tesla-fleet-api 0.9.1__py3-none-any.whl → 0.9.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,7 +9,7 @@ import hashlib
9
9
  from cryptography.hazmat.primitives.asymmetric import ec
10
10
  from cryptography.hazmat.primitives.serialization import PublicFormat, Encoding
11
11
 
12
- from .exceptions import MESSAGE_FAULTS
12
+ from .exceptions import MESSAGE_FAULTS, TeslaFleetMessageFaultIncorrectEpoch
13
13
 
14
14
  from .const import (
15
15
  LOGGER,
@@ -23,6 +23,7 @@ from .vehiclespecific import VehicleSpecific
23
23
 
24
24
  from .pb2.universal_message_pb2 import (
25
25
  # OPERATIONSTATUS_OK,
26
+ MESSAGEFAULT_ERROR_INCORRECT_EPOCH,
26
27
  OPERATIONSTATUS_WAIT,
27
28
  OPERATIONSTATUS_ERROR,
28
29
  DOMAIN_VEHICLE_SECURITY,
@@ -233,7 +234,7 @@ class VehicleSigned(VehicleSpecific):
233
234
  await self._handshake(DOMAIN_INFOTAINMENT)
234
235
  return await self._send(DOMAIN_INFOTAINMENT, command.SerializeToString())
235
236
 
236
- async def _send(self, domain: int, command: bytes) -> dict[str, Any]:
237
+ async def _send(self, domain: int, command: bytes, attempt: int = 1) -> dict[str, Any]:
237
238
  """Send a signed message to the vehicle."""
238
239
  LOGGER.debug(f"Sending to domain {Domain.Name(domain)}")
239
240
  msg = RoutableMessage()
@@ -273,7 +274,17 @@ class VehicleSigned(VehicleSpecific):
273
274
 
274
275
  msg.signature_data.CopyFrom(signature)
275
276
 
276
- resp = await self._signed_message(msg)
277
+ try:
278
+ resp = await self._signed_message(msg)
279
+ except TeslaFleetMessageFaultIncorrectEpoch as e:
280
+ attempt += 1
281
+ if attempt > 3:
282
+ # We tried 3 times, give up, raise the error
283
+ raise e
284
+ LOGGER.info(f"Session expired, starting new handshake with {Domain.Name(domain)}")
285
+ await self._handshake(domain)
286
+ LOGGER.info(f"Handshake complete, retrying message to {Domain.Name(domain)}")
287
+ return await self._send(domain, command, attempt)
277
288
 
278
289
  if resp.signedMessageStatus.operation_status == OPERATIONSTATUS_WAIT:
279
290
  return {"response": {"result": False}}
@@ -602,36 +613,41 @@ class VehicleSigned(VehicleSpecific):
602
613
  # Void CAR_SEAT_THIRD_ROW_LEFT = 14;
603
614
  # Void CAR_SEAT_THIRD_ROW_RIGHT = 15;
604
615
 
605
- heater_action = HvacSeatHeaterActions.HvacSeatHeaterAction()
616
+ heater_action_dict = {}
606
617
  match seat_position:
607
618
  case 0:
608
- heater_action.CAR_SEAT_FRONT_LEFT = Void()
619
+ heater_action_dict["CAR_SEAT_FRONT_LEFT"] = Void()
609
620
  case 1:
610
- heater_action.CAR_SEAT_FRONT_RIGHT = Void()
621
+ heater_action_dict["CAR_SEAT_FRONT_RIGHT"] = Void()
611
622
  case 2:
612
- heater_action.CAR_SEAT_REAR_LEFT = Void()
623
+ heater_action_dict["CAR_SEAT_REAR_LEFT"] = Void()
613
624
  case 3:
614
- heater_action.CAR_SEAT_REAR_LEFT_BACK = Void()
625
+ heater_action_dict["CAR_SEAT_REAR_LEFT_BACK"] = Void()
615
626
  case 4:
616
- heater_action.CAR_SEAT_REAR_CENTER = Void()
627
+ heater_action_dict["CAR_SEAT_REAR_CENTER"] = Void()
617
628
  case 5:
618
- heater_action.CAR_SEAT_REAR_RIGHT = Void()
629
+ heater_action_dict["CAR_SEAT_REAR_RIGHT"] = Void()
619
630
  case 6:
620
- heater_action.CAR_SEAT_REAR_RIGHT_BACK = Void()
631
+ heater_action_dict["CAR_SEAT_REAR_RIGHT_BACK"] = Void()
621
632
  case 7:
622
- heater_action.CAR_SEAT_THIRD_ROW_LEFT = Void()
633
+ heater_action_dict["CAR_SEAT_THIRD_ROW_LEFT"] = Void()
623
634
  case 8:
624
- heater_action.CAR_SEAT_THIRD_ROW_RIGHT = Void()
635
+ heater_action_dict["CAR_SEAT_THIRD_ROW_RIGHT"] = Void()
636
+ case _:
637
+ raise ValueError(f"Invalid seat position: {seat_position}")
625
638
  match seat_heater_level:
626
639
  case 0:
627
- heater_action.SEAT_HEATER_OFF = Void()
640
+ heater_action_dict["SEAT_HEATER_OFF"] = Void()
628
641
  case 1:
629
- heater_action.SEAT_HEATER_LOW = Void()
642
+ heater_action_dict["SEAT_HEATER_LOW"] = Void()
630
643
  case 2:
631
- heater_action.SEAT_HEATER_MEDIUM = Void()
644
+ heater_action_dict["SEAT_HEATER_MEDIUM"] = Void()
632
645
  case 3:
633
- heater_action.SEAT_HEATER_HIGH = Void()
646
+ heater_action_dict["SEAT_HEATER_HIGH"] = Void()
647
+ case _:
648
+ raise ValueError(f"Invalid seat heater level: {seat_heater_level}")
634
649
 
650
+ heater_action = HvacSeatHeaterActions.HvacSeatHeaterAction(**heater_action_dict)
635
651
  return await self._sendInfotainment(
636
652
  Action(
637
653
  vehicleAction=VehicleAction(
@@ -7,13 +7,11 @@ from .const import (
7
7
  VehicleDataEndpoint,
8
8
  SunRoofCommand,
9
9
  WindowCommand,
10
- DeviceType,
11
10
  )
12
11
 
13
12
  if TYPE_CHECKING:
14
13
  from .vehicle import Vehicle
15
14
 
16
-
17
15
  class VehicleSpecific:
18
16
  """Class describing the Tesla Fleet API vehicle endpoints and commands for a specific vehicle."""
19
17
 
@@ -132,11 +130,11 @@ class VehicleSpecific:
132
130
  return await self._parent.navigation_gps_request(self.vin, lat, lon, order)
133
131
 
134
132
  async def navigation_request(
135
- self, type: str, locale: str, timestamp_ms: str
133
+ self, value: str, type: str = "share_ext_content_raw", locale: str | None = None, timestamp_ms: int | None = None
136
134
  ) -> dict[str, Any]:
137
135
  """Sends a location to the in-vehicle navigation system."""
138
136
  return await self._parent.navigation_request(
139
- self.vin, type, locale, timestamp_ms
137
+ self.vin, value, type, locale, timestamp_ms
140
138
  )
141
139
 
142
140
  async def navigation_sc_request(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tesla_fleet_api
3
- Version: 0.9.1
3
+ Version: 0.9.3
4
4
  Summary: Tesla Fleet API library for Python
5
5
  Home-page: https://github.com/Teslemetry/tesla_fleet_api
6
6
  Author: Brett Adams
@@ -0,0 +1,33 @@
1
+ tesla_fleet_api/__init__.py,sha256=BVZUDsfaxT05tAfcMHHWiyFyXwmDOx_wP_IHZBscgho,729
2
+ tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
3
+ tesla_fleet_api/const.py,sha256=ISCEtC7C99sNuZ6EY6dm0gaE5TWqdAy6eO2_uACmhkw,12888
4
+ tesla_fleet_api/energy.py,sha256=S7D75MPuMVsHgkyUcFfMqjGCLZBM5YVFlWLEHbaX-zw,5957
5
+ tesla_fleet_api/energyspecific.py,sha256=UfeaGE59aoAa8UhpQCXUi0sOrNCA40xZlqwF73BXTVY,4254
6
+ tesla_fleet_api/exceptions.py,sha256=hyPo5tmghAvsRLnv6eGwBvlj3B6uqE8S1DHP6lBGQ2M,20559
7
+ tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
8
+ tesla_fleet_api/ratecalculator.py,sha256=4lz8yruUeouHXh_3ezsXX-CTpIegp1T1J4VuRV_qdHA,1791
9
+ tesla_fleet_api/teslafleetapi.py,sha256=Ssf3L-pFR-avmkyHQaMt3yoUp9NHFCixgSsBeDSUdds,7430
10
+ tesla_fleet_api/teslafleetoauth.py,sha256=ClrVh4_lpatW8w44fWM0PZiVB-ciPHr-9h4yw1Zf9w8,4121
11
+ tesla_fleet_api/teslafleetopensource.py,sha256=TJfVPcqJlA1b3kMoGuLr-g5Gn8UDyYsTZhjvGY1MtIk,2007
12
+ tesla_fleet_api/teslemetry.py,sha256=IiDxEjDfWdXlpI7qFGW2YwroWoLbUdWSSVM6zCnhQl8,3307
13
+ tesla_fleet_api/tessie.py,sha256=4dBYxe1G2v9JvJGRbb01wXrAmvWT4jOfV4f_VQE_vkE,2302
14
+ tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
15
+ tesla_fleet_api/vehicle.py,sha256=e0AotkaI-WftNfxJbLF8peIq3l99f6-ezVSEQbkOD1I,32090
16
+ tesla_fleet_api/vehiclesigned.py,sha256=gbkQY6b_kwNxONWOG4aHkO-puWqXGl0PsNKyzEcD7yU,39652
17
+ tesla_fleet_api/vehiclespecific.py,sha256=P7KI8MqUbAyM2cfDC8NqbJXzGL2ZsOIx3IBeqB8xYQY,20656
18
+ tesla_fleet_api/pb2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ tesla_fleet_api/pb2/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ tesla_fleet_api/pb2/car_server_pb2.py,sha256=I3bq-cbq_4GXZblJatOFtjUny9seZb_1caNWMUciry0,51750
21
+ tesla_fleet_api/pb2/common_pb2.py,sha256=Iip_uomlO1s6wTyQl2QYxkUdVKB1qqSrpD3MHr-5rl0,6041
22
+ tesla_fleet_api/pb2/errors_pb2.py,sha256=ESk8GRN-jbsVvPWsWC0WfntmOXfRWVjy3sPT99WL89Q,2149
23
+ tesla_fleet_api/pb2/keys_pb2.py,sha256=T5q0OMlMiwFJV5xSmn6E2tnLCzr463Rk3pweaLFiPgM,1366
24
+ tesla_fleet_api/pb2/managed_charging_pb2.py,sha256=g6dJu9sYe9D2BCAWNFUNM_Qr0gJM5AHxmAJikHstQMc,1792
25
+ tesla_fleet_api/pb2/signatures_pb2.py,sha256=UZCXDYgV-tYIrzVHeqi0NaytUtRZJB-_lC7IVjIbggc,7719
26
+ tesla_fleet_api/pb2/universal_message_pb2.py,sha256=XF08dOMbhN0F9D4xbaNJhUIAEqbKdK1iYQdZFAloWdk,7826
27
+ tesla_fleet_api/pb2/vcsec_pb2.py,sha256=CMJ97e4Mm4p7NFcgybbCC2KJRcvtrcqmBy_pGycYhMo,26238
28
+ tesla_fleet_api/pb2/vehicle_pb2.py,sha256=ViSm74kS3iLjB2C18w-FDZyCkvi2e71GNKVmH2FU8zg,57629
29
+ tesla_fleet_api-0.9.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
30
+ tesla_fleet_api-0.9.3.dist-info/METADATA,sha256=ZMb9GVIa94cplQKjzKdMd1mE1toABc6Vs-IFZo9mi-s,3897
31
+ tesla_fleet_api-0.9.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
32
+ tesla_fleet_api-0.9.3.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
33
+ tesla_fleet_api-0.9.3.dist-info/RECORD,,
@@ -1,32 +0,0 @@
1
- tesla_fleet_api/__init__.py,sha256=BVZUDsfaxT05tAfcMHHWiyFyXwmDOx_wP_IHZBscgho,729
2
- tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
3
- tesla_fleet_api/const.py,sha256=Pqk-DoTPxL7qbjsIkyvCKivMN1fdAEPintyW_KJdRhE,12888
4
- tesla_fleet_api/energy.py,sha256=S7D75MPuMVsHgkyUcFfMqjGCLZBM5YVFlWLEHbaX-zw,5957
5
- tesla_fleet_api/energyspecific.py,sha256=UfeaGE59aoAa8UhpQCXUi0sOrNCA40xZlqwF73BXTVY,4254
6
- tesla_fleet_api/exceptions.py,sha256=wteuynQA2OY13IHEsiQHV-WU8BPUCpDDHBaYbRvQlHI,20299
7
- tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
8
- tesla_fleet_api/ratecalculator.py,sha256=4lz8yruUeouHXh_3ezsXX-CTpIegp1T1J4VuRV_qdHA,1791
9
- tesla_fleet_api/teslafleetapi.py,sha256=4Rnh_HNZkIw54o9SYAaHsA8vY0pmk_bMncrLuJ8MtSk,7389
10
- tesla_fleet_api/teslafleetoauth.py,sha256=ClrVh4_lpatW8w44fWM0PZiVB-ciPHr-9h4yw1Zf9w8,4121
11
- tesla_fleet_api/teslafleetopensource.py,sha256=TJfVPcqJlA1b3kMoGuLr-g5Gn8UDyYsTZhjvGY1MtIk,2007
12
- tesla_fleet_api/teslemetry.py,sha256=l404hRZuZonOAp3x4hgiLfJTM84y9A-hCSoe1vo5c2k,3730
13
- tesla_fleet_api/tessie.py,sha256=4dBYxe1G2v9JvJGRbb01wXrAmvWT4jOfV4f_VQE_vkE,2302
14
- tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
15
- tesla_fleet_api/vehicle.py,sha256=rEaLBWK5Vd9K-SFnMy5jFEQK-6wxpVsyY1AJ-nmHm7c,31765
16
- tesla_fleet_api/vehiclesigned.py,sha256=kxcR_I5B6I8ZsE336d22QDlVNpfxkdvRnW38XolLBsw,38698
17
- tesla_fleet_api/vehiclespecific.py,sha256=Nr4zZzfmIuw3RFYjQEX6c_xtYZgztMsN5ohVn-YEH0I,20600
18
- tesla_fleet_api/pb2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- tesla_fleet_api/pb2/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- tesla_fleet_api/pb2/car_server_pb2.py,sha256=kRNoZFFRfYx6T-8HOH9gvIhOgKCXWjvdgQfNLBA-g9w,45026
21
- tesla_fleet_api/pb2/common_pb2.py,sha256=qkRGyMbzzThzJpWiGjfa86BZvcWTbuaFE6OuVtG9jM0,4474
22
- tesla_fleet_api/pb2/errors_pb2.py,sha256=ESk8GRN-jbsVvPWsWC0WfntmOXfRWVjy3sPT99WL89Q,2149
23
- tesla_fleet_api/pb2/keys_pb2.py,sha256=T5q0OMlMiwFJV5xSmn6E2tnLCzr463Rk3pweaLFiPgM,1366
24
- tesla_fleet_api/pb2/signatures_pb2.py,sha256=5mdJUC8EC8kx1UxYrHK5XI3_7M6v7w2POH12EyCbWkc,6798
25
- tesla_fleet_api/pb2/universal_message_pb2.py,sha256=F6-SkYXSuzWDsBvnGMg9k2pAIZv13v609qCPx7NSrdw,7254
26
- tesla_fleet_api/pb2/vcsec_pb2.py,sha256=CMJ97e4Mm4p7NFcgybbCC2KJRcvtrcqmBy_pGycYhMo,26238
27
- tesla_fleet_api/pb2/vehicle_pb2.py,sha256=P1V7Dqg3BBGZwODxTpZqtxLP6fGS_FNBqJcz_Fp0crs,2482
28
- tesla_fleet_api-0.9.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
29
- tesla_fleet_api-0.9.1.dist-info/METADATA,sha256=IwzWpi6Wb7_LnwXTOfpVJinVi-C3hGNe-dD0yH6mGa0,3897
30
- tesla_fleet_api-0.9.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
31
- tesla_fleet_api-0.9.1.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
32
- tesla_fleet_api-0.9.1.dist-info/RECORD,,