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.
- tesla_fleet_api/__init__.py +1 -1
- tesla_fleet_api/tesla/__init__.py +2 -1
- tesla_fleet_api/tesla/vehicle/__init__.py +2 -0
- tesla_fleet_api/tesla/vehicle/bluetooth.py +2 -2
- tesla_fleet_api/tesla/vehicle/commands.py +15 -18
- tesla_fleet_api/teslemetry/teslemetry.py +5 -7
- tesla_fleet_api/tessie/tessie.py +6 -5
- {tesla_fleet_api-1.0.14.dist-info → tesla_fleet_api-1.0.16.dist-info}/METADATA +1 -1
- {tesla_fleet_api-1.0.14.dist-info → tesla_fleet_api-1.0.16.dist-info}/RECORD +12 -12
- {tesla_fleet_api-1.0.14.dist-info → tesla_fleet_api-1.0.16.dist-info}/LICENSE +0 -0
- {tesla_fleet_api-1.0.14.dist-info → tesla_fleet_api-1.0.16.dist-info}/WHEEL +0 -0
- {tesla_fleet_api-1.0.14.dist-info → tesla_fleet_api-1.0.16.dist-info}/top_level.txt +0 -0
tesla_fleet_api/__init__.py
CHANGED
@@ -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.
|
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.
|
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
|
-
|
178
|
-
|
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
|
-
|
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 =
|
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."""
|
tesla_fleet_api/tessie/tessie.py
CHANGED
@@ -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 =
|
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
|
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,7 +1,7 @@
|
|
1
|
-
tesla_fleet_api/__init__.py,sha256=
|
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=
|
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=
|
14
|
-
tesla_fleet_api/tesla/vehicle/bluetooth.py,sha256=
|
15
|
-
tesla_fleet_api/tesla/vehicle/commands.py,sha256=
|
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=
|
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=
|
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.
|
47
|
-
tesla_fleet_api-1.0.
|
48
|
-
tesla_fleet_api-1.0.
|
49
|
-
tesla_fleet_api-1.0.
|
50
|
-
tesla_fleet_api-1.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|