ソースを参照

add VRF control logic

highing666 4 年 前
コミット
8aa0b00808

+ 13 - 1
app/api/routers/devices.py

@@ -9,7 +9,8 @@ from app.controllers.equipment.fcu.on_ratio import start_on_ratio_mode
 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.models.domain.devices import DevicesInstructionsBaseResponse, DevicesEarlyStartTime
+from app.controllers.equipment.vrf.basic import get_vrf_instructions
+from app.models.domain.devices import DevicesInstructionsBaseResponse, DevicesEarlyStartTime, ACATVIInstructionsRequest
 
 router = APIRouter()
 
@@ -104,6 +105,17 @@ 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'),

+ 0 - 1
app/controllers/equipment/controller.py

@@ -9,7 +9,6 @@ class EquipmentController(Controller):
 
     def __init__(self):
         super(EquipmentController, self).__init__()
-        pass
 
     @abstractmethod
     async def run(self):

+ 92 - 0
app/controllers/equipment/vrf/basic.py

@@ -0,0 +1,92 @@
+from typing import Dict, Optional
+
+from loguru import logger
+
+from app.controllers.equipment.controller import EquipmentController
+from app.schemas.equipment import VRF
+
+
+class VRFController(EquipmentController):
+
+    def __init__(self, device: VRF, target: float, realtime: float):
+        super(VRFController, self).__init__()
+        self.device = device
+        self.target = target
+        self.realtime = realtime
+
+    def get_switch_set(self, speed: Optional[str] = 'off') -> bool:
+        if self.target and self.target:
+            if speed == 'off':
+                switch_set = False
+            else:
+                switch_set = True
+        else:
+            switch_set = False
+
+        self.device.equip_switch_set = switch_set
+
+        return switch_set
+
+    def get_mode_set(self) -> str:
+        if self.target > self.realtime:
+            mode_set = 'cooling'
+        else:
+            mode_set = 'cooling'
+
+        self.device.mode_set = mode_set
+
+        return mode_set
+
+    def get_temperature_set(self) -> float:
+        self.device.temperature_set = self.target
+
+        return self.target
+
+    def get_speed_set(self) -> str:
+        diff = self.realtime - self.target
+        if diff < 0:
+            speed = 'off'
+        elif diff < 0.5:
+            speed = 'LL'
+        elif diff < 1.0:
+            speed = 'L'
+        elif diff < 1.5:
+            speed = 'M'
+        elif diff < 2.0:
+            speed = 'H'
+        elif diff >= 2.0:
+            speed = 'HH'
+        else:
+            speed = 'unknown'
+
+        self.device.speed_set = speed
+
+        return speed
+
+    async def run(self):
+        if self.target and self.realtime:
+            speed = self.get_speed_set()
+            self.get_switch_set(speed)
+            self.get_mode_set()
+            self.get_temperature_set()
+        else:
+            self.get_switch_set()
+
+    def get_results(self):
+        return self.device
+
+
+@logger.catch()
+async def get_vrf_instructions(device_id: str, target: float, realtime: float) -> Dict:
+    vrf = VRF(id=device_id)
+    controller = VRFController(vrf, target, realtime)
+    await controller.run()
+    regulated_vrf = controller.get_results()
+
+    output = {'switch_set': 'on' if regulated_vrf.equip_switch_set else 'off'}
+    if regulated_vrf.equip_switch_set:
+        output.update({'speed_set': regulated_vrf.speed_set})
+        output.update({'temperature_set': regulated_vrf.temperature_set})
+        output.update({'mode_set': regulated_vrf.mode_set})
+
+    return output

+ 7 - 0
app/models/domain/devices.py

@@ -20,3 +20,10 @@ class DevicesEarlyStartTime(BaseModel):
     projectId: str
     spaceId: str
     minutes: float
+
+
+class ACATVIInstructionsRequest(BaseModel):
+    projectId: str
+    equipId: str
+    spaceTempTarget: float
+    spaceRealTimeTemp: float

+ 6 - 0
app/schemas/equipment.py

@@ -57,3 +57,9 @@ class VentilationFan(BaseEquipment):
 
 class PAU(BaseEquipment):
     pass
+
+
+class VRF(BaseEquipment):
+    speed_set: Optional[str]
+    temperature_set: Optional[float]
+    mode_set: Optional[str]