Browse Source

modify control logic of VAV

highing666 3 years ago
parent
commit
ac55066ec2
2 changed files with 31 additions and 16 deletions
  1. 30 16
      app/controllers/equipment/vav.py
  2. 1 0
      app/schemas/space.py

+ 30 - 16
app/controllers/equipment/vav.py

@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 
+from operator import attrgetter
 from typing import Dict, List, Tuple
 
 import numpy as np
@@ -135,17 +136,34 @@ class VAVControllerV2(VAVController):
             self.equipment.virtual_realtime_temperature = np.NAN
 
     async def rectify(self) -> Tuple[float, float]:
+        bad_spaces = list()
         for sp in self.equipment.spaces:
-            if sp.realtime_temperature < min(23.0, sp.temperature_target):
-                if self.season == Season.heating:
-                    self.equipment.virtual_target_temperature = min(23.0, sp.temperature_target) + 0.5
-                    self.equipment.virtual_realtime_temperature = sp.realtime_temperature
-                    break
-            elif sp.realtime_temperature > max(27.0, sp.temperature_target):
-                if self.season == Season.cooling:
-                    self.equipment.virtual_target_temperature = max(27.0, sp.temperature_target)
-                    self.equipment.virtual_realtime_temperature = sp.realtime_temperature
-                    break
+            if (sp.realtime_temperature > max(27.0, sp.temperature_target) or
+                    sp.realtime_temperature < min(21.0, sp.temperature_target)):
+                bad_spaces.append(sp)
+
+        if bad_spaces:
+            virtual_diff = self.equipment.virtual_target_temperature - self.equipment.virtual_realtime_temperature
+            if self.season == Season.cooling:
+                bad_spaces = sorted(bad_spaces, key=attrgetter('diff'))
+                worst = bad_spaces[0]
+                if worst.diff <= 0:
+                    if worst.diff < virtual_diff:
+                        self.equipment.virtual_target_temperature = worst.temperature_target
+                        self.equipment.virtual_realtime_temperature = worst.realtime_temperature
+                else:
+                    self.equipment.virtual_target_temperature = min(21.0, worst.temperature_target) + 0.5
+                    self.equipment.virtual_realtime_temperature = worst.realtime_temperature
+            elif self.season == Season.heating:
+                bad_spaces = sorted(bad_spaces, key=attrgetter('diff'), reverse=True)
+                worst = bad_spaces[0]
+                if worst.diff >= 0:
+                    if worst.diff > virtual_diff:
+                        self.equipment.virtual_target_temperature = worst.temperature_target
+                        self.equipment.virtual_realtime_temperature = worst.realtime_temperature
+                else:
+                    self.equipment.virtual_target_temperature = max(27.0, worst.temperature_target) - 0.5
+                    self.equipment.virtual_realtime_temperature = worst.realtime_temperature
 
         return self.equipment.virtual_target_temperature, self.equipment.virtual_realtime_temperature
 
@@ -161,11 +179,6 @@ async def fetch_vav_control_params(project_id: str, equipment_id: str) -> Dict:
         duo_duo = Duoduo(client, project_id)
         platform = DataPlatformService(client, project_id)
 
-        _AHU_LIST = [
-            'Eq1101050030846e0a94670842109f7c8d8db0d44cf5',
-            'Eq1101050030b6b2f1db3d6944afa71e213e0d45d565'
-        ]
-
         season = await duo_duo.get_season()
         served_spaces = await duo_duo.get_space_by_equipment(equipment_id)
         space_objects = []
@@ -192,7 +205,8 @@ async def fetch_vav_control_params(project_id: str, equipment_id: str) -> Dict:
                 'id': sp_id,
                 'realtime_temperature': realtime_temperature,
                 'equipment': equipment_objects,
-                'temperature_target': current_target
+                'temperature_target': current_target,
+                'diff': current_target - realtime_temperature
             }
             space = Space(**temp_space_params)
             space_objects.append(space)

+ 1 - 0
app/schemas/space.py

@@ -11,3 +11,4 @@ class Space(BaseModel):
     equipment: Optional[List]
     temperature_target: Optional[float]
     comfortable_temperature: Optional[float]
+    diff: Optional[float]