22import asyncio
33import logging
44import json
5+ from datetime import datetime , timedelta
56from homeassistant .helpers .entity import DeviceInfo
67from ..const import DOMAIN
78
@@ -20,6 +21,7 @@ def __init__(self, email, password):
2021
2122 self ._device_info = None
2223 self ._token = None
24+ self ._user_id = ""
2325 self ._serial = ""
2426 self ._session = aiohttp .ClientSession ()
2527
@@ -74,6 +76,21 @@ async def _put_request(self, url, data=None, is_retry=False):
7476
7577 return True
7678
79+ async def _get_request (self , url , is_retry = False ):
80+ """Try to make a GET request
81+ If we get a non 200 response, refresh auth token and try again"""
82+ async with self ._session .get (
83+ url ,
84+ headers = {"Authorization" : "Firebase %s" % self ._token }
85+ ) as resp :
86+ if resp .status != 200 and not is_retry :
87+ await self .async_refresh_session ()
88+ return await self ._get_request (url , is_retry = True )
89+ elif resp .status != 200 :
90+ return False
91+
92+ return await resp .json ()
93+
7794 async def async_pause_charge (self ):
7895 """Pause an ongoing charge"""
7996 result = await self ._post_request (f"https://api.ohme.io/v1/chargeSessions/{ self ._serial } /stop" , skip_json = True )
@@ -98,46 +115,57 @@ async def async_stop_max_charge(self):
98115 async def async_get_charge_sessions (self , is_retry = False ):
99116 """Try to fetch charge sessions endpoint.
100117 If we get a non 200 response, refresh auth token and try again"""
101- async with self ._session .get (
102- 'https://api.ohme.io/v1/chargeSessions' ,
103- headers = {"Authorization" : "Firebase %s" % self ._token }
104- ) as resp :
105-
106- if resp .status != 200 and not is_retry :
107- await self .async_refresh_session ()
108- return await self .async_get_charge_sessions (True )
109- elif resp .status != 200 :
110- return False
118+ resp = await self ._get_request ('https://api.ohme.io/v1/chargeSessions' )
119+
120+ if not resp :
121+ return False
111122
112- resp_json = await resp .json ()
113- return resp_json [0 ]
123+ return resp [0 ]
114124
115125 async def async_update_device_info (self , is_retry = False ):
116126 """Update _device_info with our charger model."""
117- async with self ._session .get (
118- 'https://api.ohme.io/v1/users/me/account' ,
119- headers = {"Authorization" : "Firebase %s" % self ._token }
120- ) as resp :
127+ resp = await self ._get_request ('https://api.ohme.io/v1/users/me/account' )
121128
122- if resp .status != 200 and not is_retry :
123- await self .async_refresh_session ()
124- return await self .async_get_device_info (True )
125- elif resp .status != 200 :
126- return False
129+ if not resp :
130+ return False
127131
128- resp_json = await resp .json ()
129- device = resp_json ['chargeDevices' ][0 ]
130-
131- info = DeviceInfo (
132- identifiers = {(DOMAIN , "ohme_charger" )},
133- name = device ['modelTypeDisplayName' ],
134- manufacturer = "Ohme" ,
135- model = device ['modelTypeDisplayName' ].replace ("Ohme " , "" ),
136- sw_version = device ['firmwareVersionLabel' ],
137- serial_number = device ['id' ]
138- )
139- self ._serial = device ['id' ]
140- self ._device_info = info
132+ device = resp ['chargeDevices' ][0 ]
133+
134+ info = DeviceInfo (
135+ identifiers = {(DOMAIN , "ohme_charger" )},
136+ name = device ['modelTypeDisplayName' ],
137+ manufacturer = "Ohme" ,
138+ model = device ['modelTypeDisplayName' ].replace ("Ohme " , "" ),
139+ sw_version = device ['firmwareVersionLabel' ],
140+ serial_number = device ['id' ]
141+ )
142+
143+ self ._user_id = resp ['user' ]['id' ]
144+ self ._serial = device ['id' ]
145+ self ._device_info = info
146+
147+ return True
148+
149+ def _last_second_of_month_timestamp (self ):
150+ """Get the last second of this month."""
151+ dt = datetime .today ()
152+ dt = dt .replace (day = 1 ) + timedelta (days = 32 )
153+ dt = dt .replace (day = 1 , hour = 0 , minute = 0 , second = 0 , microsecond = 0 ) - timedelta (seconds = 1 )
154+ return int (dt .timestamp ()* 1e3 )
155+
156+ async def async_get_charge_statistics (self ):
157+ """Get charge statistics. Currently this is just for all time (well, Jan 2019)."""
158+ end_ts = self ._last_second_of_month_timestamp ()
159+ resp = await self ._get_request (f"https://api.ohme.io/v1/chargeSessions/summary/users/{ self ._user_id } ?&startTs=1546300800000&endTs={ end_ts } &granularity=MONTH" )
160+
161+ if not resp :
162+ return False
163+
164+ return resp ['totalStats' ]
141165
142166 def get_device_info (self ):
143167 return self ._device_info
168+
169+ def get_unique_id (self , name ):
170+ return f"ohme_{ self ._serial } _{ name } "
171+
0 commit comments