platform.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. from enum import Enum
  3. from typing import Dict
  4. import arrow
  5. import numpy as np
  6. from httpx import AsyncClient, URL
  7. from loguru import logger
  8. from app.services.service import Service
  9. from app.utils.date import get_time_str, TIME_FMT
  10. from app.utils.math import round_half_up
  11. SERVER = 'http://api.sagacloud.cn'
  12. SECRET = 'saga123456'
  13. class InfoCode(str, Enum):
  14. temperature = 'Tdb'
  15. co2 = 'CO2'
  16. hcho = 'HCHO'
  17. pm2d5 = 'PM2d5'
  18. humidity = 'RH'
  19. class DataPlatformService(Service):
  20. def __init__(self, client: AsyncClient, project_id: str, space_id: str):
  21. super(DataPlatformService, self).__init__(client)
  22. self._project_id = project_id
  23. self._space_id = space_id
  24. self._base_url = URL(SERVER)
  25. self._now_time = get_time_str()
  26. self._secret = SECRET
  27. def _common_parameters(self) -> Dict:
  28. return {'projectId': self._project_id, 'secret': self._secret}
  29. async def get_realtime_data(self, code: InfoCode) -> float:
  30. url = self._base_url.join('data-platform-3/hisdata/query_by_obj')
  31. params = self._common_parameters()
  32. start_time = get_time_str(60 * 60, flag='ago')
  33. payload = {
  34. 'criteria': {
  35. 'id': self._space_id,
  36. 'code': code.value,
  37. 'receivetime': {
  38. '$gte': start_time,
  39. '$lte': self._now_time,
  40. }
  41. }
  42. }
  43. raw_info = await self._post(url, params, payload)
  44. value = np.NAN
  45. if raw_info.get('Content'):
  46. latest_data = raw_info.get('Content')[-1].get('data')
  47. latest_time = raw_info.get('Content')[-1].get('receivetime')
  48. if arrow.get(latest_time, TIME_FMT).shift(minutes=15) < arrow.get(self._now_time, TIME_FMT):
  49. logger.info(f'delayed data - {self._space_id}: ({latest_time}, {latest_data})')
  50. value = round_half_up(latest_data, 2)
  51. return value
  52. async def get_realtime_temperature(self) -> float:
  53. return await self.get_realtime_data(InfoCode.temperature)
  54. async def get_realtime_co2(self) -> float:
  55. return await self.get_realtime_data(InfoCode.co2)
  56. async def get_realtime_hcho(self) -> float:
  57. return await self.get_realtime_data(InfoCode.hcho)
  58. async def get_realtime_pm2d5(self) -> float:
  59. return await self.get_realtime_data(InfoCode.pm2d5)
  60. async def get_realtime_humidity(self) -> float:
  61. return await self.get_realtime_data(InfoCode.humidity)