carconnectivity-connector-skoda 0.4a6__tar.gz → 0.4a8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of carconnectivity-connector-skoda might be problematic. Click here for more details.
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/PKG-INFO +2 -2
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/pyproject.toml +1 -1
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +2 -2
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/requires.txt +1 -1
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/_version.py +1 -1
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/connector.py +32 -8
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/mqtt_client.py +7 -2
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.flake8 +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/dependabot.yml +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/build.yml +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/build_and_publish.yml +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/codeql-analysis.yml +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.gitignore +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/CHANGELOG.md +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/LICENSE +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/Makefile +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/README.md +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/doc/Config.md +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/setup.cfg +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/setup_requirements.txt +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/capability.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/charging.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/command_impl.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/error.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
- {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/test/integration_test/carConnectivity.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: carconnectivity-connector-skoda
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4a8
|
|
4
4
|
Summary: CarConnectivity connector for Skoda services
|
|
5
5
|
Author: Till Steinbach
|
|
6
6
|
License: MIT License
|
|
@@ -37,7 +37,7 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
37
37
|
Requires-Python: >=3.8
|
|
38
38
|
Description-Content-Type: text/markdown
|
|
39
39
|
License-File: LICENSE
|
|
40
|
-
Requires-Dist: carconnectivity>=0.
|
|
40
|
+
Requires-Dist: carconnectivity>=0.4a11
|
|
41
41
|
Requires-Dist: oauthlib~=3.2.2
|
|
42
42
|
Requires-Dist: requests~=2.32.3
|
|
43
43
|
Requires-Dist: jwt~=1.3.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: carconnectivity-connector-skoda
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4a8
|
|
4
4
|
Summary: CarConnectivity connector for Skoda services
|
|
5
5
|
Author: Till Steinbach
|
|
6
6
|
License: MIT License
|
|
@@ -37,7 +37,7 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
37
37
|
Requires-Python: >=3.8
|
|
38
38
|
Description-Content-Type: text/markdown
|
|
39
39
|
License-File: LICENSE
|
|
40
|
-
Requires-Dist: carconnectivity>=0.
|
|
40
|
+
Requires-Dist: carconnectivity>=0.4a11
|
|
41
41
|
Requires-Dist: oauthlib~=3.2.2
|
|
42
42
|
Requires-Dist: requests~=2.32.3
|
|
43
43
|
Requires-Dist: jwt~=1.3.1
|
|
@@ -23,13 +23,14 @@ from carconnectivity.doors import Doors
|
|
|
23
23
|
from carconnectivity.windows import Windows
|
|
24
24
|
from carconnectivity.lights import Lights
|
|
25
25
|
from carconnectivity.drive import GenericDrive, ElectricDrive, CombustionDrive
|
|
26
|
-
from carconnectivity.attributes import GenericAttribute, BooleanAttribute, DurationAttribute, TemperatureAttribute
|
|
26
|
+
from carconnectivity.attributes import GenericAttribute, BooleanAttribute, DurationAttribute, TemperatureAttribute, EnumAttribute
|
|
27
27
|
from carconnectivity.charging import Charging
|
|
28
28
|
from carconnectivity.position import Position
|
|
29
29
|
from carconnectivity.climatization import Climatization
|
|
30
30
|
from carconnectivity.charging_connector import ChargingConnector
|
|
31
31
|
from carconnectivity.commands import Commands
|
|
32
32
|
from carconnectivity.command_impl import ClimatizationStartStopCommand, ChargingStartStopCommand, HonkAndFlashCommand, LockUnlockCommand, WakeSleepCommand
|
|
33
|
+
from carconnectivity.enums import ConnectionState
|
|
33
34
|
|
|
34
35
|
from carconnectivity_connectors.base.connector import BaseConnector
|
|
35
36
|
from carconnectivity_connectors.skoda.auth.session_manager import SessionManager, SessionUser, Service
|
|
@@ -73,7 +74,6 @@ class Connector(BaseConnector):
|
|
|
73
74
|
"""
|
|
74
75
|
def __init__(self, connector_id: str, car_connectivity: CarConnectivity, config: Dict) -> None:
|
|
75
76
|
BaseConnector.__init__(self, connector_id=connector_id, car_connectivity=car_connectivity, config=config, log=LOG, api_log=LOG_API)
|
|
76
|
-
self._healthy = False
|
|
77
77
|
|
|
78
78
|
self._mqtt_client: SkodaMQTTClient = SkodaMQTTClient(skoda_connector=self)
|
|
79
79
|
|
|
@@ -81,7 +81,10 @@ class Connector(BaseConnector):
|
|
|
81
81
|
self._background_connect_thread: Optional[threading.Thread] = None
|
|
82
82
|
self._stop_event = threading.Event()
|
|
83
83
|
|
|
84
|
-
self.
|
|
84
|
+
self.connection_state: EnumAttribute = EnumAttribute(name="connection_state", parent=self, value_type=ConnectionState,
|
|
85
|
+
value=ConnectionState.DISCONNECTED, tags={'connector_custom'})
|
|
86
|
+
self.rest_connected: bool = False
|
|
87
|
+
self.mqtt_connected: bool = False
|
|
85
88
|
self.interval: DurationAttribute = DurationAttribute(name="interval", parent=self, tags={'connector_custom'})
|
|
86
89
|
self.interval.minimum = timedelta(seconds=180)
|
|
87
90
|
self.interval._is_changeable = True # pylint: disable=protected-access
|
|
@@ -167,7 +170,7 @@ class Connector(BaseConnector):
|
|
|
167
170
|
self._background_connect_thread.start()
|
|
168
171
|
# Start MQTT thread
|
|
169
172
|
self._mqtt_client.loop_start()
|
|
170
|
-
self.
|
|
173
|
+
self.healthy._set_value(value=True) # pylint: disable=protected-access
|
|
171
174
|
|
|
172
175
|
def _background_connect_loop(self) -> None:
|
|
173
176
|
while not self._stop_event.is_set():
|
|
@@ -181,6 +184,7 @@ class Connector(BaseConnector):
|
|
|
181
184
|
def _background_loop(self) -> None:
|
|
182
185
|
self._stop_event.clear()
|
|
183
186
|
fetch: bool = True
|
|
187
|
+
self.connection_state._set_value(value=ConnectionState.CONNECTING) # pylint: disable=protected-access
|
|
184
188
|
while not self._stop_event.is_set():
|
|
185
189
|
interval = 300
|
|
186
190
|
try:
|
|
@@ -199,25 +203,43 @@ class Connector(BaseConnector):
|
|
|
199
203
|
raise
|
|
200
204
|
except TooManyRequestsError as err:
|
|
201
205
|
LOG.error('Retrieval error during update. Too many requests from your account (%s). Will try again after 15 minutes', str(err))
|
|
206
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
207
|
+
self.rest_connected = False
|
|
202
208
|
self._stop_event.wait(900)
|
|
203
209
|
except RetrievalError as err:
|
|
204
210
|
LOG.error('Retrieval error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
|
211
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
212
|
+
self.rest_connected = False
|
|
205
213
|
self._stop_event.wait(interval)
|
|
206
214
|
except APIError as err:
|
|
207
215
|
LOG.error('API error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
|
216
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
217
|
+
self.rest_connected = False
|
|
208
218
|
self._stop_event.wait(interval)
|
|
209
219
|
except APICompatibilityError as err:
|
|
210
220
|
LOG.error('API compatability error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
|
221
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
222
|
+
self.rest_connected = False
|
|
211
223
|
self._stop_event.wait(interval)
|
|
212
224
|
except TemporaryAuthenticationError as err:
|
|
213
225
|
LOG.error('Temporary authentification error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
|
226
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
227
|
+
self.rest_connected = False
|
|
214
228
|
self._stop_event.wait(interval)
|
|
215
229
|
except Exception as err:
|
|
216
230
|
LOG.critical('Critical error during update: %s', traceback.format_exc())
|
|
217
|
-
self.
|
|
231
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
|
232
|
+
self.rest_connected = False
|
|
233
|
+
self.healthy._set_value(value=False) # pylint: disable=protected-access
|
|
218
234
|
raise err
|
|
219
235
|
else:
|
|
236
|
+
self.rest_connected = True
|
|
237
|
+
if self.mqtt_connected:
|
|
238
|
+
self.connection_state._set_value(value=ConnectionState.CONNECTED) # pylint: disable=protected-access
|
|
220
239
|
self._stop_event.wait(interval)
|
|
240
|
+
# When leaving the loop, set the connection state to disconnected
|
|
241
|
+
self.connection_state._set_value(value=ConnectionState.DISCONNECTED) # pylint: disable=protected-access
|
|
242
|
+
self.rest_connected = False
|
|
221
243
|
|
|
222
244
|
def persist(self) -> None:
|
|
223
245
|
"""
|
|
@@ -647,7 +669,7 @@ class Connector(BaseConnector):
|
|
|
647
669
|
if vehicle.position is None:
|
|
648
670
|
raise ValueError('Vehicle has no charging object')
|
|
649
671
|
url = f'https://mysmob.api.connect.skoda-auto.cz/api/v1/maps/positions?vin={vin}'
|
|
650
|
-
data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache)
|
|
672
|
+
data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache, allow_empty=True)
|
|
651
673
|
if data is not None:
|
|
652
674
|
if 'positions' in data and data['positions'] is not None:
|
|
653
675
|
for position_dict in data['positions']:
|
|
@@ -1352,6 +1374,8 @@ class Connector(BaseConnector):
|
|
|
1352
1374
|
data = status_response.json()
|
|
1353
1375
|
if session.cache is not None:
|
|
1354
1376
|
session.cache[url] = (data, str(datetime.utcnow()))
|
|
1377
|
+
elif status_response.status_code == requests.codes['no_content'] and allow_empty:
|
|
1378
|
+
data = None
|
|
1355
1379
|
elif status_response.status_code == requests.codes['too_many_requests']:
|
|
1356
1380
|
raise TooManyRequestsError('Could not fetch data due to too many requests from your account. '
|
|
1357
1381
|
f'Status Code was: {status_response.status_code}')
|
|
@@ -1767,5 +1791,5 @@ class Connector(BaseConnector):
|
|
|
1767
1791
|
raise CommandError(f'Retrying failed: {retry_error}') from retry_error
|
|
1768
1792
|
return command_arguments
|
|
1769
1793
|
|
|
1770
|
-
def
|
|
1771
|
-
return
|
|
1794
|
+
def get_name(self) -> str:
|
|
1795
|
+
return "Skoda Connector"
|
|
@@ -22,6 +22,7 @@ from carconnectivity.util import robust_time_parse, log_extra_keys
|
|
|
22
22
|
from carconnectivity.charging import Charging
|
|
23
23
|
from carconnectivity.climatization import Climatization
|
|
24
24
|
from carconnectivity.units import Speed, Power, Length
|
|
25
|
+
from carconnectivity.enums import ConnectionState
|
|
25
26
|
|
|
26
27
|
from carconnectivity_connectors.skoda.vehicle import SkodaVehicle, SkodaElectricVehicle
|
|
27
28
|
from carconnectivity_connectors.skoda.charging import SkodaCharging, mapping_skoda_charging_state
|
|
@@ -77,6 +78,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
|
|
|
77
78
|
Returns:
|
|
78
79
|
MQTTErrorCode: The result of the connection attempt.
|
|
79
80
|
"""
|
|
81
|
+
self._skoda_connector.connection_state._set_value(value=ConnectionState.CONNECTING) # pylint: disable=protected-access
|
|
80
82
|
return super().connect(*args, host='mqtt.messagehub.de', port=8883, keepalive=60, **kwargs)
|
|
81
83
|
|
|
82
84
|
def _on_pre_connect_callback(self, client: Client, userdata: Any) -> None:
|
|
@@ -312,7 +314,9 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
|
|
|
312
314
|
# reason_code 0 means success
|
|
313
315
|
if reason_code == 0:
|
|
314
316
|
LOG.info('Connected to Skoda MQTT server')
|
|
315
|
-
self._skoda_connector.
|
|
317
|
+
if self._skoda_connector.rest_connected:
|
|
318
|
+
self._skoda_connector.connection_state._set_value(value=ConnectionState.CONNECTED) # pylint: disable=protected-access
|
|
319
|
+
self._skoda_connector.mqtt_connected = True
|
|
316
320
|
observer_flags: Observable.ObserverEvent = Observable.ObserverEvent.ENABLED | Observable.ObserverEvent.DISABLED
|
|
317
321
|
self._skoda_connector.car_connectivity.garage.add_observer(observer=self._on_carconnectivity_vehicle_enabled,
|
|
318
322
|
flag=observer_flags,
|
|
@@ -385,7 +389,8 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
|
|
|
385
389
|
del properties
|
|
386
390
|
del flags
|
|
387
391
|
|
|
388
|
-
self._skoda_connector.
|
|
392
|
+
self._skoda_connector.connection_state._set_value(value=ConnectionState.DISCONNECTED) # pylint: disable=protected-access
|
|
393
|
+
self._skoda_connector.mqtt_connected = False
|
|
389
394
|
self._skoda_connector.car_connectivity.garage.remove_observer(observer=self._on_carconnectivity_vehicle_enabled)
|
|
390
395
|
|
|
391
396
|
self.subscribed_topics.clear()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/CHANGELOG.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/doc/Config.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|