update_maintenance_info.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. this_time = time.time()
  23. if this_time - self.run_time > 60:
  24. self.run_time = this_time
  25. now_time = datetime.now()
  26. today_time = now_time.strftime('%Y-%m-%d')
  27. month_time = now_time.strftime('%Y-%m')
  28. use_data = {}
  29. day_use = 0 # 所有设备的日耗能
  30. month_use = 0 # 所有设备的月耗能
  31. # 电流的serial_number
  32. current_threshold = 0.5 # 电流阈值,单位A
  33. i_unit = "A"
  34. i_serial_number = {}
  35. sql_i_serial_number = "SELECT device_name,serial_number FROM data_point_tbl WHERE unit=\'%s\';" % (i_unit)
  36. res_i_serial_number = self._operate_mysql.execute_sql(sql_i_serial_number)
  37. for each in res_i_serial_number:
  38. i_serial_number.setdefault(each["device_name"], []).append("c" + str(each["serial_number"]))
  39. # 更新维保信息
  40. v_unit = "kWh" # 耗能单位
  41. find_electric_device = "SELECT serial_number, device_name FROM data_point_tbl WHERE station_name=\'sct003\' AND unit=\'%s\';" % (v_unit)
  42. all_electric_device = self._operate_mysql.execute_sql(find_electric_device)
  43. for each_device in all_electric_device:
  44. v_serial_number = "c" + str(each_device['serial_number'])
  45. device_name = each_device['device_name']
  46. if device_name != "60kpcs":
  47. table_name = "table_" + device_name
  48. # 日耗能
  49. # [{'t': '2021-05-28', 'c159': 6.0}, {'t': '2021-05-27', 'c159': 4.2}]
  50. day_electric = "SELECT DATE_FORMAT(times, '%%Y-%%m-%%d') AS t, MAX(%s) AS %s FROM %s GROUP BY t ORDER BY t DESC LIMIT 2;" % (v_serial_number, v_serial_number, table_name)
  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 = "SELECT DATE_FORMAT(times, '%%Y-%%m') AS t, MAX(%s) AS %s FROM %s GROUP BY t ORDER BY t DESC LIMIT 2;" % (v_serial_number, v_serial_number, table_name)
  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 = "SELECT run_time FROM maintenance_information WHERE device_name=\'%s\';" % (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. sql_device_status_num = "SELECT serial_number FROM data_point_tbl WHERE io_point_name=\'%s\';" % (device_name + "_status")
  83. res_device_status_num = self._operate_mysql.execute_sql(sql_device_status_num)
  84. device_status_num = "c" + str(res_device_status_num[0]['serial_number'])
  85. device_status = self._operate_mysql.memoryStorage.get_value([device_status_num]) # 0:开启, 1:关闭 {'c761':'0'}
  86. # 查看电流的大小是否超过阈值(0.5A)
  87. i_status = 0 # 假设未超过
  88. i_serial = i_serial_number[device_name]
  89. 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)
  90. res_i_value = self._operate_mysql.execute_sql(sql_i_value)
  91. if len(res_i_value) == 1:
  92. for k in res_i_value[0]:
  93. if res_i_value[0][k] >= current_threshold:
  94. i_status = 1
  95. # 判断设备是否在正常运行
  96. if device_status[device_status_num] == '0' and i_status == 1:
  97. run_time = run_time + 1
  98. day_use = day_use + day_electric_use
  99. month_use = month_use + month_electric_use
  100. use_data[device_name] = [day_electric_use, month_electric_use, run_time]
  101. for each in use_data:
  102. data = use_data[each]
  103. day_energy = data[0] # 日耗能
  104. month_energy = data[1] # 月耗能
  105. run_time = data[2] # 运行时间
  106. if day_energy == 0 :
  107. day_energy_percent = 0
  108. else:
  109. day_energy_percent = day_energy / day_use # 日耗能占比
  110. day_energy_percent = str("%.2f" % (day_energy_percent*100)) + "%"
  111. if month_energy == 0:
  112. month_energy_percent = 0
  113. else:
  114. month_energy_percent = month_energy / month_use # 月耗能占比
  115. month_energy_percent = str("%.2f" % (month_energy_percent*100)) + "%"
  116. # 计算设备的待维保时间
  117. maintenance_cycle_sql = "SELECT maintenance_cycle, last_maintenance_time FROM maintenance_information WHERE device_name=\'%s\';" % (each)
  118. maintenance_cycle_res = self._operate_mysql.execute_sql(maintenance_cycle_sql)
  119. maintenance_cycle = maintenance_cycle_res[0]['maintenance_cycle']
  120. last_maintenance_time = maintenance_cycle_res[0]['last_maintenance_time']
  121. next_maintenance_time = (last_maintenance_time + timedelta(days=maintenance_cycle)).strftime("%Y-%m-%d")
  122. waiting_days = (parse(next_maintenance_time) - parse(today_time)).days
  123. # 数据表更新
  124. update_electric = "UPDATE maintenance_information SET day_energy=%s, day_energy_percent=\'%s\', month_energy=%s, month_energy_percent=\'%s\', run_time=%s, waiting_days=%s WHERE device_name=\'%s\';" % ("%.2f" % day_energy, day_energy_percent, "%.2f" % month_energy, month_energy_percent, run_time, waiting_days, each)
  125. try:
  126. self._operate_mysql.execute_sql(update_electric)
  127. except:
  128. self._log.error("设备维保信息更新失败!")
  129. self._log.error(traceback.format_exc())