carconnectivity-connector-skoda 0.4a5__tar.gz → 0.4a7__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.4a5 → carconnectivity_connector_skoda-0.4a7}/PKG-INFO +2 -2
  2. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/pyproject.toml +1 -1
  3. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +2 -2
  4. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/requires.txt +1 -1
  5. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/_version.py +1 -1
  6. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/command_impl.py +4 -2
  7. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/connector.py +14 -16
  8. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/mqtt_client.py +7 -1
  9. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.flake8 +0 -0
  10. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/dependabot.yml +0 -0
  13. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/build.yml +0 -0
  14. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/build_and_publish.yml +0 -0
  15. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/codeql-analysis.yml +0 -0
  16. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.gitignore +0 -0
  17. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/CHANGELOG.md +0 -0
  18. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/LICENSE +0 -0
  19. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/Makefile +0 -0
  20. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/README.md +0 -0
  21. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/doc/Config.md +0 -0
  22. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/setup.cfg +0 -0
  23. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/setup_requirements.txt +0 -0
  24. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
  25. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  26. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  27. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  28. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  29. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  30. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  31. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
  32. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
  33. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  34. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  35. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/capability.py +0 -0
  36. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/charging.py +0 -0
  37. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
  38. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/error.py +0 -0
  39. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
  40. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
  41. {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/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.4a5
3
+ Version: 0.4a7
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.4a8
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.4a8",
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.4a5
3
+ Version: 0.4a7
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.4a8
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.4a8
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.4a5'
20
+ __version__ = version = '0.4a7'
21
21
  __version_tuple__ = version_tuple = (0, 4)
@@ -31,6 +31,8 @@ class SpinCommand(GenericCommand):
31
31
 
32
32
  @value.setter
33
33
  def value(self, new_value: Optional[Union[str, Dict]]) -> None:
34
+ # Execute early hooks before parsing the value
35
+ new_value = self._execute_on_set_hook(new_value, early_hook=True)
34
36
  if isinstance(new_value, str):
35
37
  parser = ThrowingArgumentParser(prog='', add_help=False, exit_on_error=False)
36
38
  parser.add_argument('command', help='Command to execute', type=SpinCommand.Command,
@@ -55,8 +57,8 @@ class SpinCommand(GenericCommand):
55
57
  raise ValueError('Invalid value for SpinCommand. '
56
58
  f'Command must be one of {SpinCommand.Command}')
57
59
  if self._is_changeable:
58
- for hook in self._on_set_hooks:
59
- new_value = hook(self, new_value)
60
+ # Execute late hooks before setting the value
61
+ new_value = self._execute_on_set_hook(new_value, early_hook=False)
60
62
  self._set_value(new_value)
61
63
  else:
62
64
  raise TypeError('You cannot set this attribute. Attribute is not mutable.')
@@ -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,17 +81,11 @@ 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'})
85
86
  self.interval: DurationAttribute = DurationAttribute(name="interval", parent=self, tags={'connector_custom'})
86
-
87
- def __check_interval(attribute: GenericAttribute, value: Any) -> Any:
88
- del attribute
89
- if value is not None and value < timedelta(seconds=180):
90
- raise ValueError('Intervall must be at least 180 seconds')
91
- return value
92
-
87
+ self.interval.minimum = timedelta(seconds=180)
93
88
  self.interval._is_changeable = True # pylint: disable=protected-access
94
- self.interval._add_on_set_hook(__check_interval) # pylint: disable=protected-access
95
89
 
96
90
  self.commands: Commands = Commands(parent=self)
97
91
 
@@ -174,7 +168,7 @@ class Connector(BaseConnector):
174
168
  self._background_connect_thread.start()
175
169
  # Start MQTT thread
176
170
  self._mqtt_client.loop_start()
177
- self._healthy = True
171
+ self.healthy._set_value(value=True) # pylint: disable=protected-access
178
172
 
179
173
  def _background_connect_loop(self) -> None:
180
174
  while not self._stop_event.is_set():
@@ -188,6 +182,7 @@ class Connector(BaseConnector):
188
182
  def _background_loop(self) -> None:
189
183
  self._stop_event.clear()
190
184
  fetch: bool = True
185
+ self.connection_state._set_value(value=ConnectionState.CONNECTING) # pylint: disable=protected-access
191
186
  while not self._stop_event.is_set():
192
187
  interval = 300
193
188
  try:
@@ -221,7 +216,7 @@ class Connector(BaseConnector):
221
216
  self._stop_event.wait(interval)
222
217
  except Exception as err:
223
218
  LOG.critical('Critical error during update: %s', traceback.format_exc())
224
- self._healthy = False
219
+ self.healthy._set_value(value=False) # pylint: disable=protected-access
225
220
  raise err
226
221
  else:
227
222
  self._stop_event.wait(interval)
@@ -369,6 +364,7 @@ class Connector(BaseConnector):
369
364
  if vehicle_to_update.capabilities.has_capability('VEHICLE_HEALTH_INSPECTION'):
370
365
  vehicle_to_update = self.fetch_maintenance(vehicle_to_update)
371
366
  vehicle_to_update = self.decide_state(vehicle_to_update)
367
+ self.car_connectivity.transaction_end()
372
368
 
373
369
  def decide_state(self, vehicle: SkodaVehicle) -> SkodaVehicle:
374
370
  """
@@ -653,7 +649,7 @@ class Connector(BaseConnector):
653
649
  if vehicle.position is None:
654
650
  raise ValueError('Vehicle has no charging object')
655
651
  url = f'https://mysmob.api.connect.skoda-auto.cz/api/v1/maps/positions?vin={vin}'
656
- data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache)
652
+ data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache, allow_empty=True)
657
653
  if data is not None:
658
654
  if 'positions' in data and data['positions'] is not None:
659
655
  for position_dict in data['positions']:
@@ -1358,6 +1354,8 @@ class Connector(BaseConnector):
1358
1354
  data = status_response.json()
1359
1355
  if session.cache is not None:
1360
1356
  session.cache[url] = (data, str(datetime.utcnow()))
1357
+ elif status_response.status_code == requests.codes['no_content'] and allow_empty:
1358
+ data = None
1361
1359
  elif status_response.status_code == requests.codes['too_many_requests']:
1362
1360
  raise TooManyRequestsError('Could not fetch data due to too many requests from your account. '
1363
1361
  f'Status Code was: {status_response.status_code}')
@@ -1773,5 +1771,5 @@ class Connector(BaseConnector):
1773
1771
  raise CommandError(f'Retrying failed: {retry_error}') from retry_error
1774
1772
  return command_arguments
1775
1773
 
1776
- def is_healthy(self) -> bool:
1777
- return self._healthy and super().is_healthy()
1774
+ def get_name(self) -> str:
1775
+ return "Skoda Connector"
@@ -469,7 +469,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
469
469
  if 'data' in data and data['data'] is not None:
470
470
  vehicle: Optional[GenericVehicle] = self._skoda_connector.car_connectivity.garage.get_vehicle(vin)
471
471
  if isinstance(vehicle, SkodaElectricVehicle):
472
- electric_drive: ElectricDrive = vehicle.get_electric_drive()
472
+ electric_drive: Optional[ElectricDrive] = vehicle.get_electric_drive()
473
473
  if electric_drive is not None:
474
474
  charging_state: Optional[Charging.ChargingState] = vehicle.charging.state.value
475
475
  old_charging_state: Optional[Charging.ChargingState] = charging_state
@@ -509,6 +509,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
509
509
  if old_charging_state != charging_state:
510
510
  try:
511
511
  self._skoda_connector.fetch_charging(vehicle, no_cache=True)
512
+ self._skoda_connector.car_connectivity.transaction_end()
512
513
  except CarConnectivityError as e:
513
514
  LOG.error('Error while fetching charging: %s', e)
514
515
  if 'timeToFinish' in data['data'] and data['data']['timeToFinish'] is not None \
@@ -536,6 +537,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
536
537
  if isinstance(vehicle, SkodaVehicle):
537
538
  try:
538
539
  self._skoda_connector.fetch_air_conditioning(vehicle, no_cache=True)
540
+ self._skoda_connector.car_connectivity.transaction_end()
539
541
  except CarConnectivityError as e:
540
542
  LOG.error('Error while fetching air conditioning: %s', e)
541
543
  elif 'name' in data and data['name'] == 'climatisation-completed':
@@ -582,6 +584,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
582
584
  self._skoda_connector.fetch_air_conditioning(vehicle, no_cache=True)
583
585
  except CarConnectivityError as e:
584
586
  LOG.error('Error while fetching air conditioning: %s', e)
587
+ self._skoda_connector.car_connectivity.transaction_end()
585
588
 
586
589
  if vin in self.delayed_access_function_timers:
587
590
  self.delayed_access_function_timers[vin].cancel()
@@ -598,6 +601,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
598
601
  if isinstance(vehicle, SkodaVehicle):
599
602
  try:
600
603
  self._skoda_connector.fetch_vehicle_status(vehicle, no_cache=True)
604
+ self._skoda_connector.car_connectivity.transaction_end()
601
605
  except CarConnectivityError as e:
602
606
  LOG.error('Error while fetching vehicle status: %s', e)
603
607
 
@@ -629,6 +633,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
629
633
  LOG.debug('Received %s operation request for vehicle %s from user %s', operation_request, vin, user_id)
630
634
  try:
631
635
  self._skoda_connector.fetch_air_conditioning(vehicle, no_cache=True)
636
+ self._skoda_connector.car_connectivity.transaction_end()
632
637
  except CarConnectivityError as e:
633
638
  LOG.error('Error while fetching air-conditioning: %s', e)
634
639
  return
@@ -649,6 +654,7 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
649
654
  LOG.debug('Received %s operation request for vehicle %s from user %s', operation_request, vin, user_id)
650
655
  try:
651
656
  self._skoda_connector.fetch_charging(vehicle, no_cache=True)
657
+ self._skoda_connector.car_connectivity.transaction_end()
652
658
  except CarConnectivityError as e:
653
659
  LOG.error('Error while fetching charging: %s', e)
654
660
  return