freq_set.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. from typing import Tuple
  3. from httpx import AsyncClient
  4. from loguru import logger
  5. from app.services.platform import DataPlatformService, InfoCode
  6. from app.services.transfer import Duoduo
  7. class ACATFUFanFreqController:
  8. """
  9. Fan freq setting logic for zhonghai.
  10. """
  11. def __init__(self, current_freq: float, hot_rate: float, cold_rate: float):
  12. self.current_freq = current_freq
  13. self.hot_rate = hot_rate
  14. self.cold_rate = cold_rate
  15. def get_next_set(self) -> float:
  16. try:
  17. cold_hot_ratio = self.cold_rate / self.hot_rate
  18. except ZeroDivisionError:
  19. cold_hot_ratio = 99
  20. if cold_hot_ratio < 0.5:
  21. diff = 3
  22. elif cold_hot_ratio < 0.9:
  23. diff = 2
  24. elif cold_hot_ratio < 1.1:
  25. diff = 0
  26. elif cold_hot_ratio < 1.5:
  27. diff = -2
  28. elif cold_hot_ratio >= 1.5:
  29. diff = -3
  30. else: # If cold hot rate is NAN.
  31. diff = 0
  32. next_freq_set = self.current_freq + diff
  33. next_freq_set = max(30.0, min(45.0, next_freq_set))
  34. return next_freq_set
  35. async def fetch_params(project_id: str, device_id: str) -> Tuple[float, float, float]:
  36. async with AsyncClient() as client:
  37. platform = DataPlatformService(client, project_id)
  38. duoduo = Duoduo(client, project_id)
  39. current_freq = await platform.get_realtime_data(InfoCode.fan_freq, device_id)
  40. hot_rate, cold_rate = await duoduo.query_fill_rate_by_device(device_id)
  41. return current_freq, hot_rate, cold_rate
  42. @logger.catch()
  43. async def get_next_acatfu_freq_set(project_id: str, device_id: str) -> float:
  44. current_freq, hot_rate, cold_rate = await fetch_params(project_id, device_id)
  45. controller = ACATFUFanFreqController(current_freq, hot_rate, cold_rate)
  46. next_freq_set = controller.get_next_set()
  47. return next_freq_set