tesla-fleet-api 0.9.9__py3-none-any.whl → 1.0.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/__init__.py +7 -22
- tesla_fleet_api/const.py +1 -225
- tesla_fleet_api/exceptions.py +117 -0
- tesla_fleet_api/tesla/__init__.py +11 -0
- tesla_fleet_api/tesla/bluetooth.py +33 -0
- tesla_fleet_api/{charging.py → tesla/charging.py} +1 -1
- tesla_fleet_api/{energy.py → tesla/energysite.py} +41 -33
- tesla_fleet_api/{teslafleetapi.py → tesla/fleet.py} +8 -53
- tesla_fleet_api/{teslafleetoauth.py → tesla/oauth.py} +3 -4
- tesla_fleet_api/{partner.py → tesla/partner.py} +1 -1
- tesla_fleet_api/tesla/tesla.py +52 -0
- tesla_fleet_api/{user.py → tesla/user.py} +1 -1
- tesla_fleet_api/teslemetry/__init__.py +5 -0
- tesla_fleet_api/{teslemetry.py → teslemetry/teslemetry.py} +16 -25
- tesla_fleet_api/teslemetry/vehicle.py +73 -0
- tesla_fleet_api/tessie/__init__.py +5 -0
- tesla_fleet_api/{tessie.py → tessie/tessie.py} +17 -9
- tesla_fleet_api/tessie/vehicle.py +41 -0
- {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/METADATA +3 -2
- tesla_fleet_api-1.0.0.dist-info/RECORD +24 -0
- tesla_fleet_api/energyspecific.py +0 -125
- tesla_fleet_api/pb2/__init__.py +0 -0
- tesla_fleet_api/pb2/__init__.pyi +0 -9
- tesla_fleet_api/pb2/car_server_pb2.py +0 -175
- tesla_fleet_api/pb2/car_server_pb2.pyi +0 -904
- tesla_fleet_api/pb2/common_pb2.py +0 -33
- tesla_fleet_api/pb2/common_pb2.pyi +0 -130
- tesla_fleet_api/pb2/errors_pb2.py +0 -17
- tesla_fleet_api/pb2/errors_pb2.pyi +0 -32
- tesla_fleet_api/pb2/keys_pb2.py +0 -15
- tesla_fleet_api/pb2/keys_pb2.pyi +0 -21
- tesla_fleet_api/pb2/managed_charging_pb2.py +0 -15
- tesla_fleet_api/pb2/managed_charging_pb2.pyi +0 -17
- tesla_fleet_api/pb2/signatures_pb2.py +0 -35
- tesla_fleet_api/pb2/signatures_pb2.pyi +0 -152
- tesla_fleet_api/pb2/universal_message_pb2.py +0 -30
- tesla_fleet_api/pb2/universal_message_pb2.pyi +0 -148
- tesla_fleet_api/pb2/vcsec_pb2.py +0 -79
- tesla_fleet_api/pb2/vcsec_pb2.pyi +0 -482
- tesla_fleet_api/pb2/vehicle_pb2.py +0 -125
- tesla_fleet_api/pb2/vehicle_pb2.pyi +0 -1183
- tesla_fleet_api/teslafleetopensource.py +0 -61
- tesla_fleet_api/vehicle.py +0 -878
- tesla_fleet_api/vehiclesigned.py +0 -1127
- tesla_fleet_api/vehiclespecific.py +0 -505
- tesla_fleet_api-0.9.9.dist-info/RECORD +0 -42
- {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/LICENSE +0 -0
- {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/WHEEL +0 -0
- {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/top_level.txt +0 -0
@@ -2,26 +2,20 @@
|
|
2
2
|
|
3
3
|
from json import dumps
|
4
4
|
from typing import Any, Awaitable
|
5
|
-
from os.path import exists
|
6
5
|
import aiohttp
|
7
|
-
import aiofiles
|
8
6
|
|
9
|
-
|
10
|
-
from
|
11
|
-
from
|
12
|
-
from cryptography.hazmat.backends import default_backend
|
13
|
-
|
14
|
-
from .exceptions import raise_for_status, InvalidRegion, LibraryError, ResponseError
|
15
|
-
from .const import SERVERS, Method, LOGGER, VERSION
|
7
|
+
from .tesla import Tesla
|
8
|
+
from ..exceptions import raise_for_status, InvalidRegion, LibraryError, ResponseError
|
9
|
+
from ..const import SERVERS, Method, LOGGER, VERSION
|
16
10
|
from .charging import Charging
|
17
|
-
from .
|
11
|
+
from .energysite import EnergySites
|
18
12
|
from .partner import Partner
|
19
13
|
from .user import User
|
20
|
-
from .vehicle import
|
14
|
+
from .vehicle.vehicles import Vehicles
|
21
15
|
|
22
16
|
|
23
17
|
# Based on https://developer.tesla.com/docs/fleet-api
|
24
|
-
class TeslaFleetApi:
|
18
|
+
class TeslaFleetApi(Tesla):
|
25
19
|
"""Class describing the Tesla Fleet API."""
|
26
20
|
|
27
21
|
access_token: str | None = None
|
@@ -30,7 +24,6 @@ class TeslaFleetApi:
|
|
30
24
|
session: aiohttp.ClientSession
|
31
25
|
headers: dict[str, str]
|
32
26
|
refresh_hook: Awaitable | None = None
|
33
|
-
private_key: ec.EllipticCurvePrivateKey | None = None
|
34
27
|
|
35
28
|
def __init__(
|
36
29
|
self,
|
@@ -63,13 +56,13 @@ class TeslaFleetApi:
|
|
63
56
|
if charging_scope:
|
64
57
|
self.charging = Charging(self)
|
65
58
|
if energy_scope:
|
66
|
-
self.
|
59
|
+
self.energySites = EnergySites(self)
|
67
60
|
if user_scope:
|
68
61
|
self.user = User(self)
|
69
62
|
if partner_scope:
|
70
63
|
self.partner = Partner(self)
|
71
64
|
if vehicle_scope:
|
72
|
-
self.
|
65
|
+
self.vehicles = Vehicles(self)
|
73
66
|
|
74
67
|
async def find_server(self) -> str:
|
75
68
|
"""Find the server URL for the Tesla Fleet API."""
|
@@ -162,41 +155,3 @@ class TeslaFleetApi:
|
|
162
155
|
Method.GET,
|
163
156
|
"api/1/products",
|
164
157
|
)
|
165
|
-
|
166
|
-
async def get_private_key(
|
167
|
-
self, path: str = "private_key.pem"
|
168
|
-
) -> ec.EllipticCurvePrivateKey:
|
169
|
-
"""Get or create the private key."""
|
170
|
-
if not exists(path):
|
171
|
-
self.private_key = ec.generate_private_key(
|
172
|
-
ec.SECP256R1(), default_backend()
|
173
|
-
)
|
174
|
-
# save the key
|
175
|
-
pem = self.private_key.private_bytes(
|
176
|
-
encoding=serialization.Encoding.PEM,
|
177
|
-
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
178
|
-
encryption_algorithm=serialization.NoEncryption(),
|
179
|
-
)
|
180
|
-
async with aiofiles.open(path, "wb") as key_file:
|
181
|
-
await key_file.write(pem)
|
182
|
-
else:
|
183
|
-
try:
|
184
|
-
async with aiofiles.open(path, "rb") as key_file:
|
185
|
-
key_data = await key_file.read()
|
186
|
-
value = serialization.load_pem_private_key(
|
187
|
-
key_data, password=None, backend=default_backend()
|
188
|
-
)
|
189
|
-
except FileNotFoundError:
|
190
|
-
raise FileNotFoundError(f"Private key file not found at {path}")
|
191
|
-
except PermissionError:
|
192
|
-
raise PermissionError(f"Permission denied when trying to read {path}")
|
193
|
-
|
194
|
-
if not isinstance(value, ec.EllipticCurvePrivateKey):
|
195
|
-
raise AssertionError("Loaded key is not an EllipticCurvePrivateKey")
|
196
|
-
self.private_key = value
|
197
|
-
return self.private_key
|
198
|
-
|
199
|
-
@property
|
200
|
-
def has_private_key(self) -> bool:
|
201
|
-
"""Check if the private key has been set."""
|
202
|
-
return self.private_key is not None
|
@@ -2,16 +2,15 @@ from typing import Any
|
|
2
2
|
import aiohttp
|
3
3
|
import time
|
4
4
|
|
5
|
-
from
|
6
|
-
from
|
7
|
-
from .const import Scope, SERVERS
|
5
|
+
from . import TeslaFleetApi
|
6
|
+
from ..const import Scope, SERVERS, Method
|
8
7
|
|
9
8
|
|
10
9
|
class TeslaFleetOAuth(TeslaFleetApi):
|
11
10
|
"""Tesla Fleet OAuth API."""
|
12
11
|
|
13
12
|
expires: int
|
14
|
-
refresh_token: str
|
13
|
+
refresh_token: str | None
|
15
14
|
redirect_uri: str | None
|
16
15
|
_client_secret: str | None
|
17
16
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
"""Tesla Fleet API for Python."""
|
2
|
+
|
3
|
+
from os.path import exists
|
4
|
+
import aiofiles
|
5
|
+
|
6
|
+
# cryptography
|
7
|
+
from cryptography.hazmat.primitives.asymmetric import ec
|
8
|
+
from cryptography.hazmat.primitives import serialization
|
9
|
+
from cryptography.hazmat.backends import default_backend
|
10
|
+
|
11
|
+
class Tesla:
|
12
|
+
"""Base class describing interactions with Tesla products."""
|
13
|
+
|
14
|
+
private_key: ec.EllipticCurvePrivateKey | None = None
|
15
|
+
|
16
|
+
async def get_private_key(
|
17
|
+
self, path: str = "private_key.pem"
|
18
|
+
) -> ec.EllipticCurvePrivateKey:
|
19
|
+
"""Get or create the private key."""
|
20
|
+
if not exists(path):
|
21
|
+
self.private_key = ec.generate_private_key(
|
22
|
+
ec.SECP256R1(), default_backend()
|
23
|
+
)
|
24
|
+
# save the key
|
25
|
+
pem = self.private_key.private_bytes(
|
26
|
+
encoding=serialization.Encoding.PEM,
|
27
|
+
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
28
|
+
encryption_algorithm=serialization.NoEncryption(),
|
29
|
+
)
|
30
|
+
async with aiofiles.open(path, "wb") as key_file:
|
31
|
+
await key_file.write(pem)
|
32
|
+
else:
|
33
|
+
try:
|
34
|
+
async with aiofiles.open(path, "rb") as key_file:
|
35
|
+
key_data = await key_file.read()
|
36
|
+
value = serialization.load_pem_private_key(
|
37
|
+
key_data, password=None, backend=default_backend()
|
38
|
+
)
|
39
|
+
except FileNotFoundError:
|
40
|
+
raise FileNotFoundError(f"Private key file not found at {path}")
|
41
|
+
except PermissionError:
|
42
|
+
raise PermissionError(f"Permission denied when trying to read {path}")
|
43
|
+
|
44
|
+
if not isinstance(value, ec.EllipticCurvePrivateKey):
|
45
|
+
raise AssertionError("Loaded key is not an EllipticCurvePrivateKey")
|
46
|
+
self.private_key = value
|
47
|
+
return self.private_key
|
48
|
+
|
49
|
+
@property
|
50
|
+
def has_private_key(self) -> bool:
|
51
|
+
"""Check if the private key has been set."""
|
52
|
+
return self.private_key is not None
|
@@ -1,30 +1,32 @@
|
|
1
1
|
from typing import Any
|
2
2
|
|
3
3
|
import aiohttp
|
4
|
-
from aiolimiter import AsyncLimiter
|
5
4
|
|
6
|
-
from .
|
7
|
-
from .
|
5
|
+
from ..tesla.charging import Charging
|
6
|
+
from ..tesla.energysite import EnergySites
|
7
|
+
from ..tesla.user import User
|
8
|
+
from .vehicle import TeslemetryVehicles
|
9
|
+
from ..const import LOGGER, Method
|
10
|
+
from ..tesla import TeslaFleetApi
|
8
11
|
|
9
|
-
|
10
|
-
rate_limit = AsyncLimiter(5, 10)
|
12
|
+
class Teslemetry(TeslaFleetApi):
|
11
13
|
|
14
|
+
server = "https://api.teslemetry.com"
|
12
15
|
|
13
|
-
class Teslemetry(TeslaFleetApi):
|
14
16
|
def __init__(
|
15
17
|
self,
|
16
18
|
session: aiohttp.ClientSession,
|
17
19
|
access_token: str,
|
18
20
|
):
|
19
21
|
"""Initialize the Teslemetry API."""
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
)
|
27
|
-
self.
|
22
|
+
|
23
|
+
self.session = session
|
24
|
+
self.access_token = access_token
|
25
|
+
|
26
|
+
self.charging = Charging(self)
|
27
|
+
self.energySites = EnergySites(self)
|
28
|
+
self.user = User(self)
|
29
|
+
self.vehicle = TeslemetryVehicles(self)
|
28
30
|
|
29
31
|
async def ping(self) -> dict[str, bool]:
|
30
32
|
"""Send a ping."""
|
@@ -102,14 +104,3 @@ class Teslemetry(TeslaFleetApi):
|
|
102
104
|
Method.GET,
|
103
105
|
f"api/refresh/{vin}",
|
104
106
|
)
|
105
|
-
|
106
|
-
async def _request(
|
107
|
-
self,
|
108
|
-
method: Method,
|
109
|
-
path: str,
|
110
|
-
params: dict[str, Any] | None = None,
|
111
|
-
json: dict[str, Any] | None = None,
|
112
|
-
) -> dict[str, Any]:
|
113
|
-
"""Send a request to the Teslemetry API."""
|
114
|
-
async with rate_limit:
|
115
|
-
return await super()._request(method, path, params, json)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
from typing import TYPE_CHECKING, Any
|
3
|
+
|
4
|
+
from ..const import Method
|
5
|
+
from ..tesla.vehicle.proto.universal_message_pb2 import Domain
|
6
|
+
from ..tesla.vehicle.vehicle import Vehicle
|
7
|
+
from ..tesla.vehicle.vehicles import Vehicles
|
8
|
+
from ..tesla.vehicle.bluetooth import VehicleBluetooth
|
9
|
+
from ..tesla.vehicle.fleet import VehicleFleet
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from .teslemetry import Teslemetry
|
13
|
+
|
14
|
+
class TeslemetryVehicle(Vehicle):
|
15
|
+
"""Teslemetry specific base vehicle."""
|
16
|
+
pass
|
17
|
+
|
18
|
+
class TeslemetryVehicleFleet(VehicleFleet):
|
19
|
+
"""Teslemetry specific API vehicle."""
|
20
|
+
|
21
|
+
async def server_side_polling(
|
22
|
+
self, value: bool | None = None
|
23
|
+
) -> bool | None:
|
24
|
+
"""Get or set Auto mode."""
|
25
|
+
if value is True:
|
26
|
+
return (
|
27
|
+
await self._request(
|
28
|
+
Method.POST,
|
29
|
+
f"api/auto/{self.vin}",
|
30
|
+
)
|
31
|
+
).get("response")
|
32
|
+
if value is False:
|
33
|
+
return (
|
34
|
+
await self._request(
|
35
|
+
Method.DELETE,
|
36
|
+
f"api/auto/{self.vin}",
|
37
|
+
)
|
38
|
+
).get("response")
|
39
|
+
return (
|
40
|
+
await self._request(
|
41
|
+
Method.GET,
|
42
|
+
f"api/auto/{self.vin}",
|
43
|
+
)
|
44
|
+
).get("response")
|
45
|
+
|
46
|
+
async def data_refresh(self) -> dict[str, Any]:
|
47
|
+
"""Force a refresh of the vehicle data."""
|
48
|
+
return await self._request(
|
49
|
+
Method.GET,
|
50
|
+
f"api/refresh/{self.vin}",
|
51
|
+
)
|
52
|
+
|
53
|
+
|
54
|
+
class TeslemetryVehicles(Vehicles):
|
55
|
+
"""Class containing and creating vehicles."""
|
56
|
+
|
57
|
+
def create(self, vin: str) -> TeslemetryVehicleFleet:
|
58
|
+
"""Creates a specific vehicle."""
|
59
|
+
return self.createFleet(vin)
|
60
|
+
|
61
|
+
def createFleet(self, vin: str) -> TeslemetryVehicleFleet:
|
62
|
+
"""Creates a specific vehicle."""
|
63
|
+
vehicle = TeslemetryVehicleFleet(self._parent, vin)
|
64
|
+
self[vin] = vehicle
|
65
|
+
return vehicle
|
66
|
+
|
67
|
+
def createSigned(self, vin: str):
|
68
|
+
"""Creates a specific vehicle."""
|
69
|
+
raise NotImplementedError("Signing is handled by Teslemetry server-side")
|
70
|
+
|
71
|
+
def createBluetooth(self, vin: str):
|
72
|
+
"""Creates a specific vehicle."""
|
73
|
+
raise NotImplementedError("Bluetooth is only handled locally")
|
@@ -1,23 +1,31 @@
|
|
1
1
|
import aiohttp
|
2
2
|
from typing import Any
|
3
|
-
from .teslafleetapi import TeslaFleetApi
|
4
|
-
from .const import Method
|
5
3
|
|
4
|
+
from ..tesla.charging import Charging
|
5
|
+
from ..tesla.energysite import EnergySites
|
6
|
+
from ..tesla.user import User
|
7
|
+
from ..tesla import TeslaFleetApi
|
8
|
+
from ..const import Method
|
9
|
+
from .vehicle import TessieVehicles
|
6
10
|
|
7
11
|
class Tessie(TeslaFleetApi):
|
12
|
+
|
13
|
+
server="https://api.tessie.com"
|
14
|
+
|
8
15
|
def __init__(
|
9
16
|
self,
|
10
17
|
session: aiohttp.ClientSession,
|
11
18
|
access_token: str,
|
12
19
|
):
|
13
20
|
"""Initialize the Tessie API."""
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
)
|
21
|
+
|
22
|
+
self.session = session
|
23
|
+
self.access_token = access_token
|
24
|
+
|
25
|
+
self.charging = Charging(self)
|
26
|
+
self.energySites = EnergySites(self)
|
27
|
+
self.user = User(self)
|
28
|
+
self.vehicle = TessieVehicles(self)
|
21
29
|
|
22
30
|
async def scopes(self) -> list[str]:
|
23
31
|
"""Get user scopes."""
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
from typing import TYPE_CHECKING, Any
|
3
|
+
|
4
|
+
from ..const import Method
|
5
|
+
from ..tesla.vehicle.proto.universal_message_pb2 import Domain
|
6
|
+
from ..tesla.vehicle.vehicle import Vehicle
|
7
|
+
from ..tesla.vehicle.vehicles import Vehicles
|
8
|
+
from ..tesla.vehicle.bluetooth import VehicleBluetooth
|
9
|
+
from ..tesla.vehicle.fleet import VehicleFleet
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from .tessie import Tessie
|
13
|
+
|
14
|
+
class TessieVehicle(Vehicle):
|
15
|
+
"""Tessie specific base vehicle."""
|
16
|
+
pass
|
17
|
+
|
18
|
+
class TessieVehicleFleet(VehicleFleet):
|
19
|
+
"""Tessie specific API vehicle."""
|
20
|
+
pass
|
21
|
+
|
22
|
+
class TessieVehicles(Vehicles):
|
23
|
+
"""Class containing and creating vehicles."""
|
24
|
+
|
25
|
+
def create(self, vin: str) -> TessieVehicleFleet:
|
26
|
+
"""Creates a specific vehicle."""
|
27
|
+
return self.createFleet(vin)
|
28
|
+
|
29
|
+
def createFleet(self, vin: str) -> TessieVehicleFleet:
|
30
|
+
"""Creates a specific vehicle."""
|
31
|
+
vehicle = TessieVehicleFleet(self._parent, vin)
|
32
|
+
self[vin] = vehicle
|
33
|
+
return vehicle
|
34
|
+
|
35
|
+
def createSigned(self, vin: str):
|
36
|
+
"""Creates a specific vehicle."""
|
37
|
+
raise NotImplementedError("Signing is handled by Tessie server-side")
|
38
|
+
|
39
|
+
def createBluetooth(self, vin: str):
|
40
|
+
"""Creates a specific vehicle."""
|
41
|
+
raise NotImplementedError("Bluetooth is only handled locally")
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: tesla_fleet_api
|
3
|
-
Version: 0.
|
3
|
+
Version: 1.0.0
|
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
|
7
7
|
Author-email: hello@teslemetry.com
|
8
|
-
Classifier: Development Status ::
|
8
|
+
Classifier: Development Status :: 5 - Production/Stable
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
10
10
|
Classifier: License :: OSI Approved :: Apache Software License
|
11
11
|
Classifier: Operating System :: OS Independent
|
@@ -17,6 +17,7 @@ Requires-Dist: aiofiles
|
|
17
17
|
Requires-Dist: aiolimiter
|
18
18
|
Requires-Dist: cryptography
|
19
19
|
Requires-Dist: protobuf
|
20
|
+
Requires-Dist: bleak
|
20
21
|
Dynamic: author
|
21
22
|
Dynamic: author-email
|
22
23
|
Dynamic: classifier
|
@@ -0,0 +1,24 @@
|
|
1
|
+
tesla_fleet_api/__init__.py,sha256=FewtEncMLxOZa3dVA3SsT3tY--RMNF9-GXIpOTkbXvk,396
|
2
|
+
tesla_fleet_api/const.py,sha256=uyfy2ZOfFZd4sunTRiIuB3FtGxIzmO1VAcSRs1pztSY,3158
|
3
|
+
tesla_fleet_api/exceptions.py,sha256=nTo9MIJrAxL-UxzbrMrr00QhSvrLaSc6ee00Ko9pB1Q,34213
|
4
|
+
tesla_fleet_api/ratecalculator.py,sha256=4lz8yruUeouHXh_3ezsXX-CTpIegp1T1J4VuRV_qdHA,1791
|
5
|
+
tesla_fleet_api/tesla/__init__.py,sha256=sWIkVh4lesdp5eGQPC9Hjk_eoyN1_g9zz7vpMsJzTgo,219
|
6
|
+
tesla_fleet_api/tesla/bluetooth.py,sha256=H4LQwNJ4RwtKMWMwfHTOyG2om11MtvC9px0Go2GCRNE,915
|
7
|
+
tesla_fleet_api/tesla/charging.py,sha256=9zNSFi9vo8v03KQRKyosO5me49_tDrg3_25BRZibfQ0,1690
|
8
|
+
tesla_fleet_api/tesla/energysite.py,sha256=jauUrh14LL-EaMruxhye1YsNHjtTMmgCl1HCf_8mBeI,6070
|
9
|
+
tesla_fleet_api/tesla/fleet.py,sha256=NCkHLd-ddpa0wkSu_CEOG7ru9ea5HTLXud4lvkh3DWM,5516
|
10
|
+
tesla_fleet_api/tesla/oauth.py,sha256=pFGtIcERjsNKrO5VUEHm8WsNo1xF4DVbx3Yt2MhlGPQ,4070
|
11
|
+
tesla_fleet_api/tesla/partner.py,sha256=TU3Xg18x2w3PHv6Dy3Mo40pb417pp5lqnF0c1vDCt6g,1224
|
12
|
+
tesla_fleet_api/tesla/tesla.py,sha256=Jlz90-fM0nJbhnQN0k3ukNv59-9KqZZbyQ91IiLIbfo,2010
|
13
|
+
tesla_fleet_api/tesla/user.py,sha256=1LVwarEU-wmkqkPw0LGvNiPRy6uGRZkYL-vr17sz51M,1180
|
14
|
+
tesla_fleet_api/teslemetry/__init__.py,sha256=OnHrZEkPGVFrziwMA-vArvh5vgBn6vT_nMbIhjN49V0,68
|
15
|
+
tesla_fleet_api/teslemetry/teslemetry.py,sha256=BtV__OSenTg_dwM0aovbL--mv3HhIIWtoWHQp58sViQ,2990
|
16
|
+
tesla_fleet_api/teslemetry/vehicle.py,sha256=aCe4Vhs4WHd6OQ-gzdxsPubKF_C5aLBoHrDvzyVgucI,2277
|
17
|
+
tesla_fleet_api/tessie/__init__.py,sha256=UNsWgx5w0DJSIFcMd7jBBdSxklF3Vhubq9tSL8vfegg,56
|
18
|
+
tesla_fleet_api/tessie/tessie.py,sha256=Z6t-ulDL7zfBIAJ6L7EBUMux2iawWjR1cR4jvYIhVFg,2523
|
19
|
+
tesla_fleet_api/tessie/vehicle.py,sha256=C2Q0en3Uo3xtI2sU9jSHXUtYhgBrNJYYhl8gP2zVmfQ,1315
|
20
|
+
tesla_fleet_api-1.0.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
21
|
+
tesla_fleet_api-1.0.0.dist-info/METADATA,sha256=vmW8VMIM1jR6N_64JNBgkivup9NBaM9blKTkFULRDxY,4056
|
22
|
+
tesla_fleet_api-1.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
23
|
+
tesla_fleet_api-1.0.0.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
|
24
|
+
tesla_fleet_api-1.0.0.dist-info/RECORD,,
|
@@ -1,125 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
from typing import Any, TYPE_CHECKING
|
3
|
-
from .const import EnergyExportMode, EnergyOperationMode, TeslaEnergyPeriod
|
4
|
-
|
5
|
-
if TYPE_CHECKING:
|
6
|
-
from .energy import Energy
|
7
|
-
|
8
|
-
|
9
|
-
class EnergySpecific:
|
10
|
-
"""Class describing the Tesla Fleet API partner endpoints"""
|
11
|
-
|
12
|
-
_parent: Energy
|
13
|
-
energy_site_id: int
|
14
|
-
|
15
|
-
def __init__(
|
16
|
-
self,
|
17
|
-
parent: Energy,
|
18
|
-
energy_site_id: int,
|
19
|
-
):
|
20
|
-
self._parent = parent
|
21
|
-
self.energy_site_id = energy_site_id
|
22
|
-
|
23
|
-
async def backup(self, backup_reserve_percent: int) -> dict[str, Any]:
|
24
|
-
"""Adjust the site's backup reserve."""
|
25
|
-
return await self._parent.backup(
|
26
|
-
self.energy_site_id,
|
27
|
-
backup_reserve_percent,
|
28
|
-
)
|
29
|
-
|
30
|
-
async def backup_history(
|
31
|
-
self,
|
32
|
-
period: TeslaEnergyPeriod | str,
|
33
|
-
start_date: str | None = None,
|
34
|
-
end_date: str | None = None,
|
35
|
-
time_zone: str | None = None,
|
36
|
-
) -> dict[str, Any]:
|
37
|
-
"""Returns the backup (off-grid) event history of the site in duration of seconds."""
|
38
|
-
return await self._parent.backup_history(
|
39
|
-
self.energy_site_id,
|
40
|
-
period,
|
41
|
-
start_date,
|
42
|
-
end_date,
|
43
|
-
time_zone,
|
44
|
-
)
|
45
|
-
|
46
|
-
async def charge_history(
|
47
|
-
self,
|
48
|
-
start_date: str,
|
49
|
-
end_date: str,
|
50
|
-
time_zone: str | None = None,
|
51
|
-
) -> dict[str, Any]:
|
52
|
-
"""Returns the charging history of a wall connector."""
|
53
|
-
return await self._parent.charge_history(
|
54
|
-
self.energy_site_id,
|
55
|
-
start_date,
|
56
|
-
end_date,
|
57
|
-
time_zone,
|
58
|
-
)
|
59
|
-
|
60
|
-
async def energy_history(
|
61
|
-
self,
|
62
|
-
period: TeslaEnergyPeriod | str,
|
63
|
-
start_date: str | None = None,
|
64
|
-
end_date: str | None = None,
|
65
|
-
time_zone: str | None = None,
|
66
|
-
) -> dict[str, Any]:
|
67
|
-
"""Returns the energy measurements of the site, aggregated to the requested period."""
|
68
|
-
return await self._parent.energy_history(
|
69
|
-
self.energy_site_id,
|
70
|
-
period,
|
71
|
-
start_date,
|
72
|
-
end_date,
|
73
|
-
time_zone,
|
74
|
-
)
|
75
|
-
|
76
|
-
async def grid_import_export(
|
77
|
-
self,
|
78
|
-
disallow_charge_from_grid_with_solar_installed: bool | None = None,
|
79
|
-
customer_preferred_export_rule: EnergyExportMode | str | None = None,
|
80
|
-
) -> dict[str, Any]:
|
81
|
-
"""Allow/disallow charging from the grid and exporting energy to the grid."""
|
82
|
-
return await self._parent.grid_import_export(
|
83
|
-
self.energy_site_id,
|
84
|
-
disallow_charge_from_grid_with_solar_installed,
|
85
|
-
customer_preferred_export_rule,
|
86
|
-
)
|
87
|
-
|
88
|
-
async def live_status(self) -> dict[str, Any]:
|
89
|
-
"""Returns the live status of the site (power, state of energy, grid status, storm mode)."""
|
90
|
-
return await self._parent.live_status(self.energy_site_id)
|
91
|
-
|
92
|
-
async def off_grid_vehicle_charging_reserve(
|
93
|
-
self, off_grid_vehicle_charging_reserve_percent: int
|
94
|
-
) -> dict[str, Any]:
|
95
|
-
"""Adjust the site's off-grid vehicle charging backup reserve."""
|
96
|
-
return await self._parent.off_grid_vehicle_charging_reserve(
|
97
|
-
self.energy_site_id, off_grid_vehicle_charging_reserve_percent
|
98
|
-
)
|
99
|
-
|
100
|
-
async def operation(
|
101
|
-
self, default_real_mode: EnergyOperationMode | str
|
102
|
-
) -> dict[str, Any]:
|
103
|
-
"""Set the site's mode."""
|
104
|
-
return await self._parent.operation(
|
105
|
-
self.energy_site_id,
|
106
|
-
default_real_mode,
|
107
|
-
)
|
108
|
-
|
109
|
-
async def site_info(self) -> dict[str, Any]:
|
110
|
-
"""Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc)."""
|
111
|
-
return await self._parent.site_info(self.energy_site_id)
|
112
|
-
|
113
|
-
async def storm_mode(self, enabled: bool) -> dict[str, Any]:
|
114
|
-
"""Update storm watch participation."""
|
115
|
-
return await self._parent.storm_mode(
|
116
|
-
self.energy_site_id,
|
117
|
-
enabled,
|
118
|
-
)
|
119
|
-
|
120
|
-
async def time_of_use_settings(self, settings: dict[str, Any]) -> dict[str, Any]:
|
121
|
-
"""Update the site's time of use settings."""
|
122
|
-
return await self._parent.time_of_use_settings(
|
123
|
-
self.energy_site_id,
|
124
|
-
settings,
|
125
|
-
)
|
tesla_fleet_api/pb2/__init__.py
DELETED
File without changes
|
tesla_fleet_api/pb2/__init__.pyi
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
from . import car_server_pb2
|
2
|
-
from . import common_pb2
|
3
|
-
from . import errors_pb2
|
4
|
-
from . import keys_pb2
|
5
|
-
from . import managed_charging_pb2
|
6
|
-
from . import signatures_pb2
|
7
|
-
from . import universal_message_pb2
|
8
|
-
from . import vcsec_pb2
|
9
|
-
from . import vehicle_pb2
|