|
|
@@ -0,0 +1,159 @@
|
|
|
+
|
|
|
+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["MedidoresCondusal"]
|
|
|
+ self.meterLogsCollection = self.mongoDB["meters_logs"]
|
|
|
+ self.schedulerCollection = self.mongoDB["mail_scheduler"]
|
|
|
+
|
|
|
+ self.now = datetime.now()
|
|
|
+ self.hora_inicio = "09:00:00"
|
|
|
+ self.hora_fin = "08: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']:
|
|
|
+ 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'] == 5001:
|
|
|
+ totalEnergy = totalEnergy + float(med['lectura'])
|
|
|
+ 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)
|
|
|
+
|
|
|
+ resp = self.meterLogsCollection.find({"logDate" : {"$gte":finicio, "$lte":ffin},"serialNumber": self.serialNumber, "meterLogNumber":5})
|
|
|
+ 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("Escribindo el archivo {0}".format(fileToSend))
|
|
|
+ self._makeCSV(fileToSend, result)
|
|
|
+ _, energiaTotal = self._calculateEnergy(result)
|
|
|
+
|
|
|
+ data = {
|
|
|
+ "from":{
|
|
|
+ "email":"energy_report@energy.inverlec.solar"
|
|
|
+ },
|
|
|
+ "personalizations":[
|
|
|
+ {
|
|
|
+ "to":[
|
|
|
+ {
|
|
|
+ "email":"oscar.leiva@mercadoselectricos.com.sv"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "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": "http://40.85.159.114/data/meter/" + self.serialNumber + "/" + fileToSend }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "template_id":"d-14e708c347344f6ca01a2f245e278cbb"
|
|
|
+ }
|
|
|
+
|
|
|
+ headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.sg_api_key}
|
|
|
+
|
|
|
+ # r = requests.post(self.sg_api_url, json=data, headers=headers)
|
|
|
+ # self.logger.info(r)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ sender = MailSender("0208069934")
|
|
|
+ # scheduler = BlockingScheduler()
|
|
|
+
|
|
|
+ # scheduler.add_job(sender.sendMail, 'cron', hour=8, minute=00)# 8
|
|
|
+ # scheduler.add_job(sender.sendMail, 'interval', seconds=10)# 8
|
|
|
+
|
|
|
+ # scheduler.start()
|
|
|
+ sender.sendMail()
|