tesla-fleet-api 0.0.1__py3-none-any.whl → 0.0.4__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/TeslaFleetApi.py +715 -271
- tesla_fleet_api/TeslaFleetOAuth.py +50 -4
- tesla_fleet_api/Teslemetry.py +25 -0
- tesla_fleet_api/__init__.py +0 -1
- tesla_fleet_api/const.py +236 -2
- tesla_fleet_api/exceptions.py +180 -122
- {tesla_fleet_api-0.0.1.dist-info → tesla_fleet_api-0.0.4.dist-info}/METADATA +37 -3
- tesla_fleet_api-0.0.4.dist-info/RECORD +11 -0
- tesla_fleet_api-0.0.1.dist-info/RECORD +0 -11
- {tesla_fleet_api-0.0.1.dist-info → tesla_fleet_api-0.0.4.dist-info}/LICENSE +0 -0
- {tesla_fleet_api-0.0.1.dist-info → tesla_fleet_api-0.0.4.dist-info}/WHEEL +0 -0
- {tesla_fleet_api-0.0.1.dist-info → tesla_fleet_api-0.0.4.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,67 @@
|
|
1
1
|
import aiohttp
|
2
|
+
import datetime
|
2
3
|
from .TeslaFleetApi import TeslaFleetApi
|
3
4
|
|
4
5
|
|
5
6
|
class TeslaFleetOAuth(TeslaFleetApi):
|
6
7
|
"""Tesla Fleet OAuth API."""
|
7
8
|
|
9
|
+
expires: datetime
|
10
|
+
|
8
11
|
def __init__(
|
9
12
|
self,
|
10
13
|
session: aiohttp.ClientSession,
|
11
|
-
refresh_token: str,
|
12
14
|
client_id: str,
|
15
|
+
refresh_token: str,
|
16
|
+
region: str | None = None,
|
13
17
|
server: str | None = None,
|
14
18
|
raise_for_status: bool = True,
|
15
19
|
):
|
20
|
+
raise NotImplementedError("This is not implemented yet")
|
21
|
+
self.client_id = client_id
|
22
|
+
self.refresh_token = refresh_token
|
23
|
+
self.expires = datetime.now()
|
24
|
+
|
16
25
|
super().__init__(
|
17
26
|
session,
|
18
|
-
|
19
|
-
|
20
|
-
|
27
|
+
access_token="",
|
28
|
+
region=region,
|
29
|
+
server=server,
|
30
|
+
raise_for_status=raise_for_status,
|
31
|
+
)
|
32
|
+
|
33
|
+
async def check_access_token(self) -> None:
|
34
|
+
"""Get the access token."""
|
35
|
+
if self.expires > datetime.now():
|
36
|
+
return
|
37
|
+
await self.refresh_access_token()
|
38
|
+
|
39
|
+
async def refresh_access_token(self) -> str:
|
40
|
+
if not self.refresh_token:
|
41
|
+
raise ValueError("Refresh token is missing")
|
42
|
+
with self.session.post(
|
43
|
+
"https://auth.tesla.com/oauth2/v3/token",
|
44
|
+
data={
|
45
|
+
"grant_type": "refresh_token",
|
46
|
+
"client_id": self.client_id,
|
47
|
+
"refresh_token": self.refresh_token,
|
48
|
+
},
|
49
|
+
) as resp:
|
50
|
+
data = await resp.json()
|
51
|
+
self.access_token = data["access_token"]
|
52
|
+
self.expires = datetime.now() + datetime.timedelta(
|
53
|
+
seconds=data["expires_in"]
|
54
|
+
)
|
55
|
+
|
56
|
+
async def get_refresh_token(self, client_secret: str, code: str):
|
57
|
+
"""Get the refresh token."""
|
58
|
+
data = {
|
59
|
+
"grant_type": "authorization_code",
|
60
|
+
"client_id": self.client_id,
|
61
|
+
"code": code,
|
62
|
+
"audience": self.region,
|
63
|
+
}
|
64
|
+
|
65
|
+
self.session.post(
|
66
|
+
"https://auth.tesla.com/oauth2/v3/token",
|
21
67
|
)
|
tesla_fleet_api/Teslemetry.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import aiohttp
|
2
2
|
from .TeslaFleetApi import TeslaFleetApi
|
3
|
+
from .const import Methods
|
3
4
|
|
4
5
|
|
5
6
|
class Teslemetry(TeslaFleetApi):
|
@@ -18,6 +19,30 @@ class Teslemetry(TeslaFleetApi):
|
|
18
19
|
raise_for_status=raise_for_status,
|
19
20
|
)
|
20
21
|
|
22
|
+
async def vehicles(self):
|
23
|
+
"""Get the subscribed vehicles."""
|
24
|
+
return await self._request(
|
25
|
+
Methods.GET,
|
26
|
+
"/meta/vehicles",
|
27
|
+
)
|
28
|
+
|
21
29
|
async def find_server(self):
|
22
30
|
"""Find the server URL for the Tesla Fleet API."""
|
23
31
|
raise NotImplementedError("Do not use this function for Teslemetry.")
|
32
|
+
|
33
|
+
def stream(self, vin: str, fields, alerts, expire: int):
|
34
|
+
"""Stream data from the Tesla Fleet API."""
|
35
|
+
raise NotImplementedError("Not implemented yet")
|
36
|
+
|
37
|
+
class Vehicle(TeslaFleetApi.Vehicle):
|
38
|
+
"""Tesla Fleet API Vehicle."""
|
39
|
+
|
40
|
+
async def create(
|
41
|
+
self, only_subscribed=True
|
42
|
+
) -> [TeslaFleetApi.Vehicle.Specific]:
|
43
|
+
"""Creates a class for each vehicle."""
|
44
|
+
if only_subscribed:
|
45
|
+
return [
|
46
|
+
self.Specific(self, vin) for vin in await self._parent.vehicles()
|
47
|
+
]
|
48
|
+
return await super().create()
|
tesla_fleet_api/__init__.py
CHANGED
tesla_fleet_api/const.py
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
"""Tesla Fleet API constants."""
|
2
|
-
from enum import StrEnum
|
2
|
+
from enum import StrEnum, IntEnum
|
3
|
+
|
4
|
+
|
5
|
+
class Methods(StrEnum):
|
6
|
+
"""HTTP methods."""
|
7
|
+
|
8
|
+
GET = "GET"
|
9
|
+
POST = "POST"
|
10
|
+
DELETE = "DELETE"
|
3
11
|
|
4
12
|
|
5
13
|
class Errors(StrEnum):
|
@@ -8,11 +16,11 @@ class Errors(StrEnum):
|
|
8
16
|
INVALID_COMMAND = "invalid_command"
|
9
17
|
INVALID_FIELD = "invalid_field"
|
10
18
|
INVALID_REQUEST = "invalid_request"
|
19
|
+
INVALID_TOKEN = "invalid_token" # Teslemetry specific
|
11
20
|
INVALID_AUTH_CODE = "invalid_auth_code"
|
12
21
|
INVALID_REDIRECT_URL = "invalid_redirect_url"
|
13
22
|
UNAUTHORIZED_CLIENT = "unauthorized_client"
|
14
23
|
MOBILE_ACCESS_DISABLED = "mobile_access_disabled"
|
15
|
-
NO_RESPONSE_BODY = "no response body"
|
16
24
|
|
17
25
|
|
18
26
|
SERVERS = {
|
@@ -20,3 +28,229 @@ SERVERS = {
|
|
20
28
|
"eu": "https://fleet-api.prd.eu.vn.cloud.tesla.com",
|
21
29
|
"cn": "https://fleet-api.prd.cn.vn.cloud.tesla.cn",
|
22
30
|
}
|
31
|
+
|
32
|
+
|
33
|
+
class Trunks(StrEnum):
|
34
|
+
"""Trunk options"""
|
35
|
+
|
36
|
+
FRONT: "front"
|
37
|
+
REAR: "rear"
|
38
|
+
|
39
|
+
|
40
|
+
class ClimateKeeperMode(IntEnum):
|
41
|
+
"""Climate Keeper Mode options"""
|
42
|
+
|
43
|
+
OFF = 0
|
44
|
+
KEEP_MODE = 1
|
45
|
+
DOG_MODE = 2
|
46
|
+
CAMP_MODE = 3
|
47
|
+
|
48
|
+
|
49
|
+
class CabinOverheatProtectionTemps(IntEnum):
|
50
|
+
"""COP Temp options"""
|
51
|
+
|
52
|
+
LOW = 0 # 30C 90F
|
53
|
+
MEDIUM = 1 # 35C 95F
|
54
|
+
HIGH = 2 # 40C 100F
|
55
|
+
|
56
|
+
|
57
|
+
class VehicleDataEndpoints(StrEnum):
|
58
|
+
"""Endpoints options"""
|
59
|
+
|
60
|
+
CHARGE_STATE = "charge_state"
|
61
|
+
CLIMATE_STATE = "climate_state"
|
62
|
+
CLOSURES_STATE = "closures_state"
|
63
|
+
DRIVE_STATE = "drive_state"
|
64
|
+
GUI_SETTINGS = "gui_settings"
|
65
|
+
LOCATION_DATA = "location_data"
|
66
|
+
VEHICLE_CONFIG = "vehicle_config"
|
67
|
+
VEHICLE_STATE = "vehicle_state"
|
68
|
+
VEHICLE_DATA_COMBO = "vehicle_data_combo"
|
69
|
+
|
70
|
+
|
71
|
+
class SunRoofCommands(StrEnum):
|
72
|
+
"""Sunroof options"""
|
73
|
+
|
74
|
+
STOP = "stop"
|
75
|
+
CLOSE = "close"
|
76
|
+
VENT = "vent"
|
77
|
+
|
78
|
+
|
79
|
+
class WindowCommands(StrEnum):
|
80
|
+
"""Window Control options"""
|
81
|
+
|
82
|
+
VENT = "vent"
|
83
|
+
CLOSE = "close"
|
84
|
+
|
85
|
+
|
86
|
+
class DeviceTypes(StrEnum):
|
87
|
+
"""Device Type options"""
|
88
|
+
|
89
|
+
ANDROID = "android"
|
90
|
+
IOS_DEVELOPMENT = "ios-development"
|
91
|
+
IOS_ENTERPRISE = "ios-enterprise"
|
92
|
+
IOS_BETA = "ios-beta"
|
93
|
+
IOS_PRODUCTION = "ios-production"
|
94
|
+
|
95
|
+
|
96
|
+
class TelemetryFields(StrEnum):
|
97
|
+
"""Fields available in telemetry streams"""
|
98
|
+
|
99
|
+
AC_CHARGING_ENERGY_IN = "ACChargingEnergyIn"
|
100
|
+
AC_CHARGING_POWER = "ACChargingPower"
|
101
|
+
AUTO_SEAT_CLIMATE_LEFT = "AutoSeatClimateLeft"
|
102
|
+
AUTO_SEAT_CLIMATE_RIGHT = "AutoSeatClimateRight"
|
103
|
+
AUTOMATIC_BLIND_SPOT_CAMERA = "AutomaticBlindSpotCamera"
|
104
|
+
AUTOMATIC_EMERGENCY_BRAKING_OFF = "AutomaticEmergencyBrakingOff"
|
105
|
+
BMS_STATE = "BMSState"
|
106
|
+
BATTERY_HEATER_ON = "BatteryHeaterOn"
|
107
|
+
BATTERY_LEVEL = "BatteryLevel"
|
108
|
+
BLIND_SPOT_COLLISION_WARNING_CHIME = "BlindSpotCollisionWarningChime"
|
109
|
+
BMS_FULL_CHARGE_COMPLETE = "BmsFullchargecomplete"
|
110
|
+
BRAKE_PEDAL = "BrakePedal"
|
111
|
+
BRAKE_PEDAL_POS = "BrakePedalPos"
|
112
|
+
BRICK_VOLTAGE_MAX = "BrickVoltageMax"
|
113
|
+
BRICK_VOLTAGE_MIN = "BrickVoltageMin"
|
114
|
+
CAR_TYPE = "CarType"
|
115
|
+
CHARGE_AMPS = "ChargeAmps"
|
116
|
+
CHARGE_CURRENT_REQUEST = "ChargeCurrentRequest"
|
117
|
+
CHARGE_CURRENT_REQUEST_MAX = "ChargeCurrentRequestMax"
|
118
|
+
CHARGE_ENABLE_REQUEST = "ChargeEnableRequest"
|
119
|
+
CHARGE_LIMIT_SOC = "ChargeLimitSoc"
|
120
|
+
CHARGE_PORT = "ChargePort"
|
121
|
+
CHARGE_PORT_COLD_WEATHER_MODE = "ChargePortColdWeatherMode"
|
122
|
+
CHARGE_PORT_LATCH = "ChargePortLatch"
|
123
|
+
CHARGE_STATE = "ChargeState"
|
124
|
+
CHARGER_PHASES = "ChargerPhases"
|
125
|
+
CRUISE_FOLLOW_DISTANCE = "CruiseFollowDistance"
|
126
|
+
CRUISE_SET_SPEED = "CruiseSetSpeed"
|
127
|
+
CRUISE_STATE = "CruiseState"
|
128
|
+
CURRENT_LIMIT_MPH = "CurrentLimitMph"
|
129
|
+
DC_CHARGING_ENERGY_IN = "DCChargingEnergyIn"
|
130
|
+
DC_CHARGING_POWER = "DCChargingPower"
|
131
|
+
DC_DC_ENABLE = "DCDCEnable"
|
132
|
+
DESTINATION_LOCATION = "DestinationLocation"
|
133
|
+
DI_AXLE_SPEED_F = "DiAxleSpeedF"
|
134
|
+
DI_AXLE_SPEED_R = "DiAxleSpeedR"
|
135
|
+
DI_AXLE_SPEED_REL = "DiAxleSpeedREL"
|
136
|
+
DI_AXLE_SPEED_RER = "DiAxleSpeedRER"
|
137
|
+
DI_HEATSINK_TF = "DiHeatsinkTF"
|
138
|
+
DI_HEATSINK_TR = "DiHeatsinkTR"
|
139
|
+
DI_HEATSINK_TREL = "DiHeatsinkTREL"
|
140
|
+
DI_HEATSINK_TRER = "DiHeatsinkTRER"
|
141
|
+
DI_MOTOR_CURRENT_F = "DiMotorCurrentF"
|
142
|
+
DI_MOTOR_CURRENT_R = "DiMotorCurrentR"
|
143
|
+
DI_MOTOR_CURRENT_REL = "DiMotorCurrentREL"
|
144
|
+
DI_MOTOR_CURRENT_RER = "DiMotorCurrentRER"
|
145
|
+
DI_SLAVE_TORQUE_CMD = "DiSlaveTorqueCmd"
|
146
|
+
DI_STATE_F = "DiStateF"
|
147
|
+
DI_STATE_R = "DiStateR"
|
148
|
+
DI_STATE_REL = "DiStateREL"
|
149
|
+
DI_STATE_RER = "DiStateRER"
|
150
|
+
DI_STATOR_TEMP_F = "DiStatorTempF"
|
151
|
+
DI_STATOR_TEMP_R = "DiStatorTempR"
|
152
|
+
DI_STATOR_TEMP_REL = "DiStatorTempREL"
|
153
|
+
DI_STATOR_TEMP_RER = "DiStatorTempRER"
|
154
|
+
DI_TORQUE_ACTUAL_F = "DiTorqueActualF"
|
155
|
+
DI_TORQUE_ACTUAL_R = "DiTorqueActualR"
|
156
|
+
DI_TORQUE_ACTUAL_REL = "DiTorqueActualREL"
|
157
|
+
DI_TORQUE_ACTUAL_RER = "DiTorqueActualRER"
|
158
|
+
DI_TORQUEMOTOR = "DiTorquemotor"
|
159
|
+
DI_V_BAT_F = "DiVBatF"
|
160
|
+
DI_V_BAT_R = "DiVBatR"
|
161
|
+
DI_V_BAT_REL = "DiVBatREL"
|
162
|
+
DI_V_BAT_RER = "DiVBatRER"
|
163
|
+
DOOR_STATE = "DoorState"
|
164
|
+
DRIVE_RAIL = "DriveRail"
|
165
|
+
DRIVER_SEAT_BELT = "DriverSeatBelt"
|
166
|
+
DRIVER_SEAT_OCCUPIED = "DriverSeatOccupied"
|
167
|
+
EMERGENCY_LANE_DEPARTURE_AVOIDANCE = "EmergencyLaneDepartureAvoidance"
|
168
|
+
ENERGY_REMAINING = "EnergyRemaining"
|
169
|
+
EST_BATTERY_RANGE = "EstBatteryRange"
|
170
|
+
EXPERIMENTAL_1 = "Experimental_1"
|
171
|
+
EXPERIMENTAL_2 = "Experimental_2"
|
172
|
+
EXPERIMENTAL_3 = "Experimental_3"
|
173
|
+
EXPERIMENTAL_4 = "Experimental_4"
|
174
|
+
EXTERIOR_COLOR = "ExteriorColor"
|
175
|
+
FAST_CHARGER_PRESENT = "FastChargerPresent"
|
176
|
+
FD_WINDOW = "FdWindow"
|
177
|
+
FORWARD_COLLISION_WARNING = "ForwardCollisionWarning"
|
178
|
+
FP_WINDOW = "FpWindow"
|
179
|
+
GEAR = "Gear"
|
180
|
+
GPS_HEADING = "GpsHeading"
|
181
|
+
GPS_STATE = "GpsState"
|
182
|
+
GUEST_MODE_ENABLED = "GuestModeEnabled"
|
183
|
+
GUEST_MODE_MOBILE_ACCESS_STATE = "GuestModeMobileAccessState"
|
184
|
+
HVIL = "Hvil"
|
185
|
+
IDEAL_BATTERY_RANGE = "IdealBatteryRange"
|
186
|
+
INSIDE_TEMP = "InsideTemp"
|
187
|
+
ISOLATION_RESISTANCE = "IsolationResistance"
|
188
|
+
LANE_DEPARTURE_AVOIDANCE = "LaneDepartureAvoidance"
|
189
|
+
LATERAL_ACCELERATION = "LateralAcceleration"
|
190
|
+
LIFETIME_ENERGY_GAINED_REGEN = "LifetimeEnergyGainedRegen"
|
191
|
+
LIFETIME_ENERGY_USED = "LifetimeEnergyUsed"
|
192
|
+
LIFETIME_ENERGY_USED_DRIVE = "LifetimeEnergyUsedDrive"
|
193
|
+
LOCATION = "Location"
|
194
|
+
LOCKED = "Locked"
|
195
|
+
LONGITUDINAL_ACCELERATION = "LongitudinalAcceleration"
|
196
|
+
MILES_TO_ARRIVAL = "MilesToArrival"
|
197
|
+
MINUTES_TO_ARRIVAL = "MinutesToArrival"
|
198
|
+
MODULE_TEMP_MAX = "ModuleTempMax"
|
199
|
+
MODULE_TEMP_MIN = "ModuleTempMin"
|
200
|
+
NOT_ENOUGH_POWER_TO_HEAT = "NotEnoughPowerToHeat"
|
201
|
+
NUM_BRICK_VOLTAGE_MAX = "NumBrickVoltageMax"
|
202
|
+
NUM_BRICK_VOLTAGE_MIN = "NumBrickVoltageMin"
|
203
|
+
NUM_MODULE_TEMP_MAX = "NumModuleTempMax"
|
204
|
+
NUM_MODULE_TEMP_MIN = "NumModuleTempMin"
|
205
|
+
ODOMETER = "Odometer"
|
206
|
+
ORIGIN_LOCATION = "OriginLocation"
|
207
|
+
OUTSIDE_TEMP = "OutsideTemp"
|
208
|
+
PACK_CURRENT = "PackCurrent"
|
209
|
+
PACK_VOLTAGE = "PackVoltage"
|
210
|
+
PAIRED_PHONE_KEY_AND_KEY_FOB_QTY = "PairedPhoneKeyAndKeyFobQty"
|
211
|
+
PASSENGER_SEAT_BELT = "PassengerSeatBelt"
|
212
|
+
PEDAL_POSITION = "PedalPosition"
|
213
|
+
PIN_TO_DRIVE_ENABLED = "PinToDriveEnabled"
|
214
|
+
PRECONDITIONING_ENABLED = "PreconditioningEnabled"
|
215
|
+
RATED_RANGE = "RatedRange"
|
216
|
+
RD_WINDOW = "RdWindow"
|
217
|
+
ROOF_COLOR = "RoofColor"
|
218
|
+
ROUTE_LAST_UPDATED = "RouteLastUpdated"
|
219
|
+
ROUTE_LINE = "RouteLine"
|
220
|
+
RP_WINDOW = "RpWindow"
|
221
|
+
SCHEDULED_CHARGING_MODE = "ScheduledChargingMode"
|
222
|
+
SCHEDULED_CHARGING_PENDING = "ScheduledChargingPending"
|
223
|
+
SCHEDULED_CHARGING_START_TIME = "ScheduledChargingStartTime"
|
224
|
+
SCHEDULED_DEPARTURE_TIME = "ScheduledDepartureTime"
|
225
|
+
SEAT_HEATER_LEFT = "SeatHeaterLeft"
|
226
|
+
SEAT_HEATER_REAR_CENTER = "SeatHeaterRearCenter"
|
227
|
+
SEAT_HEATER_REAR_LEFT = "SeatHeaterRearLeft"
|
228
|
+
SEAT_HEATER_REAR_RIGHT = "SeatHeaterRearRight"
|
229
|
+
SEAT_HEATER_RIGHT = "SeatHeaterRight"
|
230
|
+
SENTRY_MODE = "SentryMode"
|
231
|
+
SERVICE_MODE = "ServiceMode"
|
232
|
+
SOC = "Soc"
|
233
|
+
SPEED_LIMIT_MODE = "SpeedLimitMode"
|
234
|
+
SPEED_LIMIT_WARNING = "SpeedLimitWarning"
|
235
|
+
SUPERCHARGER_SESSION_TRIP_PLANNER = "SuperchargerSessionTripPlanner"
|
236
|
+
TIME_TO_FULL_CHARGE = "TimeToFullCharge"
|
237
|
+
TPMS_LAST_SEEN_PRESSURE_TIME_FL = "TpmsLastSeenPressureTimeFl"
|
238
|
+
TPMS_LAST_SEEN_PRESSURE_TIME_FR = "TpmsLastSeenPressureTimeFr"
|
239
|
+
TPMS_LAST_SEEN_PRESSURE_TIME_RL = "TpmsLastSeenPressureTimeRl"
|
240
|
+
TPMS_LAST_SEEN_PRESSURE_TIME_RR = "TpmsLastSeenPressureTimeRr"
|
241
|
+
TPMS_PRESSURE_FL = "TpmsPressureFl"
|
242
|
+
TPMS_PRESSURE_FR = "TpmsPressureFr"
|
243
|
+
TPMS_PRESSURE_RL = "TpmsPressureRl"
|
244
|
+
TPMS_PRESSURE_RR = "TpmsPressureRr"
|
245
|
+
TRIM = "Trim"
|
246
|
+
VEHICLE_NAME = "VehicleName"
|
247
|
+
VEHICLE_SPEED = "VehicleSpeed"
|
248
|
+
VERSION = "Version"
|
249
|
+
|
250
|
+
|
251
|
+
class TelemetryAlerts(StrEnum):
|
252
|
+
"""Alerts available in telemetry streams"""
|
253
|
+
|
254
|
+
CUSTOMER = "Customer"
|
255
|
+
SERVICE = "Service"
|
256
|
+
SERVICE_FIX = "ServiceFix"
|