optimize.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import os
  2. from datetime import datetime,timedelta
  3. from pathlib import Path
  4. from pprint import pprint
  5. import pandas as pd
  6. from ...model.DHU.DHU_A import DHU_A
  7. from ...model.DHU.DHU_B import DHU_B
  8. from ...tools.config_reader import ConfigReader
  9. from ...tools.data_loader import DataLoader
  10. NOW = datetime.now().replace(second=0,microsecond=0)
  11. def optimize(*inputs,config=None):
  12. config = {} if config is None else config
  13. if '__LOCAL' in config.keys():
  14. config_reader_path = config['__LOCAL']
  15. data_URL = config['__URL']
  16. else:
  17. config_reader_path = '/mnt/workflow_data'
  18. data_URL = 'http://basedataportal-svc:8080/data/getpointsdata'
  19. config_reader = ConfigReader(path=f'{config_reader_path}/DHU_A配置.xlsx')
  20. if config_reader.meta['设备类型'] == 'DHU_A':
  21. MODEL = DHU_A
  22. elif config_reader.meta['设备类型'] == 'DHU_B':
  23. MODEL = DHU_B
  24. else:
  25. raise NotImplementedError(config_reader.meta['设备类型'])
  26. ALL_RESULT = {
  27. 'EXCEPTION':{
  28. 'Mod' : {},
  29. 'Data_Room': {},
  30. 'Data_ATD' : {},
  31. 'Opt' : {},
  32. 'Push' : {}
  33. },
  34. 'STATUS':{
  35. 'Mode_Steady': [],
  36. 'Mode_Low' : [],
  37. 'Mode_stop' : []
  38. }
  39. }
  40. for each_eaup_name in config_reader.all_equp_names:
  41. # 加载模型
  42. # 加载数据
  43. # 运行判断
  44. # 稳态判断:房间露点设定值与反馈值是否接近
  45. # 模型调整
  46. # 模型判断:模型精度是否满足要求
  47. # 模式判断:
  48. # 1. 基于当前露点优化模式:基于房间露点设定值减偏差
  49. # 2. 快速提升送风露点模式:约束送风露点保持不变
  50. # 加载模型
  51. try:
  52. if config_reader.get_app_info(
  53. each_eaup_name,
  54. app_type = '实时优化',
  55. key = '使用临时模型',
  56. info_type = 'bool'
  57. ):
  58. # 从文件夹中获取临时模型
  59. MODEL = MODEL.load(path=f'{config_reader_path}/model/{each_eaup_name}.pkl')
  60. else:
  61. MODEL = MODEL.load_from_platform(
  62. source = 'id',
  63. model_id = config_reader.get_equp_info(
  64. equp_name = each_eaup_name,
  65. key = '模型编号',
  66. info_type = 'str'
  67. )
  68. )
  69. except Exception as e:
  70. ALL_RESULT['EXCEPTION']['Mod'][each_eaup_name] = e
  71. continue
  72. # 加载房间数据
  73. try:
  74. room_steady_len = config_reader.get_app_info(each_eaup_name,'实时优化','房间稳态判断时长','float')
  75. room_data_loader = DataLoader(
  76. path = f'{config_reader_path}/data/optimize/data_cur/',
  77. start_time = NOW - timedelta(minutes=room_steady_len),
  78. end_time = NOW
  79. )
  80. room_data_loader.dowload_equp_data(
  81. equp_name = each_eaup_name,
  82. point = config_reader.get_equp_point(each_eaup_name,equp_class=['C']),
  83. url = data_URL,
  84. clean_cache = True
  85. )
  86. room_data = room_data_loader.get_equp_data(each_eaup_name)
  87. room_Dew_SP_adj = config_reader.get_app_info(each_eaup_name,'实时优化','房间露点设定值偏差','float')
  88. room_Dew_SP = room_data.room_DSP.mean() + room_Dew_SP_adj
  89. room_Dew_PV = room_data.room_DPV.mean()
  90. room_Dew_diff_dwlim = config_reader.get_app_info(each_eaup_name,'实时优化','房间露点过低阈值','float')
  91. # 模式判断
  92. is_room_Dew_steady = (room_Dew_PV < room_Dew_SP + 0.5) or (room_Dew_PV > room_Dew_SP - 0.5)
  93. is_room_Dew_low = room_Dew_PV - room_Dew_SP < room_Dew_diff_dwlim
  94. if is_room_Dew_steady:
  95. DewOut_constrain = 'coil_3_DoutA-[coil_3_DoutA]<0'
  96. ALL_RESULT['STATUS']['Mode_Steady'].append(each_eaup_name)
  97. elif is_room_Dew_low:
  98. DewOut_constrain = f'coil_3_DoutA-{room_Dew_SP-4}<0' #TODO 这个4度比较粗糙,待改进
  99. ALL_RESULT['STATUS']['Mode_Low'].append(each_eaup_name)
  100. else:
  101. ALL_RESULT['STATUS']['Mode_stop'].append(each_eaup_name)
  102. continue
  103. except Exception as e:
  104. ALL_RESULT['STATUS']['Data_Room'][each_eaup_name] = e
  105. continue
  106. # 加载除湿机数据
  107. try:
  108. dhu_steady_len = config_reader.get_app_info(each_eaup_name,'实时优化','除湿机工况均值时长','float')
  109. data_input_point = config_reader.get_equp_point(each_eaup_name,equp_class=['A','B'])
  110. data_cur = (
  111. DataLoader(
  112. path = f'{config_reader_path}/data/optimize/data_cur/',
  113. start_time = NOW - timedelta(minutes=dhu_steady_len),
  114. end_time = NOW
  115. )
  116. .dowload_equp_data(
  117. equp_name = each_eaup_name,
  118. point = data_input_point,
  119. url = data_URL,
  120. clean_cache = True
  121. )
  122. .get_equp_data(
  123. equp_name = each_eaup_name,
  124. )
  125. .mean(axis=0)
  126. .to_frame().T
  127. )
  128. except Exception as e:
  129. ALL_RESULT['EXCEPTION']['Data_ATD'][each_eaup_name] = e
  130. try:
  131. # 模型精度判断
  132. predict = MODEL.predict_system(input_data=data_cur)
  133. TVP_data = (
  134. predict.T.set_axis(['pred'],axis=1)
  135. .join(
  136. data_cur.T.set_axis(['real'],axis=1),
  137. how = 'left'
  138. )
  139. .dropna(axis=0)
  140. )
  141. print(TVP_data)
  142. # 实时优化
  143. constrains = [DewOut_constrain]
  144. opt_res = MODEL.optimize(
  145. cur_input_data = data_cur,
  146. wheel_1_TinR_ub = config_reader.get_app_info(each_eaup_name,'实时优化','前再生盘管温度上限','float'),
  147. wheel_1_TinR_lb = config_reader.get_app_info(each_eaup_name,'实时优化','前再生盘管温度下限','float'),
  148. wheel_2_TinR_ub = config_reader.get_app_info(each_eaup_name,'实时优化','后再生盘管温度上限','float'),
  149. wheel_2_TinR_lb = config_reader.get_app_info(each_eaup_name,'实时优化','后再生盘管温度下限','float'),
  150. constrains = constrains,
  151. logging = False
  152. )
  153. opt_summary = opt_res['opt_summary']
  154. opt_var = opt_res['opt_var']
  155. except Exception as e:
  156. ALL_RESULT['EXCEPTION']['Opt'][each_eaup_name] = e
  157. pprint(ALL_RESULT)