carconnectivity-connector-seatcupra 0.1a16__py3-none-any.whl → 0.1a18__py3-none-any.whl
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.
- {carconnectivity_connector_seatcupra-0.1a16.dist-info → carconnectivity_connector_seatcupra-0.1a18.dist-info}/METADATA +2 -2
- {carconnectivity_connector_seatcupra-0.1a16.dist-info → carconnectivity_connector_seatcupra-0.1a18.dist-info}/RECORD +7 -7
- carconnectivity_connectors/seatcupra/_version.py +1 -1
- carconnectivity_connectors/seatcupra/connector.py +22 -10
- {carconnectivity_connector_seatcupra-0.1a16.dist-info → carconnectivity_connector_seatcupra-0.1a18.dist-info}/LICENSE +0 -0
- {carconnectivity_connector_seatcupra-0.1a16.dist-info → carconnectivity_connector_seatcupra-0.1a18.dist-info}/WHEEL +0 -0
- {carconnectivity_connector_seatcupra-0.1a16.dist-info → carconnectivity_connector_seatcupra-0.1a18.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: carconnectivity-connector-seatcupra
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.1a18
|
4
4
|
Summary: CarConnectivity connector for Seat and Cupra 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.9
|
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,10 +1,10 @@
|
|
1
1
|
carconnectivity_connectors/seatcupra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
carconnectivity_connectors/seatcupra/_version.py,sha256=
|
2
|
+
carconnectivity_connectors/seatcupra/_version.py,sha256=AzwM9w1dt-7j68mrwryycYGn4KhF1VZVvPVM1rH_oUo,509
|
3
3
|
carconnectivity_connectors/seatcupra/capability.py,sha256=Oe9tC_u69bj6VmOuNJ21RKoETe2j3QyZCoz-VgcZPQ0,4523
|
4
4
|
carconnectivity_connectors/seatcupra/charging.py,sha256=BJe_5GEB0JkP78tpU6kyKpwuwjDZHvm-kt3PTlpQHeU,3336
|
5
5
|
carconnectivity_connectors/seatcupra/climatization.py,sha256=0xxWlxrheAPzkVT8WRQtbm6ExZmVdgW7lUdOXyS_qWY,1695
|
6
6
|
carconnectivity_connectors/seatcupra/command_impl.py,sha256=LmBOCWGZPfJCG_4-5449xvO6NAvnPDsAWEBKlsG4WoI,3051
|
7
|
-
carconnectivity_connectors/seatcupra/connector.py,sha256=
|
7
|
+
carconnectivity_connectors/seatcupra/connector.py,sha256=BIt3jaOgStNZHqKPk7NQ-S4B7bUOkl-tEtuDx2zG1jA,103242
|
8
8
|
carconnectivity_connectors/seatcupra/vehicle.py,sha256=s0G-HqG5qcwStDxD3649KgLMa3lKPZ4TOGWRJEuQzsQ,3403
|
9
9
|
carconnectivity_connectors/seatcupra/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
carconnectivity_connectors/seatcupra/auth/auth_util.py,sha256=Y81h8fGOMSMgPtE4wI_TI9WgE_s43uaPjRLBBINhj4g,4433
|
@@ -14,8 +14,8 @@ carconnectivity_connectors/seatcupra/auth/session_manager.py,sha256=ZIDvC848T3fy
|
|
14
14
|
carconnectivity_connectors/seatcupra/auth/vw_web_session.py,sha256=CcI6m68IyRs6WsMDu-IsW3Dj85vyGiMmxvFqNETMHO0,10929
|
15
15
|
carconnectivity_connectors/seatcupra/auth/helpers/blacklist_retry.py,sha256=f3wsiY5bpHDBxp7Va1Mv9nKJ4u3qnCHZZmDu78_AhMk,1251
|
16
16
|
carconnectivity_connectors/seatcupra/ui/connector_ui.py,sha256=SNYnlcGJpbWhuLiIHD2l6H9IfSiMz3IgmvXsdossDnE,1412
|
17
|
-
carconnectivity_connector_seatcupra-0.
|
18
|
-
carconnectivity_connector_seatcupra-0.
|
19
|
-
carconnectivity_connector_seatcupra-0.
|
20
|
-
carconnectivity_connector_seatcupra-0.
|
21
|
-
carconnectivity_connector_seatcupra-0.
|
17
|
+
carconnectivity_connector_seatcupra-0.1a18.dist-info/LICENSE,sha256=PIwI1alwDyOfvEQHdGCm2u9uf_mGE8030xZDfun0xTo,1071
|
18
|
+
carconnectivity_connector_seatcupra-0.1a18.dist-info/METADATA,sha256=D_FAa_WnsSe_1hHGfMKcMKqVsW2f3ibtubdFyv_uX1c,5642
|
19
|
+
carconnectivity_connector_seatcupra-0.1a18.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
20
|
+
carconnectivity_connector_seatcupra-0.1a18.dist-info/top_level.txt,sha256=KqA8GviZsDH4PtmnwSQsz0HB_w-TWkeEHLIRNo5dTaI,27
|
21
|
+
carconnectivity_connector_seatcupra-0.1a18.dist-info/RECORD,,
|
@@ -22,7 +22,7 @@ from carconnectivity.windows import Windows
|
|
22
22
|
from carconnectivity.lights import Lights
|
23
23
|
from carconnectivity.drive import GenericDrive, ElectricDrive, CombustionDrive
|
24
24
|
from carconnectivity.vehicle import GenericVehicle, ElectricVehicle
|
25
|
-
from carconnectivity.attributes import BooleanAttribute, DurationAttribute, GenericAttribute, TemperatureAttribute
|
25
|
+
from carconnectivity.attributes import BooleanAttribute, DurationAttribute, GenericAttribute, TemperatureAttribute, EnumAttribute
|
26
26
|
from carconnectivity.units import Temperature
|
27
27
|
from carconnectivity.command_impl import ClimatizationStartStopCommand, WakeSleepCommand, HonkAndFlashCommand, LockUnlockCommand, ChargingStartStopCommand
|
28
28
|
from carconnectivity.climatization import Climatization
|
@@ -30,6 +30,7 @@ from carconnectivity.commands import Commands
|
|
30
30
|
from carconnectivity.charging import Charging
|
31
31
|
from carconnectivity.charging_connector import ChargingConnector
|
32
32
|
from carconnectivity.position import Position
|
33
|
+
from carconnectivity.enums import ConnectionState
|
33
34
|
|
34
35
|
from carconnectivity_connectors.base.connector import BaseConnector
|
35
36
|
from carconnectivity_connectors.seatcupra.auth.session_manager import SessionManager, SessionUser, Service
|
@@ -76,13 +77,12 @@ class Connector(BaseConnector):
|
|
76
77
|
self._background_thread: Optional[threading.Thread] = None
|
77
78
|
self._stop_event = threading.Event()
|
78
79
|
|
79
|
-
self.
|
80
|
+
self.connection_state: EnumAttribute = EnumAttribute(name="connection_state", parent=self, value_type=ConnectionState,
|
81
|
+
value=ConnectionState.DISCONNECTED, tags={'connector_custom'})
|
80
82
|
self.interval: DurationAttribute = DurationAttribute(name="interval", parent=self, tags={'connector_custom'})
|
81
83
|
self.interval.minimum = timedelta(seconds=180)
|
82
84
|
self.interval._is_changeable = True # pylint: disable=protected-access
|
83
85
|
|
84
|
-
self._healthy = False
|
85
|
-
|
86
86
|
self.commands: Commands = Commands(parent=self)
|
87
87
|
|
88
88
|
LOG.info("Loading seatcupra connector with config %s", config_remove_credentials(config))
|
@@ -167,11 +167,12 @@ class Connector(BaseConnector):
|
|
167
167
|
self._background_thread = threading.Thread(target=self._background_loop, daemon=False)
|
168
168
|
self._background_thread.name = 'carconnectivity.connectors.seatcupra-background'
|
169
169
|
self._background_thread.start()
|
170
|
-
self.
|
170
|
+
self.healthy._set_value(value=True) # pylint: disable=protected-access
|
171
171
|
|
172
172
|
def _background_loop(self) -> None:
|
173
173
|
self._stop_event.clear()
|
174
174
|
fetch: bool = True
|
175
|
+
self.connection_state._set_value(value=ConnectionState.CONNECTING) # pylint: disable=protected-access
|
175
176
|
while not self._stop_event.is_set():
|
176
177
|
interval = 300
|
177
178
|
try:
|
@@ -190,25 +191,34 @@ class Connector(BaseConnector):
|
|
190
191
|
raise
|
191
192
|
except TooManyRequestsError as err:
|
192
193
|
LOG.error('Retrieval error during update. Too many requests from your account (%s). Will try again after 15 minutes', str(err))
|
194
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
193
195
|
self._stop_event.wait(900)
|
194
196
|
except RetrievalError as err:
|
195
197
|
LOG.error('Retrieval error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
198
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
196
199
|
self._stop_event.wait(interval)
|
197
200
|
except APIError as err:
|
198
201
|
LOG.error('API error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
202
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
199
203
|
self._stop_event.wait(interval)
|
200
204
|
except APICompatibilityError as err:
|
201
205
|
LOG.error('API compatability error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
206
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
202
207
|
self._stop_event.wait(interval)
|
203
208
|
except TemporaryAuthenticationError as err:
|
204
209
|
LOG.error('Temporary authentification error during update (%s). Will try again after configured interval of %ss', str(err), interval)
|
210
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
205
211
|
self._stop_event.wait(interval)
|
206
212
|
except Exception as err:
|
207
213
|
LOG.critical('Critical error during update: %s', traceback.format_exc())
|
208
|
-
self.
|
214
|
+
self.connection_state._set_value(value=ConnectionState.ERROR) # pylint: disable=protected-access
|
215
|
+
self.healthy._set_value(value=False) # pylint: disable=protected-access
|
209
216
|
raise err
|
210
217
|
else:
|
218
|
+
self.connection_state._set_value(value=ConnectionState.CONNECTED) # pylint: disable=protected-access
|
211
219
|
self._stop_event.wait(interval)
|
220
|
+
# When leaving the loop, set the connection state to disconnected
|
221
|
+
self.connection_state._set_value(value=ConnectionState.DISCONNECTED) # pylint: disable=protected-access
|
212
222
|
|
213
223
|
def persist(self) -> None:
|
214
224
|
"""
|
@@ -720,7 +730,7 @@ class Connector(BaseConnector):
|
|
720
730
|
if vehicle.position is None:
|
721
731
|
raise ValueError('Vehicle has no position object')
|
722
732
|
url = f'https://ola.prod.code.seat.cloud.vwgroup.com/v1/vehicles/{vin}/parkingposition'
|
723
|
-
data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache)
|
733
|
+
data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache, allow_empty=True)
|
724
734
|
if data is not None:
|
725
735
|
if 'lat' in data and data['lat'] is not None:
|
726
736
|
latitude: Optional[float] = data['lat']
|
@@ -842,7 +852,7 @@ class Connector(BaseConnector):
|
|
842
852
|
vehicle.climatization.state._set_value(value=climatization_state, measured=captured_at) # pylint: disable=protected-access
|
843
853
|
else:
|
844
854
|
vehicle.climatization.state._set_value(None) # pylint: disable=protected-access
|
845
|
-
log_extra_keys(LOG_API, '
|
855
|
+
log_extra_keys(LOG_API, 'climatisationStatus', data['climatisationStatus'], {'carCapturedTimestamp', 'climatisationState'})
|
846
856
|
else:
|
847
857
|
vehicle.climatization.state._set_value(None) # pylint: disable=protected-access
|
848
858
|
log_extra_keys(LOG_API, 'climatisation', data, {'climatisationStatus'})
|
@@ -1082,6 +1092,8 @@ class Connector(BaseConnector):
|
|
1082
1092
|
data = status_response.json()
|
1083
1093
|
if session.cache is not None:
|
1084
1094
|
session.cache[url] = (data, str(datetime.utcnow()))
|
1095
|
+
elif status_response.status_code == requests.codes['no_content'] and allow_empty:
|
1096
|
+
data = None
|
1085
1097
|
elif status_response.status_code == requests.codes['too_many_requests']:
|
1086
1098
|
raise TooManyRequestsError('Could not fetch data due to too many requests from your account. '
|
1087
1099
|
f'Status Code was: {status_response.status_code}')
|
@@ -1454,5 +1466,5 @@ class Connector(BaseConnector):
|
|
1454
1466
|
def get_type(self) -> str:
|
1455
1467
|
return "carconnectivity-connector-seatcupra"
|
1456
1468
|
|
1457
|
-
def
|
1458
|
-
return
|
1469
|
+
def get_name(self) -> str:
|
1470
|
+
return "Seat/Cupra Connector"
|
File without changes
|
File without changes
|