Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 28 additions & 9 deletions packages/modules/vehicles/bmwbc/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ class Api:
_clconf = {}
_account = {}
_last_reload = {}
_login_required = {}
_primary_vehicle_id = {}
_lock = Lock()

Expand Down Expand Up @@ -188,6 +189,7 @@ async def _fetch_soc(self,
soc = 0
range = 0.0
soc_tsX = 0.0
self._login_required[user_id] = False

if captcha_token != "SECONDARY":
self._mode = "PRIMARY "
Expand All @@ -207,13 +209,20 @@ async def _fetch_soc(self,
# last used captcha token in store, compare with captcha_token in configuration
if self._store[user_id]['captcha_token'] != captcha_token:
# invalidate current refresh and access token to force new login
log.debug("new captcha token configured - invalidate stored token set")
self._login_required[user_id] = True
log.info("new captcha token configured - invalidate stored token set")
self._new_captcha = True
self._store[user_id]['expires_at'] = None
self._store[user_id]['access_token'] = None
self._store[user_id]['refresh_token'] = None
self._store[user_id]['session_id'] = None
self._store[user_id]['gcid'] = None
if user_id in self._auth:
self._auth.pop(user_id)
if user_id in self._clconf:
self._clconf.pop(user_id)
if user_id in self._account:
self._account.pop(user_id)
else:
log.debug("captcha token unchanged")
self._new_captcha = False
Expand Down Expand Up @@ -246,10 +255,11 @@ async def _fetch_soc(self,
log.debug("# Reuse _auth instance")

# set session_id and gcid in _auth to store values
if self._store[user_id]['session_id'] is not None:
self._auth[user_id].session_id = self._store[user_id]['session_id']
if self._store[user_id]['gcid'] is not None:
self._auth[user_id].gcid = self._store[user_id]['gcid']
if self._login_required[user_id] is False:
if self._store[user_id]['session_id'] is not None:
self._auth[user_id].session_id = self._store[user_id]['session_id']
if self._store[user_id]['gcid'] is not None:
self._auth[user_id].gcid = self._store[user_id]['gcid']

# instantiate client configuration object is not existent yet
if user_id not in self._clconf:
Expand All @@ -265,15 +275,23 @@ async def _fetch_soc(self,
self._account[user_id] = MyBMWAccount(None, None, None,
config=self._clconf[user_id],
hcaptcha_token=captcha_token)
self._account[user_id].set_refresh_token(refresh_token=self._store[user_id]['refresh_token'],
gcid=self._store[user_id]['gcid'],
access_token=self._store[user_id]['access_token'],
session_id=self._store[user_id]['session_id'])
if self._login_required[user_id] is False:
self._account[user_id].set_refresh_token(refresh_token=self._store[user_id]['refresh_token'],
gcid=self._store[user_id]['gcid'],
access_token=self._store[user_id]['access_token'],
session_id=self._store[user_id]['session_id'])
else:
log.debug("# Reuse _account instance")
else:
self._mode = "SECONDARY"

if self._login_required[user_id]:
log.debug("# before initial login:" + str(self._auth[user_id].expires_at))
await self._auth[user_id].login()
log.debug("# after initial login:" + str(self._auth[user_id].expires_at))
self._login_required[user_id] = False
self._last_reload[user_id] = 0

# get vehicle list - if last reload is more than 5 min ago
self._now = datetime.timestamp(datetime.now())
if user_id not in self._last_reload:
Expand Down Expand Up @@ -325,6 +343,7 @@ async def _fetch_soc(self,

# get json of vehicle data
resp = dumps(vehicle, cls=MyBMWJSONEncoder, indent=4)
log.debug("bmwbc.fetch_soc: resp=" + resp)

# vehicle data - json to dict
respd = loads(resp)
Expand Down