From ae4203b47261b8dbd01cdf2f876137ba1a691f93 Mon Sep 17 00:00:00 2001 From: rleidner Date: Fri, 22 Aug 2025 13:49:53 +0200 Subject: [PATCH] bmwbc: fix initial login --- packages/modules/vehicles/bmwbc/api.py | 37 +++++++++++++++++++------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/modules/vehicles/bmwbc/api.py b/packages/modules/vehicles/bmwbc/api.py index c140b10558..ece02fa090 100755 --- a/packages/modules/vehicles/bmwbc/api.py +++ b/packages/modules/vehicles/bmwbc/api.py @@ -139,6 +139,7 @@ class Api: _clconf = {} _account = {} _last_reload = {} + _login_required = {} _primary_vehicle_id = {} _lock = Lock() @@ -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 " @@ -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 @@ -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: @@ -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: @@ -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)