carconnectivity-connector-skoda 0.5a1__py3-none-any.whl → 0.5a2__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.

Potentially problematic release.


This version of carconnectivity-connector-skoda might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.5a1
3
+ Version: 0.5a2
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -1,13 +1,13 @@
1
1
  carconnectivity_connectors/skoda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- carconnectivity_connectors/skoda/_version.py,sha256=bOACEC2JYUy747MhESx6BWoNpp7KZI9kUrva3bfgmQk,508
2
+ carconnectivity_connectors/skoda/_version.py,sha256=FnsAkPBiQBLIp2akvad-n95m_ffJpDdufPzILnmfCFo,508
3
3
  carconnectivity_connectors/skoda/capability.py,sha256=wH563-XUb_TnT8di1qDjnj-cY-cNHcAT6z7mx21LhSQ,4770
4
- carconnectivity_connectors/skoda/charging.py,sha256=CoUOYHHUPPPldKQvv0h-qrUsoEtstR3iUx-l0IU5rNM,6798
4
+ carconnectivity_connectors/skoda/charging.py,sha256=7DPNiTWFhxiiEFKVnbIIU2TCmkpmcMWx_zsHXGXFpAQ,6856
5
5
  carconnectivity_connectors/skoda/climatization.py,sha256=Jut468SkxjPBDTqroWFvDifVPfJBxGjsFed5pc4kZkg,1768
6
6
  carconnectivity_connectors/skoda/command_impl.py,sha256=vgno5Qb5To0hCHOEBWSG8UOwCY9kT5fz1e2y0b6zF7U,3047
7
- carconnectivity_connectors/skoda/connector.py,sha256=OH0i5Z9MkTvr2QDTg6ENTXj3Kzd6bMBsu9gnLjvb290,136225
7
+ carconnectivity_connectors/skoda/connector.py,sha256=wp3GXooqn1-O-TR4PxUdNR846EKrghBPCp3lN_5_UeE,144975
8
8
  carconnectivity_connectors/skoda/error.py,sha256=ffxzvjmci7vtp9Q1K4DR1kBF0kTJxN5Gluci3kDBkEI,2459
9
9
  carconnectivity_connectors/skoda/mqtt_client.py,sha256=RkZ43NG1Z_TUmc2hUZS0yYUfwewzfut63zZUhQR1xug,39101
10
- carconnectivity_connectors/skoda/vehicle.py,sha256=TeY3qKWbBfxFxt6UzSDrB-YZ4L8GURAvINzBiFm9Y9E,3819
10
+ carconnectivity_connectors/skoda/vehicle.py,sha256=q5gwe-_yPfE_-aEc17UQ-Q0Z46IN7PCpNG5jLw5PZl0,3981
11
11
  carconnectivity_connectors/skoda/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  carconnectivity_connectors/skoda/auth/auth_util.py,sha256=dGLUbUre0HBsTg_Ii5vW34f8DLrCykYJYCyzEvUBBEE,4434
13
13
  carconnectivity_connectors/skoda/auth/my_skoda_session.py,sha256=lSh23SFJs8opjmPwHTv-KNIKDep_WY4aItSP4Zq7bT8,10396
@@ -16,8 +16,8 @@ carconnectivity_connectors/skoda/auth/session_manager.py,sha256=Uf1vujuDBYUCAXhY
16
16
  carconnectivity_connectors/skoda/auth/skoda_web_session.py,sha256=tapjCRRPBu3tHrDoKmtuAlQhgxktib3oWTB8MHEzZTY,10816
17
17
  carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py,sha256=f3wsiY5bpHDBxp7Va1Mv9nKJ4u3qnCHZZmDu78_AhMk,1251
18
18
  carconnectivity_connectors/skoda/ui/connector_ui.py,sha256=2Gywhyki52IxIZXV6DhWhzrBLn2293LlUMhK1Rxnw9w,1376
19
- carconnectivity_connector_skoda-0.5a1.dist-info/LICENSE,sha256=PIwI1alwDyOfvEQHdGCm2u9uf_mGE8030xZDfun0xTo,1071
20
- carconnectivity_connector_skoda-0.5a1.dist-info/METADATA,sha256=dB0LvcHwohnohuDrxnEyb1UcYqNfd9RubqrCyLGbJFw,5360
21
- carconnectivity_connector_skoda-0.5a1.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
22
- carconnectivity_connector_skoda-0.5a1.dist-info/top_level.txt,sha256=KqA8GviZsDH4PtmnwSQsz0HB_w-TWkeEHLIRNo5dTaI,27
23
- carconnectivity_connector_skoda-0.5a1.dist-info/RECORD,,
19
+ carconnectivity_connector_skoda-0.5a2.dist-info/LICENSE,sha256=PIwI1alwDyOfvEQHdGCm2u9uf_mGE8030xZDfun0xTo,1071
20
+ carconnectivity_connector_skoda-0.5a2.dist-info/METADATA,sha256=9poMLd4wkqQ22Sj1NQCFVeMIPBYD7bIUMQ8qkHB5e1U,5360
21
+ carconnectivity_connector_skoda-0.5a2.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
22
+ carconnectivity_connector_skoda-0.5a2.dist-info/top_level.txt,sha256=KqA8GviZsDH4PtmnwSQsz0HB_w-TWkeEHLIRNo5dTaI,27
23
+ carconnectivity_connector_skoda-0.5a2.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.5a1'
20
+ __version__ = version = '0.5a2'
21
21
  __version_tuple__ = version_tuple = (0, 5)
@@ -26,11 +26,11 @@ class SkodaCharging(Charging): # pylint: disable=too-many-instance-attributes
26
26
  """
27
27
  def __init__(self, vehicle: ElectricVehicle | None = None, origin: Optional[Charging] = None) -> None:
28
28
  if origin is not None:
29
- super().__init__(origin=origin)
30
- self.settings: Charging.Settings = SkodaCharging.Settings(origin=origin.settings)
29
+ super().__init__(vehicle=vehicle, origin=origin)
30
+ self.settings: Charging.Settings = SkodaCharging.Settings(parent=self, origin=origin.settings)
31
31
  else:
32
32
  super().__init__(vehicle=vehicle)
33
- self.settings: Charging.Settings = SkodaCharging.Settings(origin=self.settings)
33
+ self.settings: Charging.Settings = SkodaCharging.Settings(parent=self, origin=self.settings)
34
34
  self.errors: Dict[str, Error] = {}
35
35
  self.is_in_saved_location: BooleanAttribute = BooleanAttribute("is_in_saved_location", parent=self, tags={'connector_custom'})
36
36
 
@@ -40,7 +40,7 @@ class SkodaCharging(Charging): # pylint: disable=too-many-instance-attributes
40
40
  """
41
41
  def __init__(self, parent: Optional[GenericObject] = None, origin: Optional[Charging.Settings] = None) -> None:
42
42
  if origin is not None:
43
- super().__init__(origin=origin)
43
+ super().__init__(parent=parent, origin=origin)
44
44
  else:
45
45
  super().__init__(parent=parent)
46
46
  self.preferred_charge_mode: EnumAttribute = EnumAttribute("preferred_charge_mode", parent=self, tags={'connector_custom'})
@@ -23,7 +23,8 @@ 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, EnumAttribute
26
+ from carconnectivity.attributes import BooleanAttribute, DurationAttribute, TemperatureAttribute, EnumAttribute, LevelAttribute, \
27
+ CurrentAttribute
27
28
  from carconnectivity.charging import Charging
28
29
  from carconnectivity.position import Position
29
30
  from carconnectivity.climatization import Climatization
@@ -509,14 +510,24 @@ class Connector(BaseConnector):
509
510
  if 'settings' in data and data['settings'] is not None:
510
511
  if 'targetStateOfChargeInPercent' in data['settings'] and data['settings']['targetStateOfChargeInPercent'] is not None \
511
512
  and vehicle.charging is not None and vehicle.charging.settings is not None:
513
+ vehicle.charging.settings.target_level.minimum = 50.0
514
+ vehicle.charging.settings.target_level.maximum = 100.0
515
+ vehicle.charging.settings.target_level.precision = 10.0
516
+ vehicle.charging.settings.target_level._add_on_set_hook(self.__on_charging_target_level_change) # pylint: disable=protected-access
517
+ vehicle.charging.settings.target_level._is_changeable = True # pylint: disable=protected-access
512
518
  # pylint: disable-next=protected-access
513
519
  vehicle.charging.settings.target_level._set_value(value=data['settings']['targetStateOfChargeInPercent'], measured=captured_at)
514
520
  else:
515
521
  vehicle.charging.settings.target_level._set_value(None, measured=captured_at) # pylint: disable=protected-access
516
522
  if 'maxChargeCurrentAc' in data['settings'] and data['settings']['maxChargeCurrentAc'] is not None \
517
523
  and vehicle.charging is not None and vehicle.charging.settings is not None:
524
+ vehicle.charging.settings.maximum_current.minimum = 6.0
525
+ vehicle.charging.settings.maximum_current.maximum = 16.0
526
+ vehicle.charging.settings.maximum_current.precision = 1.0
527
+ vehicle.charging.settings.maximum_current._add_on_set_hook(self.__on_charging_maximum_current_change) # pylint: disable=protected-access
528
+ vehicle.charging.settings.maximum_current._is_changeable = True # pylint: disable=protected-access
518
529
  if data['settings']['maxChargeCurrentAc'] == 'MAXIMUM':
519
- vehicle.charging.settings.maximum_current._set_value(value=11, measured=captured_at) # pylint: disable=protected-access
530
+ vehicle.charging.settings.maximum_current._set_value(value=16, measured=captured_at) # pylint: disable=protected-access
520
531
  elif data['settings']['maxChargeCurrentAc'] == 'REDUCED':
521
532
  vehicle.charging.settings.maximum_current._set_value(value=6, measured=captured_at) # pylint: disable=protected-access
522
533
  else:
@@ -525,6 +536,8 @@ class Connector(BaseConnector):
525
536
  else:
526
537
  vehicle.charging.settings.maximum_current._set_value(None, measured=captured_at) # pylint: disable=protected-access
527
538
  if 'autoUnlockPlugWhenCharged' in data['settings'] and data['settings']['autoUnlockPlugWhenCharged'] is not None:
539
+ vehicle.charging.settings.auto_unlock._add_on_set_hook(self.__on_charging_auto_unlock_change) # pylint: disable=protected-access
540
+ vehicle.charging.settings.auto_unlock._is_changeable = True # pylint: disable=protected-access
528
541
  if data['settings']['autoUnlockPlugWhenCharged'] in ['ON', 'PERMANENT']:
529
542
  vehicle.charging.settings.auto_unlock._set_value(True, measured=captured_at) # pylint: disable=protected-access
530
543
  elif data['settings']['autoUnlockPlugWhenCharged'] == 'OFF':
@@ -1234,7 +1247,7 @@ class Connector(BaseConnector):
1234
1247
  car_type = GenericVehicle.Type(range_data['carType'])
1235
1248
  if car_type == GenericVehicle.Type.ELECTRIC and not isinstance(vehicle, SkodaElectricVehicle):
1236
1249
  LOG.debug('Promoting %s to SkodaElectricVehicle object for %s', vehicle.__class__.__name__, vin)
1237
- vehicle = SkodaElectricVehicle(origin=vehicle)
1250
+ vehicle = SkodaElectricVehicle(garage=self.car_connectivity.garage, origin=vehicle)
1238
1251
  self.car_connectivity.garage.replace_vehicle(vin, vehicle)
1239
1252
  elif car_type in [GenericVehicle.Type.FUEL,
1240
1253
  GenericVehicle.Type.GASOLINE,
@@ -1244,11 +1257,11 @@ class Connector(BaseConnector):
1244
1257
  GenericVehicle.Type.LPG] \
1245
1258
  and not isinstance(vehicle, SkodaCombustionVehicle):
1246
1259
  LOG.debug('Promoting %s to SkodaCombustionVehicle object for %s', vehicle.__class__.__name__, vin)
1247
- vehicle = SkodaCombustionVehicle(origin=vehicle)
1260
+ vehicle = SkodaCombustionVehicle(garage=self.car_connectivity.garage, origin=vehicle)
1248
1261
  self.car_connectivity.garage.replace_vehicle(vin, vehicle)
1249
1262
  elif car_type == GenericVehicle.Type.HYBRID and not isinstance(vehicle, SkodaHybridVehicle):
1250
1263
  LOG.debug('Promoting %s to SkodaHybridVehicle object for %s', vehicle.__class__.__name__, vin)
1251
- vehicle = SkodaHybridVehicle(origin=vehicle)
1264
+ vehicle = SkodaHybridVehicle(garage=self.car_connectivity.garage, origin=vehicle)
1252
1265
  self.car_connectivity.garage.replace_vehicle(vin, vehicle)
1253
1266
  except ValueError:
1254
1267
  LOG_API.warning('Unknown car type %s', range_data['carType'])
@@ -1889,5 +1902,122 @@ class Connector(BaseConnector):
1889
1902
  raise CommandError(f'Retrying failed: {retry_error}') from retry_error
1890
1903
  return command_arguments
1891
1904
 
1905
+ def __on_charging_target_level_change(self, level_attribute: LevelAttribute, target_level: float) -> float:
1906
+ """
1907
+ Callback for the charging target level change.
1908
+
1909
+ Args:
1910
+ level_attribute (LevelAttribute): The level attribute that changed.
1911
+ target_level (float): The new target level.
1912
+ """
1913
+ if level_attribute.parent is None or level_attribute.parent.parent is None \
1914
+ or level_attribute.parent.parent.parent is None or not isinstance(level_attribute.parent.parent.parent, SkodaVehicle):
1915
+ raise SetterError('Object hierarchy is not as expected')
1916
+ vehicle: SkodaVehicle = level_attribute.parent.parent.parent
1917
+ vin: Optional[str] = vehicle.vin.value
1918
+ if vin is None:
1919
+ raise SetterError('VIN in object hierarchy missing')
1920
+ precision: float = level_attribute.precision if level_attribute.precision is not None else 10.0
1921
+ target_level = round(target_level / precision) * precision
1922
+ setting_dict = {}
1923
+ setting_dict['targetSOCInPercent'] = target_level
1924
+
1925
+ url = f'https://mysmob.api.connect.skoda-auto.cz/api/v1/charging/{vin}/set-charge-limit'
1926
+ try:
1927
+ settings_response: requests.Response = self.session.put(url, data=json.dumps(setting_dict), allow_redirects=True)
1928
+ if settings_response.status_code != requests.codes['accepted']:
1929
+ LOG.error('Could not set target level (%s)', settings_response.status_code)
1930
+ raise SetterError(f'Could not set value ({settings_response.status_code})')
1931
+ except requests.exceptions.ConnectionError as connection_error:
1932
+ raise SetterError(f'Connection error: {connection_error}.'
1933
+ ' If this happens frequently, please check if other applications communicate with the Skoda server.') from connection_error
1934
+ except requests.exceptions.ChunkedEncodingError as chunked_encoding_error:
1935
+ raise SetterError(f'Error: {chunked_encoding_error}') from chunked_encoding_error
1936
+ except requests.exceptions.ReadTimeout as timeout_error:
1937
+ raise SetterError(f'Timeout during read: {timeout_error}') from timeout_error
1938
+ except requests.exceptions.RetryError as retry_error:
1939
+ raise SetterError(f'Retrying failed: {retry_error}') from retry_error
1940
+ return target_level
1941
+
1942
+ def __on_charging_maximum_current_change(self, current_attribute: CurrentAttribute, maximum_current: float) -> float:
1943
+ """
1944
+ Callback for the charging target level change.
1945
+
1946
+ Args:
1947
+ current_attribute (CurrentAttribute): The current attribute that changed.
1948
+ maximum_current (float): The new maximum current.
1949
+ """
1950
+ if current_attribute.parent is None or current_attribute.parent.parent is None \
1951
+ or current_attribute.parent.parent.parent is None or not isinstance(current_attribute.parent.parent.parent, SkodaVehicle):
1952
+ raise SetterError('Object hierarchy is not as expected')
1953
+ vehicle: SkodaVehicle = current_attribute.parent.parent.parent
1954
+ vin: Optional[str] = vehicle.vin.value
1955
+ if vin is None:
1956
+ raise SetterError('VIN in object hierarchy missing')
1957
+ setting_dict = {}
1958
+ precision: float = current_attribute.precision if current_attribute.precision is not None else 1.0
1959
+ maximum_current = round(maximum_current / precision) * precision
1960
+ if maximum_current < 16:
1961
+ setting_dict['chargingCurrent'] = "REDUCED"
1962
+ maximum_current = 6.0
1963
+ else:
1964
+ setting_dict['chargingCurrent'] = "MAXIMUM"
1965
+ maximum_current = 16.0
1966
+
1967
+ url = f'https://mysmob.api.connect.skoda-auto.cz/api/v1/charging/{vin}/set-charging-current'
1968
+ try:
1969
+ settings_response: requests.Response = self.session.put(url, data=json.dumps(setting_dict), allow_redirects=True)
1970
+ if settings_response.status_code != requests.codes['accepted']:
1971
+ LOG.error('Could not set target charging current (%s)', settings_response.status_code)
1972
+ raise SetterError(f'Could not set value ({settings_response.status_code})')
1973
+ except requests.exceptions.ConnectionError as connection_error:
1974
+ raise SetterError(f'Connection error: {connection_error}.'
1975
+ ' If this happens frequently, please check if other applications communicate with the Skoda server.') from connection_error
1976
+ except requests.exceptions.ChunkedEncodingError as chunked_encoding_error:
1977
+ raise SetterError(f'Error: {chunked_encoding_error}') from chunked_encoding_error
1978
+ except requests.exceptions.ReadTimeout as timeout_error:
1979
+ raise SetterError(f'Timeout during read: {timeout_error}') from timeout_error
1980
+ except requests.exceptions.RetryError as retry_error:
1981
+ raise SetterError(f'Retrying failed: {retry_error}') from retry_error
1982
+ return maximum_current
1983
+
1984
+ def __on_charging_auto_unlock_change(self, boolean_attribute: BooleanAttribute, auto_unlock: bool) -> bool:
1985
+ """
1986
+ Callback for the charging target level change.
1987
+
1988
+ Args:
1989
+ boolean_attribute (BooleanAttribute): The boolean attribute that changed.
1990
+ auto_unlock (float): The new auto_unlock setting.
1991
+ """
1992
+ if boolean_attribute.parent is None or boolean_attribute.parent.parent is None \
1993
+ or boolean_attribute.parent.parent.parent is None or not isinstance(boolean_attribute.parent.parent.parent, SkodaVehicle):
1994
+ raise SetterError('Object hierarchy is not as expected')
1995
+ vehicle: SkodaVehicle = boolean_attribute.parent.parent.parent
1996
+ vin: Optional[str] = vehicle.vin.value
1997
+ if vin is None:
1998
+ raise SetterError('VIN in object hierarchy missing')
1999
+ setting_dict = {}
2000
+ if auto_unlock:
2001
+ setting_dict['autoUnlockPlug'] = "PERMANENT"
2002
+ else:
2003
+ setting_dict['autoUnlockPlug'] = "OFF"
2004
+
2005
+ url = f'https://mysmob.api.connect.skoda-auto.cz/api/v1/charging/{vin}/set-auto-unlock-plug'
2006
+ try:
2007
+ settings_response: requests.Response = self.session.put(url, data=json.dumps(setting_dict), allow_redirects=True)
2008
+ if settings_response.status_code != requests.codes['accepted']:
2009
+ LOG.error('Could not set auto unlock setting (%s)', settings_response.status_code)
2010
+ raise SetterError(f'Could not set value ({settings_response.status_code})')
2011
+ except requests.exceptions.ConnectionError as connection_error:
2012
+ raise SetterError(f'Connection error: {connection_error}.'
2013
+ ' If this happens frequently, please check if other applications communicate with the Skoda server.') from connection_error
2014
+ except requests.exceptions.ChunkedEncodingError as chunked_encoding_error:
2015
+ raise SetterError(f'Error: {chunked_encoding_error}') from chunked_encoding_error
2016
+ except requests.exceptions.ReadTimeout as timeout_error:
2017
+ raise SetterError(f'Timeout during read: {timeout_error}') from timeout_error
2018
+ except requests.exceptions.RetryError as retry_error:
2019
+ raise SetterError(f'Retrying failed: {retry_error}') from retry_error
2020
+ return auto_unlock
2021
+
1892
2022
  def get_name(self) -> str:
1893
2023
  return "Skoda Connector"
@@ -30,7 +30,7 @@ class SkodaVehicle(GenericVehicle): # pylint: disable=too-many-instance-attribu
30
30
  def __init__(self, vin: Optional[str] = None, garage: Optional[Garage] = None, managing_connector: Optional[BaseConnector] = None,
31
31
  origin: Optional[SkodaVehicle] = None) -> None:
32
32
  if origin is not None:
33
- super().__init__(origin=origin)
33
+ super().__init__(garage=garage, origin=origin)
34
34
  self.capabilities: Capabilities = origin.capabilities
35
35
  self.capabilities.parent = self
36
36
  self.in_motion: BooleanAttribute = origin.in_motion
@@ -55,13 +55,14 @@ class SkodaElectricVehicle(ElectricVehicle, SkodaVehicle):
55
55
  def __init__(self, vin: Optional[str] = None, garage: Optional[Garage] = None, managing_connector: Optional[BaseConnector] = None,
56
56
  origin: Optional[SkodaVehicle] = None) -> None:
57
57
  if origin is not None:
58
- super().__init__(origin=origin)
58
+ super().__init__(garage=garage, origin=origin)
59
59
  if isinstance(origin, ElectricVehicle):
60
- self.charging: Charging = SkodaCharging(origin=origin.charging)
61
- self.charging.parent = self
60
+ self.charging: Charging = SkodaCharging(vehicle=self, origin=origin.charging)
61
+ else:
62
+ self.charging: Charging = SkodaCharging(vehicle=self, origin=self.charging)
62
63
  else:
63
64
  super().__init__(vin=vin, garage=garage, managing_connector=managing_connector)
64
- self.charging: Charging = SkodaCharging(vehicle=self)
65
+ self.charging: Charging = SkodaCharging(vehicle=self, origin=self.charging)
65
66
 
66
67
 
67
68
  class SkodaCombustionVehicle(CombustionVehicle, SkodaVehicle):
@@ -71,7 +72,7 @@ class SkodaCombustionVehicle(CombustionVehicle, SkodaVehicle):
71
72
  def __init__(self, vin: Optional[str] = None, garage: Optional[Garage] = None, managing_connector: Optional[BaseConnector] = None,
72
73
  origin: Optional[SkodaVehicle] = None) -> None:
73
74
  if origin is not None:
74
- super().__init__(origin=origin)
75
+ super().__init__(garage=garage, origin=origin)
75
76
  else:
76
77
  super().__init__(vin=vin, garage=garage, managing_connector=managing_connector)
77
78
 
@@ -83,6 +84,6 @@ class SkodaHybridVehicle(HybridVehicle, SkodaVehicle):
83
84
  def __init__(self, vin: Optional[str] = None, garage: Optional[Garage] = None, managing_connector: Optional[BaseConnector] = None,
84
85
  origin: Optional[SkodaVehicle] = None) -> None:
85
86
  if origin is not None:
86
- super().__init__(origin=origin)
87
+ super().__init__(garage=garage, origin=origin)
87
88
  else:
88
89
  super().__init__(vin=vin, garage=garage, managing_connector=managing_connector)