|
@@ -36,6 +36,24 @@ class StepSizeCalculator:
|
|
return self.weight.get(str(feedback.value)) * base_step_size
|
|
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):
|
|
class NewTargetBuilder(metaclass=ABCMeta):
|
|
"""
|
|
"""
|
|
Calculate a new target value.
|
|
Calculate a new target value.
|
|
@@ -529,6 +547,68 @@ class TemperatureTargetControllerV2:
|
|
return self.result
|
|
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()
|
|
@logger.catch()
|
|
async def temperature_target_control_v1(
|
|
async def temperature_target_control_v1(
|
|
project_id: str, space_id: str, feedback: FeedbackValue
|
|
project_id: str, space_id: str, feedback: FeedbackValue
|
|
@@ -568,10 +648,29 @@ async def temperature_target_control_v2(
|
|
|
|
|
|
|
|
|
|
@logger.catch()
|
|
@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(
|
|
async def get_target_after_feedback(
|
|
project_id: str, space_id: str, feedback: FeedbackValue
|
|
project_id: str, space_id: str, feedback: FeedbackValue
|
|
) -> float:
|
|
) -> 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(
|
|
temperature_target_raw_data = await TemperatureTargetCarrier(
|
|
project_id, space_id
|
|
project_id, space_id
|
|
).get_result()
|
|
).get_result()
|
|
@@ -584,6 +683,8 @@ async def get_target_after_feedback(
|
|
).get_result()
|
|
).get_result()
|
|
if project_id == "Pj1101050030" or project_id == 'Pj1101140020' or project_id == 'Pj1101050039':
|
|
if project_id == "Pj1101050030" or project_id == 'Pj1101140020' or project_id == 'Pj1101050039':
|
|
controller = TemperatureTargetController(temperature_target_data)
|
|
controller = TemperatureTargetController(temperature_target_data)
|
|
|
|
+ elif project_id == "Pj3301100002":
|
|
|
|
+ controller = TemperatureTargetControllerV3(temperature_target_data)
|
|
else:
|
|
else:
|
|
controller = TemperatureTargetControllerV2(temperature_target_data)
|
|
controller = TemperatureTargetControllerV2(temperature_target_data)
|
|
controller.run(feedback)
|
|
controller.run(feedback)
|