basic.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. from typing import List, Tuple
  3. import arrow
  4. import numpy as np
  5. from app.schemas.equipment import ASHP
  6. class ASHPGroupController:
  7. def __init__(self, ashp_list: List[ASHP], outdoor_temp_list: List[float]):
  8. self._ashp_list = ashp_list
  9. self._outdoor_temp_list = outdoor_temp_list
  10. self._is_warning = False
  11. def initialization(self) -> Tuple[float, float, float]:
  12. if self._outdoor_temp_list:
  13. outdoor_temp_avg = np.mean(self._outdoor_temp_list)
  14. else:
  15. outdoor_temp_avg = 22.0
  16. total_device_num = len(self._ashp_list)
  17. if outdoor_temp_avg <= 20.0:
  18. device_num = 1
  19. out_temp_set = 10.0
  20. interval = 45 * 60
  21. elif outdoor_temp_avg < 24.0:
  22. device_num = total_device_num // 3
  23. out_temp_set = 9.0
  24. interval = 0
  25. else:
  26. device_num = total_device_num // 3 + 1
  27. out_temp_set = 8.5
  28. interval = 0
  29. if self._outdoor_temp_list:
  30. if np.max(self._outdoor_temp_list) > 34.0:
  31. device_num += 1
  32. device_num = min(device_num, total_device_num - 1)
  33. return device_num, out_temp_set, interval
  34. def device_num_adjustment(self) -> float:
  35. out_temp_15_avg = np.mean([np.mean(device.out_temp_15min) for device in self._ashp_list])
  36. out_temp_set_15_avg = np.mean([np.mean(device.out_temp_set_15min) for device in self._ashp_list])
  37. iplr_15_avg = np.mean([np.mean(device.iplr_15min) for device in self._ashp_list])
  38. out_temp_30_avg = np.mean([np.mean(device.out_temp_30min) for device in self._ashp_list])
  39. out_temp_set_30_avg = np.mean([np.mean(device.out_temp_set_30min) for device in self._ashp_list])
  40. iplr_30_avg = np.mean([np.mean(device.iplr_30min) for device in self._ashp_list])
  41. device_num_diff = 0
  42. if out_temp_15_avg > out_temp_set_15_avg + 1 and iplr_15_avg > 0.85:
  43. device_num_diff = 1
  44. if out_temp_30_avg > out_temp_set_30_avg + 1 and iplr_30_avg <= 0.85:
  45. device_num_diff = 1
  46. self._is_warning = True
  47. if out_temp_15_avg <= out_temp_set_15_avg + 0.3 and iplr_15_avg < 0.6:
  48. device_num_diff = -1
  49. return device_num_diff
  50. def out_temp_set_adjustment(self) -> float:
  51. out_temp_set = np.NAN
  52. if self._outdoor_temp_list:
  53. current_outdoor_temp = self._outdoor_temp_list[-1]
  54. if current_outdoor_temp >= 30.0:
  55. out_temp_set = 8.0
  56. elif current_outdoor_temp >= 28.0:
  57. out_temp_set = 8.5
  58. elif current_outdoor_temp >= 26.0:
  59. out_temp_set = 9.0
  60. elif current_outdoor_temp > 22.0:
  61. out_temp_set = 10.0
  62. else:
  63. out_temp_set = 11.0
  64. return out_temp_set
  65. def build_up(self, diff: float, out_temp_set: float):
  66. if diff > 0:
  67. for device in self._ashp_list:
  68. if not device.running_status:
  69. device.equip_switch_set = True
  70. diff -= 1
  71. if diff == 0:
  72. break
  73. elif diff < 0:
  74. for device in self._ashp_list:
  75. if device.running_status:
  76. device.equip_switch_set = False
  77. diff += 1
  78. if diff == 0:
  79. break
  80. if not np.isnan(out_temp_set):
  81. for device in self._ashp_list:
  82. if device.running_status or device.equip_switch_set:
  83. device.out_temp_set = out_temp_set
  84. def run(self):
  85. t = arrow.utcnow()
  86. if t.minute < 30:
  87. if t.hour == 1:
  88. if not np.any([device.running_status for device in self._ashp_list]): # no device is running
  89. device_num_diff, out_temp_set, interval = self.initialization()
  90. self.build_up(device_num_diff, out_temp_set)
  91. else:
  92. device_num_diff = self.device_num_adjustment()
  93. self.build_up(device_num_diff, np.NAN)
  94. else:
  95. out_temp_set = self.out_temp_set_adjustment()
  96. self.build_up(0, out_temp_set)