carconnectivity-connector-skoda 0.1a16__tar.gz → 0.1a17__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 (37) hide show
  1. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/PKG-INFO +1 -1
  2. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +1 -1
  3. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +1 -0
  4. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/_version.py +1 -1
  5. carconnectivity_connector_skoda-0.1a17/src/carconnectivity_connectors/skoda/charging.py +137 -0
  6. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/connector.py +116 -2
  7. carconnectivity_connector_skoda-0.1a17/src/carconnectivity_connectors/skoda/error.py +42 -0
  8. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/mqtt_client.py +28 -5
  9. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/vehicle.py +6 -0
  10. carconnectivity_connector_skoda-0.1a16/src/carconnectivity_connectors/skoda/charging.py +0 -67
  11. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.flake8 +0 -0
  12. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  13. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  14. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/dependabot.yml +0 -0
  15. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/build.yml +0 -0
  16. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/build_and_publish.yml +0 -0
  17. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/codeql-analysis.yml +0 -0
  18. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.gitignore +0 -0
  19. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/LICENSE +0 -0
  20. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/Makefile +0 -0
  21. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/README.md +0 -0
  22. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/doc/Config.md +0 -0
  23. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/pyproject.toml +0 -0
  24. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/setup.cfg +0 -0
  25. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/setup_requirements.txt +0 -0
  26. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  27. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/requires.txt +0 -0
  28. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  29. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  30. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  31. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  32. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  33. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
  34. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
  35. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  36. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  37. {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/capability.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.1a16
3
+ Version: 0.1a17
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.1a16
3
+ Version: 0.1a17
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -22,6 +22,7 @@ src/carconnectivity_connectors/skoda/_version.py
22
22
  src/carconnectivity_connectors/skoda/capability.py
23
23
  src/carconnectivity_connectors/skoda/charging.py
24
24
  src/carconnectivity_connectors/skoda/connector.py
25
+ src/carconnectivity_connectors/skoda/error.py
25
26
  src/carconnectivity_connectors/skoda/mqtt_client.py
26
27
  src/carconnectivity_connectors/skoda/vehicle.py
27
28
  src/carconnectivity_connectors/skoda/auth/__init__.py
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.1a16'
15
+ __version__ = version = '0.1a17'
16
16
  __version_tuple__ = version_tuple = (0, 1)
@@ -0,0 +1,137 @@
1
+ """
2
+ Module for charging for skoda vehicles.
3
+ """
4
+ from __future__ import annotations
5
+ from typing import TYPE_CHECKING
6
+
7
+ from enum import Enum
8
+
9
+ from carconnectivity.charging import Charging
10
+ from carconnectivity.objects import GenericObject
11
+ from carconnectivity.vehicle import ElectricVehicle
12
+ from carconnectivity.attributes import BooleanAttribute, EnumAttribute, StringAttribute
13
+
14
+ from carconnectivity_connectors.skoda.error import Error
15
+
16
+ if TYPE_CHECKING:
17
+ from typing import Optional, Dict
18
+
19
+
20
+ class SkodaCharging(Charging): # pylint: disable=too-many-instance-attributes
21
+ """
22
+ SkodaCharging class for handling Skoda vehicle charging information.
23
+
24
+ This class extends the Charging class and includes an enumeration of various
25
+ charging states specific to Skoda vehicles.
26
+ """
27
+ def __init__(self, vehicle: ElectricVehicle | None = None, origin: Optional[Charging] = None) -> None:
28
+ if origin is not None:
29
+ super().__init__(origin=origin)
30
+ self.settings: Charging.Settings = SkodaCharging.Settings(origin=origin.settings)
31
+ else:
32
+ super().__init__(vehicle=vehicle)
33
+ self.settings: Charging.Settings = SkodaCharging.Settings(origin=self.settings)
34
+ self.errors: Dict[str, Error] = {}
35
+ self.is_in_saved_location: BooleanAttribute = BooleanAttribute("is_in_saved_location", parent=self)
36
+
37
+ class Settings(Charging.Settings):
38
+ """
39
+ This class represents the settings for a skoda car charging.
40
+ """
41
+ def __init__(self, parent: Optional[GenericObject] = None, origin: Optional[Charging.Settings] = None) -> None:
42
+ if origin is not None:
43
+ super().__init__(origin=origin)
44
+ else:
45
+ super().__init__(parent=parent)
46
+ self.preferred_charge_mode: EnumAttribute = EnumAttribute("preferred_charge_mode", parent=self)
47
+ self.available_charge_modes: StringAttribute = StringAttribute("available_charge_modes", parent=self)
48
+ self.charging_care_mode: EnumAttribute = EnumAttribute("charging_care_mode", parent=self)
49
+ self.battery_support: EnumAttribute = EnumAttribute("battery_support", parent=self)
50
+
51
+ class SkodaChargingState(Enum,):
52
+ """
53
+ Enum representing the various charging states for a Skoda vehicle.
54
+
55
+ Attributes:
56
+ OFF: The vehicle is not charging.
57
+ READY_FOR_CHARGING: The vehicle is ready to start charging.
58
+ NOT_READY_FOR_CHARGING: The vehicle is not ready to start charging.
59
+ CONSERVATION: The vehicle is in conservation mode.
60
+ CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING: The vehicle has reached its charging purpose and is not in conservation charging mode.
61
+ CHARGE_PURPOSE_REACHED_CONSERVATION: The vehicle has reached its charging purpose and is in conservation charging mode.
62
+ CHARGING: The vehicle is currently charging.
63
+ ERROR: There is an error in the charging process.
64
+ UNSUPPORTED: The charging state is unsupported.
65
+ DISCHARGING: The vehicle is discharging.
66
+ UNKNOWN: The charging state is unknown.
67
+ """
68
+ OFF = 'off'
69
+ CONNECT_CABLE = 'connectCable'
70
+ READY_FOR_CHARGING = 'readyForCharging'
71
+ NOT_READY_FOR_CHARGING = 'notReadyForCharging'
72
+ CONSERVATION = 'conservation'
73
+ CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING = 'chargePurposeReachedAndNotConservationCharging'
74
+ CHARGE_PURPOSE_REACHED_CONSERVATION = 'chargePurposeReachedAndConservation'
75
+ CHARGING = 'charging'
76
+ ERROR = 'error'
77
+ UNSUPPORTED = 'unsupported'
78
+ DISCHARGING = 'discharging'
79
+ UNKNOWN = 'unknown charging state'
80
+
81
+ class SkodaChargeMode(Enum,):
82
+ """
83
+ Enum class representing different Skoda charge modes.
84
+
85
+ Attributes:
86
+ HOME_STORAGE_CHARGING (str): Charge mode for home storage charging.
87
+ IMMEDIATE_DISCHARGING (str): Charge mode for immediate discharging.
88
+ ONLY_OWN_CURRENT (str): Charge mode for using only own current.
89
+ PREFERRED_CHARGING_TIMES (str): Charge mode for preferred charging times.
90
+ TIMER_CHARGING_WITH_CLIMATISATION (str): Charge mode for timer charging with climatisation.
91
+ TIMER (str): Charge mode for timer-based charging.
92
+ MANUAL (str): Charge mode for manual charging.
93
+ OFF (str): Charge mode for turning off charging.
94
+ """
95
+ HOME_STORAGE_CHARGING = 'HOME_STORAGE_CHARGING'
96
+ IMMEDIATE_DISCHARGING = 'IMMEDIATE_DISCHARGING'
97
+ ONLY_OWN_CURRENT = 'ONLY_OWN_CURRENT'
98
+ PREFERRED_CHARGING_TIMES = 'PREFERRED_CHARGING_TIMES'
99
+ TIMER_CHARGING_WITH_CLIMATISATION = 'TIMER_CHARGING_WITH_CLIMATISATION'
100
+ TIMER = 'TIMER'
101
+ MANUAL = 'MANUAL'
102
+ OFF = 'OFF'
103
+ UNKNOWN = 'unknown charge mode'
104
+
105
+ class SkodaChargingCareMode(Enum,):
106
+ """
107
+ Enum representing the charging care mode for Skoda vehicles.
108
+ """
109
+ ACTIVATED = 'ACTIVATED'
110
+ DEACTIVATED = 'DEACTIVATED'
111
+ UNKNOWN = 'UNKNOWN'
112
+
113
+ class SkodaBatterySupport(Enum,):
114
+ """
115
+ SkodaBatterySupport is an enumeration that represents the different states of battery support for Skoda vehicles.
116
+ """
117
+ ENABLED = 'ENABLED'
118
+ DISABLED = 'DISABLED'
119
+ NOT_ALLOWED = 'NOT_ALLOWED'
120
+ UNKNOWN = 'UNKNOWN'
121
+
122
+
123
+ # Mapping of Skoda charging states to generic charging states
124
+ mapping_skoda_charging_state: Dict[SkodaCharging.SkodaChargingState, Charging.ChargingState] = {
125
+ SkodaCharging.SkodaChargingState.OFF: Charging.ChargingState.OFF,
126
+ SkodaCharging.SkodaChargingState.CONNECT_CABLE: Charging.ChargingState.OFF,
127
+ SkodaCharging.SkodaChargingState.READY_FOR_CHARGING: Charging.ChargingState.READY_FOR_CHARGING,
128
+ SkodaCharging.SkodaChargingState.NOT_READY_FOR_CHARGING: Charging.ChargingState.OFF,
129
+ SkodaCharging.SkodaChargingState.CONSERVATION: Charging.ChargingState.CONSERVATION,
130
+ SkodaCharging.SkodaChargingState.CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING: Charging.ChargingState.READY_FOR_CHARGING,
131
+ SkodaCharging.SkodaChargingState.CHARGE_PURPOSE_REACHED_CONSERVATION: Charging.ChargingState.CONSERVATION,
132
+ SkodaCharging.SkodaChargingState.CHARGING: Charging.ChargingState.CHARGING,
133
+ SkodaCharging.SkodaChargingState.ERROR: Charging.ChargingState.ERROR,
134
+ SkodaCharging.SkodaChargingState.UNSUPPORTED: Charging.ChargingState.UNSUPPORTED,
135
+ SkodaCharging.SkodaChargingState.DISCHARGING: Charging.ChargingState.DISCHARGING,
136
+ SkodaCharging.SkodaChargingState.UNKNOWN: Charging.ChargingState.UNKNOWN
137
+ }
@@ -31,11 +31,12 @@ from carconnectivity_connectors.skoda.auth.my_skoda_session import MySkodaSessio
31
31
  from carconnectivity_connectors.skoda.vehicle import SkodaVehicle, SkodaElectricVehicle, SkodaCombustionVehicle, SkodaHybridVehicle
32
32
  from carconnectivity_connectors.skoda.capability import Capability
33
33
  from carconnectivity_connectors.skoda.charging import SkodaCharging, mapping_skoda_charging_state
34
+ from carconnectivity_connectors.skoda.error import Error
34
35
  from carconnectivity_connectors.skoda._version import __version__
35
36
  from carconnectivity_connectors.skoda.mqtt_client import SkodaMQTTClient
36
37
 
37
38
  if TYPE_CHECKING:
38
- from typing import Dict, List, Optional, Any
39
+ from typing import Dict, List, Optional, Any, Set
39
40
 
40
41
  from carconnectivity.carconnectivity import CarConnectivity
41
42
 
@@ -340,6 +341,12 @@ class Connector(BaseConnector):
340
341
  captured_at: datetime = robust_time_parse(data['carCapturedTimestamp'])
341
342
  else:
342
343
  raise APIError('Could not fetch charging, carCapturedTimestamp missing')
344
+ if 'isVehicleInSavedLocation' in data and data['isVehicleInSavedLocation'] is not None:
345
+ if vehicle.charging is not None:
346
+ if not isinstance(vehicle.charging, SkodaCharging):
347
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
348
+ # pylint: disable-next=protected-access
349
+ vehicle.charging.is_in_saved_location._set_value(data['isVehicleInSavedLocation'], measured=captured_at)
343
350
  if 'status' in data and data['status'] is not None:
344
351
  if 'state' in data['status'] and data['status']['state'] is not None:
345
352
  if data['status']['state'] in [item.name for item in SkodaCharging.SkodaChargingState]:
@@ -404,7 +411,114 @@ class Connector(BaseConnector):
404
411
  'state',
405
412
  'chargeType',
406
413
  'battery'})
407
- log_extra_keys(LOG_API, 'charging data', data, {'carCapturedTimestamp', 'status'})
414
+ if 'settings' in data and data['settings'] is not None:
415
+ if 'targetStateOfChargeInPercent' in data['settings'] and data['settings']['targetStateOfChargeInPercent'] is not None \
416
+ and vehicle.charging is not None and vehicle.charging.settings is not None:
417
+ # pylint: disable-next=protected-access
418
+ vehicle.charging.settings.target_level._set_value(value=data['settings']['targetStateOfChargeInPercent'], measured=captured_at)
419
+ else:
420
+ vehicle.charging.settings.target_level._set_value(None, measured=captured_at) # pylint: disable=protected-access
421
+ if 'maxChargeCurrentAc' in data['settings'] and data['settings']['maxChargeCurrentAc'] is not None \
422
+ and vehicle.charging is not None and vehicle.charging.settings is not None:
423
+ if data['settings']['maxChargeCurrentAc'] == 'MAXIMUM':
424
+ vehicle.charging.settings.maximum_current._set_value(value=11, measured=captured_at) # pylint: disable=protected-access
425
+ elif data['settings']['maxChargeCurrentAc'] == 'REDUCED':
426
+ vehicle.charging.settings.maximum_current._set_value(value=6, measured=captured_at) # pylint: disable=protected-access
427
+ else:
428
+ LOG_API.info('Unknown maxChargeCurrentAc %s not in %s', data['settings']['maxChargeCurrentAc'], ['MAXIMUM', 'REDUCED'])
429
+ vehicle.charging.settings.maximum_current._set_value(None, measured=captured_at) # pylint: disable=protected-access
430
+ else:
431
+ vehicle.charging.settings.maximum_current._set_value(None, measured=captured_at) # pylint: disable=protected-access
432
+ if 'autoUnlockPlugWhenCharged' in data['settings'] and data['settings']['autoUnlockPlugWhenCharged'] is not None:
433
+ if data['settings']['autoUnlockPlugWhenCharged'] in ['ON', 'PERMANENT']:
434
+ vehicle.charging.settings.auto_unlock._set_value(True, measured=captured_at) # pylint: disable=protected-access
435
+ elif data['settings']['autoUnlockPlugWhenCharged'] == 'OFF':
436
+ vehicle.charging.settings.auto_unlock._set_value(False, measured=captured_at) # pylint: disable=protected-access
437
+ else:
438
+ LOG_API.info('Unknown autoUnlockPlugWhenCharged %s not in %s', data['settings']['autoUnlockPlugWhenCharged'],
439
+ ['ON', 'PERMANENT', 'OFF'])
440
+ vehicle.charging.settings.auto_unlock._set_value(None, measured=captured_at) # pylint: disable=protected-access
441
+ if 'preferredChargeMode' in data['settings'] and data['settings']['preferredChargeMode'] is not None:
442
+ if not isinstance(vehicle.charging, SkodaCharging):
443
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
444
+ if data['settings']['preferredChargeMode'] in [item.name for item in SkodaCharging.SkodaChargeMode]:
445
+ preferred_charge_mode: SkodaCharging.SkodaChargeMode = SkodaCharging.SkodaChargeMode[data['settings']['preferredChargeMode']]
446
+ else:
447
+ LOG_API.info('Unkown charge mode %s not in %s', data['settings']['preferredChargeMode'], str(SkodaCharging.SkodaChargeMode))
448
+ preferred_charge_mode = SkodaCharging.SkodaChargeMode.UNKNOWN
449
+
450
+ if isinstance(vehicle.charging.settings, SkodaCharging.Settings):
451
+ # pylint: disable-next=protected-access
452
+ vehicle.charging.settings.preferred_charge_mode._set_value(value=preferred_charge_mode, measured=captured_at)
453
+ else:
454
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
455
+ vehicle.charging.settings.preferred_charge_mode._set_value(None, measured=captured_at) # pylint: disable=protected-access
456
+ if 'availableChargeModes' in data['settings'] and data['settings']['availableChargeModes'] is not None:
457
+ if not isinstance(vehicle.charging, SkodaCharging):
458
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
459
+ available_charge_modes: list[str] = data['settings']['availableChargeModes']
460
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
461
+ # pylint: disable-next=protected-access
462
+ vehicle.charging.settings.available_charge_modes._set_value('.'.join(available_charge_modes), measured=captured_at)
463
+ else:
464
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
465
+ vehicle.charging.settings.available_charge_modes._set_value(None, measured=captured_at) # pylint: disable=protected-access
466
+ if 'chargingCareMode' in data['settings'] and data['settings']['chargingCareMode'] is not None:
467
+ if not isinstance(vehicle.charging, SkodaCharging):
468
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
469
+ if data['settings']['chargingCareMode'] in [item.name for item in SkodaCharging.SkodaChargingCareMode]:
470
+ charge_mode: SkodaCharging.SkodaChargingCareMode = SkodaCharging.SkodaChargingCareMode[data['settings']['chargingCareMode']]
471
+ else:
472
+ LOG_API.info('Unknown charging care mode %s not in %s', data['settings']['chargingCareMode'], str(SkodaCharging.SkodaChargingCareMode))
473
+ charge_mode = SkodaCharging.SkodaChargingCareMode.UNKNOWN
474
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
475
+ # pylint: disable-next=protected-access
476
+ vehicle.charging.settings.charging_care_mode._set_value(value=charge_mode, measured=captured_at)
477
+ else:
478
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
479
+ vehicle.charging.settings.charging_care_mode._set_value(None, measured=captured_at) # pylint: disable=protected-access
480
+ if 'batterySupport' in data['settings'] and data['settings']['batterySupport'] is not None:
481
+ if not isinstance(vehicle.charging, SkodaCharging):
482
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
483
+ if data['settings']['batterySupport'] in [item.name for item in SkodaCharging.SkodaBatterySupport]:
484
+ battery_support: SkodaCharging.SkodaBatterySupport = SkodaCharging.SkodaBatterySupport[data['settings']['batterySupport']]
485
+ else:
486
+ LOG_API.info('Unknown battery support %s not in %s', data['settings']['batterySupport'], str(SkodaCharging.SkodaBatterySupport))
487
+ battery_support = SkodaCharging.SkodaBatterySupport.UNKNOWN
488
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
489
+ # pylint: disable-next=protected-access
490
+ vehicle.charging.settings.battery_support._set_value(value=battery_support, measured=captured_at)
491
+ else:
492
+ if vehicle.charging is not None and isinstance(vehicle.charging.settings, SkodaCharging.Settings):
493
+ vehicle.charging.settings.battery_support._set_value(None, measured=captured_at) # pylint: disable=protected-access
494
+ log_extra_keys(LOG_API, 'settings', data['settings'], {'targetStateOfChargeInPercent', 'maxChargeCurrentAc', 'autoUnlockPlugWhenCharged',
495
+ 'preferredChargeMode', 'availableChargeModes', 'chargingCareMode', 'batterySupport'})
496
+ if 'errors' in data and data['errors'] is not None:
497
+ found_errors: Set[str] = set()
498
+ if not isinstance(vehicle.charging, SkodaCharging):
499
+ vehicle.charging = SkodaCharging(origin=vehicle.charging)
500
+ for error_dict in data['errors']:
501
+ if 'type' in error_dict and error_dict['type'] is not None:
502
+ if error_dict['type'] not in vehicle.charging.errors:
503
+ error: Error = Error(object_id=error_dict['type'])
504
+ else:
505
+ error = vehicle.charging.errors[error_dict['type']]
506
+ if error_dict['type'] in [item.name for item in Error.ChargingError]:
507
+ error_type: Error.ChargingError = Error.ChargingError[error_dict['type']]
508
+ else:
509
+ LOG_API.info('Unknown charging error type %s not in %s', error_dict['type'], str(Error.ChargingError))
510
+ error_type = Error.ChargingError.UNKNOWN
511
+ error.type._set_value(error_type, measured=captured_at) # pylint: disable=protected-access
512
+ if 'description' in error_dict and error_dict['description'] is not None:
513
+ error.description._set_value(error_dict['description'], measured=captured_at) # pylint: disable=protected-access
514
+ log_extra_keys(LOG_API, 'errors', error_dict, {'type', 'description'})
515
+ if vehicle.charging is not None and vehicle.charging.errors is not None and len(vehicle.charging.errors) > 0:
516
+ for error_id in vehicle.charging.errors.keys()-found_errors:
517
+ vehicle.charging.errors.pop(error_id)
518
+ else:
519
+ if isinstance(vehicle.charging, SkodaCharging):
520
+ vehicle.charging.errors.clear()
521
+ log_extra_keys(LOG_API, 'charging data', data, {'carCapturedTimestamp', 'status', 'isVehicleInSavedLocation', 'errors', 'settings'})
408
522
  return vehicle
409
523
 
410
524
  def fetch_position(self, vehicle: SkodaVehicle, no_cache: bool = False) -> SkodaVehicle:
@@ -0,0 +1,42 @@
1
+ """Module for Skoda vehicle capability class."""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING
4
+
5
+ from enum import Enum
6
+
7
+ from carconnectivity.objects import GenericObject
8
+ from carconnectivity.attributes import EnumAttribute, StringAttribute
9
+
10
+ if TYPE_CHECKING:
11
+ from typing import Optional
12
+
13
+
14
+ class Error(GenericObject):
15
+ """
16
+ Represents an error object in the car connectivity context.
17
+ """
18
+
19
+ def __init__(self, object_id, parent: Optional[GenericObject] = None) -> None:
20
+ super().__init__(object_id, parent=parent)
21
+ self.type: EnumAttribute = EnumAttribute("type", parent=self)
22
+ self.description: StringAttribute = StringAttribute("description", parent=self)
23
+
24
+ class ChargingError(Enum):
25
+ """
26
+ Enum representing various charging errors for Skoda car connectivity.
27
+
28
+ Attributes:
29
+ STATUS_OF_CHARGING_NOT_AVAILABLE: Indicates that the status of charging is not available.
30
+ STATUS_OF_CONNECTION_NOT_AVAILABLE: Indicates that the status of connection is not available.
31
+ CARE_MODE_IS_NOT_AVAILABLE: Indicates that the care mode is not available.
32
+ AUTO_UNLOCK_IS_NOT_AVAILABLE: Indicates that the auto unlock feature is not available.
33
+ MAX_CHARGE_CURRENT_IS_NOT_AVAILABLE: Indicates that the maximum charge current setting is not available.
34
+ CHARGE_LIMIT_IS_NOT_AVAILABLE: Indicates that the charge limit setting is not available.
35
+ """
36
+ STATUS_OF_CHARGING_NOT_AVAILABLE = 'STATUS_OF_CHARGING_NOT_AVAILABLE'
37
+ STATUS_OF_CONNECTION_NOT_AVAILABLE = 'STATUS_OF_CONNECTION_NOT_AVAILABLE'
38
+ CARE_MODE_IS_NOT_AVAILABLE = 'CARE_MODE_IS_NOT_AVAILABLE'
39
+ AUTO_UNLOCK_IS_NOT_AVAILABLE = 'AUTO_UNLOCK_IS_NOT_AVAILABLE'
40
+ MAX_CHARGE_CURRENT_IS_NOT_AVAILABLE = 'MAX_CHARGE_CURRENT_IS_NOT_AVAILABLE'
41
+ CHARGE_LIMIT_IS_NOT_AVAILABLE = 'CHARGE_LIMIT_IS_NOT_AVAILABLE'
42
+ UNKNOWN = 'UNKNOWN'
@@ -40,7 +40,6 @@ if TYPE_CHECKING:
40
40
  from carconnectivity_connectors.skoda.connector import Connector
41
41
 
42
42
 
43
-
44
43
  LOG: logging.Logger = logging.getLogger("carconnectivity.connectors.skoda.mqtt")
45
44
  LOG_API: logging.Logger = logging.getLogger("carconnectivity.connectors.skoda-api-debug")
46
45
 
@@ -582,8 +581,15 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
582
581
  operation_request: str = match.group('operation_request')
583
582
  data: Dict[str, Any] = json.loads(msg.payload)
584
583
  if data is not None:
585
- if operation_request == 'air-conditioning/start-stop-air-conditioning':
586
- vehicle: Optional[GenericVehicle] = self._skoda_connector.car_connectivity.garage.get_vehicle(vin)
584
+ vehicle: Optional[GenericVehicle] = self._skoda_connector.car_connectivity.garage.get_vehicle(vin)
585
+ if operation_request == 'air-conditioning/set-air-conditioning-at-unlock' \
586
+ or operation_request == 'air-conditioning/set-air-conditioning-seats-heating' \
587
+ or operation_request == 'air-conditioning/set-air-conditioning-timers' \
588
+ or operation_request == 'air-conditioning/set-air-conditioning-without-external-power' \
589
+ or operation_request == 'air-conditioning/set-target-temperature' \
590
+ or operation_request == 'air-conditioning/start-stop-air-conditioning' \
591
+ or operation_request == 'air-conditioning/start-stop-window-heating' \
592
+ or operation_request == 'air-conditioning/windows-heating':
587
593
  if isinstance(vehicle, SkodaVehicle):
588
594
  if 'status' in data and data['status'] is not None:
589
595
  if data['status'] == 'COMPLETED_SUCCESS':
@@ -593,6 +599,23 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
593
599
  except CarConnectivityError as e:
594
600
  LOG.error('Error while fetching air-conditioning: %s', e)
595
601
  return
596
- LOG_API.info('Received unknown operation request %s for vehicle %s from user %s: %s', operation_request, vin, user_id, msg.payload)
597
- return
602
+ if operation_request == 'charging/start-stop-charging' \
603
+ or operation_request == 'charging/update-battery-support' \
604
+ or operation_request == 'charging/update-auto-unlock-plug' \
605
+ or operation_request == 'charging/update-care-mode' \
606
+ or operation_request == 'charging/update-charge-limit' \
607
+ or operation_request == 'charging/update-charge-mode' \
608
+ or operation_request == 'charging/update-charging-profiles' \
609
+ or operation_request == 'charging/update-charging-current':
610
+ if isinstance(vehicle, SkodaElectricVehicle):
611
+ if 'status' in data and data['status'] is not None:
612
+ if data['status'] == 'COMPLETED_SUCCESS':
613
+ LOG.debug('Received %s operation request for vehicle %s from user %s', operation_request, vin, user_id)
614
+ try:
615
+ self._skoda_connector.fetch_charging(vehicle, no_cache=True)
616
+ except CarConnectivityError as e:
617
+ LOG.error('Error while fetching charging: %s', e)
618
+ return
619
+ LOG_API.info('Received unknown operation request %s for vehicle %s from user %s: %s', operation_request, vin, user_id, msg.payload)
620
+ return
598
621
  LOG_API.info('I don\'t understand message %s: %s', msg.topic, msg.payload)
@@ -3,8 +3,10 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from carconnectivity.vehicle import GenericVehicle, ElectricVehicle, CombustionVehicle, HybridVehicle
6
+ from carconnectivity.charging import Charging
6
7
 
7
8
  from carconnectivity_connectors.skoda.capability import Capabilities
9
+ from carconnectivity_connectors.skoda.charging import SkodaCharging
8
10
 
9
11
  if TYPE_CHECKING:
10
12
  from typing import Optional
@@ -39,8 +41,12 @@ class SkodaElectricVehicle(ElectricVehicle, SkodaVehicle):
39
41
  origin: Optional[SkodaVehicle] = None) -> None:
40
42
  if origin is not None:
41
43
  super().__init__(origin=origin)
44
+ if isinstance(origin, ElectricVehicle):
45
+ self.charging: Charging = SkodaCharging(origin=origin.charging)
46
+ self.charging.parent = self
42
47
  else:
43
48
  super().__init__(vin=vin, garage=garage, managing_connector=managing_connector)
49
+ self.charging: Charging = SkodaCharging(vehicle=self)
44
50
 
45
51
 
46
52
  class SkodaCombustionVehicle(CombustionVehicle, SkodaVehicle):
@@ -1,67 +0,0 @@
1
- """
2
- Module for charging for skoda vehicles.
3
- """
4
- from __future__ import annotations
5
- from typing import TYPE_CHECKING
6
-
7
- from enum import Enum
8
-
9
- from carconnectivity.charging import Charging
10
-
11
- if TYPE_CHECKING:
12
- from typing import Dict
13
-
14
-
15
- class SkodaCharging(Charging): # pylint: disable=too-many-instance-attributes
16
- """
17
- SkodaCharging class for handling Skoda vehicle charging information.
18
-
19
- This class extends the Charging class and includes an enumeration of various
20
- charging states specific to Skoda vehicles.
21
- """
22
- class SkodaChargingState(Enum,):
23
- """
24
- Enum representing the various charging states for a Skoda vehicle.
25
-
26
- Attributes:
27
- OFF: The vehicle is not charging.
28
- READY_FOR_CHARGING: The vehicle is ready to start charging.
29
- NOT_READY_FOR_CHARGING: The vehicle is not ready to start charging.
30
- CONSERVATION: The vehicle is in conservation mode.
31
- CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING: The vehicle has reached its charging purpose and is not in conservation charging mode.
32
- CHARGE_PURPOSE_REACHED_CONSERVATION: The vehicle has reached its charging purpose and is in conservation charging mode.
33
- CHARGING: The vehicle is currently charging.
34
- ERROR: There is an error in the charging process.
35
- UNSUPPORTED: The charging state is unsupported.
36
- DISCHARGING: The vehicle is discharging.
37
- UNKNOWN: The charging state is unknown.
38
- """
39
- OFF = 'off'
40
- CONNECT_CABLE = 'connectCable'
41
- READY_FOR_CHARGING = 'readyForCharging'
42
- NOT_READY_FOR_CHARGING = 'notReadyForCharging'
43
- CONSERVATION = 'conservation'
44
- CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING = 'chargePurposeReachedAndNotConservationCharging'
45
- CHARGE_PURPOSE_REACHED_CONSERVATION = 'chargePurposeReachedAndConservation'
46
- CHARGING = 'charging'
47
- ERROR = 'error'
48
- UNSUPPORTED = 'unsupported'
49
- DISCHARGING = 'discharging'
50
- UNKNOWN = 'unknown charging state'
51
-
52
-
53
- # Mapping of Skoda charging states to generic charging states
54
- mapping_skoda_charging_state: Dict[SkodaCharging.SkodaChargingState, Charging.ChargingState] = {
55
- SkodaCharging.SkodaChargingState.OFF: Charging.ChargingState.OFF,
56
- SkodaCharging.SkodaChargingState.CONNECT_CABLE: Charging.ChargingState.OFF,
57
- SkodaCharging.SkodaChargingState.READY_FOR_CHARGING: Charging.ChargingState.READY_FOR_CHARGING,
58
- SkodaCharging.SkodaChargingState.NOT_READY_FOR_CHARGING: Charging.ChargingState.OFF,
59
- SkodaCharging.SkodaChargingState.CONSERVATION: Charging.ChargingState.CONSERVATION,
60
- SkodaCharging.SkodaChargingState.CHARGE_PURPOSE_REACHED_NOT_CONSERVATION_CHARGING: Charging.ChargingState.READY_FOR_CHARGING,
61
- SkodaCharging.SkodaChargingState.CHARGE_PURPOSE_REACHED_CONSERVATION: Charging.ChargingState.CONSERVATION,
62
- SkodaCharging.SkodaChargingState.CHARGING: Charging.ChargingState.CHARGING,
63
- SkodaCharging.SkodaChargingState.ERROR: Charging.ChargingState.ERROR,
64
- SkodaCharging.SkodaChargingState.UNSUPPORTED: Charging.ChargingState.UNSUPPORTED,
65
- SkodaCharging.SkodaChargingState.DISCHARGING: Charging.ChargingState.DISCHARGING,
66
- SkodaCharging.SkodaChargingState.UNKNOWN: Charging.ChargingState.UNKNOWN
67
- }