tesla-fleet-api 1.0.14__py3-none-any.whl → 1.0.16__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.
@@ -1,7 +1,7 @@
1
1
  """Tesla Fleet API"""
2
2
 
3
3
  __author__ = "hello@teslemetry.com"
4
- __version__ = "1.0.14"
4
+ __version__ = "1.0.16"
5
5
 
6
6
  from tesla_fleet_api.tesla.fleet import TeslaFleetApi
7
7
  from tesla_fleet_api.tesla.bluetooth import TeslaBluetooth
@@ -7,7 +7,7 @@ from tesla_fleet_api.tesla.charging import Charging
7
7
  from tesla_fleet_api.tesla.energysite import EnergySites, EnergySite
8
8
  from tesla_fleet_api.tesla.partner import Partner
9
9
  from tesla_fleet_api.tesla.user import User
10
- from tesla_fleet_api.tesla.vehicle import Vehicles, VehiclesBluetooth, VehicleFleet, VehicleSigned, VehicleBluetooth
10
+ from tesla_fleet_api.tesla.vehicle import Vehicles, VehiclesBluetooth, VehicleFleet, VehicleSigned, VehicleBluetooth, Vehicle
11
11
 
12
12
  __all__ = [
13
13
  "TeslaFleetApi",
@@ -19,6 +19,7 @@ __all__ = [
19
19
  "Partner",
20
20
  "User",
21
21
  "Vehicles",
22
+ "Vehicle",
22
23
  "VehiclesBluetooth",
23
24
  "VehicleFleet",
24
25
  "VehicleSigned",
@@ -4,10 +4,12 @@ from tesla_fleet_api.tesla.vehicle.vehicles import Vehicles, VehiclesBluetooth
4
4
  from tesla_fleet_api.tesla.vehicle.fleet import VehicleFleet
5
5
  from tesla_fleet_api.tesla.vehicle.bluetooth import VehicleBluetooth
6
6
  from tesla_fleet_api.tesla.vehicle.signed import VehicleSigned
7
+ from tesla_fleet_api.tesla.vehicle.vehicle import Vehicle
7
8
 
8
9
  __all__ = [
9
10
  "Vehicles",
10
11
  "VehiclesBluetooth",
12
+ "Vehicle",
11
13
  "VehicleFleet",
12
14
  "VehicleBluetooth",
13
15
  "VehicleSigned",
@@ -110,7 +110,7 @@ class ReassemblingBuffer:
110
110
  if self.expected_length is None and len(self.buffer) >= 2:
111
111
  self.expected_length = struct.unpack(">H", self.buffer[:2])[0] + 2
112
112
 
113
- LOGGER.info(f"Buffer length: {len(self.buffer)}, Packet starts: {self.packet_starts}, Expected length: {self.expected_length}")
113
+ LOGGER.debug(f"Buffer length: {len(self.buffer)}, Packet starts: {self.packet_starts}, Expected length: {self.expected_length}")
114
114
 
115
115
  if self.expected_length is not None and self.expected_length > 1024:
116
116
  LOGGER.warning(f"Expected length too large: {self.expected_length}")
@@ -270,7 +270,7 @@ class VehicleBluetooth(Commands):
270
270
  if resp.HasField(requires):
271
271
  return resp
272
272
  else:
273
- LOGGER.warning(f"Ignoring message since it does not contain the required field {requires}, {resp.HasField(requires)}")
273
+ LOGGER.debug(f"Ignoring message since it does not contain the required field {requires}, {resp.HasField(requires)}")
274
274
 
275
275
  async def query_display_name(self, max_attempts=5) -> str | None:
276
276
  """Read the device name via GATT characteristic if available"""
@@ -158,24 +158,20 @@ CopActivationTemps = (
158
158
  class Session:
159
159
  """A connect to a domain"""
160
160
 
161
- domain: Domain
162
- parent: Commands
163
- key: bytes
164
- counter: int
165
- epoch: bytes
166
- delta: int
167
- sharedKey: bytes
168
- hmac: bytes
169
- publicKey: bytes
170
- lock: Lock
171
- ready: bool
172
-
173
161
  def __init__(self, parent: Commands, domain: Domain):
174
- self.parent = parent
175
- self.domain = domain
162
+ self.parent: Commands = parent
163
+ self.domain: Domain = domain
164
+ self.counter: int = 0
165
+ self.epoch: bytes | None = None
166
+ self.delta: int = 0
167
+ self.sharedKey: bytes | None = None
168
+ self.hmac: bytes | None = None
169
+ self.publicKey: bytes | None = None
176
170
  self.lock = Lock()
177
- self.counter = 0
178
- self.ready = False
171
+
172
+ @property
173
+ def ready(self) -> bool:
174
+ return self.epoch is not None and self.hmac is not None and self.delta > 0
179
175
 
180
176
  def update(self, sessionInfo: SessionInfo):
181
177
  """Update the session with new information"""
@@ -187,7 +183,6 @@ class Session:
187
183
  self.publicKey = sessionInfo.publicKey
188
184
  self.sharedKey = self.parent.shared_key(sessionInfo.publicKey)
189
185
  self.hmac = hmac.new(self.sharedKey, "authenticated command".encode(), hashlib.sha256).digest()
190
- self.ready = True
191
186
 
192
187
  def hmac_personalized(self) -> HMAC_Personalized_Signature_Data:
193
188
  """Sign a command and return session metadata"""
@@ -195,6 +190,7 @@ class Session:
195
190
  return HMAC_Personalized_Signature_Data(
196
191
  epoch=self.epoch,
197
192
  counter=self.counter,
193
+ # Expire command in 10 seconds
198
194
  expires_at=int(time.time()) - self.delta + 10,
199
195
  )
200
196
 
@@ -205,7 +201,8 @@ class Session:
205
201
  epoch=self.epoch,
206
202
  nonce=randbytes(12),
207
203
  counter=self.counter,
208
- expires_at=int(time.time()) - self.delta + 10,
204
+ # Expire command in 30 seconds (BLE can be slow)
205
+ expires_at=int(time.time()) - self.delta + 30,
209
206
  )
210
207
 
211
208
 
@@ -2,9 +2,6 @@ from typing import Any
2
2
 
3
3
  import aiohttp
4
4
 
5
- from tesla_fleet_api.tesla.charging import Charging
6
- from tesla_fleet_api.tesla.energysite import EnergySites
7
- from tesla_fleet_api.tesla.user import User
8
5
  from tesla_fleet_api.teslemetry.vehicles import TeslemetryVehicles
9
6
  from tesla_fleet_api.const import LOGGER, Method
10
7
  from tesla_fleet_api.tesla import TeslaFleetApi
@@ -12,6 +9,7 @@ from tesla_fleet_api.tesla import TeslaFleetApi
12
9
  class Teslemetry(TeslaFleetApi):
13
10
 
14
11
  server = "https://api.teslemetry.com"
12
+ Vehicles = TeslemetryVehicles
15
13
 
16
14
  def __init__(
17
15
  self,
@@ -23,10 +21,10 @@ class Teslemetry(TeslaFleetApi):
23
21
  self.session = session
24
22
  self.access_token = access_token
25
23
 
26
- self.charging = Charging(self)
27
- self.energySites = EnergySites(self)
28
- self.user = User(self)
29
- self.vehicles = TeslemetryVehicles(self)
24
+ self.charging = self.Charging(self)
25
+ self.energySites = self.EnergySites(self)
26
+ self.user = self.User(self)
27
+ self.vehicles = self.Vehicles(self)
30
28
 
31
29
  async def ping(self) -> dict[str, bool]:
32
30
  """Send a ping."""
@@ -11,6 +11,7 @@ from tesla_fleet_api.tessie.vehicles import TessieVehicles
11
11
  class Tessie(TeslaFleetApi):
12
12
 
13
13
  server="https://api.tessie.com"
14
+ Vehicles = TessieVehicles
14
15
 
15
16
  def __init__(
16
17
  self,
@@ -22,10 +23,10 @@ class Tessie(TeslaFleetApi):
22
23
  self.session = session
23
24
  self.access_token = access_token
24
25
 
25
- self.charging = Charging(self)
26
- self.energySites = EnergySites(self)
27
- self.user = User(self)
28
- self.vehicles = TessieVehicles(self)
26
+ self.charging = self.Charging(self)
27
+ self.energySites = self.EnergySites(self)
28
+ self.user = self.User(self)
29
+ self.vehicles = self.Vehicles(self)
29
30
 
30
31
  async def scopes(self) -> list[str]:
31
32
  """Get user scopes."""
@@ -39,7 +40,7 @@ class Tessie(TeslaFleetApi):
39
40
  """Find the server URL for the Tesla Fleet API."""
40
41
  raise NotImplementedError("Do not use this function for Tessie.")
41
42
 
42
- async def vehicles(self, only_active: bool = False) -> Any:
43
+ async def list_vehicles(self, only_active: bool = False) -> Any:
43
44
  """Get vehicles."""
44
45
  return await self._request(
45
46
  Method.GET, "vehicles", params={"only_active": only_active}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tesla_fleet_api
3
- Version: 1.0.14
3
+ Version: 1.0.16
4
4
  Summary: Tesla Fleet API library for Python
5
5
  Home-page: https://github.com/Teslemetry/python-tesla-fleet-api
6
6
  Author: Brett Adams
@@ -1,7 +1,7 @@
1
- tesla_fleet_api/__init__.py,sha256=eFUgI1Ardu7JVG2Sn9hwW9VT9ou7IYR3aFjrCxGSSw0,475
1
+ tesla_fleet_api/__init__.py,sha256=e4HaWJI7rTX6_WGPqvGvXsjRvo37K4njhUm34fKhMXM,475
2
2
  tesla_fleet_api/const.py,sha256=cu9jvvFTLOw56bL78lIPWJKlb35T9CYACI5pBT6DBQI,3881
3
3
  tesla_fleet_api/exceptions.py,sha256=GvjJBR77xGt2g3vhiAxcNtysj-e1Me7F-9PwO9dyzOo,35430
4
- tesla_fleet_api/tesla/__init__.py,sha256=oAWKAqERcL0fN5ahyU9Lq9YajY_WcO-KCphj6Iq0NsI,799
4
+ tesla_fleet_api/tesla/__init__.py,sha256=ahqqQigZbXfysOpo28qUudUfWrQfKRpD_1az368Sjr0,823
5
5
  tesla_fleet_api/tesla/bluetooth.py,sha256=lyPRVf1YdcElrYBsKOMCaLwMPE9rO7Iw1a6nE7VUZ94,2369
6
6
  tesla_fleet_api/tesla/charging.py,sha256=D7I7cAf-3-95sIjyP6wpVqCq9Cppj6U-VPFQGpQQ8bs,1704
7
7
  tesla_fleet_api/tesla/energysite.py,sha256=vStffklBQfQNAO_1wrHLFu7BlBCTVVbLh7_IrAUL3wg,6131
@@ -10,9 +10,9 @@ tesla_fleet_api/tesla/oauth.py,sha256=aWBsWmnM-QxzaU8W9TXVNxGsYn_LraXnpexwdE8wOq
10
10
  tesla_fleet_api/tesla/partner.py,sha256=e-l6sEP6-IupjFEQieSUjhhvRXF3aL4ebPNahcGFRCE,1238
11
11
  tesla_fleet_api/tesla/tesla.py,sha256=Gs8-L3OsEMhs1N_vdDx-E46bOHKGowXTBxmRiP8NKh4,2391
12
12
  tesla_fleet_api/tesla/user.py,sha256=w8rwiAOIFjuDus8M0RpZ0wucJtw8kYFKtJfYVk7Ekr0,1194
13
- tesla_fleet_api/tesla/vehicle/__init__.py,sha256=EYqPyPjaD9JP846c1iGBkk697VZ-eY_tcHntDixhDGE,425
14
- tesla_fleet_api/tesla/vehicle/bluetooth.py,sha256=rMxKOrc8T3Wz_sbuGYFot4ffCbOVP2jFSCd5tVuSWv0,21035
15
- tesla_fleet_api/tesla/vehicle/commands.py,sha256=L3apfGwry-IBuSSLbuoPPjW_q4new2xTr6Iy_kUa2pA,51268
13
+ tesla_fleet_api/tesla/vehicle/__init__.py,sha256=DKQA9lIAGcya5cHj4AsNc04pcQSVHn18htTrsvN_fRs,498
14
+ tesla_fleet_api/tesla/vehicle/bluetooth.py,sha256=CSUOx2rTYHM1iCShtZ3vu7kR-_m8E2dvNSLEksFqe6g,21034
15
+ tesla_fleet_api/tesla/vehicle/commands.py,sha256=CJ_NHJ9bCr5b6mjefxPPHChaUHLB6cVBFgwm6QYl4t4,51470
16
16
  tesla_fleet_api/tesla/vehicle/fleet.py,sha256=K9BVZj6CChJSDSMFroa7Cz0KrsYWj32ILtQumarkLaU,32080
17
17
  tesla_fleet_api/tesla/vehicle/signed.py,sha256=RUzVnZIfykz3YZW2gaxd1iaN1i8LkLaEoiXrbqZn9kg,1339
18
18
  tesla_fleet_api/tesla/vehicle/vehicle.py,sha256=IBvRO6qGkUf4bi-pFongA9fIe9iScvz_wGXtzEJXilY,870
@@ -38,13 +38,13 @@ tesla_fleet_api/tesla/vehicle/proto/vcsec_pb2.pyi,sha256=cyK1uyRtDjRVqVlyl5uRQYY
38
38
  tesla_fleet_api/tesla/vehicle/proto/vehicle_pb2.py,sha256=bqyFJM-1qZ7W9XKREINhYZx8yXAudmq6W8_Pdfkhbkk,44711
39
39
  tesla_fleet_api/tesla/vehicle/proto/vehicle_pb2.pyi,sha256=sAUW_9aVB8NqJCnhZjXMLfqfePLVZv_7PfSKZKEBaQA,74251
40
40
  tesla_fleet_api/teslemetry/__init__.py,sha256=BFi16_y-1wRF8XhtgHsYM22eT8T1hTAGJ10S3Q9rWHI,464
41
- tesla_fleet_api/teslemetry/teslemetry.py,sha256=wcZOD1GnZ4lwC9LoicuSNbZ3z-ka9I4m1AMZP4LDYCY,3088
41
+ tesla_fleet_api/teslemetry/teslemetry.py,sha256=pDMeb7QcjdQv7UU6O44WPDBWusZzvtyGjmhWW5r7bsw,2979
42
42
  tesla_fleet_api/teslemetry/vehicles.py,sha256=IJMRKb3jrW9ZSdJrCQ5wOYYZGVbFvSVza24Zpdh4d_0,2067
43
43
  tesla_fleet_api/tessie/__init__.py,sha256=8HiaMLz1RueRoT5PSF1Y7iRr0-RV6ujgOH2RBSSUFk4,436
44
- tesla_fleet_api/tessie/tessie.py,sha256=uhg0oOIxpwDvlvdBhKHeF3AGR2PzmdBgzh2-_EkmSq0,2617
44
+ tesla_fleet_api/tessie/tessie.py,sha256=UByX0BmDcqLPiW8ofNuGmMcjXvaWRn3taC68Ji80Yf8,2666
45
45
  tesla_fleet_api/tessie/vehicles.py,sha256=Cdp0pt2Z8bzK5T9wQ8_KubGSZ3Gevx1Q18kqJqEUxfs,1011
46
- tesla_fleet_api-1.0.14.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
47
- tesla_fleet_api-1.0.14.dist-info/METADATA,sha256=ZG36GhQmSWLB-xe866eHesBemeY68vijuB_LRKElpZw,6960
48
- tesla_fleet_api-1.0.14.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
49
- tesla_fleet_api-1.0.14.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
50
- tesla_fleet_api-1.0.14.dist-info/RECORD,,
46
+ tesla_fleet_api-1.0.16.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
47
+ tesla_fleet_api-1.0.16.dist-info/METADATA,sha256=T9nLKyPQMFEmMtAmwOH5DpZR9JVVjAc6sXTIVwbdapw,6960
48
+ tesla_fleet_api-1.0.16.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
49
+ tesla_fleet_api-1.0.16.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
50
+ tesla_fleet_api-1.0.16.dist-info/RECORD,,