from enum import Enum from typing import List, Optional from pydantic import BaseModel, Field from app.controllers.equipment.switch import SwitchSet from app.models.domain.feedback import FeedbackValue from app.schemas.equipment import ASHP from app.schemas.equipment import VRFMode from app.schemas.season import Season class ThermalMode(str, Enum): cooling = "cooling" heating = "heating" hold = "hold" class Speed(str, Enum): off = "off" low = "low" medium = "medium" high = "high" hold = "hold" class ACATVIInstructionsRequest(BaseModel): device_id: str return_air_temperature: Optional[float] running_status: Optional[bool] work_mode: VRFMode current_speed: Optional[str] current_temperature_set: Optional[float] space_temperature_target: Optional[float] space_realtime_temperature: Optional[float] feedback: FeedbackValue on_time: Optional[str] off_time: Optional[str] class ACATVIInstructionsResponse(BaseModel): switch_set: Optional[str] speed_set: Optional[str] temperature_set: Optional[float] class ACATVIModeRequest(BaseModel): season: Season space_temperature_list: List[float] class ACATVIModeResponse(BaseModel): mode: str class ACATFCInstructionsRequestBase(BaseModel): device_id: str season: str space_temperature_target: Optional[float] space_realtime_temperature: Optional[float] running_status: Optional[bool] speed: Optional[Speed] feedback: FeedbackValue class ACATFC2InstructionsRequest(ACATFCInstructionsRequestBase): pass class ACATFC4InstructionsRequest(ACATFCInstructionsRequestBase): pass class ACATFCInstructionsResponseBase(BaseModel): speed_set: str switch_set: str class ACATFC2InstructionsResponse(ACATFCInstructionsResponseBase): water_valve_set: str class ACATFC4InstructionsResponse(ACATFCInstructionsResponseBase): chill_water_valve_set: str hot_water_valve_set: str class ACATFCInstructionsResponse(BaseModel): switch_set: int = Field(None, alias="onOff") speed_set: int = Field(None, alias="speed") temperature_set: float = Field(None, alias="temperature") mode_set: int = Field(None, alias="mode") water_valve_switch_set: int = Field(None, alias="water") class ACATFCEarlyStartPredictionRequest(BaseModel): season: Season space_id: Optional[str] device_id: str space_realtime_temperature: Optional[float] outdoor_realtime_temperature: Optional[float] class ACATFCEarlyStartPredictionResponse(BaseModel): minutes: float class Space(BaseModel): realtime_temperature: Optional[float] class ACATVASpace(Space): temperature_target: Optional[float] vav_default_weight: Optional[float] vav_temporary_weight: Optional[float] vav_temporary_update_time: Optional[str] class ACATAHSpace(Space): temperature_target: Optional[float] ahu_default_weight: Optional[float] ahu_temporary_weight: Optional[float] ahu_temporary_update_time: Optional[str] class ACATFUSpace(Space): realtime_co2: Optional[float] class ACATVAInstructionsRequestBase(BaseModel): device_id: str spaces: List[ACATVASpace] class ACATVAInstructionsRequest(ACATVAInstructionsRequestBase): season: str supply_air_temperature: Optional[float] acatah_supply_air_temperature: Optional[float] supply_air_flow: Optional[float] supply_air_flow_lower_limit: Optional[float] supply_air_flow_upper_limit: Optional[float] class ACATVAInstructionsRequestV2(ACATVAInstructionsRequestBase): season: str return_air_temperature: Optional[float] class ACATVAInstructionsResponse(BaseModel): supply_air_flow_set: float = Field(None, alias="SupplyAirFlowSet") virtual_temperature_target_set: float = Field(None, alias="TargetTemperatureSet") virtual_realtime_temperature: float = Field( None, alias="VirtualRealtimeTemperature" ) class ACATVAInstructionsResponseV2(BaseModel): temperature_target_set: float virtual_target_temperature: float virtual_realtime_temperature: float class ACATAHFreqSetRequest(BaseModel): device_id: str system_supply_static_press: Optional[float] system_supply_static_press_set: Optional[float] current_freq_set: Optional[float] supply_air_temperature_set_list: List[float] spaces_hot_rate: Optional[float] class ACATAHFreqSetResponse(BaseModel): freq_set: float class ACATAHInstructionsRequest(BaseModel): device_id: str season: Season spaces: List[ACATAHSpace] running_status: Optional[bool] return_air_temperature: Optional[float] return_air_temperature_set: Optional[float] supply_air_temperature: Optional[float] supply_air_temperature_set: Optional[float] freq: Optional[float] freq_set: Optional[float] fan_freq_upper_limit_set: Optional[float] fan_freq_lower_limit_set: Optional[float] class ACATAHInstructionsResponse(BaseModel): switch_set: str return_air_temp_set: Optional[float] supply_air_temp_set: Optional[float] freq_set: Optional[float] class SwitchSetRequestBase(BaseModel): device_id: str running_status: Optional[bool] in_cloud_status: Optional[bool] on_time: Optional[str] off_time: Optional[str] is_workday: Optional[bool] class SwitchSetResponseBase(BaseModel): switch_set: SwitchSet class ACVTSFSwitchSetRequest(SwitchSetRequestBase): pass class ACVTSFSwitchSetResponse(SwitchSetResponseBase): pass class ACATFUSwitchSetRequest(SwitchSetRequestBase): break_start_time: Optional[str] break_end_time: Optional[str] class ACATFUCO2SwitchSetRequest(ACATFUSwitchSetRequest): co2_list: List[float] class ACATFUSwitchSetResponse(SwitchSetResponseBase): pass class ACATAHSwitchSetRequest(SwitchSetRequestBase): break_start_time: Optional[str] break_end_time: Optional[str] class ACATAHSwitchSetResponse(SwitchSetResponseBase): pass class VAV(BaseModel): id: str virtual_realtime_temperature: Optional[float] virtual_temperature_target: Optional[float] supply_air_flow_lower_limit: Optional[float] supply_air_flow_upper_limit: Optional[float] supply_air_flow_set: Optional[float] supply_air_temperature: Optional[float] valve_opening: Optional[float] class ACATAHRequestBase(BaseModel): device_id: str season: str vav_list: List[VAV] class ACATAHThermalModeSetRequest(ACATAHRequestBase): pass class ACATAHThermalModeSetResponse(BaseModel): thermal_mode_set: ThermalMode class ACATAHSupplyAirTempSetRequest(ACATAHRequestBase): supply_air_temperature: Optional[float] supply_air_temperature_set: Optional[float] return_air_temperature: Optional[float] chill_water_valve_opening_set_list: List[float] hot_water_valve_opening_set_list: List[float] equip_switch_set_list: List[float] is_clear_day: Optional[bool] class ACATAHSupplyAirTempSetResponse(BaseModel): supply_air_temperature_set: float class ACATFUSupplyAirTempSetRequest(BaseModel): device_id: str season: Season supply_air_temperature_set: Optional[float] hot_ratio: Optional[float] cold_ratio: Optional[float] running_status_list: List[float] class ACATFUSupplyAirTempSetResponse(BaseModel): supply_air_temperature_set: float class ACATFUFreqSetRequest(BaseModel): device_id: str freq: Optional[float] fresh_air_temperature: Optional[float] spaces: List[ACATFUSpace] season: Season running_status_list: List[float] class ACATFUFreqSetResponse(BaseModel): freq_set: float class ASHPRequest(BaseModel): season: Season outdoor_temp: List[float] # 30min device_list: List[ASHP] class ASHPResponse(BaseModel): device_list: List[ASHP] interval: float is_warning: bool