Prechádzať zdrojové kódy

amend VRF control logic

highing666 3 rokov pred
rodič
commit
29d457ac2f

+ 99 - 25
app/controllers/equipment/vrf/basic.py

@@ -5,6 +5,7 @@ from loguru import logger
 
 from app.controllers.equipment.controller import EquipmentController
 from app.models.domain.devices import ACATVIInstructionsRequest
+from app.models.domain.feedback import FeedbackValue
 from app.schemas.equipment import VRF
 from app.utils.math import round_half_up
 
@@ -82,59 +83,132 @@ class VRFController(EquipmentController):
         return speed
 
     async def run(self):
-        need_send = False
         if self.get_switch_set() == 'on':
             self.get_speed_set()
             self.get_mode_set()
             self.get_temperature_set()
 
-            if self.device.temperature_set != self.device.current_temperature_set:
-                need_send = True
-            if self.device.speed_set != self.device.speed:
-                need_send = True
-            if self.device.equip_switch_set == 'on' and not self.device.running_status:
-                need_send = True
+            if self.device.temperature_set == self.device.current_temperature_set:
+                self.device.temperature_set = 0.0
 
-        if self.device.equip_switch_set == 'off' and self.device.running_status:
-            need_send = True
+            if self.device.speed_set == self.device.speed:
+                self.device.speed_set = 'hold'
+                self.device.equip_switch_set = 'hold'
 
-        return need_send
+            if not self.device.running_status:
+                self.device.equip_switch_set = 'on'
+                self.get_speed_set()
+        else:
+            if not self.device.running_status:
+                self.device.equip_switch_set = 'hold'
 
     def get_results(self):
         return self.device
 
 
+class VRFController1(VRFController):
+
+    def __init__(self, device: VRF,  target: float, realtime: float, feedback: FeedbackValue):
+        super(VRFController1, self).__init__(device, target, realtime)
+        self.feedback = feedback
+
+    def get_temperature_set(self) -> float:
+        new_temperature_set = self.device.current_temperature_set
+
+        # 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
+
+        # 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:
+                    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
+
+        new_temperature_set = round_half_up(new_temperature_set)
+        self.device.temperature_set = new_temperature_set
+
+        return new_temperature_set
+
+    def get_speed_set(self) -> str:
+        new_speed = self.device.speed
+
+        # Default speed set:
+        if not self.device.running_status:
+            new_speed = 'M'
+
+        # 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:
+                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'
+            else:
+                new_speed = 'LL'
+
+        self.device.speed_set = new_speed
+
+        return new_speed
+
+
 @logger.catch()
 async def build_acatvi_instructions(params: ACATVIInstructionsRequest) -> Dict:
     target = np.NAN if params.space_temperature_target == -1.0 else params.space_temperature_target
     realtime = np.NAN if params.space_realtime_temperature == -1.0 else params.space_realtime_temperature
     return_air_temp = np.NAN if params.return_air_temperature == -1.0 else params.return_air_temperature
-
-    if params.running_status == 'missing':
-        return {'need_send': False}
-    elif params.running_status == 'on':
-        running_status = True
-    else:
-        running_status = False
+    running_status = False if params.running_status == 'off' else True
+    current_temperature_set = np.NAN if params.current_temperature_set == -1.0 else round_half_up(
+        params.current_temperature_set
+    )
 
     vrf = VRF(
         return_air_temp=return_air_temp,
-        current_temperature_set=np.NAN if params.current_temperature_set == -1.0 else params.current_temperature_set,
+        current_temperature_set=current_temperature_set,
         speed=params.current_speed,
         running_status=running_status
     )
 
-    controller = VRFController(vrf, target, realtime)
-    need_send = await controller.run()
+    controller = VRFController1(vrf, target, realtime, params.feedback)
+    await controller.run()
     regulated_vrf = controller.get_results()
 
     instructions = {
         'switch_set': regulated_vrf.equip_switch_set,
-        'need_send': need_send
+        'speed_set': regulated_vrf.speed_set,
+        'temperature_set': regulated_vrf.temperature_set,
+        'mode_set': regulated_vrf.mode_set
     }
-    if regulated_vrf.equip_switch_set == 'on':
-        instructions.update({'speed_set': regulated_vrf.speed_set})
-        instructions.update({'temperature_set': regulated_vrf.temperature_set})
-        instructions.update({'mode_set': regulated_vrf.mode_set})
 
     return instructions

+ 3 - 1
app/models/domain/devices.py

@@ -3,6 +3,8 @@ from typing import Dict, List, Optional
 
 from pydantic import BaseModel, Field
 
+from app.models.domain.feedback import FeedbackValue
+
 
 class ThermalMode(str, Enum):
     cooling = 'cooling'
@@ -29,6 +31,7 @@ class ACATVIInstructionsRequest(BaseModel):
     current_temperature_set: float
     space_temperature_target: float
     space_realtime_temperature: float
+    feedback: FeedbackValue
 
 
 class ACATVIInstructionsTemporaryResponse(BaseModel):
@@ -40,7 +43,6 @@ class ACATVIInstructionsResponse(BaseModel):
     speed_set: Optional[str]
     temperature_set: Optional[str]
     mode_set: Optional[str]
-    need_send: bool
 
 
 class ACATFCInstructionsRequest(BaseModel):