Oscar Alfredo Leiva Salomón преди 6 години
ревизия
b5cc8442a7
променени са 4 файла, в които са добавени 295 реда и са изтрити 0 реда
  1. 112 0
      .gitignore
  2. 4 0
      .vscode/settings.json
  3. 20 0
      requirements.txt
  4. 159 0
      sendMail.py

+ 112 - 0
.gitignore

@@ -0,0 +1,112 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+/tmp
+*.csv
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json

+ 4 - 0
.vscode/settings.json

@@ -0,0 +1,4 @@
+{
+    "python.pythonPath": "c:\\Users\\oleiva\\Documents\\Development\\energy-report-mail\\venv\\Scripts\\python.exe",
+    "git.ignoreLimitWarning": true
+}

+ 20 - 0
requirements.txt

@@ -0,0 +1,20 @@
+APScheduler==3.6.0
+astroid==2.2.5
+Babel==2.7.0
+certifi==2019.6.16
+chardet==3.0.4
+colorama==0.4.1
+idna==2.8
+isort==4.3.21
+lazy-object-proxy==1.4.1
+mccabe==0.6.1
+pylint==2.3.1
+pymongo==3.8.0
+python-dotenv==0.10.3
+pytz==2019.1
+requests==2.22.0
+six==1.12.0
+typed-ast==1.4.0
+tzlocal==1.5.1
+urllib3==1.25.3
+wrapt==1.11.2

+ 159 - 0
sendMail.py

@@ -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()