basic.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # -*- coding: utf-8 -*-
  2. from typing import Dict
  3. import numpy as np
  4. from httpx import AsyncClient
  5. from loguru import logger
  6. from app.controllers.equipment.controller import EquipmentController
  7. from app.schemas.equipment import AirValveSpeed, FCU
  8. from app.schemas.space import Space
  9. from app.services.platform import DataPlatformService
  10. from app.services.transfer import SpaceInfoService, Duoduo, Season
  11. from app.utils.math import round_half_up
  12. class FCUController(EquipmentController):
  13. def __init__(self, equipment: FCU, season: Season):
  14. super(FCUController, self).__init__()
  15. self._equipment = equipment
  16. self.season = season
  17. async def get_temperature_target(self) -> float:
  18. target = self._equipment.space.temperature_target
  19. if not np.isnan(target):
  20. setting_target = target
  21. else:
  22. setting_target = 25.0
  23. self._equipment.setting_temperature = setting_target
  24. return setting_target
  25. async def get_mode(self) -> None:
  26. temperature_target = await self.get_temperature_target()
  27. if self.season == Season.heating:
  28. if temperature_target > self._equipment.space.realtime_temperature:
  29. mode = 2
  30. else:
  31. mode = 1
  32. elif self.season == Season.cooling:
  33. mode = 1
  34. else:
  35. mode = 0
  36. self._equipment.work_mode = mode
  37. async def get_air_valve_speed(self):
  38. temperature_target = await self.get_temperature_target()
  39. mode = await self.get_mode()
  40. if temperature_target > 0:
  41. if mode == 1:
  42. diff = self._equipment.space.realtime_temperature - temperature_target
  43. else:
  44. diff = abs(self._equipment.space.realtime_temperature - temperature_target)
  45. if diff >= 1.0:
  46. self._equipment.air_valve_speed = AirValveSpeed.high
  47. elif diff >= 0.5:
  48. self._equipment.air_valve_speed = AirValveSpeed.medium
  49. elif diff >= 0.0:
  50. self._equipment.air_valve_speed = AirValveSpeed.low
  51. else:
  52. self._equipment.air_valve_speed = AirValveSpeed.off
  53. else:
  54. self._equipment.air_valve_speed = AirValveSpeed.off
  55. async def get_running_status(self):
  56. if self._equipment.air_valve_speed == AirValveSpeed.off:
  57. self._equipment.running_status = False
  58. else:
  59. self._equipment.running_status = True
  60. async def run(self):
  61. await self.get_temperature_target()
  62. await self.get_air_valve_speed()
  63. await self.get_running_status()
  64. await self.get_mode()
  65. def get_results(self):
  66. return self._equipment
  67. @logger.catch()
  68. async def get_fcu_control_result(project_id: str, equipment_id: str) -> Dict:
  69. async with AsyncClient() as client:
  70. duo_duo = Duoduo(client, project_id)
  71. platform = DataPlatformService(client, project_id)
  72. spaces = await duo_duo.get_space_by_equipment(equipment_id)
  73. for sp in spaces:
  74. transfer = SpaceInfoService(client, project_id, sp.get('id'))
  75. current_target = await transfer.get_current_temperature_target()
  76. realtime_temperature = await platform.get_realtime_temperature(sp.get('id'))
  77. season = await transfer.get_season()
  78. temp_space_params = {
  79. 'id': sp.get('id'),
  80. 'temperature_target': current_target,
  81. 'realtime_temperature': realtime_temperature
  82. }
  83. space = Space(**temp_space_params)
  84. break
  85. fcu_temp_params = {
  86. 'id': equipment_id,
  87. 'space': space
  88. }
  89. fcu = FCU(**fcu_temp_params)
  90. fcu_controller = FCUController(fcu, season)
  91. await fcu_controller.run()
  92. regulated_fcu = fcu_controller.get_results()
  93. output = {
  94. 'onOff': 1 if regulated_fcu.running_status else 0,
  95. 'mode': regulated_fcu.work_mode,
  96. 'speed': regulated_fcu.air_valve_speed.value,
  97. 'temperature': int(round_half_up(regulated_fcu.setting_temperature, 1)),
  98. 'water': 1 if regulated_fcu.running_status else 0
  99. }
  100. logger.debug(output)
  101. return output