Quellcode durchsuchen

Prueba para nuevos medidores

Oscar Alfredo Leiva Salomón vor 6 Jahren
Ursprung
Commit
f9747f17d1
5 geänderte Dateien mit 123 neuen und 18 gelöschten Zeilen
  1. 1 2
      .vscode/settings.json
  2. 27 0
      model.py
  3. 75 0
      mongotest.py
  4. 2 0
      requirements.txt
  5. 18 16
      sendMail.py

+ 1 - 2
.vscode/settings.json

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

+ 27 - 0
model.py

@@ -0,0 +1,27 @@
+from bson import ObjectId
+
+
+class Model(dict):
+    """
+    A simple model that wraps mongodb document
+    """
+    __getattr__ = dict.get
+    __delattr__ = dict.__delitem__
+    __setattr__ = dict.__setitem__
+
+    def save(self):
+        if not self._id:
+            self.collection.insert(self)
+        else:
+            self.collection.update(
+                { "_id": ObjectId(self._id) }, self)
+
+    def reload(self):
+        if self._id:
+            self.update(self.collection\
+                    .find_one({"_id": ObjectId(self._id)}))
+
+    def remove(self):
+        if self._id:
+            self.collection.remove({"_id": ObjectId(self._id)})
+            self.clear()

+ 75 - 0
mongotest.py

@@ -0,0 +1,75 @@
+from mongoengine import connect, EmbeddedDocument, Document, StringField, IntField, ListField, EmbeddedDocumentField
+
+connect('Medidores', host='192.168.100.5', port=27017, username='mailScheduler', password='pqowieuryt')
+
+class Medicion(EmbeddedDocument):
+    descripcion = StringField()
+    registro = IntField()
+    lectura = StringField()
+
+class Logs(Document):
+    meta = {'collection': 'meters_logs'}
+    serialNumber = StringField()
+    meterLogNumber = IntField()
+    logDate = StringField()
+    saveDate = StringField()
+    mediciones = ListField(EmbeddedDocumentField(Medicion))
+
+
+class LogRetriever:
+
+    def __init__(self, serial_number, log_number, register):
+        self.serial_number = serial_number
+        self.log_number = log_number
+        self.register = register
+
+    def _make_pipeline(self, start_date, end_date, aggregate_by):
+        pipeline= [
+            {'$project':
+                {
+                    'serialNumber': 1,
+                    'meterLogNumber': 1,
+                    'mediciones': 1,
+                    'logDate': 1,
+                    'hour': {'$hour': {'$dateFromString':  {'dateString': '$logDate'}}},
+                    'day': {'$dayOfMonth': {'$dateFromString':  {'dateString': '$logDate'}}},
+                    'month': {'$month': {'$dateFromString':  {'dateString': '$logDate'}}},
+                    'year': {'$year': {'$dateFromString':  {'dateString': '$logDate'}}},
+                }
+            },
+            {'$unwind': '$mediciones' },
+            {'$match': {
+                'serialNumber': self.serial_number, 
+                'meterLogNumber': self.log_number, 
+                "mediciones.registro": self.register, 
+                'logDate': {'$gte': start_date, '$lt': end_date}}},
+            {'$group': 
+                {
+                    '_id': aggregate_by,
+                    'date': { '$min': '$logDate'},
+                    'total': {'$sum': { '$toInt': "$mediciones.lectura"}}
+                }
+            },     
+            {'$sort': { 'date': -1 }}
+        ]
+
+        return pipeline
+
+        def getByDay(self, start_date, end_date):
+            aggregate_by = {
+                'hour': None,
+                'day': '$day',
+                'month': None,
+                'year': None
+            }
+
+serial_number = '0223406118'
+log_number = 2
+register = 4999
+start_date = '2019-07-22 00:00:00' # String
+end_date = '2019-07-23 00:00:00' # String
+
+
+
+
+mediciones = Logs.objects.aggregate(*pipeline)

+ 2 - 0
requirements.txt

@@ -8,12 +8,14 @@ idna==2.8
 isort==4.3.21
 lazy-object-proxy==1.4.1
 mccabe==0.6.1
+Mongo-Thingy==0.11.0
 pylint==2.3.1
 pymongo==3.8.0
 python-dotenv==0.10.3
 pytz==2019.1
 requests==2.22.0
 six==1.12.0
+Thingy==0.8.5
 typed-ast==1.4.0
 tzlocal==1.5.1
 urllib3==1.25.3

+ 18 - 16
sendMail.py

@@ -1,3 +1,4 @@
+# coding=utf-8
 
 import logging
 
@@ -30,13 +31,13 @@ class MailSender:
 
         self.mongoClient = pymongo.MongoClient(os.getenv('MONGODB_HOST'))
 
-        self.mongoDB = self.mongoClient["MedidoresCondusal"]
+        self.mongoDB = self.mongoClient["Medidores"]
         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.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")
@@ -86,8 +87,8 @@ class MailSender:
         regs = 0
         for doc in result:
             for med in doc['mediciones']:
-                if med['registro'] == 5001:
-                    totalEnergy = totalEnergy + float(med['lectura'])
+                if med['registro'] == 4999:
+                    totalEnergy = totalEnergy + float(med['lectura'])/10
                     regs = regs + 1
         
         return regs, totalEnergy
@@ -99,8 +100,8 @@ class MailSender:
 
         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})
+        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)
 
@@ -111,12 +112,12 @@ class MailSender:
         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.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})
@@ -136,7 +137,7 @@ class MailSender:
                         "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/" + "/" + fileToSend
+                        "button_link": "https://energy.inverlec.solar/data/meter/" + fileToSend
                         }
                 }
             ],
@@ -144,18 +145,19 @@ class MailSender:
         }
 
         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(r)
+        self.logger.info("El resultado del envio de correo es: {0}".format(r))
 
 
 
 
 if __name__ == "__main__":
-    sender = MailSender("0208069934")
-    scheduler = BlockingScheduler()
+    sender = MailSender("0223412115")
+    # scheduler = BlockingScheduler()
 
-    scheduler.add_job(sender.sendMail, 'cron', hour=10, minute=00)# 8
+    # scheduler.add_job(sender.sendMail, 'cron', hour=16, minute=35)
     # scheduler.add_job(sender.sendMail, 'cron', hour=7, minute=41)# 8
 
-    scheduler.start()
+    # scheduler.start()
+    sender.sendMail()