from enum import Enum from typing import Dict, List, Optional from pydantic import BaseModel, Field from app.controllers.equipment.switch import SwitchSet from app.models.domain.feedback import FeedbackValue from app.schemas.season import Season from app.schemas.equipment import VRFMode 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 DevicesInstructionsBaseResponse(BaseModel): project_id: str = Field(None, alias="projectId") device_id: str = Field(None, alias="equipId") output: Dict class DevicesEarlyStartTime(BaseModel): project_id: str = Field(None, alias="projectId") space_id: str = Field(None, alias="spaceId") minutes: float 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 ACATVIInstructionsTemporaryResponse(BaseModel): output: Dict 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] 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_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