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.
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/PKG-INFO +1 -1
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +1 -1
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +1 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/_version.py +1 -1
- carconnectivity_connector_skoda-0.1a17/src/carconnectivity_connectors/skoda/charging.py +137 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/connector.py +116 -2
- carconnectivity_connector_skoda-0.1a17/src/carconnectivity_connectors/skoda/error.py +42 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/mqtt_client.py +28 -5
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/vehicle.py +6 -0
- carconnectivity_connector_skoda-0.1a16/src/carconnectivity_connectors/skoda/charging.py +0 -67
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.flake8 +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/dependabot.yml +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/build.yml +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/build_and_publish.yml +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.github/workflows/codeql-analysis.yml +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.gitignore +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/LICENSE +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/Makefile +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/README.md +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/doc/Config.md +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/pyproject.toml +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/setup.cfg +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/setup_requirements.txt +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/requires.txt +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
- {carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/src/carconnectivity_connectors/skoda/capability.py +0 -0
|
@@ -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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
586
|
-
|
|
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
|
-
|
|
597
|
-
|
|
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
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/doc/Config.md
RENAMED
|
File without changes
|
{carconnectivity_connector_skoda-0.1a16 → carconnectivity_connector_skoda-0.1a17}/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|