Pārlūkot izejas kodu

add target logic for zhijiang

chenhaiyang 2 gadi atpakaļ
vecāks
revīzija
371d6215a7
2 mainītis faili ar 107 papildinājumiem un 1 dzēšanām
  1. 5 0
      app/api/routers/targets.py
  2. 102 1
      app/controllers/targets/temperature.py

+ 5 - 0
app/api/routers/targets.py

@@ -7,6 +7,7 @@ from loguru import logger
 from app.controllers.targets.temperature import (
     temperature_target_control_v1,
     temperature_target_control_v2,
+    temperature_target_control_v3,
     get_target_after_feedback,
 )
 from app.models.domain.feedback import FeedbackValue
@@ -36,6 +37,10 @@ async def readjust_target(
                 need_run_room_control = await temperature_target_control_v1(
                     project_id, space_id, feedback
                 )
+            elif project_id == "Pj3301100002":
+                need_run_room_control = await temperature_target_control_v3(
+                    project_id, space_id, feedback
+                )
             else:
                 need_run_room_control = await temperature_target_control_v2(
                     project_id, space_id, feedback

+ 102 - 1
app/controllers/targets/temperature.py

@@ -36,6 +36,24 @@ class StepSizeCalculator:
         return self.weight.get(str(feedback.value)) * base_step_size
 
 
+class SimpleStepSizeCalculator:
+    """
+    Zhijiang, this is for you!
+    """
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def run(feedback: FeedbackValue) -> float:
+        if feedback == FeedbackValue.so_hot or feedback == FeedbackValue.a_little_hot:
+            step_size = -1
+        else:
+            step_size = 1
+
+        return step_size
+
+
 class NewTargetBuilder(metaclass=ABCMeta):
     """
     Calculate a new target value.
@@ -529,6 +547,68 @@ class TemperatureTargetControllerV2:
         return self.result
 
 
+class TemperatureTargetControllerV3:
+    """
+    Primary flow of temperature target adjustment for Zhijiang.
+    """
+
+    def __init__(self, data: dict):
+        self.data = data
+        self.result = {}
+
+    def run(self, feedback: FeedbackValue):
+        need_switch_off = False
+        new_temporary_target = {}
+        new_global_target = {}
+        new_actual_target = 0
+        if feedback == FeedbackValue.switch_off:
+            need_switch_off = True
+            need_run_room_control = True
+        elif feedback == FeedbackValue.switch_on:
+            need_run_room_control = True
+            if not self.data["is_customized"]:
+                new_lower, new_upper = TemporaryTargetInit(1, 24).build(
+                    self.data["extent"],
+                    self.data["season"],
+                    self.data["realtime_temperature"],
+                )
+                new_temporary_target = TemporaryTargetBuilder(
+                    new_lower, new_upper
+                ).build()
+        elif (
+                feedback == FeedbackValue.a_little_hot
+                or feedback == FeedbackValue.a_little_cold
+                or feedback == FeedbackValue.so_hot
+                or feedback == FeedbackValue.so_cold
+        ):
+            step_size = SimpleStepSizeCalculator.run(feedback)
+            new_actual_target = NewTemperatureTargetBuilder(
+                self.data["realtime_temperature"],
+                self.data["current_target"],
+                step_size,
+            ).build()
+            need_run_room_control = True
+            if new_actual_target != self.data["current_target"]:
+                new_global_target = SimpleGlobalTemperatureTargetBuilder(
+                    self.data["target"]
+                ).build(new_actual_target)
+        else:
+            need_run_room_control = False
+
+        self.result.update(
+            {
+                "need_switch_off": need_switch_off,
+                "new_temporary_target": new_temporary_target,
+                "new_global_target": new_global_target,
+                "new_actual_target": new_actual_target,
+                "need_run_room_control": need_run_room_control,
+            }
+        )
+
+    def get_result(self) -> dict:
+        return self.result
+
+
 @logger.catch()
 async def temperature_target_control_v1(
         project_id: str, space_id: str, feedback: FeedbackValue
@@ -568,10 +648,29 @@ async def temperature_target_control_v2(
 
 
 @logger.catch()
+async def temperature_target_control_v3(
+        project_id: str, space_id: str, feedback: FeedbackValue
+) -> bool:
+    temperature_target_raw_data = await TemperatureTargetCarrier(
+        project_id, space_id
+    ).get_result()
+    temperature_target_data = TemperatureTargetPacker(
+        temperature_target_raw_data
+    ).get_result()
+    controller = TemperatureTargetControllerV3(temperature_target_data)
+    controller.run(feedback)
+    controlled_result = controller.get_result()
+    await TargetDeliver(project_id, space_id).send(controlled_result)
+
+    return controlled_result["need_run_room_control"]
+
+
+@logger.catch()
 async def get_target_after_feedback(
         project_id: str, space_id: str, feedback: FeedbackValue
 ) -> float:
-    if project_id == "Pj1101050030" or project_id == "Pj1101140020" or project_id == "Pj1101050039":
+    if (project_id == "Pj1101050030" or project_id == "Pj1101140020" or project_id == "Pj1101050039"
+            or project_id == "Pj3301100002"):
         temperature_target_raw_data = await TemperatureTargetCarrier(
             project_id, space_id
         ).get_result()
@@ -584,6 +683,8 @@ async def get_target_after_feedback(
     ).get_result()
     if project_id == "Pj1101050030" or project_id == 'Pj1101140020' or project_id == 'Pj1101050039':
         controller = TemperatureTargetController(temperature_target_data)
+    elif project_id == "Pj3301100002":
+        controller = TemperatureTargetControllerV3(temperature_target_data)
     else:
         controller = TemperatureTargetControllerV2(temperature_target_data)
     controller.run(feedback)