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.

Files changed (41) hide show
  1. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/PKG-INFO +2 -2
  2. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/pyproject.toml +1 -1
  3. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +2 -2
  4. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/requires.txt +1 -1
  5. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/_version.py +1 -1
  6. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/connector.py +32 -8
  7. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/mqtt_client.py +7 -2
  8. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.flake8 +0 -0
  9. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/dependabot.yml +0 -0
  12. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/build.yml +0 -0
  13. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/build_and_publish.yml +0 -0
  14. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.github/workflows/codeql-analysis.yml +0 -0
  15. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/.gitignore +0 -0
  16. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/CHANGELOG.md +0 -0
  17. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/LICENSE +0 -0
  18. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/Makefile +0 -0
  19. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/README.md +0 -0
  20. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/doc/Config.md +0 -0
  21. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/setup.cfg +0 -0
  22. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/setup_requirements.txt +0 -0
  23. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
  24. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  25. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  26. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  27. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  28. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  29. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  30. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
  31. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
  32. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  33. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  34. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/capability.py +0 -0
  35. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/charging.py +0 -0
  36. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
  37. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/command_impl.py +0 -0
  38. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/error.py +0 -0
  39. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
  40. {carconnectivity_connector_skoda-0.4a6 → carconnectivity_connector_skoda-0.4a8}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
  41. {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.4a6
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.4a10
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
@@ -14,7 +14,7 @@ authors = [
14
14
  { name = "Till Steinbach" }
15
15
  ]
16
16
  dependencies = [
17
- "carconnectivity>=0.4a10",
17
+ "carconnectivity>=0.4a11",
18
18
  "oauthlib~=3.2.2",
19
19
  "requests~=2.32.3",
20
20
  "jwt~=1.3.1",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.4a6
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.4a10
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,4 +1,4 @@
1
- carconnectivity>=0.4a10
1
+ carconnectivity>=0.4a11
2
2
  oauthlib~=3.2.2
3
3
  requests~=2.32.3
4
4
  jwt~=1.3.1
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.4a6'
20
+ __version__ = version = '0.4a8'
21
21
  __version_tuple__ = version_tuple = (0, 4)
@@ -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.connected: BooleanAttribute = BooleanAttribute(name="connected", parent=self, tags={'connector_custom'})
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._healthy = True
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._healthy = False
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 is_healthy(self) -> bool:
1771
- return self._healthy and super().is_healthy()
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.connected._set_value(value=True) # pylint: disable=protected-access
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.connected._set_value(value=False) # pylint: disable=protected-access
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()