tesla-fleet-api 0.5.16__py3-none-any.whl → 0.6.0__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.
tesla_fleet_api/energy.py CHANGED
@@ -1,11 +1,17 @@
1
- from typing import Any
1
+ from __future__ import annotations
2
+ from typing import Any, TYPE_CHECKING
2
3
  from .const import Method, EnergyOperationMode, EnergyExportMode
3
4
  from .energyspecific import EnergySpecific
4
5
 
6
+ if TYPE_CHECKING:
7
+ from .teslafleetapi import TeslaFleetApi
8
+
5
9
 
6
10
  class Energy:
7
11
  """Class describing the Tesla Fleet API partner endpoints"""
8
12
 
13
+ parent: TeslaFleetApi
14
+
9
15
  def __init__(self, parent):
10
16
  self._request = parent._request
11
17
 
@@ -1,13 +1,20 @@
1
- from typing import Any
1
+ from __future__ import annotations
2
+ from typing import Any, TYPE_CHECKING
2
3
  from .const import EnergyExportMode, EnergyOperationMode
3
4
 
5
+ if TYPE_CHECKING:
6
+ from .energy import Energy
7
+
4
8
 
5
9
  class EnergySpecific:
6
10
  """Class describing the Tesla Fleet API partner endpoints"""
7
11
 
12
+ _parent: Energy
13
+ energy_site_id: int
14
+
8
15
  def __init__(
9
16
  self,
10
- parent,
17
+ parent: Energy,
11
18
  energy_site_id: int,
12
19
  ):
13
20
  self._parent = parent
@@ -7,9 +7,10 @@ class TeslaFleetError(BaseException):
7
7
 
8
8
  message: str = "An unknown error has occurred."
9
9
  status: int | None = None
10
- data: dict | None = None
10
+ data: dict | str | None = None
11
+ key: str | None = None
11
12
 
12
- def __init__(self, data: dict | None = None, status: int | None = None):
13
+ def __init__(self, data: dict | str | None = None, status: int | None = None):
13
14
  LOGGER.debug(self.message)
14
15
  self.data = data
15
16
  self.status = status or self.status
@@ -20,6 +21,7 @@ class ResponseError(TeslaFleetError):
20
21
  """The response from the server was not JSON."""
21
22
 
22
23
  message = "The response from the server was not JSON."
24
+ data: str | None = None
23
25
 
24
26
 
25
27
  class InvalidCommand(TeslaFleetError):
@@ -375,5 +377,5 @@ async def raise_for_status(resp: aiohttp.ClientResponse) -> None:
375
377
  elif resp.status == 540:
376
378
  raise DeviceUnexpectedResponse(data)
377
379
  elif data is None:
378
- raise ResponseError(status=resp.status)
380
+ raise ResponseError(status=resp.status, data=await resp.text())
379
381
  resp.raise_for_status()
@@ -1,8 +1,10 @@
1
- import aiohttp
1
+ """Tesla Fleet API for Python."""
2
2
 
3
3
  from json import dumps
4
- from .exceptions import raise_for_status, InvalidRegion, LibraryError, InvalidToken
5
4
  from typing import Any
5
+ import aiohttp
6
+
7
+ from .exceptions import raise_for_status, InvalidRegion, LibraryError, ResponseError
6
8
  from .const import SERVERS, Method, LOGGER, VERSION
7
9
  from .charging import Charging
8
10
  from .energy import Energy
@@ -15,10 +17,11 @@ from .vehicle import Vehicle
15
17
  class TeslaFleetApi:
16
18
  """Class describing the Tesla Fleet API."""
17
19
 
20
+ access_token: str | None = None
21
+ region: str | None = None
18
22
  server: str | None = None
19
23
  session: aiohttp.ClientSession
20
24
  headers: dict[str, str]
21
- raise_for_status: bool
22
25
 
23
26
  def __init__(
24
27
  self,
@@ -26,7 +29,6 @@ class TeslaFleetApi:
26
29
  access_token: str | None = None,
27
30
  region: str | None = None,
28
31
  server: str | None = None,
29
- raise_for_status: bool = True,
30
32
  charging_scope: bool = True,
31
33
  energy_scope: bool = True,
32
34
  partner_scope: bool = True,
@@ -37,7 +39,6 @@ class TeslaFleetApi:
37
39
 
38
40
  self.session = session
39
41
  self.access_token = access_token
40
- self.raise_for_status = raise_for_status
41
42
 
42
43
  if server is not None:
43
44
  self.server = server
@@ -82,7 +83,7 @@ class TeslaFleetApi:
82
83
  path: str,
83
84
  params: dict[str, Any] | None = None,
84
85
  json: dict[str, Any] | None = None,
85
- ) -> dict[str, Any] | str:
86
+ ) -> dict[str, Any]:
86
87
  """Send a request to the Tesla Fleet API."""
87
88
 
88
89
  if not self.server:
@@ -113,22 +114,14 @@ class TeslaFleetApi:
113
114
  params=params,
114
115
  ) as resp:
115
116
  LOGGER.debug("Response Status: %s", resp.status)
116
- if self.raise_for_status and not resp.ok:
117
+ if not resp.ok:
117
118
  await raise_for_status(resp)
118
- elif resp.status == 401 and resp.content_type != "application/json":
119
- # Manufacture a response since Tesla doesn't provide a body for token expiration.
120
- return {
121
- "response": None,
122
- "error": InvalidToken.key,
123
- "error_message": "The OAuth token has expired.",
124
- }
125
- if resp.content_type == "application/json":
126
- data = await resp.json()
127
- LOGGER.debug("Response JSON: %s", data)
128
- return data
129
-
130
- data = await resp.text()
131
- LOGGER.debug("Response Text: %s", data)
119
+ if not resp.content_type.lower().startswith("application/json"):
120
+ LOGGER.debug("Response type is: %s", resp.content_type)
121
+ raise ResponseError(status=resp.status, data=await resp.text())
122
+
123
+ data = await resp.json()
124
+ LOGGER.debug("Response JSON: %s", data)
132
125
  return data
133
126
 
134
127
  async def status(self) -> str:
@@ -21,7 +21,6 @@ class TeslaFleetOAuth(TeslaFleetApi):
21
21
  expires: int = 0,
22
22
  region: str | None = None,
23
23
  server: str | None = None,
24
- raise_for_status: bool = True,
25
24
  ):
26
25
  self.client_id = client_id
27
26
  self.access_token = access_token
@@ -33,7 +32,6 @@ class TeslaFleetOAuth(TeslaFleetApi):
33
32
  access_token="",
34
33
  region=region,
35
34
  server=server,
36
- raise_for_status=raise_for_status,
37
35
  )
38
36
 
39
37
  def get_login_url(
@@ -96,8 +94,8 @@ class TeslaFleetOAuth(TeslaFleetApi):
96
94
  method: Method,
97
95
  path: str,
98
96
  params: dict[str, Any] | None = None,
99
- data: dict[str, Any] | None = None,
100
- ) -> str | dict[str, Any]:
97
+ json: dict[str, Any] | None = None,
98
+ ) -> dict[str, Any]:
101
99
  """Send a request to the Tesla Fleet API."""
102
100
  await self.check_access_token()
103
- return await super()._request(method, path, params, data)
101
+ return await super()._request(method, path, params, json)
@@ -13,14 +13,12 @@ class Teslemetry(TeslaFleetApi):
13
13
  self,
14
14
  session: aiohttp.ClientSession,
15
15
  access_token: str,
16
- raise_for_status: bool = True,
17
16
  ):
18
17
  """Initialize the Teslemetry API."""
19
18
  super().__init__(
20
19
  session,
21
20
  access_token,
22
21
  server="https://api.teslemetry.com",
23
- raise_for_status=raise_for_status,
24
22
  partner_scope=False,
25
23
  user_scope=False,
26
24
  )
@@ -52,10 +50,11 @@ class Teslemetry(TeslaFleetApi):
52
50
  LOGGER.debug("Using server %s", self.server)
53
51
  return resp
54
52
 
55
- # TODO: type this properly, it probably should return something
56
- async def find_server(self) -> None:
53
+ async def find_server(self) -> str:
57
54
  """Find the server URL for the Tesla Fleet API."""
58
55
  await self.metadata(True)
56
+ assert self.region
57
+ return self.region
59
58
 
60
59
  async def _request(
61
60
  self,
@@ -63,7 +62,7 @@ class Teslemetry(TeslaFleetApi):
63
62
  path: str,
64
63
  params: dict[str, Any] | None = None,
65
64
  json: dict[str, Any] | None = None,
66
- ) -> str | dict[str, Any]:
65
+ ) -> dict[str, Any]:
67
66
  """Send a request to the Teslemetry API."""
68
67
  async with rate_limit:
69
68
  return await super()._request(method, path, params, json)
tesla_fleet_api/tessie.py CHANGED
@@ -9,14 +9,12 @@ class Tessie(TeslaFleetApi):
9
9
  self,
10
10
  session: aiohttp.ClientSession,
11
11
  access_token: str,
12
- raise_for_status: bool = True,
13
12
  ):
14
13
  """Initialize the Tessie API."""
15
14
  super().__init__(
16
15
  session,
17
16
  access_token,
18
17
  server="https://api.tessie.com",
19
- raise_for_status=raise_for_status,
20
18
  partner_scope=False,
21
19
  user_scope=False,
22
20
  )
@@ -1,4 +1,5 @@
1
- from typing import Any, List
1
+ from __future__ import annotations
2
+ from typing import Any, List, TYPE_CHECKING
2
3
  from .const import (
3
4
  Method,
4
5
  Trunk,
@@ -13,17 +14,22 @@ from .const import (
13
14
  )
14
15
  from .vehiclespecific import VehicleSpecific
15
16
 
17
+ if TYPE_CHECKING:
18
+ from .teslafleetapi import TeslaFleetApi
19
+
16
20
 
17
21
  class Vehicle:
18
22
  """Class describing the Tesla Fleet API vehicle endpoints and commands."""
19
23
 
20
- def __init__(self, parent):
24
+ _parent: TeslaFleetApi
25
+
26
+ def __init__(self, parent: TeslaFleetApi):
21
27
  self._parent = parent
22
28
  self._request = parent._request
23
29
 
24
- def specific(self, vehicle_tag: str | int) -> VehicleSpecific:
30
+ def specific(self, vin: str) -> VehicleSpecific:
25
31
  """Creates a class for each vehicle."""
26
- return VehicleSpecific(self, vehicle_tag)
32
+ return VehicleSpecific(self, vin)
27
33
 
28
34
  def pre2021(self, vin: str) -> bool:
29
35
  """Checks if a vehicle is a pre-2021 model S or X."""
@@ -716,26 +722,6 @@ class Vehicle:
716
722
  {"routable_message": routable_message},
717
723
  )
718
724
 
719
- async def subscriptions(
720
- self, device_token: str, device_type: str
721
- ) -> dict[str, Any]:
722
- """Returns the list of vehicles for which this mobile device currently subscribes to push notifications."""
723
- return await self._request(
724
- Method.GET,
725
- "api/1/subscriptions",
726
- query={"device_token": device_token, "device_type": device_type},
727
- )
728
-
729
- async def subscriptions_set(
730
- self, device_token: str, device_type: str
731
- ) -> dict[str, Any]:
732
- """Allows a mobile device to specify which vehicles to receive push notifications from."""
733
- return await self._request(
734
- Method.POST,
735
- "api/1/subscriptions",
736
- query={"device_token": device_token, "device_type": device_type},
737
- )
738
-
739
725
  async def vehicle(self, vehicle_tag: str | int) -> dict[str, Any]:
740
726
  """Returns information about a vehicle."""
741
727
  return await self._request(Method.GET, f"api/1/vehicles/{vehicle_tag}")
@@ -743,7 +729,7 @@ class Vehicle:
743
729
  async def vehicle_data(
744
730
  self,
745
731
  vehicle_tag: str | int,
746
- endpoints: List[VehicleDataEndpoint] | List[str] | None = None,
732
+ endpoints: List[VehicleDataEndpoint | str] | None = None,
747
733
  ) -> dict[str, Any]:
748
734
  """Makes a live call to the vehicle. This may return cached data if the vehicle is offline. For vehicles running firmware versions 2023.38+, location_data is required to fetch vehicle location. This will result in a location sharing icon to show on the vehicle UI."""
749
735
  endpoint_payload = ";".join(endpoints) if endpoints else None
@@ -753,37 +739,21 @@ class Vehicle:
753
739
  {"endpoints": endpoint_payload},
754
740
  )
755
741
 
756
- async def vehicle_subscriptions(
757
- self, device_token: str, device_type: DeviceType | str
758
- ) -> dict[str, Any]:
759
- """Returns the list of vehicles for which this mobile device currently subscribes to push notifications."""
760
- return await self._request(
761
- Method.GET,
762
- "api/1/vehicle_subscriptions",
763
- {"device_token": device_token, "device_type": device_type},
764
- )
765
-
766
- async def vehicle_subscriptions_set(
767
- self, device_token: str, device_type: DeviceType | str
768
- ) -> dict[str, Any]:
769
- """Allows a mobile device to specify which vehicles to receive push notifications from."""
770
- return await self._request(
771
- Method.POST,
772
- "api/1/vehicle_subscriptions",
773
- params={"device_token": device_token, "device_type": device_type},
774
- )
775
-
776
742
  async def wake_up(self, vehicle_tag: str | int) -> dict[str, Any]:
777
743
  """Wakes the vehicle from sleep, which is a state to minimize idle energy consumption."""
778
744
  return await self._request(Method.POST, f"api/1/vehicles/{vehicle_tag}/wake_up")
779
745
 
780
746
  async def warranty_details(self, vin: str | None) -> dict[str, Any]:
781
747
  """Returns warranty details."""
782
- return await self._request(Method.GET, "api/1/dx/warranty/details", {vin: vin})
748
+ return await self._request(
749
+ Method.GET, "api/1/dx/warranty/details", {"vin": vin}
750
+ )
783
751
 
784
752
  async def fleet_status(self, vins: List[str]) -> dict[str, Any]:
785
753
  """Checks whether vehicles can accept Tesla commands protocol for the partner's public key"""
786
- return await self._request(Method.GET, "api/1/vehicles/fleet_status", json=vins)
754
+ return await self._request(
755
+ Method.GET, "api/1/vehicles/fleet_status", json={"vins": vins}
756
+ )
787
757
 
788
758
  async def fleet_telemetry_config_create(
789
759
  self, config: dict[str, Any]
@@ -1,4 +1,5 @@
1
- from typing import Any
1
+ from __future__ import annotations
2
+ from typing import Any, TYPE_CHECKING
2
3
  from .const import (
3
4
  Trunk,
4
5
  ClimateKeeperMode,
@@ -9,11 +10,17 @@ from .const import (
9
10
  DeviceType,
10
11
  )
11
12
 
13
+ if TYPE_CHECKING:
14
+ from .vehicle import Vehicle
15
+
12
16
 
13
17
  class VehicleSpecific:
14
18
  """Class describing the Tesla Fleet API vehicle endpoints and commands for a specific vehicle."""
15
19
 
16
- def __init__(self, parent, vin: str | int | None = None):
20
+ _parent: Vehicle
21
+ vin: str
22
+
23
+ def __init__(self, parent: Vehicle, vin: str):
17
24
  self._parent = parent
18
25
  self.vin = vin
19
26
 
@@ -406,45 +413,17 @@ class VehicleSpecific:
406
413
  """Signed Commands is a generic endpoint replacing legacy commands."""
407
414
  return await self._parent.signed_command(self.vin, routable_message)
408
415
 
409
- async def subscriptions(
410
- self, device_token: str, device_type: str
411
- ) -> dict[str, Any]:
412
- """Returns the list of vehicles for which this mobile device currently subscribes to push notifications."""
413
- return await self._parent.subscriptions(self.vin, device_token, device_type)
414
-
415
- async def subscriptions_set(
416
- self, device_token: str, device_type: str
417
- ) -> dict[str, Any]:
418
- """Allows a mobile device to specify which vehicles to receive push notifications from."""
419
- return await self._parent.subscriptions_set(self.vin, device_token, device_type)
420
-
421
416
  async def vehicle(self) -> dict[str, Any]:
422
417
  """Returns information about a vehicle."""
423
418
  return await self._parent.vehicle(self.vin)
424
419
 
425
420
  async def vehicle_data(
426
421
  self,
427
- endpoints: list[VehicleDataEndpoint] | str | None = None,
422
+ endpoints: list[VehicleDataEndpoint | str] | None = None,
428
423
  ) -> dict[str, Any]:
429
424
  """Makes a live call to the vehicle. This may return cached data if the vehicle is offline. For vehicles running firmware versions 2023.38+, location_data is required to fetch vehicle location. This will result in a location sharing icon to show on the vehicle UI."""
430
425
  return await self._parent.vehicle_data(self.vin, endpoints)
431
426
 
432
- async def vehicle_subscriptions(
433
- self, device_token: str, device_type: DeviceType | str
434
- ) -> dict[str, Any]:
435
- """Returns the list of vehicles for which this mobile device currently subscribes to push notifications."""
436
- return await self._parent.vehicle_subscriptions(
437
- self.vin, device_token, device_type
438
- )
439
-
440
- async def vehicle_subscriptions_set(
441
- self, device_token: str, device_type: DeviceType | str
442
- ) -> dict[str, Any]:
443
- """Allows a mobile device to specify which vehicles to receive push notifications from."""
444
- return await self._parent.vehicle_subscriptions_set(
445
- self.vin, device_token, device_type
446
- )
447
-
448
427
  async def wake_up(self) -> dict[str, Any]:
449
428
  """Wakes the vehicle from sleep, which is a state to minimize idle energy consumption."""
450
429
  return await self._parent.wake_up(self.vin)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tesla_fleet_api
3
- Version: 0.5.16
3
+ Version: 0.6.0
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
@@ -40,7 +40,6 @@ async def main():
40
40
  access_token="<access_token>",
41
41
  session=session,
42
42
  region="na",
43
- raise_for_status=True,
44
43
  )
45
44
 
46
45
  try:
@@ -71,7 +70,6 @@ async def main():
71
70
  refresh_token=auth["refresh_token"],
72
71
  expires=auth["expires"],
73
72
  region="na",
74
- raise_for_status=True,
75
73
  )
76
74
  try:
77
75
  data = await api.vehicle.list()
@@ -108,7 +106,6 @@ async def main():
108
106
  api = Teslemetry(
109
107
  access_token="<access_token>",
110
108
  session=session,
111
- raise_for_status=True,
112
109
  )
113
110
 
114
111
  try:
@@ -136,7 +133,6 @@ async def main():
136
133
  api = Tessie(
137
134
  access_token="<access_token>",
138
135
  session=session,
139
- raise_for_status=True,
140
136
  )
141
137
 
142
138
  try:
@@ -0,0 +1,19 @@
1
+ tesla_fleet_api/__init__.py,sha256=0MON9vh3AShIiX16FZ6NU3yZ7kyXFh5GxA0rY8CzVRM,584
2
+ tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
3
+ tesla_fleet_api/const.py,sha256=-MYIW8BaV-B0w7dxx--sZyF7bZQslLsEtxZZ_vIYPy8,9278
4
+ tesla_fleet_api/energy.py,sha256=lVcvrU7W2Nbd0L0j4wytzD8uV3wl0oMXN07Zp90K4t8,5426
5
+ tesla_fleet_api/energyspecific.py,sha256=KWfCV609r8MvNAcg8d1PbrjVH_mrJDjzdi_WEnFiUGs,3885
6
+ tesla_fleet_api/exceptions.py,sha256=BcvJyjY4qM2-Rf7ZMA94xPIN6ebKit89E7qattMmbr8,11018
7
+ tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
8
+ tesla_fleet_api/teslafleetapi.py,sha256=-hiZfEEdS8Sfj_yqW-woiD5XD5_Q2IcMubmkh7wdtdE,4826
9
+ tesla_fleet_api/teslafleetoauth.py,sha256=OC6djQw2ieZR_rWK5HoInLScZOu5T5aMClbg5gqbnDg,3502
10
+ tesla_fleet_api/teslemetry.py,sha256=07vY6y56slUXvyaQDGQSGW_VF98fQUgEh-xXrG_phw8,2000
11
+ tesla_fleet_api/tessie.py,sha256=dZs85N2uVlqkjxB3ICRVnPyyJkl4tWDAb3CQqV4MqQc,2096
12
+ tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
13
+ tesla_fleet_api/vehicle.py,sha256=EE8ZgL1QdOVfwPsShGeI9DZtsKcLKG7EcfBCnEugfH0,31411
14
+ tesla_fleet_api/vehiclespecific.py,sha256=BhWaQGsNhg06gSLGqNEs2JQgolY3mNGtOWz478lofFE,20324
15
+ tesla_fleet_api-0.6.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
16
+ tesla_fleet_api-0.6.0.dist-info/METADATA,sha256=Wmjs_Fx05K2qujHe4Jx_EhS8lVXjqosES1fvsK4TxUI,3821
17
+ tesla_fleet_api-0.6.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
18
+ tesla_fleet_api-0.6.0.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
19
+ tesla_fleet_api-0.6.0.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- tesla_fleet_api/__init__.py,sha256=0MON9vh3AShIiX16FZ6NU3yZ7kyXFh5GxA0rY8CzVRM,584
2
- tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
3
- tesla_fleet_api/const.py,sha256=-MYIW8BaV-B0w7dxx--sZyF7bZQslLsEtxZZ_vIYPy8,9278
4
- tesla_fleet_api/energy.py,sha256=kE-HDupzhgatIsizJoer1MAALP-wH6jjjGliiRQN0Os,5285
5
- tesla_fleet_api/energyspecific.py,sha256=kICxdeDoWR9JHlgjHvnmjJ1ErLOWJT8bCSESoXo9axU,3732
6
- tesla_fleet_api/exceptions.py,sha256=3QUqIqA2wBqr-dpatDtmz8nOnqKN-pJ4gnIy6PMDQPs,10927
7
- tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
8
- tesla_fleet_api/teslafleetapi.py,sha256=KYtfkqthYxWuKpctLbyAcE32sN5yMpJaCsMSWM7bX2E,5199
9
- tesla_fleet_api/teslafleetoauth.py,sha256=FfLnuqZMxF2HsZ5miLNtm3pRwKDoQKi2GD-oXgKxZgA,3594
10
- tesla_fleet_api/teslemetry.py,sha256=XOqm7SaakooJSNXEasJI_tRoCIyiFCD6n_PCx9U_D9g,2107
11
- tesla_fleet_api/tessie.py,sha256=Aso7pGcypG19Vgh8UBACJEdinbF5135e1aWdmrOxw7s,2182
12
- tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
13
- tesla_fleet_api/vehicle.py,sha256=qM0lD4JnZOrlqHCLnXEpTQoVGUTiWr--tdTB8wKJrfA,32871
14
- tesla_fleet_api/vehiclespecific.py,sha256=Oaz5InhWwXuKgyoQSYWpLLsMPjZ2iF0bShlnDLxEk5k,21506
15
- tesla_fleet_api-0.5.16.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
16
- tesla_fleet_api-0.5.16.dist-info/METADATA,sha256=Poyg10sjR6EfdB02U6m5fBWf6LrSzGBmHKv07JTir34,3962
17
- tesla_fleet_api-0.5.16.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
18
- tesla_fleet_api-0.5.16.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
19
- tesla_fleet_api-0.5.16.dist-info/RECORD,,