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)]}