| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- # coding=utf-8
- import logging
- from datetime import datetime, timedelta
- from babel.dates import format_date
- from string import Template
- from dotenv import load_dotenv
- import os
- from apscheduler.schedulers.blocking import BlockingScheduler
- import pymongo
- from bson import ObjectId
- from bson.json_util import dumps
- from json import loads
- import csv
- import requests
- class MailSender:
- def __init__(self, serialNumber):
- load_dotenv()
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- self.logger = logging.getLogger()
- # Connection to MongoDB
- self.serialNumber = serialNumber
- self.mongoClient = pymongo.MongoClient(os.getenv('MONGODB_HOST'))
- self.mongoDB = self.mongoClient["Medidores"]
- self.meterLogsCollection = self.mongoDB["meters_logs"]
- self.schedulerCollection = self.mongoDB["mail_scheduler"]
- self.now = datetime.now()
- self.hora_inicio = "00:00:00"
- self.hora_fin = "00:00:00"
- self.ayer = self.now - timedelta(days=1)
- self.sg_api_url = os.getenv("SG_API_URL")
- self.sg_api_key = os.getenv("SG_API_KEY")
- self.sg_template_id = os.getenv("SG_TEMPLATE_ID")
- def _read_template(self, filename):
- """
- Returns a Template object comprising the contents of the
- file specified by filename.
- """
-
- with open(filename, 'r', encoding='utf-8') as template_file:
- template_file_content = template_file.read()
- return Template(template_file_content)
- def _makeCSV(self, filename, result):
- if os.name == 'nt':
- file_dest_path = './tmp'
- else:
- file_dest_path = os.getenv("FILES_BASE_PATH")
- filename = os.path.join(file_dest_path, filename)
- headers=[]
- with open(filename, 'w', newline='') as out:
- headers.append("Date")
- writer = csv.writer(out)
- for med in result[0]['mediciones']:
- headers.append(med['descripcion'])
- writer.writerow(headers)
- for doc in result:
- line=[]
- line.append(doc['logDate'])
- for med in doc['mediciones']:
- if med['registro'] in [4999, 5007, 5001, 5009]:
- line.append(float(med['lectura'])*100)
- else:
- line.append(med['lectura'])
- writer.writerow(line)
- out.close()
-
- self.logger.info("Archivo creado con exito.")
- def _calculateEnergy(self, result):
- totalEnergy = 0
- regs = 0
- for doc in result:
- for med in doc['mediciones']:
- if med['registro'] == 4999:
- totalEnergy = totalEnergy + float(med['lectura'])*0.1
- regs = regs + 1
-
- return regs, totalEnergy
- def _getLogs(self):
- ffin = self.now.strftime("%Y-%m-%d ") + self.hora_fin
- finicio = self.ayer.strftime("%Y-%m-%d ") + self.hora_inicio
- self.logger.info("Fecha Inicio: " + finicio)
- self.logger.info("Fecha Fin: " + ffin)
- print({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
- resp = self.meterLogsCollection.find({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":2})
- resultstr = dumps(resp)
- result = loads(resultstr)
- return result
- def sendMail(self):
- fileToSend = "_".join([self.now.strftime("%Y%m%d"), self.serialNumber, "energy_data.csv"])
- self.logger.info("Obteniendo información de la base de datos para el medidor {0}".format(self.serialNumber))
- result = self._getLogs()
- self.logger.info("Escribiendo el archivo {0}".format(fileToSend))
- self._makeCSV(fileToSend, result)
- _, energiaTotal = self._calculateEnergy(result)
- recipients = []
- self.logger.info("Leyendo información de destinatarios")
- with open("recipients.txt",'r') as recipientList:
- for rec in recipientList.readlines():
- recipients.append({"email": rec})
- data = {
- "from":{
- "email":"energy_report@energy.inverlec.solar"
- },
- "personalizations":[
- {
- "to": recipients,
- "dynamic_template_data":{
- "fecha": format_date(self.now, locale='es_SV', format='full'),
- "medidor": self.serialNumber,
- "energia": energiaTotal,
- "hora_inicio": self.hora_inicio,
- "hora_fin": self.hora_fin,
- "fecha_inicio": self.ayer.strftime("%Y-%m-%d ") ,
- "fecha_fin": self.now.strftime("%Y-%m-%d"),
- "button_link": "https://energy.inverlec.solar/data/meter/" + fileToSend
- }
- }
- ],
- "template_id":"d-14e708c347344f6ca01a2f245e278cbb"
- }
- headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.sg_api_key}
- self.logger.info("Enviando correo electrónico")
- r = requests.post(self.sg_api_url, json=data, headers=headers)
- self.logger.info("El resultado del envio de correo es: {0}".format(r))
- if __name__ == "__main__":
- sender = MailSender("0223412115")
- # scheduler = BlockingScheduler()
- # scheduler.add_job(sender.sendMail, 'cron', hour=16, minute=35)
- # scheduler.add_job(sender.sendMail, 'cron', hour=7, minute=41)# 8
- # scheduler.start()
- sender.sendMail()
|