# -*- coding: utf-8 -*- from enum import Enum from typing import Tuple, Dict, List import arrow import numpy as np import pandas as pd from httpx import AsyncClient, URL from app.services.service import Service from app.utils.date import get_time_str, TIME_FMT SERVER = 'http://api.sagacloud.cn' class Season(str, Enum): cooling = 'Cooling' heating = 'Warm' transition = 'Transition' class TransferService(Service): def __init__(self, client: AsyncClient, project_id: str, space_id: str) -> None: super(TransferService, self).__init__(client) self._project_id = project_id self._space_id = space_id self._base_url = URL(SERVER) self._now_time = get_time_str() def _common_parameters(self) -> Dict: return {'projectId': self._project_id, 'spaceId': self._space_id} async def get_season(self) -> Season: url = self._base_url.join('duoduo-service/transfer/environment/getSeasonType') params = { 'projectId': self._project_id, 'date': self._now_time, } raw_info = await self._get(url, params) return Season(raw_info.get('data')) async def get_env_info(self) -> Tuple[int, pd.DataFrame, Dict]: url = self._base_url.join('duoduo-service/transfer/environment/databyroom') start_time = get_time_str(100 * 60, flag='ago') params = self._common_parameters() params.update(({'startTime': start_time, 'endTime': self._now_time})) raw_info = await self._get(url, params) if raw_info.get('meterdata') and len(raw_info.get('meterdata')) > 1: temp_df = pd.DataFrame(raw_info.get('meterdata')) temp_df = temp_df.rename(columns=temp_df.iloc[0, :]).iloc[1:, :] temp_df['date'] = pd.to_datetime(temp_df['date']) temp_df.set_index('date', inplace=True) else: temp_df = pd.DataFrame() return raw_info.get('flag'), temp_df, raw_info.get('target') async def is_temporary(self) -> bool: url = self._base_url.join('duoduo-service/transfer/environment/temp/target') params = self._common_parameters() params.update({'time': self._now_time}) raw_info = await self._get(url, params) flag = False if raw_info.get('flag') == 1: flag = True return flag async def get_feedback(self, wechat_time: str) -> Dict: url = self._base_url.join('duoduo-service/transfer/environment/feedbackCount') params = self._common_parameters() params.update({'time': wechat_time}) raw_info = await self._get(url, params) meaning_dict = { 'Id1': 'a little cold', 'Id2': 'so cold', 'Id3': 'a little hot', 'Id4': 'so hot', 'Id5': 'noisy or blowy', 'Id6': 'so stuffy', 'Id7': 'more sunshine', 'Id8': 'less sunshine', 'Id9': 'send a repairman', 'Id10': 'switch off', 'Id11': 'nice', 'Id12': 'switch on', } feedback_dic = {meaning_dict.get(k): v for k, v in raw_info.items() if k != 'result'} return feedback_dic async def get_custom_target(self) -> pd.DataFrame: url = self._base_url.join('duoduo-service/transfer/environment/target') params = self._common_parameters() params.update({'date': arrow.get(self._now_time, TIME_FMT).date().strftime('%Y%m%d')}) raw_info = await self._get(url, params) custom_target_df = pd.DataFrame(raw_info.get('data')) # custom_target_df['timestamp'] = pd.to_datetime(custom_target_df['date'] + custom_target_df['time']) custom_target_df.set_index('time', inplace=True) return custom_target_df async def env_database_set(self, form: str, value: float) -> None: url = self._base_url.join('duoduo-service/transfer/environment/hispoint/set') params = self._common_parameters() time_str = arrow.get(self._now_time, TIME_FMT).date().strftime('%H%M%S') params.update({'time': time_str, 'type': form, 'value': value}) await self._get(url, params) async def env_database_get(self) -> Dict[str, pd.DataFrame]: url = self._base_url.join('duoduo-service/transfer/environment/hispoint/get') params = self._common_parameters() params.update({'date': self._now_time}) raw_info = await self._get(url, params) result = {} if raw_info.get('result') == 'success': for k, v in raw_info.items(): if k != 'result': if len(v) > 0: temp = {} data = np.array(v) temp.update({'timestamp': data[:, 0]}) temp.update({'value': data[:, 1].astype(np.float)}) result.update({k: pd.DataFrame(temp)}) else: result.update({k: pd.DataFrame()}) return result async def set_custom_target(self, form: str, target_value: Dict[str, List[float]], flag: str = '1') -> None: url = self._base_url.join('duoduo-service/transfer/environment/target/setting') params = { 'spaceId': self._space_id, 'timepoint': self._now_time, 'type': form, 'flag': flag } await self._post(url, params=params, payload=target_value) async def set_temporary_custom(self) -> None: url = self._base_url.join('duoduo-service/transfer/environment/setServiceFlag') params = self._common_parameters() params.update({'time': self._now_time}) await self._get(url, params)