|
@@ -2,15 +2,13 @@ from typing import List
|
|
|
|
|
|
import arrow
|
|
|
import numpy as np
|
|
|
-from httpx import AsyncClient
|
|
|
from loguru import logger
|
|
|
|
|
|
-from app.controllers.equipment.ahu.thermal_mode import count_vav_box_weight, fetch_status_params
|
|
|
+from app.api.errors.iot import MissingIOTDataError
|
|
|
+from app.controllers.equipment.ahu.thermal_mode import count_vav_box_weight
|
|
|
from app.models.domain.devices import ThermalMode, ACATAHSupplyAirTempSetRequest
|
|
|
from app.schemas.equipment import VAVBox
|
|
|
-from app.services.platform import DataPlatformService, InfoCode
|
|
|
-from app.services.transfer import Duoduo, Season
|
|
|
-from app.services.weather import WeatherService
|
|
|
+from app.services.transfer import Season
|
|
|
from app.utils.date import get_time_str, TIME_FMT
|
|
|
|
|
|
|
|
@@ -108,25 +106,28 @@ class ACATAHSupplyAirTemperatureController:
|
|
|
return ratio
|
|
|
|
|
|
def build(self) -> float:
|
|
|
- if not self.is_off_to_on:
|
|
|
- normal_ratio = self.get_normal_ratio()
|
|
|
- if normal_ratio < 0.9:
|
|
|
- cold_ratio = self.get_cold_ratio()
|
|
|
- temperature = self.calculate_by_cold_vav(cold_ratio)
|
|
|
+ try:
|
|
|
+ if not self.is_off_to_on:
|
|
|
+ normal_ratio = self.get_normal_ratio()
|
|
|
+ if normal_ratio < 0.9:
|
|
|
+ cold_ratio = self.get_cold_ratio()
|
|
|
+ temperature = self.calculate_by_cold_vav(cold_ratio)
|
|
|
+ else:
|
|
|
+ temperature = self.current_set
|
|
|
else:
|
|
|
- temperature = self.current_set
|
|
|
- else:
|
|
|
+ if self.season == Season.heating:
|
|
|
+ temperature = 27.0
|
|
|
+ elif self.season == Season.cooling:
|
|
|
+ temperature = 20.0
|
|
|
+ else:
|
|
|
+ temperature = 25.0
|
|
|
+
|
|
|
if self.season == Season.heating:
|
|
|
- temperature = 27.0
|
|
|
- elif self.season == Season.cooling:
|
|
|
- temperature = 20.0
|
|
|
+ temperature = max(20.0, min(30.0, temperature))
|
|
|
else:
|
|
|
- temperature = 25.0
|
|
|
-
|
|
|
- if self.season == Season.heating:
|
|
|
- temperature = max(20.0, min(30.0, temperature))
|
|
|
- else:
|
|
|
- temperature = max(18.0, min(25.0, temperature))
|
|
|
+ temperature = max(18.0, min(25.0, temperature))
|
|
|
+ except TypeError:
|
|
|
+ raise MissingIOTDataError
|
|
|
|
|
|
return temperature
|
|
|
|
|
@@ -159,90 +160,7 @@ class ACATAHSupplyAirTemperatureDefaultController:
|
|
|
return temperature
|
|
|
|
|
|
|
|
|
-async def get_planned(project_id: str, device_id: str) -> float:
|
|
|
- vav_boxes_params = await fetch_status_params(project_id, device_id)
|
|
|
- vav_boxes_lit = vav_boxes_params["vav_boxes_list"]
|
|
|
- async with AsyncClient() as client:
|
|
|
- platform = DataPlatformService(client, project_id)
|
|
|
- duoduo = Duoduo(client, project_id)
|
|
|
-
|
|
|
- current_supply_air_temperature = await platform.get_realtime_supply_air_temperature(device_id)
|
|
|
- return_air_temperature = await platform.query_realtime_return_air_temperature(device_id)
|
|
|
-
|
|
|
- hot_water_valve_opening_set_duration = await platform.get_duration(
|
|
|
- InfoCode.hot_water_valve_opening_set, device_id, 15 * 60
|
|
|
- )
|
|
|
- chill_water_valve_opening_set_duration = await platform.get_duration(
|
|
|
- InfoCode.chill_water_valve_opening_set, device_id, 15 * 60
|
|
|
- )
|
|
|
- on_off_set_duration = await platform.get_duration(InfoCode.equip_switch_set, device_id, 20 * 60)
|
|
|
-
|
|
|
- season = await duoduo.get_season()
|
|
|
-
|
|
|
- if chill_water_valve_opening_set_duration[-1]["value"] == 0.0:
|
|
|
- thermal_mode = ThermalMode.heating
|
|
|
- else:
|
|
|
- thermal_mode = ThermalMode.cooling
|
|
|
-
|
|
|
- is_off_to_on = False
|
|
|
- if on_off_set_duration[-1]["value"] == 1.0:
|
|
|
- for item in on_off_set_duration[::-1]:
|
|
|
- if item["value"] == 0.0:
|
|
|
- is_off_to_on = True
|
|
|
- break
|
|
|
-
|
|
|
- is_thermal_mode_switched = False
|
|
|
- if len(set([item["value"] for item in hot_water_valve_opening_set_duration])) > 1:
|
|
|
- is_thermal_mode_switched = True
|
|
|
- if len(set([item["value"] for item in chill_water_valve_opening_set_duration])) > 1:
|
|
|
- is_thermal_mode_switched = True
|
|
|
-
|
|
|
- controller = ACATAHSupplyAirTemperatureController(
|
|
|
- vav_boxes_lit,
|
|
|
- current_supply_air_temperature,
|
|
|
- return_air_temperature,
|
|
|
- thermal_mode,
|
|
|
- is_off_to_on,
|
|
|
- is_thermal_mode_switched,
|
|
|
- season,
|
|
|
- )
|
|
|
- next_supply_air_temperature_set = controller.build()
|
|
|
-
|
|
|
- return next_supply_air_temperature_set
|
|
|
-
|
|
|
-
|
|
|
-async def get_default(project_id: str) -> float:
|
|
|
- async with AsyncClient() as client:
|
|
|
- weather_service = WeatherService(client)
|
|
|
- realtime_weather = await weather_service.get_realtime_weather(project_id)
|
|
|
-
|
|
|
- if realtime_weather.get("text") == "晴":
|
|
|
- is_clear_day = True
|
|
|
- else:
|
|
|
- is_clear_day = False
|
|
|
-
|
|
|
- controller = ACATAHSupplyAirTemperatureDefaultController(is_clear_day)
|
|
|
- next_supply_air_temperature_set = controller.build()
|
|
|
-
|
|
|
- return next_supply_air_temperature_set
|
|
|
-
|
|
|
-
|
|
|
-@logger.catch
|
|
|
-async def get_next_supply_air_temperature_set(project_id: str, device_id: str) -> float:
|
|
|
- try:
|
|
|
- new = await get_planned(project_id, device_id)
|
|
|
- except KeyError and IndexError:
|
|
|
- new = await get_default(project_id)
|
|
|
-
|
|
|
- logger.debug(f"next supply air temperature set: {device_id} - {new}")
|
|
|
-
|
|
|
- return new
|
|
|
-
|
|
|
-
|
|
|
-@logger.catch
|
|
|
-def build_acatah_supply_air_temperature_set(
|
|
|
- params: ACATAHSupplyAirTempSetRequest,
|
|
|
-) -> float:
|
|
|
+def build_acatah_supply_air_temperature_set(params: ACATAHSupplyAirTempSetRequest) -> float:
|
|
|
try:
|
|
|
vav_list = list()
|
|
|
for raw_vav in params.vav_list:
|