basic.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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.schemas.equipment import VRF
  7. from app.utils.math import round_half_up
  8. class VRFController(EquipmentController):
  9. def __init__(self, device: VRF, target: float, realtime: float):
  10. super(VRFController, self).__init__()
  11. self.device = device
  12. self.target = target
  13. self.realtime = realtime
  14. def get_switch_set(self) -> str:
  15. if np.isnan(self.target):
  16. switch_set = 'off'
  17. else:
  18. switch_set = 'on'
  19. self.device.equip_switch_set = switch_set
  20. return switch_set
  21. def get_mode_set(self) -> str:
  22. if self.target > self.realtime:
  23. mode_set = 'cooling'
  24. else:
  25. mode_set = 'cooling'
  26. self.device.mode_set = mode_set
  27. return mode_set
  28. def get_temperature_set(self) -> float:
  29. if self.realtime >= 24.0:
  30. diff = self.device.return_air_temp - self.realtime
  31. if diff > 0:
  32. new_temperature_set = self.target + diff
  33. else:
  34. new_temperature_set = self.target
  35. elif self.realtime <= 22.0:
  36. new_temperature_set = self.device.return_air_temp + 1
  37. else:
  38. if np.isnan(self.device.current_temperature_set):
  39. new_temperature_set = 25.0
  40. else:
  41. new_temperature_set = self.device.current_temperature_set
  42. new_temperature_set = round_half_up(new_temperature_set)
  43. self.device.temperature_set = new_temperature_set
  44. return self.device.temperature_set
  45. def get_speed_set(self) -> str:
  46. if self.realtime >= 24.0:
  47. speed = 'M'
  48. elif self.realtime <= 22.0:
  49. speed = 'LL'
  50. elif self.device.return_air_temp - self.target >= 3.0:
  51. speed = 'HH'
  52. elif self.device.return_air_temp - self.target >= 1.0:
  53. speed = 'M'
  54. else:
  55. if self.device.speed == 'missing':
  56. speed = 'M'
  57. else:
  58. speed = self.device.speed
  59. self.device.speed_set = speed
  60. return speed
  61. async def run(self):
  62. self.get_speed_set()
  63. self.get_switch_set()
  64. self.get_mode_set()
  65. self.get_temperature_set()
  66. need_send = False
  67. if self.device.equip_switch_set == 'on' and not self.device.running_status:
  68. need_send = True
  69. if self.device.equip_switch_set == 'off' and self.device.running_status:
  70. need_send = True
  71. if self.device.temperature_set != self.device.current_temperature_set:
  72. need_send = True
  73. if self.device.speed_set != self.device.speed:
  74. need_send = True
  75. return need_send
  76. def get_results(self):
  77. return self.device
  78. @logger.catch()
  79. async def build_acatvi_instructions(params: ACATVIInstructionsRequest) -> Dict:
  80. target = np.NAN if params.space_temperature_target == -1.0 else params.space_temperature_target
  81. realtime = np.NAN if params.space_realtime_temperature == -1.0 else params.space_realtime_temperature
  82. return_air_temp = np.NAN if params.return_air_temperature == -1.0 else params.return_air_temperature
  83. if params.running_status == 'missing':
  84. return {'need_send': False}
  85. elif params.running_status == 'on':
  86. running_status = True
  87. else:
  88. running_status = False
  89. vrf = VRF(
  90. return_air_temp=return_air_temp,
  91. current_temperature_set=np.NAN if params.current_temperature_set == -1.0 else params.current_temperature_set,
  92. speed=params.current_speed,
  93. running_status=running_status
  94. )
  95. controller = VRFController(vrf, target, realtime)
  96. need_send = await controller.run()
  97. regulated_vrf = controller.get_results()
  98. instructions = {
  99. 'switch_set': regulated_vrf.equip_switch_set,
  100. 'need_send': need_send
  101. }
  102. if regulated_vrf.equip_switch_set != 'off':
  103. instructions.update({'speed_set': regulated_vrf.speed_set})
  104. instructions.update({'temperature_set': regulated_vrf.temperature_set})
  105. instructions.update({'mode_set': regulated_vrf.mode_set})
  106. return instructions