carconnectivity-connector-seatcupra 0.1a4__tar.gz → 0.1a6__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.
Files changed (39) hide show
  1. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/PKG-INFO +2 -2
  2. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/pyproject.toml +1 -1
  3. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connector_seatcupra.egg-info/PKG-INFO +2 -2
  4. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connector_seatcupra.egg-info/requires.txt +1 -1
  5. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/_version.py +1 -1
  6. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/connector.py +75 -7
  7. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/vehicle.py +1 -1
  8. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.flake8 +0 -0
  9. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  10. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  11. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/dependabot.yml +0 -0
  12. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/workflows/build.yml +0 -0
  13. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/workflows/build_and_publish.yml +0 -0
  14. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.github/workflows/codeql-analysis.yml +0 -0
  15. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/.gitignore +0 -0
  16. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/CHANGELOG.md +0 -0
  17. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/LICENSE +0 -0
  18. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/Makefile +0 -0
  19. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/README.md +0 -0
  20. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/doc/Config.md +0 -0
  21. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/setup.cfg +0 -0
  22. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/setup_requirements.txt +0 -0
  23. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connector_seatcupra.egg-info/SOURCES.txt +0 -0
  24. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connector_seatcupra.egg-info/dependency_links.txt +0 -0
  25. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connector_seatcupra.egg-info/top_level.txt +0 -0
  26. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/__init__.py +0 -0
  27. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/__init__.py +0 -0
  28. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/auth_util.py +0 -0
  29. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/helpers/blacklist_retry.py +0 -0
  30. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/my_cupra_session.py +0 -0
  31. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/openid_session.py +0 -0
  32. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/session_manager.py +0 -0
  33. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/auth/vw_web_session.py +0 -0
  34. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/capability.py +0 -0
  35. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/charging.py +0 -0
  36. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/climatization.py +0 -0
  37. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/command_impl.py +0 -0
  38. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/src/carconnectivity_connectors/seatcupra/ui/connector_ui.py +0 -0
  39. {carconnectivity_connector_seatcupra-0.1a4 → carconnectivity_connector_seatcupra-0.1a6}/test/integration_test/carConnectivity.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-seatcupra
3
- Version: 0.1a4
3
+ Version: 0.1a6
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.4a2
40
+ Requires-Dist: carconnectivity>=0.4a4
41
41
  Requires-Dist: oauthlib~=3.2.2
42
42
  Requires-Dist: requests~=2.32.3
43
43
  Requires-Dist: jwt~=1.3.1
@@ -14,7 +14,7 @@ authors = [
14
14
  { name = "Till Steinbach" }
15
15
  ]
16
16
  dependencies = [
17
- "carconnectivity>=0.4a2",
17
+ "carconnectivity>=0.4a4",
18
18
  "oauthlib~=3.2.2",
19
19
  "requests~=2.32.3",
20
20
  "jwt~=1.3.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-seatcupra
3
- Version: 0.1a4
3
+ Version: 0.1a6
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.4a2
40
+ Requires-Dist: carconnectivity>=0.4a4
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,4 +1,4 @@
1
- carconnectivity>=0.4a2
1
+ carconnectivity>=0.4a4
2
2
  oauthlib~=3.2.2
3
3
  requests~=2.32.3
4
4
  jwt~=1.3.1
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.1a4'
20
+ __version__ = version = '0.1a6'
21
21
  __version_tuple__ = version_tuple = (0, 1)
@@ -259,6 +259,8 @@ class Connector(BaseConnector):
259
259
  vehicle_to_update = self.fetch_charging(vehicle_to_update)
260
260
  if vehicle_to_update.capabilities.has_capability('parkingPosition'):
261
261
  vehicle_to_update = self.fetch_parking_position(vehicle_to_update)
262
+ if vehicle_to_update.capabilities.has_capability('vehicleHealthInspection'):
263
+ vehicle_to_update = self.fetch_maintenance(vehicle_to_update)
262
264
 
263
265
  def fetch_vehicles(self) -> None:
264
266
  """
@@ -737,6 +739,42 @@ class Connector(BaseConnector):
737
739
  vehicle.odometer._set_value(None) # pylint: disable=protected-access
738
740
  return vehicle
739
741
 
742
+ def fetch_maintenance(self, vehicle: SeatCupraVehicle, no_cache: bool = False) -> SeatCupraVehicle:
743
+ vin = vehicle.vin.value
744
+ if vin is None:
745
+ raise APIError('VIN is missing')
746
+ url = f'https://ola.prod.code.seat.cloud.vwgroup.com/v1/vehicles/{vin}/maintenance'
747
+ data: Dict[str, Any] | None = self._fetch_data(url=url, session=self.session, no_cache=no_cache)
748
+ if data is not None:
749
+ if 'inspectionDueDays' in data and data['inspectionDueDays'] is not None:
750
+ inspection_due: timedelta = timedelta(days=data['inspectionDueDays'])
751
+ inspection_date: datetime = datetime.now(tz=timezone.utc) + inspection_due
752
+ inspection_date = inspection_date.replace(hour=0, minute=0, second=0, microsecond=0)
753
+ # pylint: disable-next=protected-access
754
+ vehicle.maintenance.inspection_due_at._set_value(value=inspection_date)
755
+ else:
756
+ vehicle.maintenance.inspection_due_at._set_value(None) # pylint: disable=protected-access
757
+ if 'inspectionDueKm' in data and data['inspectionDueKm'] is not None:
758
+ vehicle.maintenance.inspection_due_after._set_value(data['inspectionDueKm'], unit=Length.KM) # pylint: disable=protected-access
759
+ else:
760
+ vehicle.maintenance.inspection_due_after._set_value(None) # pylint: disable=protected-access
761
+ if 'oilServiceDueDays' in data and data['oilServiceDueDays'] is not None:
762
+ oil_service_due: timedelta = timedelta(days=data['oilServiceDueDays'])
763
+ oil_service_date: datetime = datetime.now(tz=timezone.utc) + oil_service_due
764
+ oil_service_date = oil_service_date.replace(hour=0, minute=0, second=0, microsecond=0)
765
+ # pylint: disable-next=protected-access
766
+ vehicle.maintenance.oil_service_due_at._set_value(value=oil_service_date)
767
+ else:
768
+ vehicle.maintenance.oil_service_due_at._set_value(None) # pylint: disable=protected-access
769
+ if 'oilServiceDueKm' in data and data['oilServiceDueKm'] is not None:
770
+ vehicle.maintenance.oil_service_due_after._set_value(data['oilServiceDueKm'], unit=Length.KM) # pylint: disable=protected-access
771
+ else:
772
+ vehicle.maintenance.oil_service_due_after._set_value(None) # pylint: disable=protected-access
773
+ log_extra_keys(LOG_API, f'/v1/vehicles/{vin}/maintenance', data, {'inspectionDueDays', 'inspectionDueKm', 'oilServiceDueDays', 'oilServiceDueKm'})
774
+ else:
775
+ vehicle.odometer._set_value(None) # pylint: disable=protected-access
776
+ return vehicle
777
+
740
778
  def fetch_climatisation(self, vehicle: SeatCupraVehicle, no_cache: bool = False) -> SeatCupraVehicle:
741
779
  """
742
780
  Fetches the mileage of the given vehicle and updates its mileage attributes.
@@ -1050,9 +1088,19 @@ class Connector(BaseConnector):
1050
1088
  raise CommandError('VIN in object hierarchy missing')
1051
1089
  if 'command' not in command_arguments:
1052
1090
  raise CommandError('Command argument missing')
1091
+ command_dict: Dict = {}
1053
1092
  if command_arguments['command'] == ChargingStartStopCommand.Command.START:
1054
1093
  url = f'https://ola.prod.code.seat.cloud.vwgroup.com/vehicles/{vin}/charging/requests/start'
1055
- command_response: requests.Response = self.session.post(url, data='{}', allow_redirects=True)
1094
+ if isinstance(vehicle, SeatCupraElectricVehicle) and vehicle.charging is not None and vehicle.charging.settings is not None \
1095
+ and vehicle.charging.settings.maximum_current is not None and vehicle.charging.settings.maximum_current.enabled \
1096
+ and vehicle.charging.settings.maximum_current.value is not None:
1097
+ if vehicle.charging.settings.maximum_current.value <= 6:
1098
+ command_dict['maxChargeCurrentAC'] = 'reduced'
1099
+ else:
1100
+ command_dict['maxChargeCurrentAC'] = 'maximum'
1101
+ else:
1102
+ command_dict['maxChargeCurrentAC'] = 'maximum'
1103
+ command_response: requests.Response = self.session.post(url, json=command_dict, allow_redirects=True)
1056
1104
  elif command_arguments['command'] == ChargingStartStopCommand.Command.STOP:
1057
1105
  url = f'https://ola.prod.code.seat.cloud.vwgroup.com/vehicles/{vin}/charging/requests/stop'
1058
1106
  command_response: requests.Response = self.session.post(url, data='{}', allow_redirects=True)
@@ -1078,15 +1126,35 @@ class Connector(BaseConnector):
1078
1126
  if 'command' not in command_arguments:
1079
1127
  raise CommandError('Command argument missing')
1080
1128
  command_dict = {}
1081
- command_str: Optional[str] = None
1082
1129
  if command_arguments['command'] == ClimatizationStartStopCommand.Command.START:
1083
- command_str = 'start'
1130
+ url = f'https://ola.prod.code.seat.cloud.vwgroup.com/v2/vehicles/{vin}/climatisation/start'
1131
+ if vehicle.climatization.settings is None:
1132
+ raise CommandError('Could not control climatisation, there are no climatisation settings for the vehicle available.')
1133
+ if 'target_temperature' in command_arguments:
1134
+ # Round target temperature to nearest 0.5
1135
+ command_dict['targetTemperature'] = round(command_arguments['target_temperature'] * 2) / 2
1136
+ elif vehicle.climatization.settings.target_temperature is not None and vehicle.climatization.settings.target_temperature.enabled \
1137
+ and vehicle.climatization.settings.target_temperature.value is not None:
1138
+ temperature_value = vehicle.climatization.settings.target_temperature.value
1139
+ if vehicle.climatization.settings.target_temperature.unit == Temperature.C:
1140
+ command_dict['targetTemperatureUnit'] = 'celsius'
1141
+ elif vehicle.climatization.settings.target_temperature.unit == Temperature.F:
1142
+ command_dict['targetTemperatureUnit'] = 'farenheit'
1143
+ else:
1144
+ command_dict['targetTemperatureUnit'] = 'celsius'
1145
+ if temperature_value is not None:
1146
+ command_dict['targetTemperature'] = round(temperature_value * 2) / 2
1147
+ if 'target_temperature_unit' in command_arguments:
1148
+ if command_arguments['target_temperature_unit'] == Temperature.C:
1149
+ command_dict['targetTemperatureUnit'] = 'celsius'
1150
+ elif command_arguments['target_temperature_unit'] == Temperature.F:
1151
+ command_dict['targetTemperatureUnit'] = 'farenheit'
1152
+ else:
1153
+ command_dict['targetTemperatureUnit'] = 'celsius'
1084
1154
  elif command_arguments['command'] == ClimatizationStartStopCommand.Command.STOP:
1085
- command_str = 'stop'
1155
+ url: str = f'https://ola.prod.code.seat.cloud.vwgroup.com/vehicles/{vin}/climatisation/requests/stop'
1086
1156
  else:
1087
1157
  raise CommandError(f'Unknown command {command_arguments["command"]}')
1088
-
1089
- url: str = f'https://ola.prod.code.seat.cloud.vwgroup.com/vehicles/{vin}/climatisation/requests/{command_str}'
1090
1158
  command_response: requests.Response = self.session.post(url, data=json.dumps(command_dict), allow_redirects=True)
1091
1159
  if command_response.status_code not in [requests.codes['ok'], requests.codes['created']]:
1092
1160
  LOG.error('Could not start/stop air conditioning (%s: %s)', command_response.status_code, command_response.text)
@@ -1104,7 +1172,7 @@ class Connector(BaseConnector):
1104
1172
  if self.active_config['spin'] is None:
1105
1173
  raise CommandError('S-PIN is missing, please add S-PIN to your configuration or .netrc file')
1106
1174
  if 'spin' in command_arguments:
1107
- command_dict['currentSpin'] = command_arguments['spin']
1175
+ command_dict['spin'] = command_arguments['spin']
1108
1176
  else:
1109
1177
  if self.active_config['spin'] is None or self.active_config['spin'] == '':
1110
1178
  raise CommandError('S-PIN is missing, please add S-PIN to your configuration or .netrc file')
@@ -41,7 +41,7 @@ class SeatCupraVehicle(GenericVehicle): # pylint: disable=too-many-instance-att
41
41
  self._car_images = origin._car_images
42
42
  else:
43
43
  super().__init__(vin=vin, garage=garage, managing_connector=managing_connector)
44
- self.climatization = SeatCupraClimatization(origin=self.climatization)
44
+ self.climatization = SeatCupraClimatization(vehicle=self, origin=self.climatization)
45
45
  self.capabilities: Capabilities = Capabilities(vehicle=self)
46
46
  if SUPPORT_IMAGES:
47
47
  self._car_images: Dict[str, Image.Image] = {}