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.
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/PKG-INFO +2 -2
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/pyproject.toml +1 -1
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +2 -2
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/requires.txt +1 -1
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/_version.py +1 -1
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/command_impl.py +4 -2
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/connector.py +14 -16
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/mqtt_client.py +7 -1
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.flake8 +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/dependabot.yml +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/build.yml +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/build_and_publish.yml +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.github/workflows/codeql-analysis.yml +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/.gitignore +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/CHANGELOG.md +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/LICENSE +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/Makefile +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/README.md +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/doc/Config.md +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/setup.cfg +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/setup_requirements.txt +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/openid_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/capability.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/charging.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/error.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
- {carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
- {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.
|
|
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.
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: carconnectivity-connector-skoda
|
|
3
|
-
Version: 0.
|
|
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.
|
|
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
|
|
@@ -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
|
-
|
|
59
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
1777
|
-
return
|
|
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
|
|
File without changes
|
|
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.4a5 → carconnectivity_connector_skoda-0.4a7}/CHANGELOG.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{carconnectivity_connector_skoda-0.4a5 → carconnectivity_connector_skoda-0.4a7}/doc/Config.md
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|