basic.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding: utf-8 -*-
  2. from typing import Dict, List, Optional
  3. import numpy as np
  4. from httpx import AsyncClient
  5. from loguru import logger
  6. from app.controllers.events import ahu_supply_air_temp_set_dict
  7. from app.schemas.equipment import AHU
  8. from app.schemas.system import ACAT
  9. from app.services.platform import DataPlatformService, InfoCode
  10. from app.services.transfer import ReviewService, EquipmentInfoService
  11. from app.services.weather import WeatherService
  12. class AHUController:
  13. def __init__(self, equipment: Optional[AHU] = None, system: Optional[ACAT] = None):
  14. super(AHUController, self).__init__()
  15. self._equipment = equipment
  16. self._system = system
  17. self._supply_air_temperature_command_dict = ahu_supply_air_temp_set_dict.get('dataframe')
  18. async def build_freq_set(self, supply_air_temperature_set_duration: List, hot_rate: float) -> float:
  19. extent = 5
  20. if np.isnan(self._equipment.fan_freq_set)\
  21. or np.isnan(self._system.supply_static_press)\
  22. or np.isnan(self._system.supply_static_press_set):
  23. temp_freq_set = 80.0
  24. else:
  25. pre_fan_freq_set = self._equipment.fan_freq_set
  26. if self._system.supply_static_press < self._system.supply_static_press_set - extent:
  27. temp_freq_set = pre_fan_freq_set + 2
  28. elif self._system.supply_static_press > self._system.supply_static_press_set + extent:
  29. temp_freq_set = pre_fan_freq_set - 2
  30. else:
  31. temp_freq_set = pre_fan_freq_set
  32. temperature_value_list = np.array([item['value'] for item in supply_air_temperature_set_duration])
  33. if temperature_value_list.size > 0\
  34. and np.all(temperature_value_list == temperature_value_list[0])\
  35. and temperature_value_list[0] <= 18.0\
  36. and hot_rate >= 0.5:
  37. freq_set = 100.0
  38. else:
  39. freq_set = min(temp_freq_set, 90.0)
  40. return freq_set
  41. async def build_supply_air_temperature_set(self, outdoor_temperature: float) -> float:
  42. command_df = self._supply_air_temperature_command_dict
  43. temp_command = command_df.loc[command_df['outdoor_temperature'] == outdoor_temperature]['temperature_set']
  44. if len(temp_command) > 0:
  45. command = float(temp_command)
  46. else:
  47. command = 20.0
  48. return command
  49. @logger.catch()
  50. async def get_freq_controlled(project_id: str, equipment_id: str) -> None:
  51. async with AsyncClient() as client:
  52. platform = DataPlatformService(client, project_id)
  53. review_service = ReviewService(client, project_id)
  54. # equip_service = EquipmentInfoService(client, project_id)
  55. fan_freq_set = await platform.get_realtime_fan_freq_set(equipment_id)
  56. # system = await equip_service.get_system_by_equipment(equipment_id)
  57. system = ['Sy1101050030eab54ad66b084a1cb1b919950b263280']
  58. press = await platform.get_realtime_supply_static_press(system[0])
  59. press_set = await platform.get_realtime_supply_static_press_set(system[0])
  60. hot_rate = await review_service.get_fill_rate()
  61. supply_air_temperature_set = await platform.get_duration(
  62. InfoCode.supply_air_temperature_set,
  63. equipment_id,
  64. 30 * 60
  65. )
  66. equip_params = {
  67. 'id': equipment_id,
  68. 'fan_freq_set': fan_freq_set
  69. }
  70. ahu = AHU(**equip_params)
  71. system_params = {
  72. 'id': system[0],
  73. 'supply_static_press': press,
  74. 'supply_static_press_set': press_set
  75. }
  76. acat_system = ACAT(**system_params)
  77. ahu_controller = AHUController(ahu, acat_system)
  78. new_freq_set = await ahu_controller.build_freq_set(supply_air_temperature_set, hot_rate)
  79. logger.debug(f'freq set: {new_freq_set}')
  80. async with AsyncClient() as client:
  81. platform = DataPlatformService(client, project_id)
  82. await platform.set_code_value(equipment_id, InfoCode.fan_freq_set, new_freq_set)
  83. @logger.catch()
  84. async def get_supply_air_temperature_controlled(project_id: str, equipment_id: str) -> None:
  85. async with AsyncClient() as client:
  86. weather_service = WeatherService(client)
  87. realtime_weather = await weather_service.get_realtime_weather(project_id)
  88. outdoor_temperature = realtime_weather.get('temperature')
  89. ahu_controller = AHUController()
  90. new_supply_air_temperature_set = await ahu_controller.build_supply_air_temperature_set(outdoor_temperature)
  91. logger.debug(f'supply air temperature set: {new_supply_air_temperature_set}')
  92. async with AsyncClient() as client:
  93. platform = DataPlatformService(client, project_id)
  94. await platform.set_code_value(equipment_id, InfoCode.supply_air_temperature_set, new_supply_air_temperature_set)