|
@@ -1,7 +1,6 @@
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
from abc import ABCMeta, abstractmethod
|
|
|
-from typing import Dict, Tuple
|
|
|
|
|
|
import arrow
|
|
|
import numpy as np
|
|
@@ -25,24 +24,16 @@ class StepSizeCalculator:
|
|
|
Calculate adjustment step size of environment target when a user send feedback.
|
|
|
"""
|
|
|
|
|
|
- def __init__(self, weight: Dict):
|
|
|
+ def __init__(self, weight: dict[str, int]):
|
|
|
self.weight = weight
|
|
|
|
|
|
- def run(
|
|
|
- self,
|
|
|
- realtime_temperature: float,
|
|
|
- comfortable_temperature: float,
|
|
|
- feedback: FeedbackValue,
|
|
|
- ) -> float:
|
|
|
+ def run(self, realtime_temperature: float, comfortable_temperature: float, feedback: FeedbackValue) -> float:
|
|
|
if feedback == FeedbackValue.so_hot or feedback == FeedbackValue.a_little_hot:
|
|
|
- base_step_size = 1.8 / (
|
|
|
- 1 + np.exp((comfortable_temperature - realtime_temperature) / 2)
|
|
|
- )
|
|
|
+ base_step_size = 1.8 / (1 + np.exp((comfortable_temperature - realtime_temperature) / 2))
|
|
|
else:
|
|
|
- base_step_size = 1.8 / (
|
|
|
- 1 + np.exp((realtime_temperature - comfortable_temperature) / 2)
|
|
|
- )
|
|
|
- return self.weight.get(feedback.value) * base_step_size
|
|
|
+ base_step_size = 1.8 / (1 + np.exp((realtime_temperature - comfortable_temperature) / 2))
|
|
|
+
|
|
|
+ return self.weight.get(str(feedback.value)) * base_step_size
|
|
|
|
|
|
|
|
|
class NewTargetBuilder(metaclass=ABCMeta):
|
|
@@ -76,7 +67,7 @@ class NewTemperatureTargetBuilder(NewTargetBuilder):
|
|
|
"""
|
|
|
|
|
|
def __init__(
|
|
|
- self, realtime_temperature: float, actual_target: float, step_size: float
|
|
|
+ self, realtime_temperature: float, actual_target: float, step_size: float
|
|
|
):
|
|
|
self.realtime_temperature = realtime_temperature
|
|
|
self.actual_target = actual_target
|
|
@@ -104,11 +95,11 @@ class TemporaryTargetInit:
|
|
|
self.default_target = default_target
|
|
|
|
|
|
def build(
|
|
|
- self,
|
|
|
- extent: float,
|
|
|
- season: Season,
|
|
|
- realtime_temperature: float,
|
|
|
- ) -> Tuple[float, float]:
|
|
|
+ self,
|
|
|
+ extent: float,
|
|
|
+ season: Season,
|
|
|
+ realtime_temperature: float,
|
|
|
+ ) -> tuple[float, float]:
|
|
|
if np.isnan(realtime_temperature):
|
|
|
upper_bound, lower_bound = (
|
|
|
self.default_target + 1.0,
|
|
@@ -124,7 +115,7 @@ class TemporaryTargetInit:
|
|
|
clipper = Clipper()
|
|
|
actual_target = clipper.cut(actual_target)
|
|
|
upper_bound, lower_bound = actual_target + (extent / 2), actual_target - (
|
|
|
- extent / 2
|
|
|
+ extent / 2
|
|
|
)
|
|
|
|
|
|
return lower_bound, upper_bound
|
|
@@ -136,7 +127,7 @@ class GlobalTargetBaseBuilder(metaclass=ABCMeta):
|
|
|
"""
|
|
|
|
|
|
@abstractmethod
|
|
|
- def build(self, new_actual_target: float) -> Dict:
|
|
|
+ def build(self, new_actual_target: float) -> dict:
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
@@ -148,20 +139,11 @@ class SimpleGlobalTemperatureTargetBuilder(GlobalTargetBaseBuilder):
|
|
|
def __init__(self, current_global_target: TemperatureTarget):
|
|
|
self.current_global_target = current_global_target
|
|
|
|
|
|
- def build(self, new_actual_target: float) -> Dict:
|
|
|
+ def build(self, new_actual_target: float) -> dict:
|
|
|
result = {}
|
|
|
half_extent = self.current_global_target.extent / 2
|
|
|
- for time_index in self.current_global_target.target_schedule[
|
|
|
- "temperatureMin"
|
|
|
- ].keys():
|
|
|
- result.update(
|
|
|
- {
|
|
|
- time_index: [
|
|
|
- new_actual_target - half_extent,
|
|
|
- new_actual_target + half_extent,
|
|
|
- ]
|
|
|
- }
|
|
|
- )
|
|
|
+ for time_index in self.current_global_target.target_schedule["temperatureMin"].keys():
|
|
|
+ result.update({time_index: [new_actual_target - half_extent, new_actual_target + half_extent]})
|
|
|
|
|
|
return result
|
|
|
|
|
@@ -172,12 +154,12 @@ class ExpSmoothingTemperatureTargetBuilder(GlobalTargetBaseBuilder):
|
|
|
"""
|
|
|
|
|
|
def __init__(
|
|
|
- self, current_global_target: TemperatureTarget, previous_changes: pd.DataFrame
|
|
|
+ self, current_global_target: TemperatureTarget, previous_changes: pd.DataFrame
|
|
|
):
|
|
|
self.current_global_target = current_global_target
|
|
|
self.previous_changes = previous_changes
|
|
|
|
|
|
- def build(self, new_actual_target: float) -> Dict:
|
|
|
+ def build(self, new_actual_target: float) -> dict:
|
|
|
now_time = arrow.get(get_time_str(), TIME_FMT).time().strftime("%H%M%S")
|
|
|
half_extent = self.current_global_target.extent / 2
|
|
|
previous_changes = pd.concat(
|
|
@@ -194,20 +176,13 @@ class ExpSmoothingTemperatureTargetBuilder(GlobalTargetBaseBuilder):
|
|
|
time_index = self.current_global_target.target_schedule["temperatureMin"].keys()
|
|
|
for item in time_index:
|
|
|
previous_changes["delta"] = previous_changes["timestamp"].apply(
|
|
|
- lambda x: abs(
|
|
|
- arrow.get(str(x), "HHmmss") - arrow.get(item, "HHmmss")
|
|
|
- ).seconds
|
|
|
- // (15 * 60)
|
|
|
- )
|
|
|
- previous_changes["weight2"] = previous_changes["delta"].apply(
|
|
|
- lambda x: 0.5 ** x
|
|
|
- )
|
|
|
- previous_changes["weight"] = (
|
|
|
- previous_changes["weight1"] * previous_changes["weight2"]
|
|
|
+ lambda x: abs(arrow.get(str(x), "HHmmss") - arrow.get(item, "HHmmss")).seconds // (15 * 60)
|
|
|
)
|
|
|
+ previous_changes["weight2"] = previous_changes["delta"].apply(lambda x: 0.5 ** x)
|
|
|
+ previous_changes["weight"] = (previous_changes["weight1"] * previous_changes["weight2"])
|
|
|
temp_target = (
|
|
|
- previous_changes["value"] * previous_changes["weight"]
|
|
|
- ).sum() / previous_changes["weight"].sum()
|
|
|
+ previous_changes["value"] * previous_changes["weight"]
|
|
|
+ ).sum() / previous_changes["weight"].sum()
|
|
|
new_targets.update(
|
|
|
{item: [temp_target - half_extent, temp_target + half_extent]}
|
|
|
)
|
|
@@ -224,7 +199,7 @@ class TemporaryTargetBuilder:
|
|
|
self.lower_target = lower_target
|
|
|
self.upper_target = upper_target
|
|
|
|
|
|
- def build(self) -> Dict:
|
|
|
+ def build(self) -> dict:
|
|
|
now_str = get_time_str()
|
|
|
time_index = (
|
|
|
arrow.get(
|
|
@@ -255,7 +230,7 @@ class Packer(metaclass=ABCMeta):
|
|
|
"""
|
|
|
|
|
|
@abstractmethod
|
|
|
- def run(self) -> Dict:
|
|
|
+ def run(self) -> dict:
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
@@ -306,7 +281,7 @@ class TemperatureTargetCarrier(Carrier):
|
|
|
"season": season,
|
|
|
}
|
|
|
|
|
|
- async def get_result(self) -> Dict:
|
|
|
+ async def get_result(self) -> dict:
|
|
|
await self.fetch_all()
|
|
|
return self.result
|
|
|
|
|
@@ -323,7 +298,7 @@ class TemperatureTargetV2Carrier(TemperatureTargetCarrier):
|
|
|
|
|
|
self.result.update({"previous_changes": previous_changes["temperature"]})
|
|
|
|
|
|
- async def get_result(self) -> Dict:
|
|
|
+ async def get_result(self) -> dict:
|
|
|
await self.fetch_all()
|
|
|
await self.fetch_previous_changes()
|
|
|
return self.result
|
|
@@ -341,8 +316,8 @@ class TemperatureTargetPacker:
|
|
|
all_day_targets = self.result["all_day_targets"]
|
|
|
if len(all_day_targets) > 0:
|
|
|
extent = (
|
|
|
- all_day_targets["temperatureMax"].iloc[0]
|
|
|
- - all_day_targets["temperatureMin"].iloc[0]
|
|
|
+ all_day_targets["temperatureMax"].iloc[0]
|
|
|
+ - all_day_targets["temperatureMin"].iloc[0]
|
|
|
)
|
|
|
temperature_all_day_targets = (
|
|
|
all_day_targets[["temperatureMin", "temperatureMax"]].copy().to_dict()
|
|
@@ -359,7 +334,7 @@ class TemperatureTargetPacker:
|
|
|
target = TemperatureTarget(**target_params)
|
|
|
self.result.update({"target": target})
|
|
|
|
|
|
- def get_result(self) -> Dict:
|
|
|
+ def get_result(self) -> dict:
|
|
|
self.get_temperature_target()
|
|
|
return self.result
|
|
|
|
|
@@ -373,7 +348,7 @@ class TargetDeliver:
|
|
|
self.project_id = project_id
|
|
|
self.space_id = space_id
|
|
|
|
|
|
- async def send(self, controlled_result: Dict):
|
|
|
+ async def send(self, controlled_result: dict):
|
|
|
async with AsyncClient() as client:
|
|
|
transfer = SpaceInfoService(client, self.project_id, self.space_id)
|
|
|
if controlled_result["need_switch_off"]:
|
|
@@ -387,8 +362,8 @@ class TargetDeliver:
|
|
|
"temperature", controlled_result["new_global_target"], "1"
|
|
|
)
|
|
|
if (
|
|
|
- controlled_result["new_actual_target"] > 0
|
|
|
- and controlled_result["need_run_room_control"]
|
|
|
+ controlled_result["new_actual_target"] > 0
|
|
|
+ and controlled_result["need_run_room_control"]
|
|
|
):
|
|
|
await transfer.env_database_set(
|
|
|
"temperature", controlled_result["new_actual_target"]
|
|
@@ -407,10 +382,10 @@ class WeightFlagDeliver:
|
|
|
|
|
|
def is_temperature_feedback(self) -> bool:
|
|
|
if (
|
|
|
- self.feedback == FeedbackValue.a_little_hot
|
|
|
- or self.feedback == FeedbackValue.so_hot
|
|
|
- or self.feedback == FeedbackValue.a_little_cold
|
|
|
- or self.feedback == FeedbackValue.so_cold
|
|
|
+ self.feedback == FeedbackValue.a_little_hot
|
|
|
+ or self.feedback == FeedbackValue.so_hot
|
|
|
+ or self.feedback == FeedbackValue.a_little_cold
|
|
|
+ or self.feedback == FeedbackValue.so_cold
|
|
|
):
|
|
|
flag = True
|
|
|
else:
|
|
@@ -431,7 +406,7 @@ class TemperatureTargetController:
|
|
|
Primary flow of temperature target adjustment for Sequoia.
|
|
|
"""
|
|
|
|
|
|
- def __init__(self, data: Dict):
|
|
|
+ def __init__(self, data: dict):
|
|
|
self.data = data
|
|
|
self.result = {}
|
|
|
|
|
@@ -455,10 +430,10 @@ class TemperatureTargetController:
|
|
|
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
|
|
|
+ feedback == FeedbackValue.a_little_hot
|
|
|
+ or feedback == FeedbackValue.a_little_cold
|
|
|
+ or feedback == FeedbackValue.so_hot
|
|
|
+ or feedback == FeedbackValue.so_cold
|
|
|
):
|
|
|
step_size = StepSizeCalculator(TEMPERATURE_TARGET_WEIGHT).run(
|
|
|
self.data["realtime_temperature"], 25.0, feedback
|
|
@@ -486,7 +461,7 @@ class TemperatureTargetController:
|
|
|
}
|
|
|
)
|
|
|
|
|
|
- def get_result(self) -> Dict:
|
|
|
+ def get_result(self) -> dict:
|
|
|
return self.result
|
|
|
|
|
|
|
|
@@ -495,7 +470,7 @@ class TemperatureTargetControllerV2:
|
|
|
Primary flow of temperature target adjustment for Zhonghai.
|
|
|
"""
|
|
|
|
|
|
- def __init__(self, data: Dict):
|
|
|
+ def __init__(self, data: dict):
|
|
|
self.data = data
|
|
|
self.result = {}
|
|
|
|
|
@@ -519,10 +494,10 @@ class TemperatureTargetControllerV2:
|
|
|
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
|
|
|
+ feedback == FeedbackValue.a_little_hot
|
|
|
+ or feedback == FeedbackValue.a_little_cold
|
|
|
+ or feedback == FeedbackValue.so_hot
|
|
|
+ or feedback == FeedbackValue.so_cold
|
|
|
):
|
|
|
step_size = StepSizeCalculator(TEMPERATURE_TARGET_WEIGHT).run(
|
|
|
self.data["realtime_temperature"], 25.0, feedback
|
|
@@ -550,13 +525,13 @@ class TemperatureTargetControllerV2:
|
|
|
}
|
|
|
)
|
|
|
|
|
|
- def get_result(self) -> Dict:
|
|
|
+ def get_result(self) -> dict:
|
|
|
return self.result
|
|
|
|
|
|
|
|
|
@logger.catch()
|
|
|
async def temperature_target_control_v1(
|
|
|
- project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
+ project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
) -> bool:
|
|
|
temperature_target_raw_data = await TemperatureTargetCarrier(
|
|
|
project_id, space_id
|
|
@@ -576,7 +551,7 @@ async def temperature_target_control_v1(
|
|
|
|
|
|
@logger.catch()
|
|
|
async def temperature_target_control_v2(
|
|
|
- project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
+ project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
) -> bool:
|
|
|
temperature_target_raw_data = await TemperatureTargetV2Carrier(
|
|
|
project_id, space_id
|
|
@@ -594,7 +569,7 @@ async def temperature_target_control_v2(
|
|
|
|
|
|
@logger.catch()
|
|
|
async def get_target_after_feedback(
|
|
|
- project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
+ project_id: str, space_id: str, feedback: FeedbackValue
|
|
|
) -> float:
|
|
|
if project_id == "Pj1101050030" or project_id == "Pj1101140020" or project_id == "Pj1101050039":
|
|
|
temperature_target_raw_data = await TemperatureTargetCarrier(
|