-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmyair.py
64 lines (49 loc) · 2.36 KB
/
myair.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import aiohttp
from asyncio.proactor_events import _ProactorBasePipeTransport
from datetime import datetime
from functools import wraps
import logging
from myair_client.myair_client import MyAirConfig
from myair_client import get_client
# Code copied from
# https://pythonalgos.com/runtimeerror-event-loop-is-closed-asyncio-fix
"""fix yelling at me error"""
def silence_event_loop_closed(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except RuntimeError as e:
if str(e) != 'Event loop is closed':
raise
return wrapper
_ProactorBasePipeTransport.__del__ = silence_event_loop_closed(_ProactorBasePipeTransport.__del__)
"""fix yelling at me error end"""
class MyAirConnector:
def __init__(self, config: dict[str, str]):
self.config = MyAirConfig(username=config["login"], password=config["password"], region=config["region"])
async def get_samples(self, last_report_time: str, from_time: datetime, to_time: datetime, measurement: str) -> list:
try:
client_session = aiohttp.ClientSession()
client = get_client(self.config, client_session)
await client.connect()
device = await client.get_user_device_data()
current_report_time = device['lastSleepDataReportTime']
if last_report_time and last_report_time == current_report_time:
await client_session.close()
logging.info("No new data to import.")
return None
logging.info(f"Device last reported data on: {current_report_time}")
tags = {k: v for k, v in device.items() if k in {'serialNumber', 'deviceType', 'localizedName'}}
sleep_records = await client.get_sleep_records(from_time, to_time)
ret = []
for record in sleep_records:
fields = {k: v for k, v in record.items() if k not in {'startDate', '__typename', 'sleepRecordPatientId'}}
time = record["startDate"]
logging.info(f"Record date: {time}")
ret.append({"measurement": measurement, "tags": tags, "fields": fields, "time": time})
await client_session.close()
return [current_report_time, ret]
except:
logging.exception("Unable to get myair data")
raise