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