Kaynağa Gözat

amend fcu basic control

chenhaiyang 4 yıl önce
ebeveyn
işleme
ed2b888923

+ 12 - 13
app/api/routers/equipment.py

@@ -5,7 +5,7 @@ from enum import Enum
 from fastapi import APIRouter, Query
 from loguru import logger
 
-from app.controllers.equipment.fcu import get_fcu_control_result
+from app.controllers.equipment.fcu.basic import get_fcu_control_result
 from app.controllers.equipment.vav import get_vav_control_result
 from app.models.domain.equipment import EquipmentControlResponse, EquipmentControlRequest
 from app.utils.date import get_time_str
@@ -20,23 +20,22 @@ class EquipmentName(str, Enum):
 router = APIRouter()
 
 
-@router.get('/control', response_model=EquipmentControlResponse, tags=['equipment'])
+@router.get('/control', response_model=EquipmentControlResponse)
 async def get_equipment_command(
-        projectId: str = Query(..., max_length=50, regex='^Pj'),
-        equipId: str = Query(..., max_length=50, regex='^Eq'),
-        equipType: EquipmentName = Query(...),
-        method: int = Query(3),
+        project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'),
+        equip_id: str = Query(..., max_length=50, regex='^Eq', alias='equipId'),
+        equip_type: EquipmentName = Query(..., alias='equipType'),
 ):
-    if equipType.value == EquipmentName.FCU:
-        fcu = await get_fcu_control_result(projectId, equipId)
+    if equip_type.value == EquipmentName.FCU:
+        fcu = await get_fcu_control_result(project_id, equip_id)
         output = {
             'EquipSwitchSet': 1 if fcu.running_status else 0,
             'WorkModeSet': 3,
             'FanGearSet': fcu.air_valve_speed.value,
             'IndoorAirTempSet': fcu.setting_temperature
         }
-    elif equipType.value == EquipmentName.VAV:
-        vav = await get_vav_control_result(projectId, equipId)
+    elif equip_type.value == EquipmentName.VAV:
+        vav = await get_vav_control_result(project_id, equip_id)
         output = {
             'SupplyAirFlowSet': vav.supply_air_flow_set
         }
@@ -44,15 +43,15 @@ async def get_equipment_command(
         output = {}
 
     response = {
-        'projectId': projectId,
-        'equipId': equipId,
+        'projectId': project_id,
+        'equipId': equip_id,
         'time': get_time_str(),
         'output': output
     }
     return response
 
 
-@router.post('/control', response_model=EquipmentControlResponse, tags=['equipment'])
+@router.post('/control', response_model=EquipmentControlResponse)
 async def get_equipment_command_v2(equipment_control_info: EquipmentControlRequest):
     if equipment_control_info.equipType == EquipmentName.FCU:
         fcu = await get_fcu_control_result(equipment_control_info.projectId, equipment_control_info.equipId)

+ 87 - 0
app/controllers/equipment/fcu/basic.py

@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+import numpy as np
+from httpx import AsyncClient
+from loguru import logger
+
+from app.controllers.equipment.controller import EquipmentController
+from app.schemas.equipment import AirValveSpeed, FCU, Space
+from app.services.platform import DataPlatformService
+from app.services.transfer import SpaceInfoService, EquipmentInfoService
+
+
+class FCUController(EquipmentController):
+
+    def __init__(self, equipment: FCU):
+        super(FCUController, self).__init__()
+        self._equipment = equipment
+
+    async def get_temperature_target(self) -> float:
+        target = self._equipment.space.temperature_target
+        if not np.isnan(target):
+            setting_target = target
+        else:
+            setting_target = 25.0
+        self._equipment.setting_temperature = setting_target
+
+        return setting_target
+
+    async def get_air_valve_speed(self):
+        temperature_target = await self.get_temperature_target()
+        if temperature_target > 0:
+            diff = self._equipment.space.realtime_temperature - temperature_target
+            if diff >= 1.0:
+                self._equipment.air_valve_speed = AirValveSpeed.high
+            elif diff >= 0.5:
+                self._equipment.air_valve_speed = AirValveSpeed.medium
+            elif diff >= 0.0:
+                self._equipment.air_valve_speed = AirValveSpeed.low
+            else:
+                self._equipment.air_valve_speed = AirValveSpeed.off
+        else:
+            self._equipment.air_valve_speed = AirValveSpeed.off
+
+    async def get_running_status(self):
+        if self._equipment.air_valve_speed == AirValveSpeed.off:
+            self._equipment.running_status = False
+        else:
+            self._equipment.running_status = True
+
+    async def run(self):
+        await self.get_temperature_target()
+        await self.get_air_valve_speed()
+        await self.get_running_status()
+
+    def get_results(self):
+        return self._equipment
+
+
+@logger.catch()
+async def get_fcu_control_result(project_id: str, equipment_id: str) -> FCU:
+    async with AsyncClient() as client:
+        duo_duo = EquipmentInfoService(client, project_id)
+        platform = DataPlatformService(client, project_id)
+        spaces = await duo_duo.get_space_by_equipment(equipment_id)
+        for sp in spaces:
+            transfer = SpaceInfoService(client, project_id, sp.get('id'))
+            current_target = await transfer.get_current_temperature_target()
+            realtime_temperature = await platform.get_realtime_temperature(sp.get('id'))
+            temp_space_params = {
+                'id': sp.get('id'),
+                'temperature_target': current_target,
+                'realtime_temperature': realtime_temperature
+            }
+            space = Space(**temp_space_params)
+            break
+
+        fcu_temp_params = {
+            'id': equipment_id,
+            'space': space
+        }
+        fcu = FCU(**fcu_temp_params)
+
+    fcu_controller = FCUController(fcu)
+    await fcu_controller.run()
+    regulated_fcu = fcu_controller.get_results()
+
+    return regulated_fcu