Kaynağa Gözat

update vrf control logic

highing666 3 yıl önce
ebeveyn
işleme
295c276162
1 değiştirilmiş dosya ile 199 ekleme ve 58 silme
  1. 199 58
      app/controllers/equipment/vrf/basic.py

+ 199 - 58
app/controllers/equipment/vrf/basic.py

@@ -14,6 +14,7 @@ from app.models.domain.devices import ACATVIInstructionsRequest
 from app.models.domain.feedback import FeedbackValue
 from app.schemas.device.device import DeviceCreate
 from app.schemas.equipment import VRF
+from app.schemas.season import Season
 from app.schemas.device.status_timestamp import (
     BlowyFeedbackTimeCreate,
     BlowyFeedbackTimeUpdate,
@@ -32,9 +33,15 @@ class VRFController(EquipmentController):
 
     def get_switch_set(self) -> str:
         if np.isnan(self.target):
-            switch_set = "off"
+            if self.device.running_status:
+                switch_set = "off"
+            else:
+                switch_set = "hold"
         else:
-            switch_set = "on"
+            if self.device.running_status:
+                switch_set = "hold"
+            else:
+                switch_set = "on"
 
         self.device.equip_switch_set = switch_set
 
@@ -127,47 +134,118 @@ class VRFController1(VRFController):
         feedback: FeedbackValue,
         blow_feedback_time: datetime,
         high_speed_time: datetime,
+        season: Season,
     ):
         super(VRFController1, self).__init__(device, target, realtime)
         self.feedback = feedback
         self.blow_feedback_time = blow_feedback_time
         self.high_speed_time = high_speed_time
+        self.season = season
 
     def get_temperature_set(self) -> float:
-        new_temperature_set = self.device.current_temperature_set
+        if self.season == Season.transition:
+            new_temperature_set = np.NAN
+        elif self.season == Season.cooling:
+            new_temperature_set = np.NAN
+            if np.isnan(self.target):
+                return new_temperature_set
+
+            # Default temperature set.
+            if not self.device.running_status:
+                new_temperature_set = self.target
 
-        # Default temperature set.
-        if not self.device.running_status:
-            new_temperature_set = self.target
+            # lower limit.
+            if self.realtime <= 22.0:
+                new_temperature_set = 28.0
 
-        # lower limit.
-        if self.realtime <= 22.0:
-            new_temperature_set = 28.0
+            # recovery
+            # if self.device.temperature_set == 28.0 and self.realtime > 25.0:
+            #     new_temperature_set = self.target
 
-        # recovery
-        # if self.device.temperature_set == 28.0 and self.realtime > 25.0:
-        #     new_temperature_set = self.target
-
-        # feedback
-        if (
-            self.feedback == FeedbackValue.a_little_cold
-            or self.feedback == FeedbackValue.so_cold
-        ):
-            if self.feedback == FeedbackValue.so_cold and self.device.speed == "LL":
-                new_temperature_set = self.device.current_temperature_set + 2.0
-            else:
-                new_temperature_set = self.device.current_temperature_set + 1.0
-                if self.device.return_air_temp <= self.device.current_temperature_set:
+            # feedback
+            if self.feedback.value != "null" and self.device.current_temperature_set:
+                if (
+                    self.feedback == FeedbackValue.a_little_cold
+                    or self.feedback == FeedbackValue.so_cold
+                ):
                     if self.feedback == FeedbackValue.so_cold:
-                        new_temperature_set = self.device.current_temperature_set + 2.0
-        elif (
-            self.feedback == FeedbackValue.a_little_hot
-            or self.feedback == FeedbackValue.so_hot
-        ):
-            if self.feedback == FeedbackValue.so_hot and self.device.speed == "HH":
-                new_temperature_set = self.device.current_temperature_set - 2.0
-            else:
-                new_temperature_set = self.device.current_temperature_set - 1.0
+                        if self.device.speed == "LL":
+                            new_temperature_set = (
+                                self.device.current_temperature_set + 2.0
+                            )
+                        else:
+                            new_temperature_set = (
+                                self.device.current_temperature_set + 1.0
+                            )
+                    else:
+                        new_temperature_set = self.device.current_temperature_set + 1.0
+                elif (
+                    self.feedback == FeedbackValue.a_little_hot
+                    or self.feedback == FeedbackValue.so_hot
+                ):
+                    if (
+                        self.feedback == FeedbackValue.so_hot
+                        and self.device.speed == "HH"
+                    ):
+                        if self.device.speed == "HH":
+                            new_temperature_set = (
+                                self.device.current_temperature_set - 2.0
+                            )
+                        else:
+                            new_temperature_set = (
+                                self.device.current_temperature_set - 1.0
+                            )
+                    else:
+                        new_temperature_set = self.device.current_temperature_set - 1.0
+
+            if not np.isnan(new_temperature_set):
+                new_temperature_set = max(24.0, min(28.0, new_temperature_set))
+        else:
+            new_temperature_set = np.NAN
+            if np.isnan(self.target):
+                return new_temperature_set
+
+            if not self.device.running_status:
+                new_temperature_set = self.target
+
+            if self.realtime >= 27.0:
+                new_temperature_set = 18.0
+
+            if self.feedback.value != "null" and self.device.current_temperature_set:
+                if (
+                    self.feedback == FeedbackValue.a_little_cold
+                    or self.feedback == FeedbackValue.so_cold
+                ):
+                    if self.feedback == FeedbackValue.so_cold:
+                        if self.device.speed == "M":
+                            new_temperature_set = (
+                                self.device.current_temperature_set + 1.0
+                            )
+                        else:
+                            new_temperature_set = (
+                                self.device.current_temperature_set + 2.0
+                            )
+                    else:
+                        new_temperature_set = self.device.current_temperature_set + 1.0
+                elif (
+                    self.feedback == FeedbackValue.a_little_hot
+                    or self.feedback == FeedbackValue.so_hot
+                ):
+                    if self.feedback == FeedbackValue.so_hot:
+                        if self.device.speed == "M":
+                            new_temperature_set = (
+                                self.device.current_temperature_set - 1.0
+                            )
+                        else:
+                            new_temperature_set = (
+                                self.device.current_temperature_set - 2.0
+                            )
+
+                    else:
+                        new_temperature_set = self.device.current_temperature_set - 1.0
+
+            if not np.isnan(new_temperature_set):
+                new_temperature_set = max(18.0, min(24.0, new_temperature_set))
 
         new_temperature_set = round_half_up(new_temperature_set)
         self.device.temperature_set = new_temperature_set
@@ -175,36 +253,94 @@ class VRFController1(VRFController):
         return new_temperature_set
 
     def get_speed_set(self) -> str:
-        new_speed = self.device.speed
+        if self.season == Season.transition:
+            if np.isnan(self.target):
+                new_speed = "hold"
+            else:
+                if self.device.running_status:
+                    new_speed = "hold"
+                    if self.feedback == FeedbackValue.noisy_or_blowy:
+                        if self.device.speed == "HH":
+                            new_speed = "M"
+                        elif self.device.speed == "M":
+                            new_speed = "LL"
+                        else:
+                            new_speed = "LL"
+                else:
+                    new_speed = "M"
+        elif self.season == Season.cooling:
+            new_speed = "hold"
+            if np.isnan(self.target):
+                return new_speed
 
-        # Default speed set:
-        if not self.device.running_status:
-            new_speed = "M"
+            # Default speed set:
+            if not self.device.running_status:
+                new_speed = "M"
 
-        # Lower limit.
-        if self.realtime <= 22.0:
-            new_speed = "LL"
+            # Lower limit.
+            if self.realtime <= 22.0:
+                new_speed = "LL"
 
-        # Feedback.
-        if self.feedback == FeedbackValue.so_cold:
-            if self.device.return_air_temp > self.device.current_temperature_set:
+            # Feedback.
+            if self.feedback == FeedbackValue.so_cold:
+                if self.device.return_air_temp and self.device.current_temperature_set:
+                    if (
+                        self.device.return_air_temp
+                        > self.device.current_temperature_set
+                    ):
+                        if self.device.speed == "HH":
+                            new_speed = "M"
+                        elif self.device.speed == "M":
+                            new_speed = "LL"
+            elif self.feedback == FeedbackValue.so_hot:
+                if self.device.speed == "LL":
+                    new_speed = "M"
+                elif self.device.speed == "M":
+                    new_speed = "HH"
+            elif self.feedback == FeedbackValue.noisy_or_blowy:
                 if self.device.speed == "HH":
                     new_speed = "M"
                 elif self.device.speed == "M":
                     new_speed = "LL"
-        elif self.feedback == FeedbackValue.so_hot:
-            if self.device.speed == "LL":
-                new_speed = "M"
-            elif self.device.speed == "M":
-                new_speed = "HH"
-        elif self.feedback == FeedbackValue.noisy_or_blowy:
-            if self.device.speed == "HH":
+                else:
+                    new_speed = "LL"
+        else:
+            new_speed = "hold"
+            if np.isnan(self.target):
+                return new_speed
+
+            # Default speed set:
+            if not self.device.running_status:
                 new_speed = "M"
-            elif self.device.speed == "M":
-                new_speed = "LL"
-            else:
+
+            # Lower limit.
+            if self.realtime >= 28.0:
                 new_speed = "LL"
 
+            # Feedback.
+            if self.feedback == FeedbackValue.so_hot:
+                if self.device.return_air_temp and self.device.current_temperature_set:
+                    if (
+                        self.device.return_air_temp
+                        < self.device.current_temperature_set
+                    ):
+                        if self.device.speed == "HH":
+                            new_speed = "M"
+                        elif self.device.speed == "M":
+                            new_speed = "LL"
+            elif self.feedback == FeedbackValue.so_cold:
+                if self.device.speed == "LL":
+                    new_speed = "M"
+                elif self.device.speed == "M":
+                    new_speed = "HH"
+            elif self.feedback == FeedbackValue.noisy_or_blowy:
+                if self.device.speed == "HH":
+                    new_speed = "M"
+                elif self.device.speed == "M":
+                    new_speed = "LL"
+                else:
+                    new_speed = "LL"
+
         a_now = arrow.utcnow()
 
         # Restriction.
@@ -221,6 +357,11 @@ class VRFController1(VRFController):
 
         return new_speed
 
+    async def run(self):
+        self.get_switch_set()
+        self.get_speed_set()
+        self.get_temperature_set()
+
 
 async def query_status_time(db: Session, device_id: str) -> Tuple[datetime, datetime]:
     feedback_time_in_db = blowy_feedback_time.get_time_by_device(db, device_id)
@@ -296,6 +437,7 @@ async def build_acatvi_instructions(
         params.feedback,
         act_blowy_feedback_time,
         act_high_speed_time,
+        params.season,
     )
     await controller.run()
     regulated_vrf = controller.get_results()
@@ -340,11 +482,10 @@ async def build_acatvi_instructions(
                 ),
             )
 
-    instructions = {
-        "switch_set": regulated_vrf.equip_switch_set,
-        "speed_set": regulated_vrf.speed_set,
-        "temperature_set": regulated_vrf.temperature_set,
-        "mode_set": regulated_vrf.mode_set,
-    }
+    instructions = dict()
+    instructions.update({"switch_set": regulated_vrf.equip_switch_set})
+    instructions.update({"speed_set": regulated_vrf.speed_set})
+    if regulated_vrf.temperature_set and not np.isnan(regulated_vrf.temperature_set):
+        instructions.update({"temperature_set": regulated_vrf.temperature_set})
 
     return instructions