Browse Source

set /target/adjust receive a feedback param

chenhaiyang 4 years ago
parent
commit
abfb197961

+ 34 - 26
app/api/routers/targets.py

@@ -1,10 +1,13 @@
 # -*- coding: utf-8 -*-
 
+from typing import Optional
+
 from fastapi import APIRouter, HTTPException, Query
 from loguru import logger
 
 from app.controllers.targets.target import readjust_all_target
 from app.controllers.targets.temperature import TemperatureAdjustmentController
+from app.models.domain.feedback import FeedbackValue
 from app.models.domain.targets import TargetReadjustResponse
 from app.utils.date import get_time_str
 
@@ -13,18 +16,22 @@ router = APIRouter()
 
 @router.get('/adjust', response_model=TargetReadjustResponse)
 async def readjust_target(
-        projectId: str = Query(..., max_length=50, regex='^Pj'),
-        roomId: str = Query(..., max_length=50, regex='^Sp'),
-        time: str = Query(None, min_length=14, max_length=14),
+        project_id: str = Query(..., max_length=50, regex='^Pj', alias='projectId'),
+        space_id: str = Query(..., max_length=50, regex='^Sp', alias='roomId'),
+        timestamp: Optional[str] = Query(None, min_length=14, max_length=14, alias='time'),
+        feedback: Optional[FeedbackValue] = Query(None, alias='itemId')
 ):
     try:
-        if not time:
-            time = get_time_str()
-        if projectId == 'Pj1101050030':
-            controller = TemperatureAdjustmentController(projectId, roomId, wechat_time=time)
-            need_run_room_control = await controller.run()
+        if project_id == 'Pj1101050030':
+            if feedback:
+                controller = TemperatureAdjustmentController(project_id, space_id, feedback)
+                need_run_room_control = await controller.run()
+            else:
+                need_run_room_control = True
         else:
-            need_run_room_control = await readjust_all_target(projectId, roomId, time)
+            if not timestamp:
+                timestamp = get_time_str()
+            need_run_room_control = await readjust_all_target(project_id, space_id, timestamp)
     except Exception as e:
         logger.error(e)
         raise HTTPException(
@@ -33,10 +40,10 @@ async def readjust_target(
         )
 
     response = {
-        'projectId': projectId,
-        'roomId': roomId,
+        'projectId': project_id,
+        'roomId': space_id,
         'flag': 1 if need_run_room_control else 0,
-        'time': time,
+        'time': timestamp,
     }
     return response
 
@@ -73,21 +80,22 @@ async def test_readjust_target(
 
 @router.get('/adjust/v2', response_model=TargetReadjustResponse)
 async def readjust_target_v2(
-        project_id: str = Query(..., max_length=50, regex='^Pj'),
-        space_id: str = Query(..., max_length=50, regex='^Sp')
+        project_id: str = Query(..., max_length=50, regex='^Pj', alias='project-id'),
+        space_id: str = Query(..., max_length=50, regex='^Sp', alias='space-id'),
+        feedback: Optional[FeedbackValue] = Query(None)
 ):
-    test_feedback = {
-        'a little hot': 1
-    }
-    try:
-        controller = TemperatureAdjustmentController(project_id, space_id, raw_feedback=test_feedback)
-        need_run_room_control = await controller.run()
-    except Exception as e:
-        logger.error(e)
-        raise HTTPException(
-            status_code=500,
-            detail='Oops, something wrong has happened!'
-        )
+    if feedback:
+        try:
+            controller = TemperatureAdjustmentController(project_id, space_id, feedback)
+            need_run_room_control = await controller.run()
+        except Exception as e:
+            logger.error(e)
+            raise HTTPException(
+                status_code=500,
+                detail='Oops, something wrong has happened!'
+            )
+    else:
+        need_run_room_control = True
 
     response = {
         'projectId': project_id,

+ 12 - 24
app/controllers/targets/temperature.py

@@ -8,8 +8,8 @@ import numpy as np
 from httpx import AsyncClient
 from loguru import logger
 
+from app.models.domain.feedback import FeedbackValue
 from app.resources.params import TEMPERATURE_TARGET_WEIGHT
-from app.schemas.feedback import Feedback
 from app.schemas.target import TemperatureTarget
 from app.services.platform import DataPlatformService
 from app.services.transfer import SpaceInfoService, Season
@@ -28,7 +28,7 @@ class StepSizeCalculator:
             self,
             realtime_temperature: float,
             comfortable_temperature: float,
-            feedback: Feedback
+            feedback: FeedbackValue
     ) -> float:
         base_step_size = 1.8 / (1 + np.exp((comfortable_temperature - realtime_temperature) / 2))
         return self.weight.get(feedback.value) * base_step_size
@@ -174,13 +174,11 @@ class TemperatureAdjustmentController(AdjustmentController):
             self,
             project_id: str,
             space_id: str,
-            wechat_time: Optional[str] = None,
-            raw_feedback: Optional[Dict] = None
+            feedback: Optional[FeedbackValue] = None
     ):
         self.project_id = project_id
         self.space_id = space_id
-        self.wechat_time = wechat_time
-        self.raw_feedback = raw_feedback
+        self.feedback = feedback
 
     @logger.catch()
     async def run(self) -> bool:
@@ -194,23 +192,13 @@ class TemperatureAdjustmentController(AdjustmentController):
             all_day_targets = await transfer.get_custom_target()
             current_target = await transfer.get_current_temperature_target()
             logger.debug(f'current target: {current_target}')
-            if self.wechat_time:
-                self.raw_feedback = await transfer.get_feedback(self.wechat_time)
-                logger.debug(f'raw feedback: {self.raw_feedback}')
             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()
 
-        # Arrange data.
-        feedback = Feedback('nice')
-        for k, v in self.raw_feedback.items():
-            if v > 0:
-                feedback = Feedback(k)
-                break
-        logger.debug(feedback)
-
+        # Arrange data
         if len(all_day_targets) > 0:
             extent = all_day_targets['temperatureMax'].iloc[0] - all_day_targets['temperatureMin'].iloc[0]
         else:
@@ -230,19 +218,19 @@ class TemperatureAdjustmentController(AdjustmentController):
         new_temporary_target = {}
         new_global_target = {}
         new_actual_target = 0
-        if feedback == Feedback.switch_off:
+        if self.feedback == FeedbackValue.switch_off:
             need_switch_off = True
             need_run_room_control = True
-        elif feedback == Feedback.switch_on:
+        elif self.feedback == FeedbackValue.switch_on:
             need_run_room_control = True
             if not is_customized:
                 new_lower, new_upper = TemporaryTargetInit(1, 24).build(extent, season, realtime_temperature)
                 new_temporary_target = TemporaryTargetBuilder(new_lower, new_upper)
-        elif (feedback == Feedback.a_little_hot
-              or feedback == Feedback.a_little_cold
-              or feedback == Feedback.so_hot
-              or feedback == Feedback.so_cold):
-            step_size = StepSizeCalculator(TEMPERATURE_TARGET_WEIGHT).run(realtime_temperature, 25.0, feedback)
+        elif (self.feedback == FeedbackValue.a_little_hot
+              or self.feedback == FeedbackValue.a_little_cold
+              or self.feedback == FeedbackValue.so_hot
+              or self.feedback == FeedbackValue.so_cold):
+            step_size = StepSizeCalculator(TEMPERATURE_TARGET_WEIGHT).run(realtime_temperature, 25.0, self.feedback)
             logger.debug(f'step size: {step_size}')
             new_actual_target = NewTemperatureTargetBuilder(realtime_temperature, current_target, step_size).build()
             if new_actual_target != current_target:

+ 18 - 0
app/models/domain/feedback.py

@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from enum import Enum
+
+
+class FeedbackValue(str, Enum):
+    a_little_cold = '1'
+    so_cold = '2'
+    a_little_hot = '3'
+    so_hot = '4'
+    noisy_or_blowy = '5'
+    so_stuffy = '6'
+    more_sunshine = '7'
+    less_sunshine = '8'
+    send_a_repairman = '9'
+    switch_off = '10'
+    nice = '11'
+    switch_on = '12'

+ 4 - 4
app/resources/params.py

@@ -9,10 +9,10 @@ TEMPERATURE_RELATED_FEEDBACK_WEIGHT = {
 }
 
 TEMPERATURE_TARGET_WEIGHT = {
-    'a little cold': 1,
-    'so cold': 2,
-    'a little hot': -1,
-    'so hot': -2,
+    '1': 1,
+    '2': 2,
+    '3': -1,
+    '4': -2,
 }
 
 CO2_RELATED_FEEDBACK_WEIGHT = {

+ 1 - 1
app/schemas/feedback.py

@@ -3,7 +3,7 @@
 from enum import Enum
 
 
-class Feedback(Enum):
+class Feedback(str, Enum):
     a_little_cold = 'a little cold'
     so_cold = 'so cold'
     a_little_hot = 'a little hot'