carconnectivity-connector-skoda 0.6__tar.gz → 0.7.1__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.6 → carconnectivity_connector_skoda-0.7.1}/CHANGELOG.md +18 -1
  2. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/PKG-INFO +3 -3
  3. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/doc/Config.md +2 -1
  4. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/pyproject.toml +3 -3
  5. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +3 -3
  6. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connector_skoda.egg-info/requires.txt +2 -2
  7. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/_version.py +2 -2
  8. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/openid_session.py +2 -3
  9. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/command_impl.py +1 -1
  10. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/connector.py +17 -4
  11. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/mqtt_client.py +1 -1
  12. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.flake8 +0 -0
  13. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/dependabot.yml +0 -0
  16. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/workflows/build.yml +0 -0
  17. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/workflows/build_and_publish.yml +0 -0
  18. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.github/workflows/codeql-analysis.yml +0 -0
  19. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/.gitignore +0 -0
  20. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/LICENSE +0 -0
  21. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/Makefile +0 -0
  22. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/README.md +0 -0
  23. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/setup.cfg +0 -0
  24. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/setup_requirements.txt +0 -0
  25. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
  26. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  27. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  28. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  29. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  30. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  31. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  32. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
  33. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  34. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  35. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/capability.py +0 -0
  36. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/charging.py +0 -0
  37. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
  38. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/error.py +0 -0
  39. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
  40. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
  41. {carconnectivity_connector_skoda-0.6 → carconnectivity_connector_skoda-0.7.1}/test/integration_test/carConnectivity.json +0 -0
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
5
5
  ## [Unreleased]
6
6
  - No unreleased changes so far
7
7
 
8
+ ## [0.7.1] - 2025-04-18
9
+ ### Fixed
10
+ - Fixed problem where driving range was not fetched when measurements capability had an expired license. Now it will be also fetched when charging license is active.
11
+
12
+ ## [0.7] - 2025-04-17
13
+ ### Fixed
14
+ - Bug in mode attribute that caused the connector to crash
15
+
16
+ ### Changed
17
+ - Updated dependencies
18
+ - stripping of leading and trailing spaces in commands
19
+
20
+ ### Added
21
+ - Precision for all attributes is now used when displaying values
22
+
8
23
  ## [0.6] - 2025-04-02
9
24
  ### Fixed
10
25
  - Only fetch range when measurement capability is available (fix for older cars)
@@ -51,7 +66,9 @@ All notable changes to this project will be documented in this file.
51
66
  Initial release, let's go and give this to the public to try out...
52
67
  The API is not yet implemented completely but most functions already work
53
68
 
54
- [unreleased]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/compare/v0.6...HEAD
69
+ [unreleased]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/compare/v0.7.1...HEAD
70
+ [0.7.1]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/tag/v0.7.1
71
+ [0.7]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/tag/v0.7
55
72
  [0.6]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/tag/v0.6
56
73
  [0.5]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/tag/v0.5
57
74
  [0.4.1]: https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/tag/v0.4.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.6
3
+ Version: 0.7.1
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -37,10 +37,10 @@ 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.6
40
+ Requires-Dist: carconnectivity>=0.7
41
41
  Requires-Dist: oauthlib~=3.2.2
42
42
  Requires-Dist: requests~=2.32.3
43
- Requires-Dist: jwt~=1.3.1
43
+ Requires-Dist: pyjwt~=2.10
44
44
  Requires-Dist: paho-mqtt~=2.1.0
45
45
  Dynamic: license-file
46
46
 
@@ -19,7 +19,8 @@ These are the valid options for the MySkoda Connector
19
19
  "spin": 1234, //S-Pin used for some special commands like locking/unlocking
20
20
  "netrc": "~/.netr", // netrc file if to be used for passwords
21
21
  "api_log_level": "debug", // Show debug information regarding the API
22
- "max_age": 300 //Cache requests to the server vor MAX_AGE seconds
22
+ "max_age": 300, //Cache requests to the server vor MAX_AGE seconds
23
+ "hide_vins": ["19XFB2F90CE040211", "1G2ZH35N074252067"] // Don't fetch these vins
23
24
  }
24
25
  }
25
26
  ],
@@ -14,10 +14,10 @@ authors = [
14
14
  { name = "Till Steinbach" }
15
15
  ]
16
16
  dependencies = [
17
- "carconnectivity>=0.6",
17
+ "carconnectivity>=0.7",
18
18
  "oauthlib~=3.2.2",
19
19
  "requests~=2.32.3",
20
- "jwt~=1.3.1",
20
+ "pyjwt~=2.10",
21
21
  "paho-mqtt~=2.1.0",
22
22
  ]
23
23
  readme = "README.md"
@@ -44,4 +44,4 @@ max-line-length = 160
44
44
  ignore-patterns= "_version.py"
45
45
 
46
46
  [tool.bandit]
47
- targets = "carconnectivity_cli"
47
+ targets = "carconnectivity_cli"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.6
3
+ Version: 0.7.1
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -37,10 +37,10 @@ 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.6
40
+ Requires-Dist: carconnectivity>=0.7
41
41
  Requires-Dist: oauthlib~=3.2.2
42
42
  Requires-Dist: requests~=2.32.3
43
- Requires-Dist: jwt~=1.3.1
43
+ Requires-Dist: pyjwt~=2.10
44
44
  Requires-Dist: paho-mqtt~=2.1.0
45
45
  Dynamic: license-file
46
46
 
@@ -1,5 +1,5 @@
1
- carconnectivity>=0.6
1
+ carconnectivity>=0.7
2
2
  oauthlib~=3.2.2
3
3
  requests~=2.32.3
4
- jwt~=1.3.1
4
+ pyjwt~=2.10
5
5
  paho-mqtt~=2.1.0
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.6'
21
- __version_tuple__ = version_tuple = (0, 6)
20
+ __version__ = version = '0.7.1'
21
+ __version_tuple__ = version_tuple = (0, 7, 1)
@@ -7,7 +7,7 @@ import time
7
7
  from datetime import datetime, timezone
8
8
  import logging
9
9
  import requests
10
- from jwt import JWT
10
+ import jwt
11
11
 
12
12
  from oauthlib.common import UNICODE_ASCII_CHARACTER_SET, generate_nonce, generate_token
13
13
  from oauthlib.oauth2.rfc6749.parameters import parse_authorization_code_response, parse_token_response, prepare_grant_uri
@@ -153,8 +153,7 @@ class OpenIDSession(requests.Session):
153
153
  new_token['expires_in'] = self._token['expires_in']
154
154
  else:
155
155
  if 'id_token' in new_token:
156
- jwt_instance = JWT()
157
- meta_data = jwt_instance.decode(new_token['id_token'], do_verify=False)
156
+ meta_data = jwt.decode(new_token['id_token'], do_verify=False)
158
157
  if 'exp' in meta_data:
159
158
  new_token['expires_at'] = meta_data['exp']
160
159
  expires_at = datetime.fromtimestamp(meta_data['exp'], tz=timezone.utc)
@@ -44,7 +44,7 @@ class SpinCommand(GenericCommand):
44
44
  parser.add_argument('--spin', dest='spin', help='Spin to be used instead of spin from config or .netrc', type=str, required=False,
45
45
  default=None)
46
46
  try:
47
- args = parser.parse_args(new_value.split(sep=' '))
47
+ args = parser.parse_args(new_value.strip().split(sep=' '))
48
48
  except argparse.ArgumentError as e:
49
49
  raise SetterError(f'Invalid format for SpinCommand: {e.message} {parser.format_usage()}') from e
50
50
 
@@ -378,7 +378,8 @@ class Connector(BaseConnector):
378
378
  if vehicle_to_update is not None and isinstance(vehicle_to_update, SkodaVehicle) and vehicle_to_update.is_managed_by_connector(self):
379
379
  vehicle_to_update = self.fetch_vehicle_status(vehicle_to_update)
380
380
  if vehicle_to_update.capabilities is not None and vehicle_to_update.capabilities.enabled:
381
- if vehicle_to_update.capabilities.has_capability('MEASUREMENTS', check_status_ok=True):
381
+ if vehicle_to_update.capabilities.has_capability('MEASUREMENTS', check_status_ok=True) or \
382
+ vehicle_to_update.capabilities.has_capability('CHARGING', check_status_ok=True):
382
383
  vehicle_to_update = self.fetch_driving_range(vehicle_to_update)
383
384
  if vehicle_to_update.capabilities.has_capability('READINESS', check_status_ok=True):
384
385
  vehicle_to_update = self.fetch_connection_status(vehicle_to_update)
@@ -404,13 +405,16 @@ class Connector(BaseConnector):
404
405
  SkodaVehicle: The Skoda vehicle object with the updated state.
405
406
  """
406
407
  if vehicle is not None:
407
- if vehicle.in_motion is not None and vehicle.in_motion.enabled and vehicle.in_motion.value:
408
+ if vehicle.connection_state is not None and vehicle.connection_state.enabled \
409
+ and vehicle.connection_state.value == GenericVehicle.ConnectionState.OFFLINE:
410
+ vehicle.state._set_value(GenericVehicle.State.OFFLINE)
411
+ elif vehicle.in_motion is not None and vehicle.in_motion.enabled and vehicle.in_motion.value:
408
412
  vehicle.state._set_value(GenericVehicle.State.IGNITION_ON) # pylint: disable=protected-access
409
413
  elif vehicle.position is not None and vehicle.position.enabled and vehicle.position.position_type is not None \
410
414
  and vehicle.position.position_type.enabled and vehicle.position.position_type.value == Position.PositionType.PARKING:
411
415
  vehicle.state._set_value(GenericVehicle.State.PARKED) # pylint: disable=protected-access
412
416
  else:
413
- vehicle.state._set_value(None) # pylint: disable=protected-access
417
+ vehicle.state._set_value(GenericVehicle.State.UNKNOWN) # pylint: disable=protected-access
414
418
  return vehicle
415
419
 
416
420
  def fetch_charging(self, vehicle: SkodaElectricVehicle, no_cache: bool = False) -> SkodaElectricVehicle:
@@ -498,10 +502,12 @@ class Connector(BaseConnector):
498
502
  cruising_range_in_km: float = data['status']['battery']['remainingCruisingRangeInMeters'] / 1000
499
503
  # pylint: disable-next=protected-access
500
504
  drive.range._set_value(value=cruising_range_in_km, measured=captured_at, unit=Length.KM)
505
+ drive.range.precision = 1
501
506
  if 'stateOfChargeInPercent' in data['status']['battery'] \
502
507
  and data['status']['battery']['stateOfChargeInPercent'] is not None:
503
508
  # pylint: disable-next=protected-access
504
509
  drive.level._set_value(value=data['status']['battery']['stateOfChargeInPercent'], measured=captured_at)
510
+ drive.level.precision = 1
505
511
  log_extra_keys(LOG_API, 'status', data['status']['battery'], {'remainingCruisingRangeInMeters',
506
512
  'stateOfChargeInPercent'})
507
513
  break
@@ -703,7 +709,9 @@ class Connector(BaseConnector):
703
709
  else:
704
710
  longitude = None
705
711
  vehicle.position.latitude._set_value(latitude) # pylint: disable=protected-access
712
+ vehicle.position.latitude.precision = 0.000001
706
713
  vehicle.position.longitude._set_value(longitude) # pylint: disable=protected-access
714
+ vehicle.position.longitude.precision = 0.000001
707
715
  vehicle.position.position_type._set_value(Position.PositionType.PARKING) # pylint: disable=protected-access
708
716
  else:
709
717
  vehicle.position.latitude._set_value(None) # pylint: disable=protected-access
@@ -756,6 +764,7 @@ class Connector(BaseConnector):
756
764
  raise APIError('Could not fetch maintenance, capturedAt missing')
757
765
  if 'mileageInKm' in data and data['mileageInKm'] is not None:
758
766
  vehicle.odometer._set_value(value=data['mileageInKm'], measured=captured_at, unit=Length.KM) # pylint: disable=protected-access
767
+ vehicle.odometer.precision = 1
759
768
  else:
760
769
  vehicle.odometer._set_value(None) # pylint: disable=protected-access
761
770
  if 'inspectionDueInDays' in data and data['inspectionDueInDays'] is not None:
@@ -1274,6 +1283,7 @@ class Connector(BaseConnector):
1274
1283
  if 'totalRangeInKm' in range_data and range_data['totalRangeInKm'] is not None:
1275
1284
  # pylint: disable-next=protected-access
1276
1285
  vehicle.drives.total_range._set_value(value=range_data['totalRangeInKm'], measured=captured_at, unit=Length.KM)
1286
+ vehicle.drives.total_range.precision = 1
1277
1287
  else:
1278
1288
  vehicle.drives.total_range._set_value(None, measured=captured_at, unit=Length.KM) # pylint: disable=protected-access
1279
1289
 
@@ -1306,15 +1316,18 @@ class Connector(BaseConnector):
1306
1316
  and range_data[f'{drive_id}EngineRange']['currentSoCInPercent'] is not None:
1307
1317
  # pylint: disable-next=protected-access
1308
1318
  drive.level._set_value(value=range_data[f'{drive_id}EngineRange']['currentSoCInPercent'], measured=captured_at)
1319
+ drive.level.precision = 1
1309
1320
  elif 'currentFuelLevelInPercent' in range_data[f'{drive_id}EngineRange'] \
1310
1321
  and range_data[f'{drive_id}EngineRange']['currentFuelLevelInPercent'] is not None:
1311
1322
  # pylint: disable-next=protected-access
1312
1323
  drive.level._set_value(value=range_data[f'{drive_id}EngineRange']['currentFuelLevelInPercent'], measured=captured_at)
1324
+ drive.level.precision = 1
1313
1325
  else:
1314
1326
  drive.level._set_value(None, measured=captured_at) # pylint: disable=protected-access
1315
1327
  if 'remainingRangeInKm' in range_data[f'{drive_id}EngineRange'] and range_data[f'{drive_id}EngineRange']['remainingRangeInKm'] is not None:
1316
1328
  # pylint: disable-next=protected-access
1317
1329
  drive.range._set_value(value=range_data[f'{drive_id}EngineRange']['remainingRangeInKm'], measured=captured_at, unit=Length.KM)
1330
+ drive.range.precision = 1
1318
1331
  else:
1319
1332
  drive.range._set_value(None, measured=captured_at, unit=Length.KM) # pylint: disable=protected-access
1320
1333
 
@@ -1468,7 +1481,7 @@ class Connector(BaseConnector):
1468
1481
  elif not allow_http_error or (allowed_errors is not None and status_response.status_code not in allowed_errors):
1469
1482
  raise RetrievalError(f'Could not fetch data even after re-authorization. Status Code was: {status_response.status_code}')
1470
1483
  elif not allow_http_error or (allowed_errors is not None and status_response.status_code not in allowed_errors):
1471
- raise RetrievalError(f'Could not fetch data. Status Code was: {status_response.status_code}')
1484
+ raise RetrievalError(f'Could not fetch data for {url}. Status Code was: {status_response.status_code}')
1472
1485
  except requests.exceptions.ConnectionError as connection_error:
1473
1486
  raise RetrievalError(f'Connection error: {connection_error}.'
1474
1487
  ' If this happens frequently, please check if other applications communicate with the Skoda server.') from connection_error
@@ -480,7 +480,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
480
480
  old_charging_state: Optional[Charging.ChargingState] = charging_state
481
481
  if 'mode' in data['data'] and data['data']['mode'] is not None \
482
482
  and vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
483
- if data['data']['mode'] in SkodaCharging.SkodaChargeMode:
483
+ if data['data']['mode'] in [item.value for item in SkodaCharging.SkodaChargeMode]:
484
484
  skoda_charging_mode = SkodaCharging.SkodaChargeMode(data['data']['mode'])
485
485
  else:
486
486
  LOG_API.info('Unkown charging mode %s not in %s', data['data']['mode'], str(SkodaCharging.SkodaChargeMode))