vav.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. # -*- coding: utf-8 -*-
  2. from typing import Tuple
  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.models.domain.equipment import VAVBox, FCU
  8. from app.models.domain.space import Space
  9. from app.services.platform import DataPlatformService
  10. from app.services.transfer import EquipmentInfoService, SpaceInfoService
  11. class VAVController(EquipmentController):
  12. def __init__(self, equipment: VAVBox):
  13. super(VAVController, self).__init__()
  14. self._equipment = equipment
  15. async def get_strategy(self):
  16. strategy = 'Plan A'
  17. for space in self._equipment.spaces:
  18. for eq in space.equipment:
  19. if isinstance(eq, FCU):
  20. strategy = 'Plan B'
  21. break
  22. return strategy
  23. async def get_temperature(self) -> Tuple[float, float]:
  24. target_list, realtime_list = [], []
  25. buffer_list = []
  26. strategy = await self.get_strategy()
  27. for space in self._equipment.spaces:
  28. if not np.isnan(space.temperature_target):
  29. target_list.append(space.temperature_target)
  30. realtime_list.append(space.realtime_temperature)
  31. if strategy == 'Plan B':
  32. for eq in space.equipment:
  33. logger.info(eq)
  34. if isinstance(eq, FCU):
  35. buffer = (4 - eq.air_valve_speed) / 4
  36. buffer_list.append(buffer)
  37. break
  38. logger.info(f'target list: {target_list}')
  39. logger.info(f'realtime list: {realtime_list}')
  40. logger.info(f'buffer list: {buffer_list}')
  41. total_target = buffer_list + target_list
  42. total_realtime = buffer_list + realtime_list
  43. if total_target and total_realtime:
  44. target_result = np.array(total_target).sum() / len(target_list)
  45. realtime_result = np.array(total_realtime).sum() / len(realtime_list)
  46. self._equipment.setting_temperature = target_result
  47. else:
  48. target_result, realtime_result = np.NAN, np.NAN
  49. return target_result, realtime_result
  50. async def get_supply_air_flow_set(self) -> float:
  51. temperature_set, temperature_realtime = await self.get_temperature()
  52. if np.isnan(temperature_set) or np.isnan(temperature_realtime):
  53. supply_air_flow_set = 0.0
  54. else:
  55. temperature_supply = self._equipment.supply_air_temperature
  56. if np.isnan(temperature_supply):
  57. temperature_supply = 19.0
  58. logger.info(f'supply air flow: {self._equipment.supply_air_flow}')
  59. logger.info(f'supply air temperature: {temperature_supply}')
  60. logger.info(f'set temperature: {temperature_set}')
  61. logger.info(f'realtime temperature: {temperature_realtime}')
  62. supply_air_flow_set = self._equipment.supply_air_flow * ((temperature_supply - temperature_realtime)
  63. / (temperature_supply - temperature_set))
  64. supply_air_flow_set = max(150.0, supply_air_flow_set)
  65. self._equipment.supply_air_flow_set = supply_air_flow_set
  66. return supply_air_flow_set
  67. async def run(self):
  68. await self.get_supply_air_flow_set()
  69. self._equipment.running_status = True
  70. def get_results(self):
  71. return self._equipment
  72. @logger.catch()
  73. async def get_vav_control_result(project_id: str, equipment_id: str) -> VAVBox:
  74. async with AsyncClient() as client:
  75. duo_duo = EquipmentInfoService(client, project_id)
  76. platform = DataPlatformService(client, project_id)
  77. _AHU_LIST = [
  78. 'Eq1101050030846e0a94670842109f7c8d8db0d44cf5',
  79. 'Eq1101050030b6b2f1db3d6944afa71e213e0d45d565'
  80. ]
  81. realtime_supply_air_temperature_list = []
  82. for eq in _AHU_LIST:
  83. realtime_supply_air_temperature_list.append(await platform.get_realtime_supply_air_temperature(eq))
  84. realtime_supply_air_temperature = np.array(realtime_supply_air_temperature_list).mean()
  85. realtime_supply_air_flow = await platform.get_realtime_supply_air_flow(equipment_id)
  86. served_spaces = await duo_duo.get_space_by_equipment(equipment_id)
  87. space_objects = []
  88. for sp in served_spaces:
  89. sp_id = sp.get('id')
  90. transfer = SpaceInfoService(client, project_id, sp_id)
  91. current_target = await transfer.get_current_temperature_target()
  92. realtime_temperature = await platform.get_realtime_temperature(sp_id)
  93. related_equipment = await transfer.get_equipment()
  94. equipment_objects = []
  95. for eq in related_equipment:
  96. if eq.get('category') == 'ACATFC':
  97. speed = await platform.get_fan_speed(eq.get('id'))
  98. temp_fcu_params = {'id': eq.get('id'), 'air_valve_speed': speed}
  99. fcu = FCU(**temp_fcu_params)
  100. equipment_objects.append(fcu)
  101. temp_space_params = {
  102. 'id': sp_id,
  103. 'realtime_temperature': realtime_temperature,
  104. 'equipment': equipment_objects,
  105. 'temperature_target': current_target
  106. }
  107. space = Space(**temp_space_params)
  108. space_objects.append(space)
  109. temp_vav_params = {
  110. 'id': equipment_id,
  111. 'spaces': space_objects,
  112. 'supply_air_temperature': realtime_supply_air_temperature,
  113. 'supply_air_flow': realtime_supply_air_flow,
  114. }
  115. vav = VAVBox(**temp_vav_params)
  116. vav_controller = VAVController(vav)
  117. await vav_controller.run()
  118. regulated_vav = vav_controller.get_results()
  119. return regulated_vav