tesla-fleet-api 0.5.16__py3-none-any.whl → 0.6.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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,,