transfer.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. # -*- coding: utf-8 -*-
  2. from enum import Enum
  3. from typing import Dict, List
  4. import arrow
  5. import numpy as np
  6. import pandas as pd
  7. from httpx import AsyncClient, URL
  8. from app.core.config import settings
  9. from app.services.service import Service
  10. from app.utils.date import get_time_str, TIME_FMT
  11. class Season(str, Enum):
  12. cooling = 'Cooling'
  13. heating = 'Warm'
  14. transition = 'Transition'
  15. class SpaceInfoService(Service):
  16. def __init__(
  17. self,
  18. client: AsyncClient,
  19. project_id: str,
  20. space_id: str,
  21. server_settings=settings
  22. ) -> None:
  23. super(SpaceInfoService, self).__init__(client)
  24. self._project_id = project_id
  25. self._space_id = space_id
  26. self._base_url = URL(server_settings.TRANSFER_HOST)
  27. self._now_time = get_time_str()
  28. def _common_parameters(self) -> Dict:
  29. return {'projectId': self._project_id, 'spaceId': self._space_id}
  30. async def get_season(self) -> Season:
  31. url = self._base_url.join('duoduo-service/transfer/environment/getSeasonType')
  32. params = {
  33. 'projectId': self._project_id,
  34. 'date': self._now_time,
  35. }
  36. raw_info = await self._get(url, params)
  37. return Season(raw_info.get('data'))
  38. async def is_customized(self) -> bool:
  39. url = self._base_url.join('duoduo-service/custom-service/custom/timetarget')
  40. time_str = arrow.get(arrow.get(self._now_time, TIME_FMT).shift(minutes=15).timestamp
  41. // 900 * 900).strftime('%Y%m%d%H%M%S')
  42. params = {
  43. 'projectId': self._project_id,
  44. 'objectId': self._space_id,
  45. 'timepoint': time_str,
  46. }
  47. raw_info = await self._get(url, params)
  48. flag = False
  49. if raw_info.get('data'):
  50. flag = True
  51. return flag
  52. async def is_temporary(self) -> bool:
  53. url = self._base_url.join('duoduo-service/transfer/environment/temp/target')
  54. params = self._common_parameters()
  55. params.update({'time': self._now_time})
  56. raw_info = await self._get(url, params)
  57. flag = False
  58. if raw_info.get('flag') == 1:
  59. flag = True
  60. return flag
  61. async def get_feedback(self, wechat_time: str) -> Dict:
  62. url = self._base_url.join('duoduo-service/transfer/environment/feedbackCount')
  63. params = self._common_parameters()
  64. params.update({'time': wechat_time})
  65. raw_info = await self._get(url, params)
  66. meaning_dict = {
  67. 'Id1': 'a little cold',
  68. 'Id2': 'so cold',
  69. 'Id3': 'a little hot',
  70. 'Id4': 'so hot',
  71. 'Id5': 'noisy or blowy',
  72. 'Id6': 'so stuffy',
  73. 'Id7': 'more sunshine',
  74. 'Id8': 'less sunshine',
  75. 'Id9': 'send a repairman',
  76. 'Id10': 'switch off',
  77. 'Id11': 'nice',
  78. 'Id12': 'switch on',
  79. }
  80. feedback_dic = {meaning_dict.get(k): v for k, v in raw_info.items() if k != 'result'}
  81. return feedback_dic
  82. async def get_custom_target(self) -> pd.DataFrame:
  83. url = self._base_url.join('duoduo-service/transfer/environment/target')
  84. params = self._common_parameters()
  85. params.update({'date': arrow.get(self._now_time, TIME_FMT).date().strftime('%Y%m%d')})
  86. raw_info = await self._get(url, params)
  87. try:
  88. custom_target_df = pd.DataFrame(raw_info.get('data'))
  89. custom_target_df.set_index('time', inplace=True)
  90. except KeyError:
  91. custom_target_df = pd.DataFrame()
  92. return custom_target_df
  93. async def get_current_temperature_target(self) -> object:
  94. current_targets = await self.get_custom_target()
  95. if len(current_targets) > 0:
  96. temp = arrow.get(self._now_time, TIME_FMT).shift(minutes=15).timestamp // (15 * 60) * (15 * 60)
  97. next_quarter_minutes = arrow.get(temp).time().strftime('%H%M%S')
  98. try:
  99. current_lower_target = current_targets['temperatureMin'].loc[next_quarter_minutes]
  100. current_upper_target = current_targets['temperatureMax'].loc[next_quarter_minutes]
  101. except KeyError:
  102. current_lower_target, current_upper_target = 0.0, 0.0
  103. else:
  104. current_lower_target, current_upper_target = np.NAN, np.NAN
  105. return (current_lower_target + current_upper_target) / 2
  106. async def env_database_set(self, form: str, value: float) -> None:
  107. url = self._base_url.join('duoduo-service/transfer/environment/hispoint/set')
  108. params = self._common_parameters()
  109. time_str = arrow.get(arrow.get(self._now_time, TIME_FMT).timestamp // 900 * 900).strftime('%Y%m%d%H%M%S')
  110. params.update({'time': time_str, 'type': form, 'value': value})
  111. await self._get(url, params)
  112. async def env_database_get(self) -> Dict[str, pd.DataFrame]:
  113. url = self._base_url.join('duoduo-service/transfer/environment/hispoint/get')
  114. params = self._common_parameters()
  115. params.update({'date': arrow.get(self._now_time, TIME_FMT).date().strftime('%Y%m%d')})
  116. raw_info = await self._get(url, params)
  117. result = {}
  118. if raw_info.get('result') == 'success':
  119. for k, v in raw_info.items():
  120. if k != 'result':
  121. if len(v) > 0:
  122. temp = {}
  123. data = np.array(v)
  124. temp.update({'timestamp': data[:, 0]})
  125. temp.update({'value': data[:, 1].astype(np.float)})
  126. result.update({k: pd.DataFrame(temp)})
  127. else:
  128. result.update({k: pd.DataFrame()})
  129. return result
  130. async def set_custom_target(self, form: str, target_value: Dict[str, List[float]], flag: str = '1') -> None:
  131. url = self._base_url.join('duoduo-service/transfer/environment/target/setting')
  132. params = {
  133. 'projectId': self._project_id,
  134. 'spaceId': self._space_id,
  135. 'timepoint': self._now_time,
  136. 'type': form,
  137. 'flag': flag
  138. }
  139. await self._post(url, params=params, payload=target_value)
  140. async def set_temporary_custom(self) -> None:
  141. url = self._base_url.join('duoduo-service/transfer/environment/setServiceFlag')
  142. params = self._common_parameters()
  143. params.update({'time': self._now_time})
  144. await self._get(url, params)
  145. async def get_equipment(self) -> List[dict]:
  146. url = self._base_url.join('duoduo-service/object-service/object/equipment/findForServe')
  147. params = self._common_parameters()
  148. raw_info = await self._post(url, params)
  149. result = []
  150. for eq in raw_info.get('data'):
  151. result.append({'id': eq.get('id'), 'category': eq.get('equipmentCategory')})
  152. return result
  153. class EquipmentInfoService(Service):
  154. def __init__(self, client: AsyncClient, project_id: str, server_settings=settings):
  155. super(EquipmentInfoService, self).__init__(client)
  156. self._project_id = project_id
  157. self._base_url = URL(server_settings.TRANSFER_HOST)
  158. self._now_time = get_time_str()
  159. async def get_space_by_equipment(self, equipment_id: str) -> List[dict]:
  160. url = self._base_url.join('duoduo-service/object-service/object/space/findForServe')
  161. params = {
  162. 'projectId': self._project_id,
  163. 'objectId': equipment_id
  164. }
  165. raw_info = await self._post(url, params)
  166. result = []
  167. for sp in raw_info.get('data'):
  168. result.append({'id': sp.get('id')})
  169. return result