소스 검색

delete Q-learning logic for FCU

highing666 3 년 전
부모
커밋
8f3898119d
2개의 변경된 파일8개의 추가작업 그리고 144개의 파일을 삭제
  1. 8 18
      app/api/routers/space.py
  2. 0 126
      app/controllers/equipment/fcu/q_learning.py

+ 8 - 18
app/api/routers/space.py

@@ -6,7 +6,6 @@ from fastapi import APIRouter, Depends, HTTPException, Query
 from sqlalchemy.orm import Session
 
 from app.api.dependencies.db import get_db
-from app.controllers.equipment.fcu.q_learning import QLearningCommandBuilder
 from app.crud.space.weight import (
     get_weights_by_space,
     get_weights_by_vav,
@@ -15,17 +14,16 @@ from app.crud.space.weight import (
 )
 from app.models.domain.space import SpaceControlResponse
 from app.schemas.sapce_weight import SpaceWeight, SpaceWeightCreate, SpaceWeightUpdate
-from app.services.transfer import Season
 
 router = APIRouter()
 
 
 @router.get("/control", response_model=SpaceControlResponse)
 async def get_space_command(
-    project_id: str = Query(..., max_length=50, regex="^Pj", alias="projectId"),
-    space_id: str = Query(..., max_length=50, regex="^Sp", alias="roomId"),
-    timestamp: str = Query(None, min_length=14, max_length=14, alias="time"),
-    method: int = Query(3),
+        project_id: str = Query(..., max_length=50, regex="^Pj", alias="projectId"),
+        space_id: str = Query(..., max_length=50, regex="^Sp", alias="roomId"),
+        timestamp: str = Query(None, min_length=14, max_length=14, alias="time"),
+        method: int = Query(3),
 ):
     response = {
         "projectId": project_id,
@@ -37,14 +35,6 @@ async def get_space_command(
     return response
 
 
-@router.get("/test")
-async def get_test_result(current: float, pre: float, target: float):
-    builder = QLearningCommandBuilder(Season("Cooling"))
-    command = await builder.get_command(current, pre, target)
-
-    return command
-
-
 @router.post("/weight", response_model=SpaceWeight)
 async def create_space_weight(weight: SpaceWeightCreate, db: Session = Depends(get_db)):
     return create_weight(db=db, weight=weight)
@@ -64,10 +54,10 @@ async def read_weight_by_vav(vav_id: str, db: Session = Depends(get_db)):
 
 @router.put("/weight/{space_id}/{vav_id}", response_model=SpaceWeight)
 async def update_weight_by_space(
-    space_id: str,
-    vav_id: str,
-    weight_in: SpaceWeightUpdate,
-    db: Session = Depends(get_db),
+        space_id: str,
+        vav_id: str,
+        weight_in: SpaceWeightUpdate,
+        db: Session = Depends(get_db),
 ):
     weights = get_weights_by_space(db, space_id=space_id)
     new_weight = None

+ 0 - 126
app/controllers/equipment/fcu/q_learning.py

@@ -1,126 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from typing import Dict, Optional
-
-import numpy as np
-from httpx import AsyncClient
-from loguru import logger
-
-from app.controllers.events import q_learning_models
-from app.services.platform import DataPlatformService
-from app.services.transfer import Duoduo, SpaceInfoService
-from app.services.transfer import Season
-
-
-class QLearningCommandBuilder:
-    """
-    Build FCU command by Q learning net.
-    """
-
-    def __init__(self, season: Season):
-        self.season = season
-        if season == Season.cooling:
-            self.model = q_learning_models.get('summer')
-        elif season == Season.heating:
-            self.model = q_learning_models.get('winter')
-        else:
-            self.model = None
-
-    def get_type(self, layer: int) -> str:
-        return self.model[0, layer][0, 0][0][0]
-
-    def get_weight(self, layer: int, idx: int) -> np.ndarray:
-        return self.model[0, layer][0, 0][1][0, idx]
-
-    @staticmethod
-    def linear(input_v: np.ndarray, weight: np.ndarray, bias: Optional[np.ndarray] = None) -> np.ndarray:
-        y = np.dot(weight, input_v)
-        if bias.size > 0:
-            y += bias
-
-        return y
-
-    @staticmethod
-    def relu(x: np.ndarray) -> np.ndarray:
-        return np.maximum(x, 0)
-
-    def predict_speed(self, input_v: np.ndarray) -> int:
-        result = [input_v]
-        for layer in range(self.model.shape[1]):
-            if self.get_type(layer) == 'mlp' or self.get_type(layer) == 'linear':
-                y = self.linear(result[layer], self.get_weight(layer, 0), self.get_weight(layer, 1))
-                result.append(y)
-            elif self.get_type(layer) == 'relu':
-                result.append(self.relu(result[layer]))
-
-        speed = np.argmax(result[-1])
-
-        return int(speed)
-
-    async def get_command(self, current_temperature: float, pre_temperature: float, actual_target: float) -> Dict:
-        input_value = np.array([
-            [(current_temperature - actual_target) / 5],
-            [(current_temperature - pre_temperature) / 5]
-        ])
-        speed = self.predict_speed(input_value)
-        if np.isnan(current_temperature) or np.isnan(pre_temperature):
-            speed = 2
-        if np.isnan(actual_target):
-            speed = 0
-
-        if speed == 0:
-            on_off = 0
-            water_on_off = 0
-        else:
-            on_off = 1
-            water_on_off = 1
-
-        if self.season == Season.cooling:
-            season = 1
-        elif self.season == Season.heating:
-            season = 2
-        else:
-            season = 0
-
-        command = {
-            'onOff': on_off,
-            'mode': season,
-            'speed': int(speed),
-            'temperature': actual_target if not np.isnan(actual_target) else None,
-            'water': water_on_off
-        }
-        return command
-
-
-@logger.catch()
-async def get_fcu_q_learning_control_result(project_id: str, equipment_id: str) -> Dict:
-    async with AsyncClient() as client:
-        duo_duo = Duoduo(client, project_id)
-        platform = DataPlatformService(client, project_id)
-
-        spaces = await duo_duo.get_space_by_equipment(equipment_id)
-        if not spaces:
-            logger.error(f'FCU {equipment_id} does not have space')
-            return {}
-        else:
-            if len(spaces) > 1:
-                logger.error(f'FCU {equipment_id} control more than one spaces!')
-            transfer = SpaceInfoService(client, project_id, spaces[0].get('id'))
-            season = await duo_duo.get_season()
-            current_target = await transfer.get_current_temperature_target()
-            realtime_temperature = await platform.get_realtime_temperature(spaces[0].get('id'))
-            past_temperature = await platform.get_past_temperature(spaces[0].get('id'), 15 * 60)
-
-    logger.debug(
-        f'{spaces[0]["id"]} - {equipment_id} - '
-        f'realtime Tdb: {realtime_temperature} - '
-        f'pre Tdb: {past_temperature} - '
-        f'target: {current_target}'
-    )
-    if season == Season.transition:
-        command = {}
-    else:
-        builder = QLearningCommandBuilder(season)
-        command = await builder.get_command(realtime_temperature, past_temperature, current_target)
-
-    return command