basic.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. from typing import Dict
  2. import numpy as np
  3. from loguru import logger
  4. from app.controllers.equipment.controller import EquipmentController
  5. from app.models.domain.devices import ACATVIInstructionsRequest
  6. from app.models.domain.feedback import FeedbackValue
  7. from app.schemas.equipment import VRF
  8. from app.utils.math import round_half_up
  9. class VRFController(EquipmentController):
  10. def __init__(self, device: VRF, target: float, realtime: float):
  11. super(VRFController, self).__init__()
  12. self.device = device
  13. self.target = target
  14. self.realtime = realtime
  15. def get_switch_set(self) -> str:
  16. if np.isnan(self.target):
  17. switch_set = 'off'
  18. else:
  19. switch_set = 'on'
  20. self.device.equip_switch_set = switch_set
  21. return switch_set
  22. def get_mode_set(self) -> str:
  23. if self.target > self.realtime:
  24. mode_set = 'cooling'
  25. else:
  26. mode_set = 'cooling'
  27. self.device.mode_set = mode_set
  28. return mode_set
  29. def get_temperature_set(self) -> float:
  30. if self.realtime >= 24.0:
  31. diff = self.device.return_air_temp - self.realtime
  32. if diff > 0:
  33. new_temperature_set = self.target + diff
  34. elif diff <= 0:
  35. new_temperature_set = self.target
  36. else:
  37. if np.isnan(self.device.current_temperature_set):
  38. new_temperature_set = self.realtime
  39. else:
  40. new_temperature_set = self.device.current_temperature_set
  41. elif self.realtime <= 22.0:
  42. new_temperature_set = 28.0
  43. else:
  44. if np.isnan(self.device.current_temperature_set):
  45. new_temperature_set = 25.0
  46. else:
  47. new_temperature_set = self.device.current_temperature_set
  48. new_temperature_set = round_half_up(new_temperature_set)
  49. self.device.temperature_set = new_temperature_set
  50. return self.device.temperature_set
  51. def get_speed_set(self) -> str:
  52. if self.realtime >= 24.0:
  53. speed = 'M'
  54. elif self.realtime <= 22.0:
  55. speed = 'LL'
  56. elif self.device.return_air_temp - self.target >= 3.0:
  57. speed = 'HH'
  58. elif self.device.return_air_temp - self.target >= 1.0:
  59. speed = 'M'
  60. else:
  61. if self.device.speed == 'missing':
  62. speed = 'M'
  63. else:
  64. speed = self.device.speed
  65. self.device.speed_set = speed
  66. return speed
  67. async def run(self):
  68. if self.get_switch_set() == 'on':
  69. self.get_speed_set()
  70. self.get_mode_set()
  71. self.get_temperature_set()
  72. if self.device.temperature_set == self.device.current_temperature_set:
  73. self.device.temperature_set = 0.0
  74. if self.device.speed_set == self.device.speed:
  75. self.device.speed_set = 'hold'
  76. self.device.equip_switch_set = 'hold'
  77. if not self.device.running_status:
  78. self.device.equip_switch_set = 'on'
  79. self.get_speed_set()
  80. else:
  81. if not self.device.running_status:
  82. self.device.equip_switch_set = 'hold'
  83. def get_results(self):
  84. return self.device
  85. class VRFController1(VRFController):
  86. def __init__(self, device: VRF, target: float, realtime: float, feedback: FeedbackValue):
  87. super(VRFController1, self).__init__(device, target, realtime)
  88. self.feedback = feedback
  89. def get_temperature_set(self) -> float:
  90. new_temperature_set = self.device.current_temperature_set
  91. # Default temperature set.
  92. if not self.device.running_status:
  93. new_temperature_set = self.target
  94. # lower limit.
  95. if self.realtime <= 22.0:
  96. new_temperature_set = 28.0
  97. # recovery
  98. # if self.device.temperature_set == 28.0 and self.realtime > 25.0:
  99. # new_temperature_set = self.target
  100. # feedback
  101. if self.feedback == FeedbackValue.a_little_cold or self.feedback == FeedbackValue.so_cold:
  102. if self.feedback == FeedbackValue.so_cold and self.device.speed == 'LL':
  103. new_temperature_set = self.device.current_temperature_set + 2.0
  104. else:
  105. new_temperature_set = self.device.current_temperature_set + 1.0
  106. if self.device.return_air_temp <= self.device.current_temperature_set:
  107. if self.feedback == FeedbackValue.so_cold:
  108. new_temperature_set = self.device.current_temperature_set + 2.0
  109. elif self.feedback == FeedbackValue.a_little_hot or self.feedback == FeedbackValue.so_hot:
  110. if self.feedback == FeedbackValue.so_hot and self.device.speed == 'HH':
  111. new_temperature_set = self.device.current_temperature_set - 2.0
  112. else:
  113. new_temperature_set = self.device.current_temperature_set - 1.0
  114. new_temperature_set = round_half_up(new_temperature_set)
  115. self.device.temperature_set = new_temperature_set
  116. return new_temperature_set
  117. def get_speed_set(self) -> str:
  118. new_speed = self.device.speed
  119. # Default speed set:
  120. if not self.device.running_status:
  121. new_speed = 'M'
  122. # Lower limit.
  123. if self.realtime <= 22.0:
  124. new_speed = 'LL'
  125. # Feedback.
  126. if self.feedback == FeedbackValue.so_cold:
  127. if self.device.return_air_temp > self.device.current_temperature_set:
  128. if self.device.speed == 'HH':
  129. new_speed = 'M'
  130. elif self.device.speed == 'M':
  131. new_speed = 'LL'
  132. elif self.feedback == FeedbackValue.so_hot:
  133. if self.device.speed == 'LL':
  134. new_speed = 'M'
  135. elif self.device.speed == 'M':
  136. new_speed = 'HH'
  137. elif self.feedback == FeedbackValue.noisy_or_blowy:
  138. if self.device.speed == 'HH':
  139. new_speed = 'M'
  140. elif self.device.speed == 'M':
  141. new_speed = 'LL'
  142. else:
  143. new_speed = 'LL'
  144. self.device.speed_set = new_speed
  145. return new_speed
  146. @logger.catch()
  147. async def build_acatvi_instructions(params: ACATVIInstructionsRequest) -> Dict:
  148. target = np.NAN if params.space_temperature_target == -1.0 else params.space_temperature_target
  149. realtime = np.NAN if params.space_realtime_temperature == -1.0 else params.space_realtime_temperature
  150. return_air_temp = np.NAN if params.return_air_temperature == -1.0 else params.return_air_temperature
  151. current_temperature_set = np.NAN if params.current_temperature_set == -1.0 else round_half_up(
  152. params.current_temperature_set
  153. )
  154. vrf = VRF(
  155. return_air_temp=return_air_temp,
  156. current_temperature_set=current_temperature_set,
  157. speed=params.current_speed,
  158. running_status=params.running_status
  159. )
  160. controller = VRFController1(vrf, target, realtime, params.feedback)
  161. await controller.run()
  162. regulated_vrf = controller.get_results()
  163. instructions = {
  164. 'switch_set': regulated_vrf.equip_switch_set,
  165. 'speed_set': regulated_vrf.speed_set,
  166. 'temperature_set': regulated_vrf.temperature_set,
  167. 'mode_set': regulated_vrf.mode_set
  168. }
  169. return instructions