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.
Files changed (49) hide show
  1. tesla_fleet_api/__init__.py +7 -22
  2. tesla_fleet_api/const.py +1 -225
  3. tesla_fleet_api/exceptions.py +117 -0
  4. tesla_fleet_api/tesla/__init__.py +11 -0
  5. tesla_fleet_api/tesla/bluetooth.py +33 -0
  6. tesla_fleet_api/{charging.py → tesla/charging.py} +1 -1
  7. tesla_fleet_api/{energy.py → tesla/energysite.py} +41 -33
  8. tesla_fleet_api/{teslafleetapi.py → tesla/fleet.py} +8 -53
  9. tesla_fleet_api/{teslafleetoauth.py → tesla/oauth.py} +3 -4
  10. tesla_fleet_api/{partner.py → tesla/partner.py} +1 -1
  11. tesla_fleet_api/tesla/tesla.py +52 -0
  12. tesla_fleet_api/{user.py → tesla/user.py} +1 -1
  13. tesla_fleet_api/teslemetry/__init__.py +5 -0
  14. tesla_fleet_api/{teslemetry.py → teslemetry/teslemetry.py} +16 -25
  15. tesla_fleet_api/teslemetry/vehicle.py +73 -0
  16. tesla_fleet_api/tessie/__init__.py +5 -0
  17. tesla_fleet_api/{tessie.py → tessie/tessie.py} +17 -9
  18. tesla_fleet_api/tessie/vehicle.py +41 -0
  19. {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/METADATA +3 -2
  20. tesla_fleet_api-1.0.0.dist-info/RECORD +24 -0
  21. tesla_fleet_api/energyspecific.py +0 -125
  22. tesla_fleet_api/pb2/__init__.py +0 -0
  23. tesla_fleet_api/pb2/__init__.pyi +0 -9
  24. tesla_fleet_api/pb2/car_server_pb2.py +0 -175
  25. tesla_fleet_api/pb2/car_server_pb2.pyi +0 -904
  26. tesla_fleet_api/pb2/common_pb2.py +0 -33
  27. tesla_fleet_api/pb2/common_pb2.pyi +0 -130
  28. tesla_fleet_api/pb2/errors_pb2.py +0 -17
  29. tesla_fleet_api/pb2/errors_pb2.pyi +0 -32
  30. tesla_fleet_api/pb2/keys_pb2.py +0 -15
  31. tesla_fleet_api/pb2/keys_pb2.pyi +0 -21
  32. tesla_fleet_api/pb2/managed_charging_pb2.py +0 -15
  33. tesla_fleet_api/pb2/managed_charging_pb2.pyi +0 -17
  34. tesla_fleet_api/pb2/signatures_pb2.py +0 -35
  35. tesla_fleet_api/pb2/signatures_pb2.pyi +0 -152
  36. tesla_fleet_api/pb2/universal_message_pb2.py +0 -30
  37. tesla_fleet_api/pb2/universal_message_pb2.pyi +0 -148
  38. tesla_fleet_api/pb2/vcsec_pb2.py +0 -79
  39. tesla_fleet_api/pb2/vcsec_pb2.pyi +0 -482
  40. tesla_fleet_api/pb2/vehicle_pb2.py +0 -125
  41. tesla_fleet_api/pb2/vehicle_pb2.pyi +0 -1183
  42. tesla_fleet_api/teslafleetopensource.py +0 -61
  43. tesla_fleet_api/vehicle.py +0 -878
  44. tesla_fleet_api/vehiclesigned.py +0 -1127
  45. tesla_fleet_api/vehiclespecific.py +0 -505
  46. tesla_fleet_api-0.9.9.dist-info/RECORD +0 -42
  47. {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/LICENSE +0 -0
  48. {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/WHEEL +0 -0
  49. {tesla_fleet_api-0.9.9.dist-info → tesla_fleet_api-1.0.0.dist-info}/top_level.txt +0 -0
@@ -1,30 +1,15 @@
1
- from .teslafleetapi import TeslaFleetApi
2
- from .teslafleetoauth import TeslaFleetOAuth
3
- from .teslafleetopensource import TeslaFleetOpenSource
4
- from .teslemetry import Teslemetry
5
- from .tessie import Tessie
6
- from .charging import Charging
7
- from .energy import Energy
8
- from .energyspecific import EnergySpecific
9
- from .partner import Partner
10
- from .user import User
11
- from .vehicle import Vehicle
12
- from .vehiclespecific import VehicleSpecific
13
- from .vehiclesigned import VehicleSigned
14
-
1
+ from .tesla.fleet import TeslaFleetApi
2
+ from .tesla.bluetooth import TeslaBluetooth
3
+ from .tesla.oauth import TeslaFleetOAuth
4
+ from .tesla.opensource import TeslaFleetOpenSource
5
+ from .teslemetry.teslemetry import Teslemetry
6
+ from .tessie.tessie import Tessie
15
7
 
16
8
  __all__ = [
17
9
  "TeslaFleetApi",
10
+ "TeslaBluetooth",
18
11
  "TeslaFleetOAuth",
19
12
  "TeslaFleetOpenSource",
20
13
  "Teslemetry",
21
14
  "Tessie",
22
- "Charging",
23
- "Energy",
24
- "EnergySpecific",
25
- "Partner",
26
- "User",
27
- "Vehicle",
28
- "VehicleSpecific",
29
- "VehicleSigned",
30
15
  ]
tesla_fleet_api/const.py CHANGED
@@ -3,7 +3,7 @@
3
3
  from enum import Enum
4
4
  import logging
5
5
 
6
- VERSION = "0.9.9"
6
+ VERSION = "1.0.0"
7
7
  LOGGER = logging.getLogger(__package__)
8
8
  SERVERS = {
9
9
  "na": "https://fleet-api.prd.na.vn.cloud.tesla.com",
@@ -151,230 +151,6 @@ class EnergyExportMode(StrEnum):
151
151
  NEVER = "never"
152
152
 
153
153
 
154
- class TelemetryField(StrEnum):
155
- """Fields available in telemetry streams"""
156
-
157
- AC_CHARGING_ENERGY_IN = "ACChargingEnergyIn"
158
- AC_CHARGING_POWER = "ACChargingPower"
159
- AUTO_SEAT_CLIMATE_LEFT = "AutoSeatClimateLeft"
160
- AUTO_SEAT_CLIMATE_RIGHT = "AutoSeatClimateRight"
161
- AUTOMATIC_BLIND_SPOT_CAMERA = "AutomaticBlindSpotCamera"
162
- AUTOMATIC_EMERGENCY_BRAKING_OFF = "AutomaticEmergencyBrakingOff"
163
- BATTERY_HEATER_ON = "BatteryHeaterOn"
164
- BATTERY_LEVEL = "BatteryLevel"
165
- BLIND_SPOT_COLLISION_WARNING_CHIME = "BlindSpotCollisionWarningChime"
166
- BMS_FULL_CHARGE_COMPLETE = "BmsFullchargecomplete"
167
- BMS_STATE = "BMSState"
168
- BRAKE_PEDAL = "BrakePedal"
169
- BRAKE_PEDAL_POS = "BrakePedalPos"
170
- BRICK_VOLTAGE_MAX = "BrickVoltageMax"
171
- BRICK_VOLTAGE_MIN = "BrickVoltageMin"
172
- CABIN_OVERHEAT_PROTECTION_MODE = "CabinOverheatProtectionMode"
173
- CABIN_OVERHEAT_PROTECTION_TEMPERATURE_LIMIT = "CabinOverheatProtectionTemperatureLimit"
174
- CAR_TYPE = "CarType"
175
- CENTER_DISPLAY = "CenterDisplay"
176
- CHARGE_AMPS = "ChargeAmps"
177
- CHARGE_CURRENT_REQUEST = "ChargeCurrentRequest"
178
- CHARGE_CURRENT_REQUEST_MAX = "ChargeCurrentRequestMax"
179
- CHARGE_ENABLE_REQUEST = "ChargeEnableRequest"
180
- CHARGE_LIMIT_SOC = "ChargeLimitSoc"
181
- CHARGE_PORT = "ChargePort"
182
- CHARGE_PORT_COLD_WEATHER_MODE = "ChargePortColdWeatherMode"
183
- CHARGE_PORT_DOOR_OPEN = "ChargePortDoorOpen"
184
- CHARGE_PORT_LATCH = "ChargePortLatch"
185
- CHARGE_STATE = "ChargeState"
186
- CHARGER_PHASES = "ChargerPhases"
187
- CHARGING_CABLE_TYPE = "ChargingCableType"
188
- CLIMATE_KEEPER_MODE = "ClimateKeeperMode"
189
- CRUISE_FOLLOW_DISTANCE = "CruiseFollowDistance"
190
- CRUISE_SET_SPEED = "CruiseSetSpeed"
191
- CRUISE_STATE = "CruiseState"
192
- CURRENT_LIMIT_MPH = "CurrentLimitMph"
193
- DC_CHARGING_ENERGY_IN = "DCChargingEnergyIn"
194
- DC_CHARGING_POWER = "DCChargingPower"
195
- DC_DC_ENABLE = "DCDCEnable"
196
- DEFROST_FOR_PRECONDITIONING = "DefrostForPreconditioning"
197
- DEFROST_MODE = "DefrostMode"
198
- DESTINATION_NAME = "DestinationName"
199
- DESTINATION_LOCATION = "DestinationLocation"
200
- DETAILED_CHARGE_STATE = "DetailedChargeState"
201
- DI_AXLE_SPEED_F = "DiAxleSpeedF"
202
- DI_AXLE_SPEED_R = "DiAxleSpeedR"
203
- DI_AXLE_SPEED_REL = "DiAxleSpeedREL"
204
- DI_AXLE_SPEED_RER = "DiAxleSpeedRER"
205
- DI_HEATSINK_TF = "DiHeatsinkTF"
206
- DI_HEATSINK_TR = "DiHeatsinkTR"
207
- DI_HEATSINK_TREL = "DiHeatsinkTREL"
208
- DI_HEATSINK_TRER = "DiHeatsinkTRER"
209
- DI_MOTOR_CURRENT_F = "DiMotorCurrentF"
210
- DI_MOTOR_CURRENT_R = "DiMotorCurrentR"
211
- DI_MOTOR_CURRENT_REL = "DiMotorCurrentREL"
212
- DI_MOTOR_CURRENT_RER = "DiMotorCurrentRER"
213
- DI_SLAVE_TORQUE_CMD = "DiSlaveTorqueCmd"
214
- DI_STATE_F = "DiStateF"
215
- DI_STATE_R = "DiStateR"
216
- DI_STATE_REL = "DiStateREL"
217
- DI_STATE_RER = "DiStateRER"
218
- DI_STATOR_TEMP_F = "DiStatorTempF"
219
- DI_STATOR_TEMP_R = "DiStatorTempR"
220
- DI_STATOR_TEMP_REL = "DiStatorTempREL"
221
- DI_STATOR_TEMP_RER = "DiStatorTempRER"
222
- DI_TORQUE_ACTUAL_F = "DiTorqueActualF"
223
- DI_TORQUE_ACTUAL_R = "DiTorqueActualR"
224
- DI_TORQUE_ACTUAL_REL = "DiTorqueActualREL"
225
- DI_TORQUE_ACTUAL_RER = "DiTorqueActualRER"
226
- DI_TORQUEMOTOR = "DiTorquemotor"
227
- DI_V_BAT_F = "DiVBatF"
228
- DI_V_BAT_R = "DiVBatR"
229
- DI_V_BAT_REL = "DiVBatREL"
230
- DI_V_BAT_RER = "DiVBatRER"
231
- DOOR_STATE = "DoorState"
232
- DRIVE_RAIL = "DriveRail"
233
- DRIVER_SEAT_BELT = "DriverSeatBelt"
234
- DRIVER_SEAT_OCCUPIED = "DriverSeatOccupied"
235
- EFFICIENCY_PACKAGE = "EfficiencyPackage"
236
- EMERGENCY_LANE_DEPARTURE_AVOIDANCE = "EmergencyLaneDepartureAvoidance"
237
- ENERGY_REMAINING = "EnergyRemaining"
238
- EST_BATTERY_RANGE = "EstBatteryRange"
239
- ESTIMATED_HOURS_TO_CHARGE_TERMINATION = "EstimatedHoursToChargeTermination"
240
- EUROPE_VEHICLE = "EuropeVehicle"
241
- EXPECTED_ENERGY_PERCENT_AT_TRIP_ARRIVAL = "ExpectedEnergyPercentAtTripArrival"
242
- EXPERIMENTAL_1 = "Experimental_1"
243
- EXPERIMENTAL_2 = "Experimental_2"
244
- EXPERIMENTAL_3 = "Experimental_3"
245
- EXPERIMENTAL_4 = "Experimental_4"
246
- EXTERIOR_COLOR = "ExteriorColor"
247
- FAST_CHARGER_PRESENT = "FastChargerPresent"
248
- FAST_CHARGER_TYPE = "FastChargerType"
249
- FD_WINDOW = "FdWindow"
250
- FORWARD_COLLISION_WARNING = "ForwardCollisionWarning"
251
- FP_WINDOW = "FpWindow"
252
- GEAR = "Gear"
253
- GPS_HEADING = "GpsHeading"
254
- GPS_STATE = "GpsState"
255
- GUEST_MODE_ENABLED = "GuestModeEnabled"
256
- GUEST_MODE_MOBILE_ACCESS_STATE = "GuestModeMobileAccessState"
257
- HOMELINK_DEVICE_COUNT = "HomelinkDeviceCount"
258
- HOMELINK_NEARBY = "HomelinkNearby"
259
- HVAC_AC_ENABLED = "HvacACEnabled"
260
- HVAC_AUTO_MODE = "HvacAutoMode"
261
- HVAC_FAN_SPEED = "HvacFanSpeed"
262
- HVAC_FAN_STATUS = "HvacFanStatus"
263
- HVAC_LEFT_TEMPERATURE_REQUEST = "HvacLeftTemperatureRequest"
264
- HVAC_POWER = "HvacPower"
265
- HVAC_RIGHT_TEMPERATURE_REQUEST = "HvacRightTemperatureRequest"
266
- HVAC_STEERING_WHEEL_HEAT_AUTO = "HvacSteeringWheelHeatAuto"
267
- HVAC_STEERING_WHEEL_HEAT_LEVEL = "HvacSteeringWheelHeatLevel"
268
- HVIL = "Hvil"
269
- IDEAL_BATTERY_RANGE = "IdealBatteryRange"
270
- INSIDE_TEMP = "InsideTemp"
271
- ISOLATION_RESISTANCE = "IsolationResistance"
272
- LANE_DEPARTURE_AVOIDANCE = "LaneDepartureAvoidance"
273
- LATERAL_ACCELERATION = "LateralAcceleration"
274
- LIFETIME_ENERGY_GAINED_REGEN = "LifetimeEnergyGainedRegen"
275
- LIFETIME_ENERGY_USED = "LifetimeEnergyUsed"
276
- LIFETIME_ENERGY_USED_DRIVE = "LifetimeEnergyUsedDrive"
277
- LOCATION = "Location"
278
- LOCKED = "Locked"
279
- LONGITUDINAL_ACCELERATION = "LongitudinalAcceleration"
280
- MILES_TO_ARRIVAL = "MilesToArrival"
281
- MINUTES_TO_ARRIVAL = "MinutesToArrival"
282
- MODULE_TEMP_MAX = "ModuleTempMax"
283
- MODULE_TEMP_MIN = "ModuleTempMin"
284
- NOT_ENOUGH_POWER_TO_HEAT = "NotEnoughPowerToHeat"
285
- NUM_BRICK_VOLTAGE_MAX = "NumBrickVoltageMax"
286
- NUM_BRICK_VOLTAGE_MIN = "NumBrickVoltageMin"
287
- NUM_MODULE_TEMP_MAX = "NumModuleTempMax"
288
- NUM_MODULE_TEMP_MIN = "NumModuleTempMin"
289
- ODOMETER = "Odometer"
290
- OFFROAD_LIGHTBAR_PRESENT = "OffroadLightbarPresent"
291
- ORIGIN_LOCATION = "OriginLocation"
292
- OUTSIDE_TEMP = "OutsideTemp"
293
- PACK_CURRENT = "PackCurrent"
294
- PACK_VOLTAGE = "PackVoltage"
295
- PAIRED_PHONE_KEY_AND_KEY_FOB_QTY = "PairedPhoneKeyAndKeyFobQty"
296
- PASSENGER_SEAT_BELT = "PassengerSeatBelt"
297
- PEDAL_POSITION = "PedalPosition"
298
- PIN_TO_DRIVE_ENABLED = "PinToDriveEnabled"
299
- POWERSHARE_HOURS_LEFT = "PowershareHoursLeft"
300
- POWERSHARE_INSTANTANEOUS_POWER_KW = "PowershareInstantaneousPowerKW"
301
- POWERSHARE_STATUS = "PowershareStatus"
302
- POWERSHARE_STOP_REASON = "PowershareStopReason"
303
- POWERSHARE_TYPE = "PowershareType"
304
- PRECONDITIONING_ENABLED = "PreconditioningEnabled"
305
- RATED_RANGE = "RatedRange"
306
- RD_WINDOW = "RdWindow"
307
- REAR_DISPLAY_HVAC_ENABLED = "RearDisplayHvacEnabled"
308
- REAR_SEAT_HEATERS = "RearSeatHeaters"
309
- REMOTE_START_ENABLED = "RemoteStartEnabled"
310
- RIGHT_HAND_DRIVE = "RightHandDrive"
311
- ROOF_COLOR = "RoofColor"
312
- ROUTE_LAST_UPDATED = "RouteLastUpdated"
313
- ROUTE_LINE = "RouteLine"
314
- ROUTE_TRAFFIC_MINUTES_DELAY = "RouteTrafficMinutesDelay"
315
- RP_WINDOW = "RpWindow"
316
- SCHEDULED_CHARGING_MODE = "ScheduledChargingMode"
317
- SCHEDULED_CHARGING_PENDING = "ScheduledChargingPending"
318
- SCHEDULED_CHARGING_START_TIME = "ScheduledChargingStartTime"
319
- SCHEDULED_DEPARTURE_TIME = "ScheduledDepartureTime"
320
- SEAT_HEATER_LEFT = "SeatHeaterLeft"
321
- SEAT_HEATER_REAR_CENTER = "SeatHeaterRearCenter"
322
- SEAT_HEATER_REAR_LEFT = "SeatHeaterRearLeft"
323
- SEAT_HEATER_REAR_RIGHT = "SeatHeaterRearRight"
324
- SEAT_HEATER_RIGHT = "SeatHeaterRight"
325
- SENTRY_MODE = "SentryMode"
326
- SERVICE_MODE = "ServiceMode"
327
- SOC = "Soc"
328
- SOFTWARE_UPDATE_DOWNLOAD_PERCENT_COMPLETE = "SoftwareUpdateDownloadPercentComplete"
329
- SOFTWARE_UPDATE_EXPECTED_DURATION_MINUTES = "SoftwareUpdateExpectedDurationMinutes"
330
- SOFTWARE_UPDATE_INSTALLATION_PERCENT_COMPLETE = "SoftwareUpdateInstallationPercentComplete"
331
- SOFTWARE_UPDATE_SCHEDULED_START_TIME = "SoftwareUpdateScheduledStartTime"
332
- SOFTWARE_UPDATE_VERSION = "SoftwareUpdateVersion"
333
- SPEED_LIMIT_MODE = "SpeedLimitMode"
334
- SPEED_LIMIT_WARNING = "SpeedLimitWarning"
335
- SUPERCHARGER_SESSION_TRIP_PLANNER = "SuperchargerSessionTripPlanner"
336
- TIME_TO_FULL_CHARGE = "TimeToFullCharge"
337
- TONNEAU_OPEN_PERCENT = "TonneauOpenPercent"
338
- TONNEAU_POSITION = "TonneauPosition"
339
- TONNEAU_TENT_MODE = "TonneauTentMode"
340
- TPMS_HARD_WARNINGS = "TpmsHardWarnings"
341
- TPMS_LAST_SEEN_PRESSURE_TIME_FL = "TpmsLastSeenPressureTimeFl"
342
- TPMS_LAST_SEEN_PRESSURE_TIME_FR = "TpmsLastSeenPressureTimeFr"
343
- TPMS_LAST_SEEN_PRESSURE_TIME_RL = "TpmsLastSeenPressureTimeRl"
344
- TPMS_LAST_SEEN_PRESSURE_TIME_RR = "TpmsLastSeenPressureTimeRr"
345
- TPMS_PRESSURE_FL = "TpmsPressureFl"
346
- TPMS_PRESSURE_FR = "TpmsPressureFr"
347
- TPMS_PRESSURE_RL = "TpmsPressureRl"
348
- TPMS_PRESSURE_RR = "TpmsPressureRr"
349
- TPMS_SOFT_WARNINGS = "TpmsSoftWarnings"
350
- TRIM = "Trim"
351
- VALET_MODE_ENABLED = "ValetModeEnabled"
352
- VEHICLE_NAME = "VehicleName"
353
- VEHICLE_SPEED = "VehicleSpeed"
354
- VERSION = "Version"
355
- WHEEL_TYPE = "WheelType"
356
- WIPER_HEAT_ENABLED = "WiperHeatEnabled"
357
- LOCATED_AT_HOME = "LocatedAtHome"
358
- LOCATED_AT_WORK = "LocatedAtWork"
359
- LOCATED_AT_FAVORITE = "LocatedAtFavorite"
360
- SETTING_DISTANCE_UNIT = "SettingDistanceUnit"
361
- SETTING_TEMPERATURE_UNIT = "SettingTemperatureUnit"
362
- SETTING_24_HOUR_TIME = "Setting24HourTime"
363
- SETTING_TIRE_PRESSURE_UNIT = "SettingTirePressureUnit"
364
- SETTING_CHARGE_UNIT = "SettingChargeUnit"
365
- CLIMATE_SEAT_COOLING_FRONT_LEFT = "ClimateSeatCoolingFrontLeft"
366
- CLIMATE_SEAT_COOLING_FRONT_RIGHT = "ClimateSeatCoolingFrontRight"
367
-
368
-
369
-
370
- class TelemetryAlert(StrEnum):
371
- """Alerts available in telemetry streams"""
372
-
373
- CUSTOMER = "Customer"
374
- SERVICE = "Service"
375
- SERVICE_FIX = "ServiceFix"
376
-
377
-
378
154
  class TeslaEnergyPeriod(StrEnum):
379
155
  """Period for history for energy sites"""
380
156
 
@@ -853,6 +853,123 @@ SIGNED_MESSAGE_INFORMATION_FAULTS = [
853
853
  SignedMessageInformationFaultCouldNotHashMetadata,
854
854
  ]
855
855
 
856
+ class WhitelistOperationStatus(TeslaFleetError):
857
+ message = "Whitelist operation failed"
858
+
859
+ class WhitelistOperationUndocumentedError(WhitelistOperationStatus):
860
+ message = "Undocumented whitelist operation error"
861
+ code = 1
862
+
863
+ class WhitelistOperationNoPermissionToRemoveOneself(WhitelistOperationStatus):
864
+ message = "No permission to remove oneself from whitelist"
865
+ code = 2
866
+
867
+ class WhitelistOperationKeyfobSlotsFull(WhitelistOperationStatus):
868
+ message = "Keyfob slots are full"
869
+ code = 3
870
+
871
+ class WhitelistOperationWhitelistFull(WhitelistOperationStatus):
872
+ message = "Whitelist is full"
873
+ code = 4
874
+
875
+ class WhitelistOperationNoPermissionToAdd(WhitelistOperationStatus):
876
+ message = "No permission to add to whitelist"
877
+ code = 5
878
+
879
+ class WhitelistOperationInvalidPublicKey(WhitelistOperationStatus):
880
+ message = "Invalid public key"
881
+ code = 6
882
+
883
+ class WhitelistOperationNoPermissionToRemove(WhitelistOperationStatus):
884
+ message = "No permission to remove from whitelist"
885
+ code = 7
886
+
887
+ class WhitelistOperationNoPermissionToChangePermissions(WhitelistOperationStatus):
888
+ message = "No permission to change permissions"
889
+ code = 8
890
+
891
+ class WhitelistOperationAttemptingToElevateOthersAboveOneself(WhitelistOperationStatus):
892
+ message = "Attempting to elevate others above oneself"
893
+ code = 9
894
+
895
+ class WhitelistOperationAttemptingToDemoteSuperiorToOneself(WhitelistOperationStatus):
896
+ message = "Attempting to demote superior to oneself"
897
+ code = 10
898
+
899
+ class WhitelistOperationAttemptingToRemoveOwnPermissions(WhitelistOperationStatus):
900
+ message = "Attempting to remove own permissions"
901
+ code = 11
902
+
903
+ class WhitelistOperationPublicKeyNotOnWhitelist(WhitelistOperationStatus):
904
+ message = "Public key not on whitelist"
905
+ code = 12
906
+
907
+ class WhitelistOperationAttemptingToAddExistingKey(WhitelistOperationStatus):
908
+ message = "Attempting to add key that is already on the whitelist"
909
+ code = 13
910
+
911
+ class WhitelistOperationNotAllowedToAddUnlessOnReader(WhitelistOperationStatus):
912
+ message = "Not allowed to add unless on reader"
913
+ code = 14
914
+
915
+ class WhitelistOperationFMModifyingOutsideOfFMode(WhitelistOperationStatus):
916
+ message = "FM modifying outside of F mode"
917
+ code = 15
918
+
919
+ class WhitelistOperationFMAttemptingToAddPermanentKey(WhitelistOperationStatus):
920
+ message = "FM attempting to add permanent key"
921
+ code = 16
922
+
923
+ class WhitelistOperationFMAttemptingToRemovePermanentKey(WhitelistOperationStatus):
924
+ message = "FM attempting to remove permanent key"
925
+ code = 17
926
+
927
+ class WhitelistOperationKeychainWhileFSFull(WhitelistOperationStatus):
928
+ message = "Keychain while FS full"
929
+ code = 18
930
+
931
+ class WhitelistOperationAttemptingToAddKeyWithoutRole(WhitelistOperationStatus):
932
+ message = "Attempting to add key without role"
933
+ code = 19
934
+
935
+ class WhitelistOperationAttemptingToAddKeyWithServiceRole(WhitelistOperationStatus):
936
+ message = "Attempting to add key with service role"
937
+ code = 20
938
+
939
+ class WhitelistOperationNonServiceKeyAttemptingToAddServiceTech(WhitelistOperationStatus):
940
+ message = "Non-service key attempting to add service tech"
941
+ code = 21
942
+
943
+ class WhitelistOperationServiceKeyAttemptingToAddServiceTechOutsideServiceMode(WhitelistOperationStatus):
944
+ message = "Service key attempting to add service tech outside service mode"
945
+ code = 22
946
+
947
+ WHITELIST_OPERATION_STATUS = [
948
+ None,
949
+ WhitelistOperationUndocumentedError,
950
+ WhitelistOperationNoPermissionToRemoveOneself,
951
+ WhitelistOperationKeyfobSlotsFull,
952
+ WhitelistOperationWhitelistFull,
953
+ WhitelistOperationNoPermissionToAdd,
954
+ WhitelistOperationInvalidPublicKey,
955
+ WhitelistOperationNoPermissionToRemove,
956
+ WhitelistOperationNoPermissionToChangePermissions,
957
+ WhitelistOperationAttemptingToElevateOthersAboveOneself,
958
+ WhitelistOperationAttemptingToDemoteSuperiorToOneself,
959
+ WhitelistOperationAttemptingToRemoveOwnPermissions,
960
+ WhitelistOperationPublicKeyNotOnWhitelist,
961
+ WhitelistOperationAttemptingToAddExistingKey,
962
+ WhitelistOperationNotAllowedToAddUnlessOnReader,
963
+ WhitelistOperationFMModifyingOutsideOfFMode,
964
+ WhitelistOperationFMAttemptingToAddPermanentKey,
965
+ WhitelistOperationFMAttemptingToRemovePermanentKey,
966
+ WhitelistOperationKeychainWhileFSFull,
967
+ WhitelistOperationAttemptingToAddKeyWithoutRole,
968
+ WhitelistOperationAttemptingToAddKeyWithServiceRole,
969
+ WhitelistOperationNonServiceKeyAttemptingToAddServiceTech,
970
+ WhitelistOperationServiceKeyAttemptingToAddServiceTechOutsideServiceMode
971
+ ]
972
+
856
973
 
857
974
  async def raise_for_status(resp: aiohttp.ClientResponse) -> None:
858
975
  """Raise an exception if the response status code is >=400."""
@@ -0,0 +1,11 @@
1
+ """Tesla Fleet API classes."""
2
+
3
+ from .fleet import TeslaFleetApi
4
+ from .bluetooth import TeslaBluetooth
5
+ from .oauth import TeslaFleetOAuth
6
+
7
+ __all__ = [
8
+ "TeslaFleetApi",
9
+ "TeslaBluetooth",
10
+ "TeslaFleetOAuth",
11
+ ]
@@ -0,0 +1,33 @@
1
+ """Bluetooth only interface."""
2
+
3
+ import re
4
+ from .tesla import Tesla
5
+ from .vehicle.bluetooth import VehicleBluetooth
6
+
7
+ class TeslaBluetooth(Tesla):
8
+ """Class describing a Tesla Bluetooth connection."""
9
+
10
+ def __init__(
11
+ self,
12
+ ):
13
+ """Initialize the Tesla Fleet API."""
14
+
15
+ self.vehicles = Vehicles(self)
16
+
17
+ def valid_name(self, name: str) -> bool:
18
+ """Check if a BLE device name is a valid Tesla vehicle."""
19
+ return bool(re.match("^S[a-f0-9]{16}[A-F]$", name))
20
+
21
+ class Vehicles(dict[str, VehicleBluetooth]):
22
+ """Class containing and creating vehicles."""
23
+
24
+ _parent: TeslaBluetooth
25
+
26
+ def __init__(self, parent: TeslaBluetooth):
27
+ self._parent = parent
28
+
29
+ def createBluetooth(self, vin: str) -> VehicleBluetooth:
30
+ """Creates a specific vehicle."""
31
+ vehicle = VehicleBluetooth(self._parent, vin)
32
+ self[vin] = vehicle
33
+ return vehicle
@@ -1,5 +1,5 @@
1
1
  from typing import Any
2
- from .const import Method
2
+ from ..const import Method
3
3
 
4
4
 
5
5
  class Charging:
@@ -1,37 +1,35 @@
1
1
  from __future__ import annotations
2
2
  from typing import Any, TYPE_CHECKING
3
- from .const import Method, EnergyOperationMode, EnergyExportMode, TeslaEnergyPeriod
4
- from .energyspecific import EnergySpecific
3
+ from ..const import Method, EnergyOperationMode, EnergyExportMode, TeslaEnergyPeriod
5
4
 
6
5
  if TYPE_CHECKING:
7
- from .teslafleetapi import TeslaFleetApi
6
+ from . import TeslaFleetApi
8
7
 
9
-
10
- class Energy:
8
+ class EnergySite:
11
9
  """Class describing the Tesla Fleet API partner endpoints"""
12
10
 
13
- parent: TeslaFleetApi
11
+ energy_site_id: int
14
12
 
15
- def __init__(self, parent):
13
+ def __init__(
14
+ self,
15
+ parent: TeslaFleetApi,
16
+ energy_site_id: int
17
+ ):
16
18
  self._request = parent._request
17
-
18
- def specific(self, energy_site_id: int) -> EnergySpecific:
19
- """Create a specific energy site."""
20
- return EnergySpecific(self, energy_site_id)
19
+ self.energy_site_id = energy_site_id
21
20
 
22
21
  async def backup(
23
- self, energy_site_id: int, backup_reserve_percent: int
22
+ self, backup_reserve_percent: int
24
23
  ) -> dict[str, Any]:
25
24
  """Adjust the site's backup reserve."""
26
25
  return await self._request(
27
26
  Method.POST,
28
- f"api/1/energy_sites/{energy_site_id}/backup",
27
+ f"api/1/energy_sites/{self.energy_site_id}/backup",
29
28
  json={"backup_reserve_percent": backup_reserve_percent},
30
29
  )
31
30
 
32
31
  async def backup_history(
33
32
  self,
34
- energy_site_id: int,
35
33
  period: TeslaEnergyPeriod | str | None,
36
34
  start_date: str | None = None,
37
35
  end_date: str | None = None,
@@ -40,7 +38,7 @@ class Energy:
40
38
  """Returns the backup (off-grid) event history of the site in duration of seconds."""
41
39
  return await self._request(
42
40
  Method.GET,
43
- f"api/1/energy_sites/{energy_site_id}/calendar_history",
41
+ f"api/1/energy_sites/{self.energy_site_id}/calendar_history",
44
42
  params={
45
43
  "kind": "backup",
46
44
  "start_date": start_date,
@@ -52,7 +50,6 @@ class Energy:
52
50
 
53
51
  async def charge_history(
54
52
  self,
55
- energy_site_id: int,
56
53
  start_date: str,
57
54
  end_date: str,
58
55
  time_zone: str | None = None,
@@ -60,7 +57,7 @@ class Energy:
60
57
  """Returns the charging history of a wall connector."""
61
58
  return await self._request(
62
59
  Method.GET,
63
- f"api/1/energy_sites/{energy_site_id}/telemetry_history",
60
+ f"api/1/energy_sites/{self.energy_site_id}/telemetry_history",
64
61
  params={
65
62
  "kind": "charge",
66
63
  "start_date": start_date,
@@ -71,7 +68,6 @@ class Energy:
71
68
 
72
69
  async def energy_history(
73
70
  self,
74
- energy_site_id: int,
75
71
  period: TeslaEnergyPeriod | str | None,
76
72
  start_date: str | None = None,
77
73
  end_date: str | None = None,
@@ -80,7 +76,7 @@ class Energy:
80
76
  """Returns the energy measurements of the site, aggregated to the requested period."""
81
77
  return await self._request(
82
78
  Method.GET,
83
- f"api/1/energy_sites/{energy_site_id}/calendar_history",
79
+ f"api/1/energy_sites/{self.energy_site_id}/calendar_history",
84
80
  params={
85
81
  "kind": "energy",
86
82
  "start_date": start_date,
@@ -92,70 +88,82 @@ class Energy:
92
88
 
93
89
  async def grid_import_export(
94
90
  self,
95
- energy_site_id: int,
96
91
  disallow_charge_from_grid_with_solar_installed: bool | None = None,
97
92
  customer_preferred_export_rule: EnergyExportMode | str | None = None,
98
93
  ) -> dict[str, Any]:
99
94
  """Allow/disallow charging from the grid and exporting energy to the grid."""
100
95
  return await self._request(
101
96
  Method.POST,
102
- f"api/1/energy_sites/{energy_site_id}/grid_import_export",
97
+ f"api/1/energy_sites/{self.energy_site_id}/grid_import_export",
103
98
  json={
104
99
  "disallow_charge_from_grid_with_solar_installed": disallow_charge_from_grid_with_solar_installed,
105
100
  "customer_preferred_export_rule": customer_preferred_export_rule,
106
101
  },
107
102
  )
108
103
 
109
- async def live_status(self, energy_site_id: int) -> dict[str, Any]:
104
+ async def live_status(self) -> dict[str, Any]:
110
105
  """Returns the live status of the site (power, state of energy, grid status, storm mode)."""
111
106
  return await self._request(
112
107
  Method.GET,
113
- f"api/1/energy_sites/{energy_site_id}/live_status",
108
+ f"api/1/energy_sites/{self.energy_site_id}/live_status",
114
109
  )
115
110
 
116
111
  async def off_grid_vehicle_charging_reserve(
117
- self, energy_site_id: int, off_grid_vehicle_charging_reserve_percent: int
112
+ self, off_grid_vehicle_charging_reserve_percent: int
118
113
  ) -> dict[str, Any]:
119
114
  """Adjust the site's off-grid vehicle charging backup reserve."""
120
115
  return await self._request(
121
116
  Method.POST,
122
- f"api/1/energy_sites/{energy_site_id}/off_grid_vehicle_charging_reserve",
117
+ f"api/1/energy_sites/{self.energy_site_id}/off_grid_vehicle_charging_reserve",
123
118
  json={
124
119
  "off_grid_vehicle_charging_reserve_percent": off_grid_vehicle_charging_reserve_percent
125
120
  },
126
121
  )
127
122
 
128
123
  async def operation(
129
- self, energy_site_id: int, default_real_mode: EnergyOperationMode | str
124
+ self, default_real_mode: EnergyOperationMode | str
130
125
  ) -> dict[str, Any]:
131
126
  """Set the site's mode."""
132
127
  return await self._request(
133
128
  Method.POST,
134
- f"api/1/energy_sites/{energy_site_id}/operation",
129
+ f"api/1/energy_sites/{self.energy_site_id}/operation",
135
130
  json={"default_real_mode": default_real_mode},
136
131
  )
137
132
 
138
- async def site_info(self, energy_site_id: int) -> dict[str, Any]:
133
+ async def site_info(self) -> dict[str, Any]:
139
134
  """Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc)."""
140
135
  return await self._request(
141
136
  Method.GET,
142
- f"api/1/energy_sites/{energy_site_id}/site_info",
137
+ f"api/1/energy_sites/{self.energy_site_id}/site_info",
143
138
  )
144
139
 
145
- async def storm_mode(self, energy_site_id: int, enabled: bool) -> dict[str, Any]:
140
+ async def storm_mode(self, enabled: bool) -> dict[str, Any]:
146
141
  """Update storm watch participation."""
147
142
  return await self._request(
148
143
  Method.POST,
149
- f"api/1/energy_sites/{energy_site_id}/storm_mode",
144
+ f"api/1/energy_sites/{self.energy_site_id}/storm_mode",
150
145
  json={"enabled": enabled},
151
146
  )
152
147
 
153
148
  async def time_of_use_settings(
154
- self, energy_site_id: int, settings: dict[str, Any]
149
+ self, settings: dict[str, Any]
155
150
  ) -> dict[str, Any]:
156
151
  """Update the time of use settings for the energy site."""
157
152
  return await self._request(
158
153
  Method.POST,
159
- f"api/1/energy_sites/{energy_site_id}/time_of_use_settings",
154
+ f"api/1/energy_sites/{self.energy_site_id}/time_of_use_settings",
160
155
  json={"tou_settings": {"tariff_content_v2": settings}},
161
156
  )
157
+
158
+ class EnergySites(dict[int, EnergySite]):
159
+ """Class describing the Tesla Fleet API partner endpoints"""
160
+
161
+ _parent: TeslaFleetApi
162
+
163
+ def __init__(self, parent: TeslaFleetApi):
164
+ self._parent = parent
165
+
166
+ def create(self, energy_site_id: int) -> EnergySite:
167
+ """Create a specific energy site."""
168
+ self[energy_site_id] = EnergySite(self._parent, energy_site_id)
169
+ return self[energy_site_id]