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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-seatcupra
3
- Version: 0.1a16
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.4a10
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=Q2vMRbSVvIsvGRGZpDL_EO13NrfM1hiyRO4RK2N2B04,509
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=BeiW5YQtmNckm-CsYU_fd2KT2LmdOzB6druVG-QNUNE,101715
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.1a16.dist-info/LICENSE,sha256=PIwI1alwDyOfvEQHdGCm2u9uf_mGE8030xZDfun0xTo,1071
18
- carconnectivity_connector_seatcupra-0.1a16.dist-info/METADATA,sha256=HCIYpy1TCxYmcQGaceTHYYog1OtZqs4a71o-Gr-fpjA,5642
19
- carconnectivity_connector_seatcupra-0.1a16.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
20
- carconnectivity_connector_seatcupra-0.1a16.dist-info/top_level.txt,sha256=KqA8GviZsDH4PtmnwSQsz0HB_w-TWkeEHLIRNo5dTaI,27
21
- carconnectivity_connector_seatcupra-0.1a16.dist-info/RECORD,,
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,,
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.1a16'
20
+ __version__ = version = '0.1a18'
21
21
  __version_tuple__ = version_tuple = (0, 1)
@@ -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.connected: BooleanAttribute = BooleanAttribute(name="connected", parent=self, tags={'connector_custom'})
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._healthy = True
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._healthy = False
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, 'climatisation', data, {'carCapturedTimestamp', 'climatisationState'})
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 is_healthy(self) -> bool:
1458
- return self._healthy and super().is_healthy()
1469
+ def get_name(self) -> str:
1470
+ return "Seat/Cupra Connector"