fcu.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. from httpx import AsyncClient
  4. from loguru import logger
  5. from app.controllers.equipment.controller import EquipmentController
  6. from app.schemas.equipment import AirValveSpeed, FCU, Space
  7. from app.services.platform import DataPlatformService
  8. from app.services.transfer import SpaceInfoService, EquipmentInfoService
  9. class FCUController(EquipmentController):
  10. def __init__(self, equipment: FCU):
  11. super(FCUController, self).__init__()
  12. self._equipment = equipment
  13. async def get_temperature_target(self) -> float:
  14. target = self._equipment.space.temperature_target
  15. if not np.isnan(target):
  16. setting_target = target
  17. else:
  18. setting_target = 25.0
  19. self._equipment.setting_temperature = setting_target
  20. return setting_target
  21. async def get_air_valve_speed(self):
  22. temperature_target = await self.get_temperature_target()
  23. if temperature_target > 0:
  24. diff = self._equipment.space.realtime_temperature - temperature_target
  25. if diff >= 2.0:
  26. self._equipment.air_valve_speed = AirValveSpeed.high
  27. elif diff >= 1.0:
  28. self._equipment.air_valve_speed = AirValveSpeed.medium
  29. elif diff >= 0.0:
  30. self._equipment.air_valve_speed = AirValveSpeed.low
  31. else:
  32. self._equipment.air_valve_speed = AirValveSpeed.off
  33. else:
  34. self._equipment.air_valve_speed = AirValveSpeed.off
  35. async def get_running_status(self):
  36. if self._equipment.air_valve_speed == AirValveSpeed.off:
  37. self._equipment.running_status = False
  38. else:
  39. self._equipment.running_status = True
  40. async def run(self):
  41. await self.get_temperature_target()
  42. await self.get_air_valve_speed()
  43. await self.get_running_status()
  44. def get_results(self):
  45. return self._equipment
  46. @logger.catch()
  47. async def get_fcu_control_result(project_id: str, equipment_id: str) -> FCU:
  48. async with AsyncClient() as client:
  49. duo_duo = EquipmentInfoService(client, project_id)
  50. platform = DataPlatformService(client, project_id)
  51. spaces = await duo_duo.get_space_by_equipment(equipment_id)
  52. for sp in spaces:
  53. transfer = SpaceInfoService(client, project_id, sp.get('id'))
  54. current_target = await transfer.get_current_temperature_target()
  55. realtime_temperature = await platform.get_realtime_temperature(sp.get('id'))
  56. temp_space_params = {
  57. 'id': sp.get('id'),
  58. 'temperature_target': current_target,
  59. 'realtime_temperature': realtime_temperature
  60. }
  61. space = Space(**temp_space_params)
  62. break
  63. fcu_temp_params = {
  64. 'id': equipment_id,
  65. 'space': space
  66. }
  67. fcu = FCU(**fcu_temp_params)
  68. fcu_controller = FCUController(fcu)
  69. await fcu_controller.run()
  70. regulated_fcu = fcu_controller.get_results()
  71. return regulated_fcu