transfer.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # -*- coding: utf-8 -*-
  2. from enum import Enum
  3. from typing import Tuple, Dict, List
  4. import arrow
  5. import numpy as np
  6. import pandas as pd
  7. from httpx import AsyncClient, URL
  8. from loguru import logger
  9. from app.services.service import Service
  10. from app.utils.date import get_time_str, TIME_FMT
  11. from app.core.config import TransferSettings
  12. transfer_settings = TransferSettings()
  13. class Season(str, Enum):
  14. cooling = 'Cooling'
  15. heating = 'Warm'
  16. transition = 'Transition'
  17. class TransferService(Service):
  18. def __init__(
  19. self,
  20. client: AsyncClient,
  21. project_id: str,
  22. space_id: str,
  23. settings: TransferSettings = transfer_settings
  24. ) -> None:
  25. super(TransferService, self).__init__(client)
  26. self._project_id = project_id
  27. self._space_id = space_id
  28. self._base_url = URL(settings.transfer_host)
  29. self._now_time = get_time_str()
  30. def _common_parameters(self) -> Dict:
  31. return {'projectId': self._project_id, 'spaceId': self._space_id}
  32. async def get_season(self) -> Season:
  33. url = self._base_url.join('duoduo-service/transfer/environment/getSeasonType')
  34. params = {
  35. 'projectId': self._project_id,
  36. 'date': self._now_time,
  37. }
  38. raw_info = await self._get(url, params)
  39. return Season(raw_info.get('data'))
  40. async def is_customized(self) -> bool:
  41. url = self._base_url.join('duoduo-service/custom-service/custom/timetarget')
  42. time_str = arrow.get(arrow.get(self._now_time, TIME_FMT).shift(minutes=15).timestamp
  43. // 900 * 900).strftime('%Y%m%d%H%M%S')
  44. params = {
  45. 'projectId': self._project_id,
  46. 'objectId': self._space_id,
  47. 'timepoint': time_str,
  48. }
  49. raw_info = await self._get(url, params)
  50. flag = False
  51. if raw_info.get('data'):
  52. flag = True
  53. return flag
  54. async def is_temporary(self) -> bool:
  55. url = self._base_url.join('duoduo-service/transfer/environment/temp/target')
  56. params = self._common_parameters()
  57. params.update({'time': self._now_time})
  58. raw_info = await self._get(url, params)
  59. flag = False
  60. if raw_info.get('flag') == 1:
  61. flag = True
  62. return flag
  63. async def get_feedback(self, wechat_time: str) -> Dict:
  64. url = self._base_url.join('duoduo-service/transfer/environment/feedbackCount')
  65. params = self._common_parameters()
  66. params.update({'time': wechat_time})
  67. raw_info = await self._get(url, params)
  68. meaning_dict = {
  69. 'Id1': 'a little cold',
  70. 'Id2': 'so cold',
  71. 'Id3': 'a little hot',
  72. 'Id4': 'so hot',
  73. 'Id5': 'noisy or blowy',
  74. 'Id6': 'so stuffy',
  75. 'Id7': 'more sunshine',
  76. 'Id8': 'less sunshine',
  77. 'Id9': 'send a repairman',
  78. 'Id10': 'switch off',
  79. 'Id11': 'nice',
  80. 'Id12': 'switch on',
  81. }
  82. feedback_dic = {meaning_dict.get(k): v for k, v in raw_info.items() if k != 'result'}
  83. return feedback_dic
  84. async def get_custom_target(self) -> pd.DataFrame:
  85. url = self._base_url.join('duoduo-service/transfer/environment/target')
  86. params = self._common_parameters()
  87. params.update({'date': arrow.get(self._now_time, TIME_FMT).date().strftime('%Y%m%d')})
  88. raw_info = await self._get(url, params)
  89. custom_target_df = pd.DataFrame(raw_info.get('data'))
  90. custom_target_df.set_index('time', inplace=True)
  91. return custom_target_df
  92. async def env_database_set(self, form: str, value: float) -> None:
  93. url = self._base_url.join('duoduo-service/transfer/environment/hispoint/set')
  94. params = self._common_parameters()
  95. time_str = arrow.get(arrow.get(self._now_time, TIME_FMT).timestamp // 900 * 900).strftime('%Y%m%d%H%M%S')
  96. params.update({'time': time_str, 'type': form, 'value': value})
  97. await self._get(url, params)
  98. async def env_database_get(self) -> Dict[str, pd.DataFrame]:
  99. url = self._base_url.join('duoduo-service/transfer/environment/hispoint/get')
  100. params = self._common_parameters()
  101. params.update({'date': arrow.get(self._now_time, TIME_FMT).date().strftime('%Y%m%d')})
  102. raw_info = await self._get(url, params)
  103. result = {}
  104. if raw_info.get('result') == 'success':
  105. for k, v in raw_info.items():
  106. if k != 'result':
  107. if len(v) > 0:
  108. temp = {}
  109. data = np.array(v)
  110. temp.update({'timestamp': data[:, 0]})
  111. temp.update({'value': data[:, 1].astype(np.float)})
  112. result.update({k: pd.DataFrame(temp)})
  113. else:
  114. result.update({k: pd.DataFrame()})
  115. return result
  116. async def set_custom_target(self, form: str, target_value: Dict[str, List[float]], flag: str = '1') -> None:
  117. url = self._base_url.join('duoduo-service/transfer/environment/target/setting')
  118. params = {
  119. 'projectId': self._project_id,
  120. 'spaceId': self._space_id,
  121. 'timepoint': self._now_time,
  122. 'type': form,
  123. 'flag': flag
  124. }
  125. await self._post(url, params=params, payload=target_value)
  126. async def set_temporary_custom(self) -> None:
  127. url = self._base_url.join('duoduo-service/transfer/environment/setServiceFlag')
  128. params = self._common_parameters()
  129. params.update({'time': self._now_time})
  130. await self._get(url, params)