فهرست منبع

completed VAVBox controller version0.1

chenhaiyang 4 سال پیش
والد
کامیت
818d26cc3d
5فایلهای تغییر یافته به همراه155 افزوده شده و 0 حذف شده
  1. 16 0
      app/controllers/equipment/controller.py
  2. 37 0
      app/controllers/equipment/fcu.py
  3. 45 0
      app/controllers/equipment/vav.py
  4. 45 0
      app/models/equipment.py
  5. 12 0
      app/models/space.py

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

@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from abc import ABC, abstractmethod
+from app.controllers.controller import Controller
+
+
+class EquipmentController(Controller):
+
+    def __init__(self):
+        super(EquipmentController, self).__init__()
+        pass
+
+    @abstractmethod
+    async def run(self):
+        pass
+

+ 37 - 0
app/controllers/equipment/fcu.py

@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+import numpy as np
+
+from app.controllers.equipment.controller import EquipmentController
+from app.models.equipment import FCU, AirValveSpeed
+
+
+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 target is not np.NAN and target > 0:
+            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 and temperature_target > 0:
+            self._equipment.air_valve_speed = AirValveSpeed.auto
+        else:
+            self._equipment.air_valve_speed = AirValveSpeed.off
+
+    async def run(self):
+        await self.get_temperature_target()
+        await self.get_air_valve_speed()
+
+    def get_results(self):
+        return self._equipment

+ 45 - 0
app/controllers/equipment/vav.py

@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+
+import numpy as np
+
+from app.controllers.equipment.controller import EquipmentController
+from app.models.equipment import VAVBox, FCU
+
+
+class VAVController(EquipmentController):
+
+    def __init__(self, equipment: VAVBox):
+        super(VAVController, self).__init__()
+        self._equipment = equipment
+
+    async def get_strategy(self):
+        strategy = 'Plan A'
+        for space in self._equipment.spaces:
+            for eq in space.equipment:
+                if isinstance(eq, FCU):
+                    strategy = 'Plan B'
+                    break
+
+        return strategy
+
+    async def get_temperature_target(self) -> float:
+        total_targets = []
+        total_buffer = []
+        strategy = self.get_strategy()
+        for space in self._equipment.spaces:
+            if strategy == 'Plan A':
+                total_targets.append(space.temperature_target)
+            elif strategy == 'Plan B':
+                for eq in space.equipment:
+                    if isinstance(eq, FCU):
+                        buffer = (4 - eq.air_valve_speed) / 4
+                        total_buffer.append(buffer)
+                        break
+        total = total_buffer + total_targets
+        result = np.array(total).sum() / len(total_targets)
+        self._equipment.setting_temperature = result
+
+        return result
+
+    def run(self):
+        pass

+ 45 - 0
app/models/equipment.py

@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+
+from enum import Enum
+from typing import List, Optional
+
+from pydantic import BaseModel
+
+from app.models.space import Space
+
+
+class AirValveSpeed(int, Enum):
+    off = 0
+    low = 1
+    medium = 2
+    high = 3
+    auto = -1
+
+
+class BaseEquipment(BaseModel):
+    id: str
+    running_status: Optional[bool] = False
+    setting_temperature: Optional[float] = 0.0
+
+
+class FCU(BaseEquipment):
+    air_valve_speed: Optional[AirValveSpeed] = AirValveSpeed.off
+    water_valve_status: Optional[bool] = False
+    space: Space
+
+
+class VAVBox(BaseEquipment):
+    spaces: List[Space]
+
+
+if __name__ == '__main__':
+    external_data = {
+        'id': '123',
+        'running_status': True
+    }
+    fcu = FCU(**external_data)
+    print(fcu.id)
+    print(fcu.setting_temperature)
+    fcu.setting_temperature = 23.5
+    print(fcu.setting_temperature)
+    print(isinstance(fcu, FCU))

+ 12 - 0
app/models/space.py

@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+
+from typing import List
+
+from pydantic import BaseModel
+
+
+class Space(BaseModel):
+    id: str
+    realtime_temperature: float
+    equipment: List[str]
+    temperature_target: float