carconnectivity-connector-skoda 0.4.1__tar.gz → 0.5a1__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.4.1 → carconnectivity_connector_skoda-0.5a1}/PKG-INFO +3 -3
  2. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/README.md +1 -1
  3. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/pyproject.toml +1 -1
  4. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +3 -3
  5. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connector_skoda.egg-info/requires.txt +1 -1
  6. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/_version.py +2 -2
  7. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/connector.py +87 -4
  8. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.flake8 +0 -0
  9. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/dependabot.yml +0 -0
  12. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/workflows/build.yml +0 -0
  13. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/workflows/build_and_publish.yml +0 -0
  14. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.github/workflows/codeql-analysis.yml +0 -0
  15. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/.gitignore +0 -0
  16. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/CHANGELOG.md +0 -0
  17. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/LICENSE +0 -0
  18. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/Makefile +0 -0
  19. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/doc/Config.md +0 -0
  20. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/setup.cfg +0 -0
  21. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/setup_requirements.txt +0 -0
  22. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
  23. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  24. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  25. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  26. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  27. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  28. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  29. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
  30. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
  31. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  32. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  33. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/capability.py +0 -0
  34. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/charging.py +0 -0
  35. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
  36. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/command_impl.py +0 -0
  37. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/error.py +0 -0
  38. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/mqtt_client.py +0 -0
  39. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
  40. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
  41. {carconnectivity_connector_skoda-0.4.1 → carconnectivity_connector_skoda-0.5a1}/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.4.1
3
+ Version: 0.5a1
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.4
40
+ Requires-Dist: carconnectivity>=0.5a4
41
41
  Requires-Dist: oauthlib~=3.2.2
42
42
  Requires-Dist: requests~=2.32.3
43
43
  Requires-Dist: jwt~=1.3.1
@@ -45,7 +45,7 @@ Requires-Dist: paho-mqtt~=2.1.0
45
45
 
46
46
 
47
47
 
48
- # CarConnectivity Connector for Volkswagen Vehicles
48
+ # CarConnectivity Connector for Skoda Vehicles
49
49
  [![GitHub sourcecode](https://img.shields.io/badge/Source-GitHub-green)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/)
50
50
  [![GitHub release (latest by date)](https://img.shields.io/github/v/release/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/latest)
51
51
  [![GitHub](https://img.shields.io/github/license/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/blob/master/LICENSE)
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- # CarConnectivity Connector for Volkswagen Vehicles
3
+ # CarConnectivity Connector for Skoda Vehicles
4
4
  [![GitHub sourcecode](https://img.shields.io/badge/Source-GitHub-green)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/)
5
5
  [![GitHub release (latest by date)](https://img.shields.io/github/v/release/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/latest)
6
6
  [![GitHub](https://img.shields.io/github/license/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/blob/master/LICENSE)
@@ -14,7 +14,7 @@ authors = [
14
14
  { name = "Till Steinbach" }
15
15
  ]
16
16
  dependencies = [
17
- "carconnectivity>=0.4",
17
+ "carconnectivity>=0.5a4",
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.4.1
3
+ Version: 0.5a1
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.4
40
+ Requires-Dist: carconnectivity>=0.5a4
41
41
  Requires-Dist: oauthlib~=3.2.2
42
42
  Requires-Dist: requests~=2.32.3
43
43
  Requires-Dist: jwt~=1.3.1
@@ -45,7 +45,7 @@ Requires-Dist: paho-mqtt~=2.1.0
45
45
 
46
46
 
47
47
 
48
- # CarConnectivity Connector for Volkswagen Vehicles
48
+ # CarConnectivity Connector for Skoda Vehicles
49
49
  [![GitHub sourcecode](https://img.shields.io/badge/Source-GitHub-green)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/)
50
50
  [![GitHub release (latest by date)](https://img.shields.io/github/v/release/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/releases/latest)
51
51
  [![GitHub](https://img.shields.io/github/license/tillsteinbach/CarConnectivity-connector-skoda)](https://github.com/tillsteinbach/CarConnectivity-connector-skoda/blob/master/LICENSE)
@@ -1,4 +1,4 @@
1
- carconnectivity>=0.4
1
+ carconnectivity>=0.5a4
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.4.1'
21
- __version_tuple__ = version_tuple = (0, 4, 1)
20
+ __version__ = version = '0.5a1'
21
+ __version_tuple__ = version_tuple = (0, 5)
@@ -29,8 +29,10 @@ 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
- from carconnectivity.command_impl import ClimatizationStartStopCommand, ChargingStartStopCommand, HonkAndFlashCommand, LockUnlockCommand, WakeSleepCommand
32
+ from carconnectivity.command_impl import ClimatizationStartStopCommand, ChargingStartStopCommand, HonkAndFlashCommand, LockUnlockCommand, WakeSleepCommand, \
33
+ WindowHeatingStartStopCommand
33
34
  from carconnectivity.enums import ConnectionState
35
+ from carconnectivity.window_heating import WindowHeatings
34
36
 
35
37
  from carconnectivity_connectors.base.connector import BaseConnector
36
38
  from carconnectivity_connectors.skoda.auth.session_manager import SessionManager, SessionUser, Service
@@ -646,7 +648,7 @@ class Connector(BaseConnector):
646
648
  vehicle.in_motion._set_value(data['inMotion']) # pylint: disable=protected-access
647
649
  else:
648
650
  vehicle.in_motion._set_value(None) # pylint: disable=protected-access
649
- log_extra_keys(LOG_API, 'connection status', data, {'unreachable'})
651
+ log_extra_keys(LOG_API, 'connection status', data, {'unreachable', 'inMotion'})
650
652
  return vehicle
651
653
 
652
654
  def fetch_position(self, vehicle: SkodaVehicle, no_cache: bool = False) -> SkodaVehicle:
@@ -701,6 +703,10 @@ class Connector(BaseConnector):
701
703
  vehicle.position.latitude._set_value(None) # pylint: disable=protected-access
702
704
  vehicle.position.longitude._set_value(None) # pylint: disable=protected-access
703
705
  vehicle.position.position_type._set_value(None) # pylint: disable=protected-access
706
+ else:
707
+ vehicle.position.latitude._set_value(None) # pylint: disable=protected-access
708
+ vehicle.position.longitude._set_value(None) # pylint: disable=protected-access
709
+ vehicle.position.position_type._set_value(None) # pylint: disable=protected-access
704
710
  return vehicle
705
711
 
706
712
  def fetch_maintenance(self, vehicle: SkodaVehicle, no_cache: bool = False) -> SkodaVehicle:
@@ -969,7 +975,44 @@ class Connector(BaseConnector):
969
975
  # pylint: disable-next=protected-access
970
976
  vehicle.charging.connector.lock_state._set_value(value=None, measured=captured_at)
971
977
  if 'windowHeatingState' in data and data['windowHeatingState'] is not None:
972
- pass
978
+ heating_on: bool = False
979
+ all_heating_invalid: bool = True
980
+ for window_id, state in data['windowHeatingState'].items():
981
+ if window_id != 'unspecified':
982
+ if window_id in vehicle.window_heatings.windows:
983
+ window: WindowHeatings.WindowHeating = vehicle.window_heatings.windows[window_id]
984
+ else:
985
+ window = WindowHeatings.WindowHeating(window_id=window_id, window_heatings=vehicle.window_heatings)
986
+ vehicle.window_heatings.windows[window_id] = window
987
+
988
+ if state.lower() in [item.value for item in WindowHeatings.HeatingState]:
989
+ window_heating_state: WindowHeatings.HeatingState = WindowHeatings.HeatingState(state.lower())
990
+ if window_heating_state == WindowHeatings.HeatingState.ON:
991
+ heating_on = True
992
+ if window_heating_state in [WindowHeatings.HeatingState.ON,
993
+ WindowHeatings.HeatingState.OFF]:
994
+ all_heating_invalid = False
995
+ window.heating_state._set_value(window_heating_state, measured=captured_at) # pylint: disable=protected-access
996
+ else:
997
+ LOG_API.info('Unknown window heating state %s not in %s', state.lower(), str(WindowHeatings.HeatingState))
998
+ # pylint: disable-next=protected-access
999
+ window.heating_state._set_value(WindowHeatings.HeatingState.UNKNOWN, measured=captured_at)
1000
+ if all_heating_invalid:
1001
+ # pylint: disable-next=protected-access
1002
+ vehicle.window_heatings.heating_state._set_value(WindowHeatings.HeatingState.INVALID, measured=captured_at)
1003
+ else:
1004
+ if heating_on:
1005
+ # pylint: disable-next=protected-access
1006
+ vehicle.window_heatings.heating_state._set_value(WindowHeatings.HeatingState.ON, measured=captured_at)
1007
+ else:
1008
+ # pylint: disable-next=protected-access
1009
+ vehicle.window_heatings.heating_state._set_value(WindowHeatings.HeatingState.OFF, measured=captured_at)
1010
+ if vehicle.window_heatings is not None and vehicle.window_heatings.commands is not None \
1011
+ and not vehicle.window_heatings.commands.contains_command('start-stop'):
1012
+ start_stop_command = WindowHeatingStartStopCommand(parent=vehicle.window_heatings.commands)
1013
+ start_stop_command._add_on_set_hook(self.__on_window_heating_start_stop) # pylint: disable=protected-access
1014
+ start_stop_command.enabled = True
1015
+ vehicle.window_heatings.commands.add_command(start_stop_command)
973
1016
  if 'errors' in data and data['errors'] is not None:
974
1017
  found_errors: Set[str] = set()
975
1018
  if not isinstance(vehicle.climatization, SkodaClimatization):
@@ -998,7 +1041,7 @@ class Connector(BaseConnector):
998
1041
  log_extra_keys(LOG_API, 'air-condition', data, {'carCapturedTimestamp', 'state', 'estimatedDateTimeToReachTargetTemperature',
999
1042
  'targetTemperature', 'outsideTemperature', 'chargerConnectionState',
1000
1043
  'chargerLockState', 'airConditioningAtUnlock', 'steeringWheelPosition',
1001
- 'windowHeatingEnabled', 'seatHeatingActivated', 'errors'})
1044
+ 'windowHeatingEnabled', 'seatHeatingActivated', 'windowHeatingState', 'errors'})
1002
1045
  return vehicle
1003
1046
 
1004
1047
  def fetch_vehicle_details(self, vehicle: SkodaVehicle, no_cache: bool = False) -> SkodaVehicle:
@@ -1182,6 +1225,8 @@ class Connector(BaseConnector):
1182
1225
  url = f'https://mysmob.api.connect.skoda-auto.cz/api/v2/vehicle-status/{vin}/driving-range'
1183
1226
  range_data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache)
1184
1227
  if range_data:
1228
+ if 'carCapturedTimestamp' not in range_data or range_data['carCapturedTimestamp'] is None:
1229
+ raise APIError('Could not fetch driving range, carCapturedTimestamp missing')
1185
1230
  captured_at: datetime = robust_time_parse(range_data['carCapturedTimestamp'])
1186
1231
  # Check vehicle type and if it does not match the current vehicle type, create a new vehicle object using copy constructor
1187
1232
  if 'carType' in range_data and range_data['carType'] is not None:
@@ -1806,5 +1851,43 @@ class Connector(BaseConnector):
1806
1851
  raise CommandError(f'Retrying failed: {retry_error}') from retry_error
1807
1852
  return command_arguments
1808
1853
 
1854
+ def __on_window_heating_start_stop(self, start_stop_command: WindowHeatingStartStopCommand, command_arguments: Union[str, Dict[str, Any]]) \
1855
+ -> Union[str, Dict[str, Any]]:
1856
+ if start_stop_command.parent is None or start_stop_command.parent.parent is None \
1857
+ or start_stop_command.parent.parent.parent is None or not isinstance(start_stop_command.parent.parent.parent, SkodaVehicle):
1858
+ raise CommandError('Object hierarchy is not as expected')
1859
+ if not isinstance(command_arguments, dict):
1860
+ raise CommandError('Command arguments are not a dictionary')
1861
+ vehicle: SkodaVehicle = start_stop_command.parent.parent.parent
1862
+ vin: Optional[str] = vehicle.vin.value
1863
+ if vin is None:
1864
+ raise CommandError('VIN in object hierarchy missing')
1865
+ if 'command' not in command_arguments:
1866
+ raise CommandError('Command argument missing')
1867
+ try:
1868
+ if command_arguments['command'] == WindowHeatingStartStopCommand.Command.START:
1869
+ url = f'https://mysmob.api.connect.skoda-auto.cz/api/v2/air-conditioning/{vin}/start-window-heating'
1870
+ command_response: requests.Response = self.session.post(url, allow_redirects=True)
1871
+ elif command_arguments['command'] == WindowHeatingStartStopCommand.Command.STOP:
1872
+ url = f'https://mysmob.api.connect.skoda-auto.cz/api/v2/air-conditioning/{vin}/stop-window-heating'
1873
+
1874
+ command_response: requests.Response = self.session.post(url, allow_redirects=True)
1875
+ else:
1876
+ raise CommandError(f'Unknown command {command_arguments["command"]}')
1877
+
1878
+ if command_response.status_code != requests.codes['accepted']:
1879
+ LOG.error('Could not start/stop window heating (%s: %s)', command_response.status_code, command_response.text)
1880
+ raise CommandError(f'Could not start/stop window heating ({command_response.status_code}: {command_response.text})')
1881
+ except requests.exceptions.ConnectionError as connection_error:
1882
+ raise CommandError(f'Connection error: {connection_error}.'
1883
+ ' If this happens frequently, please check if other applications communicate with the Skoda server.') from connection_error
1884
+ except requests.exceptions.ChunkedEncodingError as chunked_encoding_error:
1885
+ raise CommandError(f'Error: {chunked_encoding_error}') from chunked_encoding_error
1886
+ except requests.exceptions.ReadTimeout as timeout_error:
1887
+ raise CommandError(f'Timeout during read: {timeout_error}') from timeout_error
1888
+ except requests.exceptions.RetryError as retry_error:
1889
+ raise CommandError(f'Retrying failed: {retry_error}') from retry_error
1890
+ return command_arguments
1891
+
1809
1892
  def get_name(self) -> str:
1810
1893
  return "Skoda Connector"