temp_humi_calculation.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. from CoolProp.HumidAirProp import HAPropsSI
  2. from temp_humid_cal.excess_temp_modify import ExcessTempModify
  3. from temp_humid_cal.interval_start_stop_AHU import IntervalOnOffAHU
  4. from data_initialize_standard.constant import *
  5. # from logs_conf.logger import *
  6. from logs.logger import *
  7. import pandas as pd
  8. import time
  9. class TempHumiFunction(object):
  10. def __init__(self, terminal_data, code_data, chiller_outer):
  11. self.data = terminal_data
  12. self.config = code_data
  13. # self.modify = modify_data
  14. self.chiller_outer = chiller_outer
  15. self.chiller_mode = code_data['runMode']
  16. def terminal_limit_cal(self, data):
  17. """
  18. 监测点的限值计算
  19. :param data:
  20. :param dict_code:
  21. :return:
  22. """
  23. if self.chiller_mode == 0:
  24. data['tempLimit'] = data['coolingTempUpper'] - self.config['tempMargin']
  25. data['humiLimit'] = data['coolingHumiUpper'] - self.config['humiMargin']
  26. elif self.chiller_mode == 1:
  27. data['tempLimit'] = data['heatingTempDown'] + self.config['tempMargin']
  28. else:
  29. logger.critical("============冷机运行模式输入错误============")
  30. return data
  31. def delta_temp_humi(self, data):
  32. if self.chiller_mode == 0:
  33. data['deltaTemp'] = data['tempLimit'] - data['tempReal']
  34. data['deltaHumi'] = data['humiLimit'] - data['humiReal']
  35. elif self.chiller_mode == 1:
  36. data['deltaTemp'] = data['tempReal'] - data['tempLimit']
  37. data['deltaHumi'] = None
  38. else:
  39. logger.critical("============冷机运行模式输入错误============")
  40. return data
  41. def delta_dew_point(self, data):
  42. normal_condition = (data['tempReal'] <= TerminalTempRange['upperLimit']) & (data['tempReal'] > TerminalTempRange['lowerLimit']) & \
  43. (data['humiReal'] <= TerminalHumiRange['upperLimit']) & (data['humiReal'] > TerminalHumiRange['lowerLimit'])
  44. data_normal = data[normal_condition] # 筛选出温度和湿度范围在正常区间的数据,避免异常数据(如空值或极大值)调物性时出错
  45. data_abnormal = data.drop(data_normal.index)
  46. if self.chiller_mode == 0 and not data_normal.empty:
  47. data_normal.loc[:, ['dewTempReal']] = round(data_normal.apply(
  48. lambda x: HAPropsSI('D', 'T', x['tempReal'] + 273.15, 'P', 101325, 'R', x['humiReal'] / 100.0),
  49. axis=1) - 273.15, 1)
  50. data_normal.loc[:, ['dewTempLimit']] = round(data_normal.apply(
  51. lambda x: HAPropsSI('D', 'T', x['tempLimit'] + 273.15, 'P', 101325, 'R', x['humiLimit'] / 100.0),
  52. axis=1) - 273.15, 1)
  53. data_normal.loc[:, ['deltaDewPoint']] = data_normal['dewTempLimit'] - data_normal['dewTempReal']
  54. if not data_abnormal.empty:
  55. data_abnormal['dewTempReal'] = None
  56. data_abnormal['dewTempLimit'] = None
  57. data_abnormal['deltaDewPoint'] = None
  58. data = pd.concat([data_normal, data_abnormal])
  59. return data
  60. def excess_modify(self, terminal_data):
  61. data = self.delta_temp_humi(terminal_data)
  62. excess_condition = (data['deltaTemp'] < 0) | (data['deltaHumi'] < 0) # 温度或湿度超限的判断条件
  63. terminal_excess = data[excess_condition] # 温度或湿度超限的监测点
  64. terminal_remain = data[~excess_condition] # 未超限的监测点
  65. if not terminal_excess.empty:
  66. logger.critical("============存在监测点超限情况,开始温湿度限值修正计算============")
  67. etm = ExcessTempModify(terminal_excess, self.config, self.chiller_outer) # terminal_excess 超标的监测点数据
  68. if etm.data_judge():
  69. logger.critical("============监测点修正相关数据正常,进入修正计算============")
  70. Time1 = time.time()
  71. terminal_excess = etm.get_modified_air_temp_humi() # 温湿度计算
  72. Time2 = time.time()
  73. logger.critical("============温湿度超标点限值修正计算耗时: {}s ============".format(Time2 - Time1))
  74. else:
  75. logger.critical("============监测点修正相关数据异常,退出温湿度限值修正计算============")
  76. else:
  77. logger.critical("============不存在温度或湿度超限情况,温湿度上下限不修正============")
  78. data = pd.concat([terminal_excess, terminal_remain])
  79. return data
  80. def average_temp_humi(self, data_temp_humi):
  81. temp_mean = data_temp_humi["tempReal"].mean()
  82. humi_mean = data_temp_humi["humiReal"].mean()
  83. data_mean = {"tempHumiMeterId": "average", "terminalName": "average", "coolingTempUpper": 25,
  84. "coolingHumiUpper": 60, "heatingTempDown": 29} # 这里的上下限值实际取平均限值配置值,当前不适配写死
  85. if self.chiller_mode == 0:
  86. data_mean['tempLimit'] = data_mean['coolingTempUpper'] - self.config['tempMargin']
  87. data_mean['humiLimit'] = data_mean['coolingHumiUpper'] - self.config['humiMargin']
  88. data_mean['deltaTemp'] = data_mean['tempLimit'] - temp_mean
  89. data_mean['deltaHumi'] = data_mean['humiLimit'] - humi_mean
  90. elif self.chiller_mode == 1:
  91. data_mean['tempLimit'] = data_mean['heatingTempDown'] + self.config['tempMargin']
  92. data_mean['deltaTemp'] = data_mean['tempReal'] - data_mean['tempLimit']
  93. data_mean['deltaHumi'] = None
  94. else:
  95. logger.critical("============冷机运行模式输入错误============")
  96. data_mean_df = pd.DataFrame([data_mean])
  97. if self.config['calMode'] == 1:
  98. data = data_mean_df
  99. else:
  100. data = pd.concat([data_temp_humi, data_mean_df])
  101. return data
  102. def temp_humi_cal(self):
  103. data_temp_humi = self.terminal_limit_cal(self.data) # 确定监测点的上下限值
  104. if self.config['calMode'] == 0 or self.config['calMode'] == 2: # 监测点计算模式为常规或者综合
  105. if self.config['energyMode'] == 0: # 0为智能节能模式,1为需求优先模式
  106. logger.critical("============智控模式为智能节能模式,进入温湿度上下限修正计算============")
  107. data_temp_humi = self.excess_modify(data_temp_humi)
  108. else:
  109. logger.critical("============智控模式为需求优先模式,温湿度上下限不修正============")
  110. data_temp_humi = self.delta_temp_humi(data_temp_humi)
  111. data_temp_humi = self.delta_dew_point(data_temp_humi)
  112. ioa = IntervalOnOffAHU(data_temp_humi, self.config)
  113. data_temp_humi = ioa.exclude_ahu_short_time()
  114. if self.config['calMode'] == 1 or self.config['calMode'] == 2: # 监测点计算模式为仅平均温湿度或者综合
  115. logger.critical("============监测点计算模式为仅平均温湿度或综合模式,进入平均温湿度计算============")
  116. data_temp_humi = self.average_temp_humi(data_temp_humi)
  117. return data_temp_humi
  118. class JudgeOutRange(object):
  119. def __init__(self, data_temp_humi, dict_code):
  120. self.data = data_temp_humi
  121. self.config = dict_code
  122. self.chiller_mode = dict_code['runMode']
  123. def is_out_of_range(self):
  124. """制冷模式根据 控制依据 配置项判断 温度、露点或湿度是否超标,制热模式下只判断温度是否超标"""
  125. results = {'isOutRange': '', 'minDelta': '', 'minName': ''} # 分别代表是否超标,最不利监测点对应值,最不利监测点名称
  126. if self.chiller_mode == 0 and self.config['controlBasis'] == 0: # 制冷模式,控制依据,0为仅温度,1为仅湿度,2为温度和湿度
  127. if self.data['deltaTemp'].min() < 0:
  128. results['isOutRange'] = 1 # 1表示温度超标
  129. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  130. logger.critical("============监测点超标情况:温度超标,最不利监测点是 %s============" % (results['minName']))
  131. elif self.data['deltaDewPoint'].min() < 0:
  132. results['isOutRange'] = 2 # 2表示露点超标
  133. results['minName'] = self.data.loc[self.data['deltaDewPoint'].idxmin(), 'ahuName']
  134. logger.critical("============监测点超标情况:露点超标,最不利监测点是 %s============" % (results['minName']))
  135. else:
  136. if (self.data['deltaTemp'].min() is None) or pd.isna(self.data['deltaTemp'].min()):
  137. logger.critical("============监测点超标情况:监测点输入数据异常============")
  138. else:
  139. results['isOutRange'] = 0 # 0表示不超标
  140. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  141. logger.critical("============监测点超标情况:无超标情况,最不利监测点是 %s============" % (results['minName']))
  142. elif self.chiller_mode == 0 and self.config['controlBasis'] == 1:
  143. if self.data['deltaHumi'].min() < 0:
  144. results['isOutRange'] = 3 # 3表示湿度超标
  145. results['minName'] = self.data.loc[self.data['deltaHumi'].idxmin(), 'ahuName']
  146. logger.critical("============监测点超标情况:湿度超标,最不利监测点是 %s============" % (results['minName']))
  147. else:
  148. if (self.data['deltaHumi'].min() is None) or pd.isna(self.data['deltaHumi'].min()):
  149. logger.critical("============监测点超标情况:监测点输入数据异常============")
  150. else:
  151. results['isOutRange'] = 0 # 0表示不超标
  152. results['minName'] = self.data.loc[self.data['deltaHumi'].idxmin(), 'ahuName']
  153. logger.critical("============监测点超标情况:无超标情况,最不利监测点是 %s============" % (results['minName']))
  154. elif self.chiller_mode == 0 and self.config['controlBasis'] == 2:
  155. if self.data['deltaTemp'].min() < 0:
  156. results['isOutRange'] = 1 # 1表示温度超标
  157. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  158. logger.critical("============监测点超标情况:温度超标,最不利监测点是 %s============" % (results['minName']))
  159. elif self.data['deltaHumi'].min() < 0:
  160. results['isOutRange'] = 3 # 3表示湿度超标
  161. results['minName'] = self.data.loc[self.data['deltaHumi'].idxmin(), 'ahuName']
  162. logger.critical("============监测点超标情况:湿度超标,最不利监测点是 %s============" % (results['minName']))
  163. else:
  164. if (self.data['deltaTemp'].min() is None) or pd.isna(self.data['deltaTemp'].min() is None):
  165. logger.critical("============监测点超标情况:监测点输入数据异常============")
  166. else:
  167. results['isOutRange'] = 0 # 0表示不超标
  168. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  169. logger.critical("============监测点超标情况:无超标情况,最不利监测点是 %s============" % (results['minName']))
  170. elif self.chiller_mode == 1:
  171. if self.data['deltaTemp'].min() < 0:
  172. results['isOutRange'] = 1 # 1表示超标, 0表示不超标
  173. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  174. logger.critical("============监测点超标情况:温度超标,最不利监测点是 %s============" % (results['minName']))
  175. else:
  176. if (self.data['deltaTemp'].min() is None) or pd.isna(self.data['deltaTemp'].min()):
  177. logger.critical("============监测点超标情况:监测点输入数据异常============")
  178. else:
  179. results['isOutRange'] = 0
  180. results['minName'] = self.data.loc[self.data['deltaTemp'].idxmin(), 'ahuName']
  181. logger.critical("============监测点超标情况:温度超标,最不利监测点是 %s============" % (results['minName']))
  182. else:
  183. logger.critical("============冷机运行模式输入错误============")
  184. return results
  185. # if __name__ == '__main__':
  186. #
  187. # # 监测点的实时数据
  188. # data_df_cal = pd.DataFrame({
  189. # "tempHumiMeterId": ["3000638", "3000694", "3000691", "3000692", "3000693"],
  190. # "terminalName": ["监测点A", "监测点B", "监测点C", "监测点D", "监测点E"],
  191. # 'ahuStartTime': ["2025-4-10 23:00:00", "2025-4-10 23:00:00", "2025-4-10 23:00:00",
  192. # "2025-4-10 23:00:00", "2025-4-10 23:00:00"],
  193. # "coolingTempUpper": [25.0, 26.0, 25, 25, 25],
  194. # "coolingHumiUpper": [60.0, 65.0, 65, 65, 65],
  195. # "heatingTempDown": [18.0, 17.5, 24, 24, 26],
  196. # # "tempReal": [None, None, None, None, None],
  197. # "tempReal": [24.5, 25.3, 24, 20, 20],
  198. # "humiReal": [50, 50, 50, 50, 50],
  199. # # "humiReal": [None, None, None, None, None],
  200. # })
  201. #
  202. # station_data_ = {"chilledWaterMainTempOut": [7, 7, 7],
  203. # 'timeIndex': ["2025-4-3 12:00:00", "2025-4-4 12:00:00", "2025-4-5 12:00:00"]}
  204. #
  205. # sensor_data_ = {
  206. # "3000638": {"name": "sensor1", "tempReal": [10, 20, 30], "humiReal": [10, 20, 30], "tempSupply": [1, 2, 3]},
  207. # "3000694": {"name": "sensor2", "tempReal": [10, 20, 30], "humiReal": [10, 20, 30], "tempSupply": [1, 2, 3]},
  208. # "3000654": {"name": "sensor3", "tempReal": [10, 20, 30], "humiReal": [10, 20, 30], "tempSupply": [1, 2, 3]}}
  209. # # 冷机的历史7天数据
  210. # chiller_data_ = {"301": {"name": 1, "currentPercent": [20, 20, 30], "chillerPowerRatio": [50, 50, 50],
  211. # "chillerWaterTempOut": [7, 7, 7], "set": [7, 7, 7],
  212. # 'waterTempControlMode': 0, 'chillerWaterTempSetInitial': 7, 'capacity': 10},
  213. # "302": {"name": 1, "currentPercent": [10, 20, 30], "chillerPowerRatio": [50, 50, 50],
  214. # "chillerWaterTempOut": [7, 7, 7], "set": [7, 7, 7],
  215. # 'waterTempControlMode': 0, 'chillerWaterTempSetInitial': 7, 'capacity': 10}}
  216. # modify_data = {'terminalData': sensor_data_, 'chillerData': chiller_data_, 'stationData': station_data_}
  217. # config_info = {"handleService": 1, "controlMode": 1, "isHardwareControl": 1, "calPeriod": 3,
  218. # "minControlStep": 0.1, "chillerWaterTempSetInitial": 7, "chillerWaterTempSetUpper": 12,
  219. # "chillerWaterTempSetLower": 7, "energyMode": 1, "controlBasis": 0, "tempMargin": 0.2,
  220. # "humiMargin": 2, "mainTempMode": 0, "samplePeriod": 60, "upTempControlPeriod": 10,
  221. # "downTempControlPeriod": 12, 'runMode': 0, 'calMode': 0, 'allChillerControlSelect': [0, 0, 0],
  222. # 'triggerTime': "2025-4-5 12:00:00"}
  223. # thf = TempHumiFunction(data_df_cal, config_info, modify_data) # 监测点实时数据,冷站数据
  224. # data = thf.temp_humi_cal() # 监测点历史数据,冷机历史数据
  225. # pd.set_option('display.max_rows', None)
  226. # pd.set_option('display.max_columns', None)
  227. #
  228. # judge = JudgeOutRange(data, config_info)
  229. # result = judge.is_out_of_range()