|
@@ -0,0 +1,64 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+
|
|
|
+from typing import Tuple
|
|
|
+
|
|
|
+from httpx import AsyncClient
|
|
|
+from loguru import logger
|
|
|
+
|
|
|
+from app.services.platform import DataPlatformService, InfoCode
|
|
|
+from app.services.transfer import Duoduo
|
|
|
+
|
|
|
+
|
|
|
+class ACATFUFanFreqController:
|
|
|
+ """
|
|
|
+ Fan freq setting logic for zhonghai.
|
|
|
+ """
|
|
|
+
|
|
|
+ def __init__(self, current_freq: float, hot_rate: float, cold_rate: float):
|
|
|
+ self.current_freq = current_freq
|
|
|
+ self.hot_rate = hot_rate
|
|
|
+ self.cold_rate = cold_rate
|
|
|
+
|
|
|
+ def get_next_set(self) -> float:
|
|
|
+ try:
|
|
|
+ cold_hot_ratio = self.cold_rate / self.hot_rate
|
|
|
+ except ZeroDivisionError:
|
|
|
+ cold_hot_ratio = 99
|
|
|
+
|
|
|
+ if cold_hot_ratio < 0.5:
|
|
|
+ diff = 3
|
|
|
+ elif cold_hot_ratio < 0.9:
|
|
|
+ diff = 2
|
|
|
+ elif cold_hot_ratio < 1.1:
|
|
|
+ diff = 0
|
|
|
+ elif cold_hot_ratio < 1.5:
|
|
|
+ diff = -2
|
|
|
+ elif cold_hot_ratio >= 1.5:
|
|
|
+ diff = -3
|
|
|
+ else: # If cold hot rate is NAN.
|
|
|
+ diff = 0
|
|
|
+
|
|
|
+ next_freq_set = self.current_freq + diff
|
|
|
+ next_freq_set = max(30.0, min(45.0, next_freq_set))
|
|
|
+
|
|
|
+ return next_freq_set
|
|
|
+
|
|
|
+
|
|
|
+async def fetch_params(project_id: str, device_id: str) -> Tuple[float, float, float]:
|
|
|
+ async with AsyncClient() as client:
|
|
|
+ platform = DataPlatformService(client, project_id)
|
|
|
+ duoduo = Duoduo(client, project_id)
|
|
|
+
|
|
|
+ current_freq = await platform.get_realtime_data(InfoCode.fan_freq, device_id)
|
|
|
+ hot_rate, cold_rate = await duoduo.query_fill_rate_by_device(device_id)
|
|
|
+
|
|
|
+ return current_freq, hot_rate, cold_rate
|
|
|
+
|
|
|
+
|
|
|
+@logger.catch()
|
|
|
+async def get_next_acatfu_freq_set(project_id: str, device_id: str) -> float:
|
|
|
+ current_freq, hot_rate, cold_rate = await fetch_params(project_id, device_id)
|
|
|
+ controller = ACATFUFanFreqController(current_freq, hot_rate, cold_rate)
|
|
|
+ next_freq_set = controller.get_next_set()
|
|
|
+
|
|
|
+ return next_freq_set
|