|
@@ -12,7 +12,9 @@ from loguru import logger
|
|
|
from app.controllers.controller import Controller
|
|
|
from app.resources.params import (
|
|
|
TEMPERATURE_RELATED_FEEDBACK_WEIGHT,
|
|
|
+ TEMPERATURE_RELATED_FEEDBACK,
|
|
|
CO2_RELATED_FEEDBACK_WEIGHT,
|
|
|
+ CO2_RELATED_FEEDBACK,
|
|
|
SWITCH_RELATED_FEEDBACK
|
|
|
)
|
|
|
from app.services.platform import DataPlatformService
|
|
@@ -117,8 +119,15 @@ class TemperatureTargetController(TargetController):
|
|
|
)
|
|
|
self._season = season
|
|
|
self._previous_changes = previous_changes
|
|
|
- self._LOWER_LIMIT = 22.0
|
|
|
- self._UPPER_LIMIT = 28.0
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def _cut(value: float) -> float:
|
|
|
+ _LOWER_LIMIT = 21.0
|
|
|
+ _UPPER_LIMIT = 29.0
|
|
|
+ value = min(value, _UPPER_LIMIT)
|
|
|
+ value = max(value, _LOWER_LIMIT)
|
|
|
+
|
|
|
+ return value
|
|
|
|
|
|
async def init_temporary(self) -> Tuple[float, float]:
|
|
|
_VAR = 2
|
|
@@ -140,18 +149,21 @@ class TemperatureTargetController(TargetController):
|
|
|
new_lower_bound = mid - _RANGE
|
|
|
new_upper_bound = mid + _RANGE
|
|
|
|
|
|
- return new_lower_bound, new_upper_bound
|
|
|
+ return self._cut(new_lower_bound), self._cut(new_upper_bound)
|
|
|
|
|
|
async def get_targets(self):
|
|
|
current_lower_target = self._current_targets['temperatureMin'].loc[self._quarter_time]
|
|
|
current_upper_target = self._current_targets['temperatureMax'].loc[self._quarter_time]
|
|
|
+ if current_lower_target is np.NAN:
|
|
|
+ current_lower_target = 23.0
|
|
|
+ if current_upper_target is np.NAN:
|
|
|
+ current_upper_target = 25.0
|
|
|
|
|
|
return current_lower_target, current_upper_target
|
|
|
|
|
|
async def readjust_current(self, lower: float, upper: float, diff: float) -> Tuple[float, float]:
|
|
|
_RANGE = 2
|
|
|
new_lower_bound, new_upper_bound = lower, upper
|
|
|
- logger.info(diff)
|
|
|
if self._realtime_data is np.NAN:
|
|
|
new_lower_bound += lower + diff
|
|
|
new_upper_bound += upper + diff
|
|
@@ -167,7 +179,7 @@ class TemperatureTargetController(TargetController):
|
|
|
new_lower_bound = self._realtime_data + diff
|
|
|
new_upper_bound = new_lower_bound + (upper - lower)
|
|
|
|
|
|
- return new_lower_bound, new_upper_bound
|
|
|
+ return self._cut(new_lower_bound), self._cut(new_upper_bound)
|
|
|
|
|
|
async def generate_global(self, lower: float, upper: float):
|
|
|
extent = upper - lower
|
|
@@ -225,16 +237,25 @@ class Co2TargetController(TargetController):
|
|
|
)
|
|
|
self._previous_changes = previous_changes
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def _cut(value: float) -> float:
|
|
|
+ _UPPER_LIMIT = 1000.0
|
|
|
+ value = min(value, _UPPER_LIMIT)
|
|
|
+
|
|
|
+ return value
|
|
|
+
|
|
|
async def init_temporary(self) -> float:
|
|
|
new_target = 1000
|
|
|
diff = await self.calculate_diff(CO2_RELATED_FEEDBACK_WEIGHT)
|
|
|
if self._realtime_data is not np.NAN:
|
|
|
new_target += diff
|
|
|
|
|
|
- return new_target
|
|
|
+ return self._cut(new_target)
|
|
|
|
|
|
async def get_targets(self):
|
|
|
current_upper_target = self._current_targets['co2Max'].loc[self._quarter_time]
|
|
|
+ if current_upper_target is np.NAN:
|
|
|
+ current_upper_target = 500.0
|
|
|
|
|
|
return current_upper_target
|
|
|
|
|
@@ -247,7 +268,7 @@ class Co2TargetController(TargetController):
|
|
|
or diff < -50 and self._realtime_data - 100 < upper):
|
|
|
new_target = self._realtime_data + diff
|
|
|
|
|
|
- return new_target
|
|
|
+ return self._cut(new_target)
|
|
|
|
|
|
async def generate_global(self):
|
|
|
new_targets = self._current_targets['new_targets'].apply(lambda x: [0, x])
|
|
@@ -276,26 +297,37 @@ class Co2TargetController(TargetController):
|
|
|
return
|
|
|
|
|
|
|
|
|
+@logger.catch()
|
|
|
async def readjust_all_target(project_id: str, space_id: str, wechat_time: str, feedback: Optional[Dict] = None):
|
|
|
async with AsyncClient() as client:
|
|
|
transfer = TransferService(client, project_id, space_id)
|
|
|
platform = DataPlatformService(client, project_id, space_id)
|
|
|
|
|
|
+ nl = '\n'
|
|
|
realtime_temperature = await platform.get_realtime_temperature()
|
|
|
+ logger.debug(f'realtime temperature: {realtime_temperature}')
|
|
|
realtime_co2 = await platform.get_realtime_co2()
|
|
|
+ logger.debug(f'realtime co2: {realtime_co2}')
|
|
|
current_targets = await transfer.get_custom_target()
|
|
|
+ logger.debug(f'current targets: {nl}{current_targets}')
|
|
|
feedback = await transfer.get_feedback(wechat_time)
|
|
|
+ feedback_for_log = {k: v for k, v in feedback.items() if v > 0}
|
|
|
+ logger.debug(f'feedback: {feedback_for_log}')
|
|
|
+ is_customized = await transfer.is_customized()
|
|
|
+ logger.debug(f'is customized: {is_customized}')
|
|
|
is_temporary = await transfer.is_temporary()
|
|
|
+ logger.debug(f'is temporary: {is_temporary}')
|
|
|
season = await transfer.get_season()
|
|
|
+ logger.debug(f'season: {season}')
|
|
|
previous_changes = await transfer.env_database_get()
|
|
|
+ temperature_changes = previous_changes.get('temperature')
|
|
|
+ logger.debug(f'temperature previous changes: {nl}{temperature_changes}')
|
|
|
+ co2_changes = previous_changes.get('co2')
|
|
|
+ logger.debug(f'CO2 previous changes: {nl}{co2_changes}')
|
|
|
|
|
|
- quarter_minutes = get_quarter_minutes(get_time_str())
|
|
|
- is_customized = True if quarter_minutes in current_targets.index else False
|
|
|
-
|
|
|
- switch_on_related_feedback = SWITCH_RELATED_FEEDBACK
|
|
|
if feedback.get('switch off') and feedback.get('switch off') > 0:
|
|
|
need_switch_off = True
|
|
|
- for item in switch_on_related_feedback:
|
|
|
+ for item in SWITCH_RELATED_FEEDBACK:
|
|
|
if feedback.get(item) and feedback.get(item) > 0:
|
|
|
need_switch_off = False
|
|
|
break
|
|
@@ -311,7 +343,7 @@ async def readjust_all_target(project_id: str, space_id: str, wechat_time: str,
|
|
|
return need_run_room_control
|
|
|
|
|
|
temperature_results = {}
|
|
|
- for item in list(TEMPERATURE_RELATED_FEEDBACK_WEIGHT.keys()):
|
|
|
+ for item in TEMPERATURE_RELATED_FEEDBACK:
|
|
|
if feedback.get(item) and feedback.get(item) > 0:
|
|
|
temperature_controller = TemperatureTargetController(
|
|
|
realtime_temperature,
|
|
@@ -327,7 +359,7 @@ async def readjust_all_target(project_id: str, space_id: str, wechat_time: str,
|
|
|
break
|
|
|
|
|
|
co2_results = {}
|
|
|
- for item in list(CO2_RELATED_FEEDBACK_WEIGHT.keys()):
|
|
|
+ for item in CO2_RELATED_FEEDBACK:
|
|
|
if feedback.get(item) and feedback.get(item) > 0:
|
|
|
co2_controller = Co2TargetController(
|
|
|
realtime_co2,
|
|
@@ -347,26 +379,29 @@ async def readjust_all_target(project_id: str, space_id: str, wechat_time: str,
|
|
|
transfer = TransferService(client, project_id, space_id)
|
|
|
|
|
|
if temperature_results.get('temporary_targets'):
|
|
|
- logger.info('temperature temporary targets: ')
|
|
|
- logger.info(temperature_results.get('temporary_targets'))
|
|
|
+ temporary_targets = temperature_results.get('temporary_targets')
|
|
|
+ logger.debug(f'temperature temporary targets: {nl}{temporary_targets}')
|
|
|
await transfer.set_custom_target('temperature', temperature_results.get('temporary_targets'), '0')
|
|
|
if temperature_results.get('global_targets'):
|
|
|
- logger.info('temperature global targets:')
|
|
|
- logger.info(temperature_results.get('global_targets'))
|
|
|
+ global_targets = temperature_results.get('global_targets')
|
|
|
+ logger.debug(f'temperature global targets: {nl}{global_targets}')
|
|
|
await transfer.set_custom_target('temperature', temperature_results.get('global_targets'), '1')
|
|
|
if temperature_results.get('latest_change'):
|
|
|
- logger.info('temperature latest change:')
|
|
|
- logger.info(temperature_results.get('latest_change'))
|
|
|
+ latest_change = temperature_results.get('latest_change')
|
|
|
+ logger.debug(f'temperature latest change: {latest_change}')
|
|
|
await transfer.env_database_set('temperature', temperature_results.get('latest_change'))
|
|
|
|
|
|
if co2_results.get('temporary_targets'):
|
|
|
- logger.info(co2_results.get('temporary_targets'))
|
|
|
+ temporary_targets = co2_results.get('temporary_targets')
|
|
|
+ logger.debug(f'co2 temporary targets: {nl}{temporary_targets}')
|
|
|
await transfer.set_custom_target('co2', co2_results.get('temporary_targets'), '0')
|
|
|
if co2_results.get('global_targets'):
|
|
|
- logger.info(co2_results.get('global_targets'))
|
|
|
+ global_targets = co2_results.get('global_targets')
|
|
|
+ logger.debug(f'co2 global targets: {nl}{global_targets}')
|
|
|
await transfer.set_custom_target('co2', co2_results.get('global_targets'), '1')
|
|
|
if co2_results.get('latest_change'):
|
|
|
- logger.info(co2_results.get('latest_change'))
|
|
|
+ latest_change = co2_results.get('latest_change')
|
|
|
+ logger.debug(f'co2 latest change: {latest_change}')
|
|
|
await transfer.env_database_set('co2', co2_results.get('latest_change'))
|
|
|
|
|
|
return need_run_room_control
|