energy_service.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from app.main.model.logs import Logs
  2. from datetime import datetime, timedelta
  3. def _make_pipeline(serial_number, log_number,
  4. register, start_date, end_date, aggregate_by):
  5. pipeline = [
  6. {'$project':
  7. {
  8. 'serialNumber': 1,
  9. 'meterLogNumber': 1,
  10. 'mediciones': 1,
  11. 'logDate': 1,
  12. 'hour': {
  13. '$hour': {
  14. '$dateFromString': {'dateString': '$logDate'}
  15. }
  16. },
  17. 'day': {
  18. '$dayOfMonth': {
  19. '$dateFromString': {'dateString': '$logDate'}
  20. }
  21. },
  22. 'month': {
  23. '$month': {
  24. '$dateFromString': {'dateString': '$logDate'}
  25. }
  26. },
  27. 'year': {
  28. '$year': {
  29. '$dateFromString': {'dateString': '$logDate'}
  30. }
  31. },
  32. }
  33. },
  34. {'$unwind': '$mediciones'},
  35. {'$match': {
  36. 'serialNumber': serial_number,
  37. 'meterLogNumber': int(log_number),
  38. "mediciones.registro": register,
  39. 'logDate': {'$gte': start_date, '$lt': end_date}}},
  40. {'$group':
  41. {
  42. '_id': aggregate_by,
  43. 'date': {'$min': '$logDate'},
  44. 'total_energy': {'$sum': {'$toInt': "$mediciones.lectura"}}
  45. }
  46. },
  47. {'$sort': {'date': -1}},
  48. {'$project': {'date': 1, 'total_energy': 1, '_id': 0}}
  49. ]
  50. return pipeline
  51. def get_total_wh_by_day(serial_number, log_number, start_date, end_date=None):
  52. """Get total energy Wh by day
  53. :serial_number: string object
  54. :log_number: string object
  55. :date: string object
  56. """
  57. log = Logs.objects(serialNumber=serial_number,
  58. meterLogNumber=log_number,
  59. logDate=start_date + " 00:00:00")
  60. if not log:
  61. return {
  62. 'error': 'No existe informacion para el medidor, log o fecha'
  63. }
  64. register = 4999
  65. aggregate_by = {
  66. 'hour': None,
  67. 'day': '$day',
  68. 'month': None,
  69. 'year': None
  70. }
  71. if end_date is None:
  72. date_dt = datetime.strptime(start_date, "%Y-%m-%d")
  73. delta = timedelta(days=1)
  74. end_date_dt = date_dt + delta
  75. end_date = end_date_dt.strftime("%Y-%m-%d")
  76. pipeline = _make_pipeline(
  77. serial_number, log_number, register, start_date,
  78. end_date, aggregate_by)
  79. return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}
  80. def get_hourly_wh_by_day(serial_number, log_number, start_date, end_date):
  81. """Get hourly energy Wh by day
  82. :serial_number: string object
  83. :log_number: string object
  84. :date: string object
  85. """
  86. log = Logs.objects(serialNumber=serial_number,
  87. meterLogNumber=log_number,
  88. logDate=start_date + " 00:00:00")
  89. if not log:
  90. return {'error': 'No existe información para el medidor, log o fecha'}
  91. register = 4999
  92. aggregate_by = {
  93. 'hour': '$hour',
  94. 'day': '$day',
  95. 'month': None,
  96. 'year': None
  97. }
  98. if end_date is None:
  99. date_dt = datetime.strptime(start_date, "%Y-%m-%d")
  100. delta = timedelta(days=1)
  101. end_date_dt = date_dt + delta
  102. end_date = end_date_dt.strftime("%Y-%m-%d")
  103. pipeline = _make_pipeline(
  104. serial_number, log_number, register, start_date,
  105. end_date, aggregate_by)
  106. return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}