|
@@ -0,0 +1,127 @@
|
|
|
|
|
+from app.main.model.logs import Logs
|
|
|
|
|
+from datetime import datetime, timedelta
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _make_pipeline(serial_number, log_number,
|
|
|
|
|
+ register, 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': serial_number,
|
|
|
|
|
+ 'meterLogNumber': int(log_number),
|
|
|
|
|
+ "mediciones.registro": register,
|
|
|
|
|
+ 'logDate': {'$gte': start_date, '$lt': end_date}}},
|
|
|
|
|
+ {'$group':
|
|
|
|
|
+ {
|
|
|
|
|
+ '_id': aggregate_by,
|
|
|
|
|
+ 'date': {'$min': '$logDate'},
|
|
|
|
|
+ 'total_energy': {'$sum': {'$toInt': "$mediciones.lectura"}}
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ {'$sort': {'date': -1}},
|
|
|
|
|
+ {'$project': {'date': 1, 'total_energy': 1, '_id': 0}}
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+ return pipeline
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_total_wh_by_day(serial_number, log_number, start_date, end_date=None):
|
|
|
|
|
+ """Get total energy Wh by day
|
|
|
|
|
+
|
|
|
|
|
+ :serial_number: string object
|
|
|
|
|
+ :log_number: string object
|
|
|
|
|
+ :date: string object
|
|
|
|
|
+
|
|
|
|
|
+ """
|
|
|
|
|
+ log = Logs.objects(serialNumber=serial_number,
|
|
|
|
|
+ meterLogNumber=log_number,
|
|
|
|
|
+ logDate=start_date + " 00:00:00")
|
|
|
|
|
+
|
|
|
|
|
+ if not log:
|
|
|
|
|
+ return {
|
|
|
|
|
+ 'error': 'No existe informacion para el medidor, log o fecha'
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ register = 4999
|
|
|
|
|
+
|
|
|
|
|
+ aggregate_by = {
|
|
|
|
|
+ 'hour': None,
|
|
|
|
|
+ 'day': '$day',
|
|
|
|
|
+ 'month': None,
|
|
|
|
|
+ 'year': None
|
|
|
|
|
+ }
|
|
|
|
|
+ if end_date is None:
|
|
|
|
|
+ date_dt = datetime.strptime(start_date, "%Y-%m-%d")
|
|
|
|
|
+ delta = timedelta(days=1)
|
|
|
|
|
+ end_date_dt = date_dt + delta
|
|
|
|
|
+ end_date = end_date_dt.strftime("%Y-%m-%d")
|
|
|
|
|
+
|
|
|
|
|
+ pipeline = _make_pipeline(
|
|
|
|
|
+ serial_number, log_number, register, start_date,
|
|
|
|
|
+ end_date, aggregate_by)
|
|
|
|
|
+ return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_hourly_wh_by_day(serial_number, log_number, start_date, end_date):
|
|
|
|
|
+ """Get hourly energy Wh by day
|
|
|
|
|
+
|
|
|
|
|
+ :serial_number: string object
|
|
|
|
|
+ :log_number: string object
|
|
|
|
|
+ :date: string object
|
|
|
|
|
+
|
|
|
|
|
+ """
|
|
|
|
|
+ log = Logs.objects(serialNumber=serial_number,
|
|
|
|
|
+ meterLogNumber=log_number,
|
|
|
|
|
+ logDate=start_date + " 00:00:00")
|
|
|
|
|
+
|
|
|
|
|
+ if not log:
|
|
|
|
|
+ return {'error': 'No existe información para el medidor, log o fecha'}
|
|
|
|
|
+
|
|
|
|
|
+ register = 4999
|
|
|
|
|
+
|
|
|
|
|
+ aggregate_by = {
|
|
|
|
|
+ 'hour': '$hour',
|
|
|
|
|
+ 'day': '$day',
|
|
|
|
|
+ 'month': None,
|
|
|
|
|
+ 'year': None
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if end_date is None:
|
|
|
|
|
+ date_dt = datetime.strptime(start_date, "%Y-%m-%d")
|
|
|
|
|
+ delta = timedelta(days=1)
|
|
|
|
|
+ end_date_dt = date_dt + delta
|
|
|
|
|
+ end_date = end_date_dt.strftime("%Y-%m-%d")
|
|
|
|
|
+
|
|
|
|
|
+ pipeline = _make_pipeline(
|
|
|
|
|
+ serial_number, log_number, register, start_date,
|
|
|
|
|
+ end_date, aggregate_by)
|
|
|
|
|
+ print(pipeline)
|
|
|
|
|
+ return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}
|