update_maintenance_info.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. @time: 2021/5/31 10:22
  5. @desc: 更新设备维保信息(耗能占比和运行时间),粒度:5min
  6. """
  7. import time
  8. from event_storage import EventStorage
  9. from datetime import datetime, timedelta
  10. from log import OutPutLog
  11. import traceback
  12. from dateutil.parser import parse
  13. class UpdateMaintenanceInfo:
  14. """更新设备的维保信息(每隔五分钟更新一次)"""
  15. def __init__(self):
  16. self._log = OutPutLog()
  17. self._operate_mysql = EventStorage()
  18. self.run_time = 0
  19. def update_info(self):
  20. while 1:
  21. time.sleep(1)
  22. if time.time()-self.run_time > 60:
  23. self.run_time = time.time()
  24. now_time = datetime.now()
  25. today_time = now_time.strftime('%Y-%m-%d')
  26. month_time = now_time.strftime('%Y-%m')
  27. use_data = {}
  28. day_use = 0 # 所有设备的日耗能
  29. month_use = 0 # 所有设备的月耗能
  30. # 查询电流的serial_number
  31. current_threshold = 0.5 # 电流阈值,单位A
  32. i_unit = "A"
  33. i_serial_number = {}
  34. sql_i_serial_number = f"SELECT device_name,serial_number FROM data_point_tbl WHERE unit=\'{i_unit}\' AND `device_name` LIKE '%_electric%';"
  35. res_i_serial_number = self._operate_mysql.execute_sql(sql_i_serial_number)
  36. for each in res_i_serial_number:
  37. i_serial_number.setdefault(each["device_name"], []).append("c" + str(each["serial_number"]))
  38. # {'pg00-zfdj_electric': ['c142', 'c143', 'c144']}
  39. # 更新维保信息
  40. v_unit = "kWh" # 耗能单位
  41. find_electric_device = f"SELECT device_name, serial_number FROM data_point_tbl WHERE unit=\'{v_unit}\' AND `device_name` LIKE '%_electric%';"
  42. all_electric_device = self._operate_mysql.execute_sql(find_electric_device)
  43. for each_device in all_electric_device:
  44. # each_device = {'device_name': 'pg00-zfdj_electric', 'serial_number': 147}
  45. v_serial_number = "c" + str(each_device['serial_number']) # c147
  46. device_name = each_device['device_name'] # pg00-zfdj_electric
  47. table_name = "table_" + device_name # table_pg00-zfdj_electric
  48. # 查询日耗能
  49. # [{'t': '2021-05-28', 'c159': 6.0}, {'t': '2021-05-27', 'c159': 4.2}]
  50. day_electric = f"SELECT DATE_FORMAT(times, '%Y-%m-%d') AS t, MAX({v_serial_number}) AS {v_serial_number} FROM `{table_name}` GROUP BY t ORDER BY t DESC LIMIT 2;"
  51. day_electric_res = self._operate_mysql.execute_sql(day_electric)
  52. if len(day_electric_res) == 0:
  53. day_electric_use = 0
  54. elif day_electric_res[0]['t'] != today_time:
  55. day_electric_use = 0
  56. elif len(day_electric_res) == 2:
  57. day_electric_use = day_electric_res[0][v_serial_number] - day_electric_res[1][v_serial_number]
  58. elif len(day_electric_res) == 1:
  59. day_electric_use = day_electric_res[0][v_serial_number]
  60. if day_electric_use < 0:
  61. day_electric_use = 0
  62. # 查询月耗能
  63. month_electric = f"SELECT DATE_FORMAT(times, '%Y-%m') AS t, MAX({v_serial_number}) AS {v_serial_number} FROM `{table_name}` GROUP BY t ORDER BY t DESC LIMIT 2;"
  64. month_electric_res = self._operate_mysql.execute_sql(month_electric)
  65. if len(month_electric_res) == 0:
  66. month_electric_use = 0
  67. elif month_electric_res[0]['t'] != month_time:
  68. month_electric_use = 0
  69. elif len(month_electric_res) == 2:
  70. month_electric_use = month_electric_res[0][v_serial_number] - month_electric_res[1][v_serial_number]
  71. if month_electric_use < 0:
  72. month_electric_use = month_electric_res[0][v_serial_number]
  73. elif len(month_electric_res) == 1:
  74. month_electric_use = month_electric_res[0][v_serial_number]
  75. if month_electric_use < 0:
  76. month_electric_use = 0
  77. # 查看设备历史运行时间
  78. sql_begin_run_time = f"SELECT run_time FROM maintenance_information WHERE device_name=\'{device_name}\';"
  79. begin_run_time = self._operate_mysql.execute_sql(sql_begin_run_time)
  80. run_time = begin_run_time[0]['run_time']
  81. '''
  82. # 查看设备的开关状态
  83. sql_device_status_num = "SELECT serial_number FROM data_point_tbl WHERE io_point_name=\'%s\';" % (device_name + "_status")
  84. res_device_status_num = self._operate_mysql.execute_sql(sql_device_status_num)
  85. device_status_num = "c" + str(res_device_status_num[0]['serial_number'])
  86. device_status = self._operate_mysql.memoryStorage.get_value([device_status_num]) # 0:开启, 1:关闭 {'c761':'0'}
  87. '''
  88. # 查看电流的大小是否超过阈值(0.5A)
  89. i_status = 0 # 假设未超过
  90. i_serial = i_serial_number[device_name]
  91. sql_i_value = "SELECT %s,%s,%s FROM `%s` ORDER BY times DESC LIMIT 1;" % (i_serial[0].replace('\'', ''), i_serial[1].replace('\'', ''), i_serial[2].replace('\'', ''), table_name)
  92. res_i_value = self._operate_mysql.execute_sql(sql_i_value)
  93. if len(res_i_value) == 1:
  94. for k in res_i_value[0]:
  95. if res_i_value[0][k] >= current_threshold:
  96. i_status = 1
  97. # 判断设备是否在正常运行
  98. # if device_status[device_status_num] == '0' and i_status == 1:
  99. if i_status == 1:
  100. run_time = run_time + 1
  101. day_use = day_use + day_electric_use
  102. month_use = month_use + month_electric_use
  103. use_data[device_name] = [day_electric_use, month_electric_use, run_time]
  104. for each in use_data:
  105. data = use_data[each]
  106. day_energy = data[0] # 日耗能
  107. month_energy = data[1] # 月耗能
  108. run_time = data[2] # 运行时间
  109. # 计算日耗能占比
  110. if day_energy == 0:
  111. day_energy_percent = 0
  112. else:
  113. day_energy_percent = day_energy / day_use
  114. day_energy_percent = str("%.2f" % (day_energy_percent*100)) + "%"
  115. # 计算月耗能占比
  116. if month_energy == 0:
  117. month_energy_percent = 0
  118. else:
  119. month_energy_percent = month_energy / month_use
  120. month_energy_percent = str("%.2f" % (month_energy_percent*100)) + "%"
  121. # 计算设备的待维保时间
  122. maintenance_cycle_sql = f"SELECT `maintenance_cycle`, `last_maintenance_time` FROM `maintenance_information` WHERE device_name=\'{each}\';"
  123. maintenance_cycle_res = self._operate_mysql.execute_sql(maintenance_cycle_sql)
  124. maintenance_cycle = maintenance_cycle_res[0]['maintenance_cycle']
  125. last_maintenance_time = maintenance_cycle_res[0]['last_maintenance_time']
  126. next_maintenance_time = (last_maintenance_time + timedelta(days=maintenance_cycle)).strftime("%Y-%m-%d")
  127. waiting_days = (parse(next_maintenance_time) - parse(today_time)).days
  128. # 数据表更新
  129. update_electric = f"UPDATE maintenance_information SET day_energy={'%.2f' % day_energy}, " \
  130. f"day_energy_percent=\'{day_energy_percent}\', " \
  131. f"month_energy={'%.2f' % month_energy}, " \
  132. f"month_energy_percent=\'{month_energy_percent}\', " \
  133. f"run_time={run_time}, waiting_days={waiting_days} WHERE device_name=\'{each}\';"
  134. try:
  135. self._operate_mysql.execute_sql(update_electric)
  136. except:
  137. self._log.error("设备维保信息更新失败!")
  138. self._log.error(traceback.format_exc())