basic.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # -*- coding: utf-8 -*-
  2. from typing import List, Optional
  3. import numpy as np
  4. from httpx import AsyncClient
  5. from loguru import logger
  6. from app.schemas.equipment import AHU
  7. from app.schemas.system import ACAT
  8. from app.services.platform import DataPlatformService, InfoCode
  9. from app.services.transfer import Duoduo
  10. class AHUController:
  11. def __init__(self, equipment: Optional[AHU] = None, system: Optional[ACAT] = None):
  12. super(AHUController, self).__init__()
  13. self._equipment = equipment
  14. self._system = system
  15. async def build_freq_set(self, supply_air_temperature_set_duration: List, hot_rate: float) -> float:
  16. extent = 5
  17. if (np.isnan(self._equipment.fan_freq_set)
  18. or np.isnan(self._system.supply_static_press)
  19. or np.isnan(self._system.supply_static_press_set)):
  20. temp_freq_set = 80.0
  21. else:
  22. pre_fan_freq_set = self._equipment.fan_freq_set
  23. if self._system.supply_static_press < self._system.supply_static_press_set - extent:
  24. temp_freq_set = pre_fan_freq_set + 2
  25. elif self._system.supply_static_press > self._system.supply_static_press_set + extent:
  26. temp_freq_set = pre_fan_freq_set - 2
  27. else:
  28. temp_freq_set = pre_fan_freq_set
  29. temperature_value_list = np.array([item['value'] for item in supply_air_temperature_set_duration])
  30. freq_upper_limit = 90.0
  31. if (temperature_value_list.size > 0
  32. and np.all(temperature_value_list == temperature_value_list[0])
  33. and temperature_value_list[0] <= 18.0
  34. and hot_rate >= 0.5):
  35. freq_upper_limit = 100.0
  36. freq_set = min(temp_freq_set, freq_upper_limit)
  37. self._equipment.fan_freq_set = freq_set
  38. return freq_set
  39. @logger.catch()
  40. async def get_freq_controlled(project_id: str, equipment_id: str) -> None:
  41. async with AsyncClient() as client:
  42. platform = DataPlatformService(client, project_id)
  43. review_service = Duoduo(client, project_id)
  44. fan_freq_set = await platform.get_realtime_fan_freq_set(equipment_id)
  45. # system = await equip_service.get_system_by_equipment(equipment_id)
  46. system = ['Sy1101050030eab54ad66b084a1cb1b919950b263280']
  47. press = await platform.get_realtime_supply_static_press(system[0])
  48. press_set = await platform.get_realtime_supply_static_press_set(system[0])
  49. count = await review_service.get_fill_count()
  50. try:
  51. hot_rate = count.get('hotNum') / (count.get('hotNum') + count.get('coldNum') + count.get('normalNum'))
  52. except ZeroDivisionError or KeyError:
  53. hot_rate = 0.0
  54. supply_air_temperature_set = await platform.get_duration(
  55. InfoCode.supply_air_temperature_set,
  56. equipment_id,
  57. 30 * 60
  58. )
  59. equip_params = {
  60. 'id': equipment_id,
  61. 'fan_freq_set': fan_freq_set
  62. }
  63. ahu = AHU(**equip_params)
  64. system_params = {
  65. 'id': system[0],
  66. 'supply_static_press': press,
  67. 'supply_static_press_set': press_set
  68. }
  69. acat_system = ACAT(**system_params)
  70. ahu_controller = AHUController(ahu, acat_system)
  71. new_freq_set = await ahu_controller.build_freq_set(supply_air_temperature_set, hot_rate)
  72. # logger.debug(f'{equipment_id} freq set: {new_freq_set}')
  73. async with AsyncClient() as client:
  74. platform = DataPlatformService(client, project_id)
  75. await platform.set_code_value(equipment_id, InfoCode.fan_freq_set, new_freq_set)