Explorar el Código

update VRF control logic

highing666 hace 3 años
padre
commit
7f811afda2

+ 24 - 12
app/api/routers/devices.py

@@ -1,6 +1,7 @@
 from fastapi import APIRouter, BackgroundTasks, Depends, Query
 from sqlalchemy.orm import Session
 
+import app.models.domain.devices as domain_devices
 from app.api.dependencies.db import get_db
 from app.controllers.equipment.ahu.supply_air_temperature_set import get_next_supply_air_temperature_set
 from app.controllers.equipment.ahu.thermal_mode import get_thermal_mode
@@ -10,7 +11,7 @@ from app.controllers.equipment.pau.freq_set import get_next_acatfu_freq_set
 from app.controllers.equipment.pau.supply_air_temperature_set import get_next_acatfu_supply_air_temperature_set
 from app.controllers.equipment.pau.switch import get_switch_action
 from app.controllers.equipment.vrf.basic import get_vrf_instructions
-from app.models.domain.devices import DevicesInstructionsBaseResponse, DevicesEarlyStartTime, ACATVIInstructionsRequest
+from app.models.domain.devices import DevicesInstructionsBaseResponse, DevicesEarlyStartTime
 
 router = APIRouter()
 
@@ -105,17 +106,6 @@ async def get_acatfu_freq_set(
     }
 
 
-@router.post('/instructions/acatvi', response_model=DevicesInstructionsBaseResponse)
-async def get_acatvi_instructions(device_info: ACATVIInstructionsRequest):
-    output = await get_vrf_instructions(device_info.equipId, device_info.spaceTempTarget, device_info.spaceRealTimeTemp)
-
-    return {
-        'projectId': device_info.projectId,
-        'equipId': device_info.equipId,
-        'output': output
-    }
-
-
 @router.get('/early-start/prediction/acatfc', response_model=DevicesEarlyStartTime)
 async def get_acatfc_early_start_time(
         project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'),
@@ -128,3 +118,25 @@ async def get_acatfc_early_start_time(
         'spaceId': space_id,
         'minutes': minutes
     }
+
+
+@router.post('/instructions/acatvi', response_model=domain_devices.ACATVIInstructionsTemporaryResponse)
+async def get_acatvi_instructions(device_info: domain_devices.ACATVIInstructionsRequest):
+    output = await get_vrf_instructions(
+        device_info.space_temp_target,
+        device_info.return_air_temp,
+        device_info.space_realtime_temp
+    )
+    resp = {'output': output}
+
+    return resp
+
+
+@router.post('/instructions/acatfc', response_model=domain_devices.ACATFCInstructionsResponse)
+async def get_acatfc_instructions(params: domain_devices.ACATFCInstructionsRequest):
+    pass
+
+
+@router.post('/instructions/acatva', response_model=domain_devices.ACATVAInstructionsResponse)
+async def get_acatva_instructions(params: domain_devices.ACATVAInstructionsRequest):
+    pass

+ 8 - 5
app/controllers/equipment/vrf/basic.py

@@ -1,4 +1,4 @@
-from typing import Dict, Optional
+from typing import Dict
 
 import numpy as np
 from loguru import logger
@@ -36,12 +36,13 @@ class VRFController(EquipmentController):
         return mode_set
 
     def get_temperature_set(self) -> float:
-        self.device.temperature_set = self.target
+        self.device.temperature_set = self.target + 2
 
         return self.target
 
     def get_speed_set(self) -> str:
-        diff = self.realtime - self.target
+        # diff = self.realtime - self.target
+        diff = self.device.return_air_temp - (self.target + 2)
         if diff < 0:
             speed = 'off'
         elif diff < 0.5:
@@ -72,10 +73,12 @@ class VRFController(EquipmentController):
 
 
 @logger.catch()
-async def get_vrf_instructions(device_id: str, target: float, realtime: float) -> Dict:
-    vrf = VRF(id=device_id)
+async def get_vrf_instructions(target: float, return_air_temp: float, realtime: float) -> Dict:
     target = np.NAN if target == -1.0 else target
     realtime = np.NAN if realtime == -1.0 else realtime
+    return_air_temp = np.NAN if realtime == -1.0 else return_air_temp
+
+    vrf = VRF(return_air_temp=return_air_temp)
 
     controller = VRFController(vrf, target, realtime)
     await controller.run()

+ 50 - 5
app/models/domain/devices.py

@@ -1,5 +1,5 @@
 from enum import Enum
-from typing import Dict
+from typing import Dict, List, Optional
 
 from pydantic import BaseModel
 
@@ -23,7 +23,52 @@ class DevicesEarlyStartTime(BaseModel):
 
 
 class ACATVIInstructionsRequest(BaseModel):
-    projectId: str
-    equipId: str
-    spaceTempTarget: float
-    spaceRealTimeTemp: float
+    return_air_temp: float
+    space_temp_target: float
+    space_realtime_temp: float
+
+
+class ACATVIInstructionsTemporaryResponse(BaseModel):
+    output: Dict
+
+
+class ACATVIInstructionsResponse(BaseModel):
+    switch_set: Optional[str]
+    speed_set: Optional[str]
+    temperature_set: Optional[str]
+    mode_set: Optional[str]
+
+
+class ACATFCInstructionsRequest(BaseModel):
+    pass
+
+
+class ACATFCInstructionsResponse(BaseModel):
+    switch_set: int
+    speed_set: int
+    temperature_set: float
+    mode_set: int
+    water_valve_switch_set: int
+
+
+class Space(BaseModel):
+    realtime_temperature: float
+    temperature_target: float
+    vav_default_weight: float
+    vav_temporary_weight: float
+    vav_temporary_update_time: float
+
+
+class ACATVAInstructionsRequest(BaseModel):
+    season: str
+    supply_air_temperature: float
+    supply_air_flow: float
+    supply_air_flow_lower_limit: float
+    supply_air_flow_upper_limit: float
+    spaces: List[Space]
+
+
+class ACATVAInstructionsResponse(BaseModel):
+    supply_air_flow_set: float
+    virtual_target_temperature_set: float
+    virtual_realtime_temperature: float

+ 2 - 1
app/schemas/equipment.py

@@ -17,7 +17,7 @@ class AirValveSpeed(float, Enum):
 
 
 class BaseEquipment(BaseModel):
-    id: str
+    id: Optional[str]
     running_status: Optional[bool] = False
     in_cloud_status: Optional[bool]
     on_time: Optional[str]
@@ -70,3 +70,4 @@ class VRF(BaseEquipment):
     speed_set: Optional[str]
     temperature_set: Optional[float]
     mode_set: Optional[str]
+    return_air_temp: Optional[float]