Browse Source

optimized some code and fixed some bugs

chenhaiyang 4 years ago
parent
commit
73ef6dfc63
5 changed files with 113 additions and 34 deletions
  1. 5 3
      app/api/routers/targets.py
  2. 58 23
      app/controllers/targets.py
  3. 25 1
      app/main.py
  4. 14 2
      app/resources/params.py
  5. 11 5
      app/services/platform.py

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

@@ -17,6 +17,8 @@ async def readjust_target(
         wechat_timestamp: str = Query(None, min_length=14, max_length=14),
 ):
     try:
+        if not wechat_timestamp:
+            wechat_timestamp = get_time_str()
         need_run_room_control = await readjust_all_target(project_id, space_id, wechat_timestamp)
     except Exception as e:
         logger.error(e)
@@ -37,11 +39,11 @@ async def readjust_target(
 @router.get('/readjust/test/{project_id}/{space_id}', tags=['targets'])
 async def test_readjust(project_id: str, space_id: str, wechat_time: str = Depends(get_time_str)):
     feedback = {
-        'a little cold': 1,
+        'a little cold': 0,
         'so cold': 0,
-        'a little hot': 1,
+        'a little hot': 0,
         'so hot': 0,
-        'noisy or blowy': 0,
+        'noisy or blowy': 1,
         'so stuffy': 0,
         'switch off': 0,
         'switch on': 0,

+ 58 - 23
app/controllers/targets.py

@@ -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

+ 25 - 1
app/main.py

@@ -1,13 +1,37 @@
 # -*- coding: utf-8 -*-
 
+from pathlib import Path
+from functools import lru_cache
+import logging
+
 import uvicorn
-from fastapi import FastAPI
+from fastapi import FastAPI, Depends
+from loguru import logger
 
 from app.api.routers import targets
+from app.core.logger import InterceptHandler
+from app.core.config import LoggerSettings
+
+logger_settings = LoggerSettings()
+logging.getLogger().handlers = [InterceptHandler()]
+logger.add(Path(logger_settings.logs_dir, 'env_fastapi.log'), level='INFO', rotation='00:00', encoding='utf-8')
 
 app = FastAPI()
 
 app.include_router(targets.router, prefix='/targets')
 
+
+@lru_cache()
+def get_settings():
+    return LoggerSettings()
+
+
+@app.get("/info")
+async def info(settings: LoggerSettings = Depends(get_settings)):
+    return {
+        'logs_dir': settings.logs_dir
+    }
+
+
 if __name__ == '__main__':
     uvicorn.run(app, host='0.0.0.0', port=8000)

+ 14 - 2
app/resources/params.py

@@ -5,13 +5,11 @@ TEMPERATURE_RELATED_FEEDBACK_WEIGHT = {
     'so cold': 3,
     'a little hot': -1,
     'so hot': -2,
-    'switch on': 0,
 }
 
 CO2_RELATED_FEEDBACK_WEIGHT = {
     'noisy or blowy': 100,
     'so stuffy': -100,
-    'switch on': 0,
 }
 
 SWITCH_RELATED_FEEDBACK = [
@@ -22,3 +20,17 @@ SWITCH_RELATED_FEEDBACK = [
     'so stuffy',
     'switch on',
 ]
+
+TEMPERATURE_RELATED_FEEDBACK = [
+    'a little cold',
+    'so cold',
+    'a little hot',
+    'so hot',
+    'switch on'
+]
+
+CO2_RELATED_FEEDBACK = [
+    'noisy or blowy',
+    'so stuffy',
+    'switch on',
+]

+ 11 - 5
app/services/platform.py

@@ -11,9 +11,9 @@ from loguru import logger
 from app.services.service import Service
 from app.utils.date import get_time_str, TIME_FMT
 from app.utils.math import round_half_up
+from app.core.config import PlatformSettings
 
-SERVER = 'http://api.sagacloud.cn'
-SECRET = 'saga123456'
+platform_settings = PlatformSettings()
 
 
 class InfoCode(str, Enum):
@@ -26,13 +26,19 @@ class InfoCode(str, Enum):
 
 class DataPlatformService(Service):
 
-    def __init__(self, client: AsyncClient, project_id: str, space_id: str):
+    def __init__(
+            self,
+            client: AsyncClient,
+            project_id: str,
+            space_id: str,
+            settings: PlatformSettings = platform_settings
+    ):
         super(DataPlatformService, self).__init__(client)
         self._project_id = project_id
         self._space_id = space_id
-        self._base_url = URL(SERVER)
+        self._base_url = URL(settings.platform_host)
         self._now_time = get_time_str()
-        self._secret = SECRET
+        self._secret = settings.platform_secret
 
     def _common_parameters(self) -> Dict:
         return {'projectId': self._project_id, 'secret': self._secret}