tesla-fleet-api 0.3.0 → 0.5.0

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 (342) hide show
  1. package/README.md +284 -1
  2. package/dist/_virtual/_rolldown/runtime.cjs +32 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +12 -0
  4. package/dist/bluetooth/adapters/shared.cjs +38 -0
  5. package/dist/bluetooth/adapters/shared.mjs +36 -0
  6. package/dist/bluetooth/async.cjs +121 -0
  7. package/dist/bluetooth/async.d.cts +10 -0
  8. package/dist/bluetooth/async.d.mts +10 -0
  9. package/dist/bluetooth/async.mjs +116 -0
  10. package/dist/bluetooth/broadcast.cjs +153 -0
  11. package/dist/bluetooth/broadcast.d.cts +59 -0
  12. package/dist/bluetooth/broadcast.d.mts +59 -0
  13. package/dist/bluetooth/broadcast.mjs +151 -0
  14. package/dist/bluetooth/constants.cjs +99 -0
  15. package/dist/bluetooth/constants.d.cts +70 -0
  16. package/dist/bluetooth/constants.d.mts +70 -0
  17. package/dist/bluetooth/constants.mjs +72 -0
  18. package/dist/bluetooth/esphome.cjs +292 -0
  19. package/dist/bluetooth/esphome.d.cts +83 -0
  20. package/dist/bluetooth/esphome.d.mts +83 -0
  21. package/dist/bluetooth/esphome.mjs +291 -0
  22. package/dist/bluetooth/framing.cjs +125 -0
  23. package/dist/bluetooth/framing.d.cts +45 -0
  24. package/dist/bluetooth/framing.d.mts +45 -0
  25. package/dist/bluetooth/framing.mjs +122 -0
  26. package/dist/bluetooth/homey.cjs +155 -0
  27. package/dist/bluetooth/homey.d.cts +75 -0
  28. package/dist/bluetooth/homey.d.mts +75 -0
  29. package/dist/bluetooth/homey.mjs +150 -0
  30. package/dist/bluetooth/names.cjs +24 -0
  31. package/dist/bluetooth/names.d.cts +10 -0
  32. package/dist/bluetooth/names.d.mts +10 -0
  33. package/dist/bluetooth/names.mjs +20 -0
  34. package/dist/bluetooth/noble.cjs +178 -0
  35. package/dist/bluetooth/noble.d.cts +58 -0
  36. package/dist/bluetooth/noble.d.mts +58 -0
  37. package/dist/bluetooth/noble.mjs +177 -0
  38. package/dist/bluetooth/streamglue.cjs +157 -0
  39. package/dist/bluetooth/streamglue.d.cts +37 -0
  40. package/dist/bluetooth/streamglue.d.mts +37 -0
  41. package/dist/bluetooth/streamglue.mjs +154 -0
  42. package/dist/bluetooth/teslabluetooth.cjs +67 -0
  43. package/dist/bluetooth/teslabluetooth.d.cts +41 -0
  44. package/dist/bluetooth/teslabluetooth.d.mts +41 -0
  45. package/dist/bluetooth/teslabluetooth.mjs +66 -0
  46. package/dist/bluetooth/transport.cjs +10 -0
  47. package/dist/bluetooth/transport.d.cts +95 -0
  48. package/dist/bluetooth/transport.d.mts +95 -0
  49. package/dist/bluetooth/transport.mjs +10 -0
  50. package/dist/bluetooth/vehiclebluetooth.cjs +1272 -0
  51. package/dist/bluetooth/vehiclebluetooth.d.cts +495 -0
  52. package/dist/bluetooth/vehiclebluetooth.d.mts +495 -0
  53. package/dist/bluetooth/vehiclebluetooth.mjs +1270 -0
  54. package/dist/bluetooth/verify.cjs +93 -0
  55. package/dist/bluetooth/verify.d.cts +35 -0
  56. package/dist/bluetooth/verify.d.mts +35 -0
  57. package/dist/bluetooth/verify.mjs +91 -0
  58. package/dist/bluetooth.cjs +53 -0
  59. package/dist/bluetooth.d.cts +10 -0
  60. package/dist/bluetooth.d.mts +10 -0
  61. package/dist/bluetooth.mjs +9 -0
  62. package/dist/charging.cjs +53 -0
  63. package/dist/charging.d.cts +31 -0
  64. package/dist/charging.d.mts +30 -0
  65. package/dist/charging.mjs +53 -0
  66. package/dist/commands.cjs +1797 -0
  67. package/dist/commands.d.cts +881 -0
  68. package/dist/commands.d.mts +881 -0
  69. package/dist/commands.mjs +1791 -0
  70. package/dist/const.cjs +322 -0
  71. package/dist/const.d.cts +308 -0
  72. package/dist/const.d.mts +308 -0
  73. package/dist/const.mjs +282 -0
  74. package/dist/energy.cjs +142 -0
  75. package/dist/energy.d.cts +101 -0
  76. package/dist/energy.d.mts +100 -0
  77. package/dist/energy.mjs +142 -0
  78. package/dist/energyisland.cjs +38 -0
  79. package/dist/energyisland.mjs +37 -0
  80. package/dist/energyparsers.cjs +118 -0
  81. package/dist/energyparsers.d.cts +39 -0
  82. package/dist/energyparsers.d.mts +39 -0
  83. package/dist/energyparsers.mjs +116 -0
  84. package/dist/energyspecific.cjs +457 -0
  85. package/dist/energyspecific.d.cts +258 -0
  86. package/dist/energyspecific.d.mts +258 -0
  87. package/dist/energyspecific.mjs +451 -0
  88. package/dist/exceptions.cjs +1488 -0
  89. package/dist/exceptions.d.cts +1143 -0
  90. package/dist/exceptions.d.mts +1143 -0
  91. package/dist/exceptions.mjs +1325 -0
  92. package/dist/funnel.cjs +297 -0
  93. package/dist/funnel.d.cts +118 -0
  94. package/dist/funnel.d.mts +118 -0
  95. package/dist/funnel.mjs +292 -0
  96. package/dist/index.cjs +287 -0
  97. package/dist/index.d.cts +28 -0
  98. package/dist/index.d.mts +28 -0
  99. package/dist/index.mjs +27 -0
  100. package/dist/log.cjs +75 -0
  101. package/dist/log.d.cts +4 -0
  102. package/dist/log.d.mts +4 -0
  103. package/dist/log.mjs +71 -0
  104. package/dist/oauth.cjs +143 -0
  105. package/dist/oauth.d.cts +69 -0
  106. package/dist/oauth.d.mts +69 -0
  107. package/dist/oauth.mjs +143 -0
  108. package/dist/partner.cjs +32 -0
  109. package/dist/partner.d.cts +24 -0
  110. package/dist/partner.d.mts +23 -0
  111. package/dist/partner.mjs +32 -0
  112. package/dist/powerwall/client.cjs +818 -0
  113. package/dist/powerwall/client.d.cts +297 -0
  114. package/dist/powerwall/client.d.mts +297 -0
  115. package/dist/powerwall/client.mjs +807 -0
  116. package/dist/powerwall/components.cjs +188 -0
  117. package/dist/powerwall/components.d.cts +45 -0
  118. package/dist/powerwall/components.d.mts +45 -0
  119. package/dist/powerwall/components.mjs +182 -0
  120. package/dist/powerwall/energysite.cjs +216 -0
  121. package/dist/powerwall/energysite.d.cts +104 -0
  122. package/dist/powerwall/energysite.d.mts +104 -0
  123. package/dist/powerwall/energysite.mjs +214 -0
  124. package/dist/powerwall/exceptions.cjs +59 -0
  125. package/dist/powerwall/exceptions.d.cts +38 -0
  126. package/dist/powerwall/exceptions.d.mts +38 -0
  127. package/dist/powerwall/exceptions.mjs +51 -0
  128. package/dist/powerwall/gateway.cjs +102 -0
  129. package/dist/powerwall/gateway.d.cts +57 -0
  130. package/dist/powerwall/gateway.d.mts +57 -0
  131. package/dist/powerwall/gateway.mjs +101 -0
  132. package/dist/powerwall/merge.cjs +163 -0
  133. package/dist/powerwall/merge.d.cts +63 -0
  134. package/dist/powerwall/merge.d.mts +63 -0
  135. package/dist/powerwall/merge.mjs +159 -0
  136. package/dist/powerwall/models.d.cts +95 -0
  137. package/dist/powerwall/models.d.mts +95 -0
  138. package/dist/powerwall/queries.cjs +17 -0
  139. package/dist/powerwall/queries.mjs +10 -0
  140. package/dist/powerwall/transport.cjs +232 -0
  141. package/dist/powerwall/transport.mjs +227 -0
  142. package/dist/powerwall.cjs +47 -0
  143. package/dist/powerwall.d.cts +9 -0
  144. package/dist/powerwall.d.mts +9 -0
  145. package/dist/powerwall.mjs +8 -0
  146. package/dist/router/base.cjs +203 -0
  147. package/dist/router/base.d.cts +112 -0
  148. package/dist/router/base.d.mts +112 -0
  149. package/dist/router/base.mjs +200 -0
  150. package/dist/router/energysite.cjs +65 -0
  151. package/dist/router/energysite.d.cts +47 -0
  152. package/dist/router/energysite.d.mts +47 -0
  153. package/dist/router/energysite.mjs +60 -0
  154. package/dist/router.cjs +13 -0
  155. package/dist/router.d.cts +3 -0
  156. package/dist/router.d.mts +3 -0
  157. package/dist/router.mjs +3 -0
  158. package/dist/signing/crypto.cjs +59 -0
  159. package/dist/signing/crypto.mjs +52 -0
  160. package/dist/signing/energy.cjs +123 -0
  161. package/dist/signing/energy.d.cts +45 -0
  162. package/dist/signing/energy.d.mts +45 -0
  163. package/dist/signing/energy.mjs +120 -0
  164. package/dist/signing/jws.cjs +229 -0
  165. package/dist/signing/jws.d.cts +45 -0
  166. package/dist/signing/jws.d.mts +45 -0
  167. package/dist/signing/jws.mjs +211 -0
  168. package/dist/signing/keys.cjs +191 -0
  169. package/dist/signing/keys.d.cts +21 -0
  170. package/dist/signing/keys.d.mts +21 -0
  171. package/dist/signing/keys.mjs +182 -0
  172. package/dist/signing/session.cjs +186 -0
  173. package/dist/signing/session.d.cts +106 -0
  174. package/dist/signing/session.d.mts +106 -0
  175. package/dist/signing/session.mjs +184 -0
  176. package/dist/tariff.cjs +319 -0
  177. package/dist/tariff.d.cts +40 -0
  178. package/dist/tariff.d.mts +40 -0
  179. package/dist/tariff.mjs +317 -0
  180. package/dist/teslafleetapi.cjs +326 -0
  181. package/dist/teslafleetapi.d.cts +160 -0
  182. package/dist/teslafleetapi.d.mts +160 -0
  183. package/dist/teslafleetapi.mjs +326 -0
  184. package/dist/teslemetry.cjs +183 -0
  185. package/dist/teslemetry.d.cts +113 -0
  186. package/dist/teslemetry.d.mts +113 -0
  187. package/dist/teslemetry.mjs +181 -0
  188. package/dist/teslemetryenergy.cjs +287 -0
  189. package/dist/teslemetryenergy.d.cts +154 -0
  190. package/dist/teslemetryenergy.d.mts +154 -0
  191. package/dist/teslemetryenergy.mjs +282 -0
  192. package/dist/teslemetryvehicle.cjs +407 -0
  193. package/dist/teslemetryvehicle.d.cts +238 -0
  194. package/dist/teslemetryvehicle.d.mts +238 -0
  195. package/dist/teslemetryvehicle.mjs +405 -0
  196. package/dist/tessie.cjs +71 -0
  197. package/dist/tessie.d.cts +69 -0
  198. package/dist/tessie.d.mts +69 -0
  199. package/dist/tessie.mjs +71 -0
  200. package/dist/tessievehicle.cjs +514 -0
  201. package/dist/tessievehicle.d.cts +333 -0
  202. package/dist/tessievehicle.d.mts +333 -0
  203. package/dist/tessievehicle.mjs +513 -0
  204. package/dist/types/commands.d.cts +28 -0
  205. package/dist/types/commands.d.mts +28 -0
  206. package/dist/types/live_status.d.cts +30 -0
  207. package/dist/types/live_status.d.mts +30 -0
  208. package/dist/types/products.d.cts +58 -0
  209. package/dist/types/products.d.mts +58 -0
  210. package/dist/types/responses.d.cts +13 -0
  211. package/dist/types/responses.d.mts +13 -0
  212. package/dist/types/site_info.d.cts +154 -0
  213. package/dist/types/site_info.d.mts +154 -0
  214. package/dist/types/vehicle.d.cts +33 -0
  215. package/dist/types/vehicle.d.mts +33 -0
  216. package/dist/types/vehicle_data.d.cts +278 -0
  217. package/dist/types/vehicle_data.d.mts +278 -0
  218. package/dist/types.cjs +0 -0
  219. package/dist/types.d.cts +9 -0
  220. package/dist/types.d.mts +9 -0
  221. package/dist/types.mjs +1 -0
  222. package/dist/user.cjs +28 -0
  223. package/dist/user.d.cts +17 -0
  224. package/dist/user.d.mts +16 -0
  225. package/dist/user.mjs +28 -0
  226. package/dist/util.cjs +41 -0
  227. package/dist/util.d.cts +18 -0
  228. package/dist/util.d.mts +18 -0
  229. package/dist/util.mjs +40 -0
  230. package/dist/vehicle.cjs +847 -0
  231. package/dist/vehicle.d.cts +566 -0
  232. package/dist/vehicle.d.mts +565 -0
  233. package/dist/vehicle.mjs +847 -0
  234. package/dist/vehiclesigned.cjs +35 -0
  235. package/dist/vehiclesigned.d.cts +23 -0
  236. package/dist/vehiclesigned.d.mts +22 -0
  237. package/dist/vehiclesigned.mjs +35 -0
  238. package/dist/vehiclespecific.cjs +715 -0
  239. package/dist/vehiclespecific.d.cts +497 -0
  240. package/dist/vehiclespecific.d.mts +496 -0
  241. package/dist/vehiclespecific.mjs +715 -0
  242. package/package.json +178 -38
  243. package/dist/charging.d.ts +0 -30
  244. package/dist/charging.js +0 -51
  245. package/dist/charging.js.map +0 -1
  246. package/dist/commands.d.ts +0 -352
  247. package/dist/commands.js +0 -875
  248. package/dist/commands.js.map +0 -1
  249. package/dist/energy.d.ts +0 -94
  250. package/dist/energy.js +0 -125
  251. package/dist/energy.js.map +0 -1
  252. package/dist/energyspecific.d.ts +0 -77
  253. package/dist/energyspecific.js +0 -97
  254. package/dist/energyspecific.js.map +0 -1
  255. package/dist/helpers.d.ts +0 -2
  256. package/dist/helpers.js +0 -10
  257. package/dist/helpers.js.map +0 -1
  258. package/dist/index.d.ts +0 -15
  259. package/dist/index.js +0 -15
  260. package/dist/index.js.map +0 -1
  261. package/dist/partner.d.ts +0 -23
  262. package/dist/partner.js +0 -31
  263. package/dist/partner.js.map +0 -1
  264. package/dist/signing/crypto.d.ts +0 -10
  265. package/dist/signing/crypto.js +0 -26
  266. package/dist/signing/crypto.js.map +0 -1
  267. package/dist/signing/errors.d.ts +0 -29
  268. package/dist/signing/errors.js +0 -40
  269. package/dist/signing/errors.js.map +0 -1
  270. package/dist/signing/session.d.ts +0 -69
  271. package/dist/signing/session.js +0 -102
  272. package/dist/signing/session.js.map +0 -1
  273. package/dist/tariff.d.ts +0 -29
  274. package/dist/tariff.js +0 -302
  275. package/dist/tariff.js.map +0 -1
  276. package/dist/teslafleetapi.d.ts +0 -58
  277. package/dist/teslafleetapi.js +0 -120
  278. package/dist/teslafleetapi.js.map +0 -1
  279. package/dist/teslemetry.d.ts +0 -29
  280. package/dist/teslemetry.js +0 -39
  281. package/dist/teslemetry.js.map +0 -1
  282. package/dist/tessie.d.ts +0 -23
  283. package/dist/tessie.js +0 -28
  284. package/dist/tessie.js.map +0 -1
  285. package/dist/types/commands.d.ts +0 -44
  286. package/dist/types/commands.js +0 -11
  287. package/dist/types/commands.js.map +0 -1
  288. package/dist/types/live_status.d.ts +0 -26
  289. package/dist/types/live_status.js +0 -2
  290. package/dist/types/live_status.js.map +0 -1
  291. package/dist/types/products.d.ts +0 -54
  292. package/dist/types/products.js +0 -2
  293. package/dist/types/products.js.map +0 -1
  294. package/dist/types/responses.d.ts +0 -5
  295. package/dist/types/responses.js +0 -2
  296. package/dist/types/responses.js.map +0 -1
  297. package/dist/types/site_info.d.ts +0 -150
  298. package/dist/types/site_info.js +0 -2
  299. package/dist/types/site_info.js.map +0 -1
  300. package/dist/types/vehicle.d.ts +0 -23
  301. package/dist/types/vehicle.js +0 -10
  302. package/dist/types/vehicle.js.map +0 -1
  303. package/dist/types/vehicle_data.d.ts +0 -274
  304. package/dist/types/vehicle_data.js +0 -2
  305. package/dist/types/vehicle_data.js.map +0 -1
  306. package/dist/user.d.ts +0 -16
  307. package/dist/user.js +0 -26
  308. package/dist/user.js.map +0 -1
  309. package/dist/vehicle.d.ts +0 -548
  310. package/dist/vehicle.js +0 -774
  311. package/dist/vehicle.js.map +0 -1
  312. package/dist/vehiclesigned.d.ts +0 -13
  313. package/dist/vehiclesigned.js +0 -19
  314. package/dist/vehiclesigned.js.map +0 -1
  315. package/dist/vehiclespecific.d.ts +0 -432
  316. package/dist/vehiclespecific.js +0 -601
  317. package/dist/vehiclespecific.js.map +0 -1
  318. package/src/charging.ts +0 -66
  319. package/src/commands.ts +0 -1134
  320. package/src/energy.ts +0 -217
  321. package/src/energyspecific.ts +0 -116
  322. package/src/helpers.ts +0 -11
  323. package/src/index.ts +0 -21
  324. package/src/partner.ts +0 -37
  325. package/src/signing/crypto.ts +0 -29
  326. package/src/signing/errors.ts +0 -50
  327. package/src/signing/session.ts +0 -132
  328. package/src/tariff.ts +0 -375
  329. package/src/teslafleetapi.ts +0 -182
  330. package/src/teslemetry.ts +0 -54
  331. package/src/tessie.ts +0 -42
  332. package/src/types/commands.ts +0 -62
  333. package/src/types/live_status.ts +0 -27
  334. package/src/types/products.ts +0 -61
  335. package/src/types/responses.ts +0 -1
  336. package/src/types/site_info.ts +0 -159
  337. package/src/types/vehicle.ts +0 -33
  338. package/src/types/vehicle_data.ts +0 -286
  339. package/src/user.ts +0 -35
  340. package/src/vehicle.ts +0 -886
  341. package/src/vehiclesigned.ts +0 -20
  342. package/src/vehiclespecific.ts +0 -818
package/src/energy.ts DELETED
@@ -1,217 +0,0 @@
1
- import EnergySpecific from "./energyspecific.js";
2
- import TeslaFleetApi from "./teslafleetapi.js";
3
- import { LiveStatusResponse } from "./types/live_status.js";
4
- import { SiteInfoResponse } from "./types/site_info.js";
5
-
6
- // Energy Class
7
- export default class Energy {
8
- parent: TeslaFleetApi;
9
-
10
- constructor(parent: TeslaFleetApi) {
11
- this.parent = parent;
12
- }
13
-
14
- /**
15
- * Create an Energy class for a specific site.
16
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
17
- * @returns `EnergySpecific` class
18
- */
19
- specific(energy_site_id: number): EnergySpecific {
20
- return new EnergySpecific(this, energy_site_id);
21
- }
22
-
23
- /**
24
- * Adjust the site's backup reserve.
25
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.ID field of an energy site from /api/1/products endpoint.
26
- * @param backup_reserve_percent The desired backup reserve percent.
27
- * @returns
28
- */
29
- async backup(
30
- energy_site_id: number,
31
- backup_reserve_percent: number,
32
- ): Promise<Record<string, any>> {
33
- return this.parent._request(
34
- "POST",
35
- `api/1/energy_sites/${energy_site_id}/backup`,
36
- null,
37
- { backup_reserve_percent },
38
- );
39
- }
40
-
41
- /**
42
- * Returns the backup (off-grid) event history of the site in duration of seconds.
43
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
44
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
45
- * @param start_date Start date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
46
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
47
- * @param period Period of the window to retrieve backup events. This can be day, week, month, year, lifetime and should align with the window requested.
48
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
49
- * @returns
50
- */
51
- async backup_history(
52
- energy_site_id: number,
53
- kind: string,
54
- start_date: string,
55
- end_date: string,
56
- period: string,
57
- time_zone: string,
58
- ): Promise<Record<string, any>> {
59
- return this.parent._request(
60
- "GET",
61
- `api/1/energy_sites/${energy_site_id}/calendar_history`,
62
- null,
63
- { kind, start_date, end_date, period, time_zone },
64
- );
65
- }
66
-
67
- /**
68
- * Returns the charging history of a wall connector.
69
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
70
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
71
- * @param start_date Start date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
72
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
73
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
74
- * @returns
75
- */
76
- async charge_history(
77
- energy_site_id: number,
78
- kind: string,
79
- start_date: string,
80
- end_date: string,
81
- time_zone: string,
82
- ): Promise<Record<string, any>> {
83
- return this.parent._request(
84
- "GET",
85
- `api/1/energy_sites/${energy_site_id}/telemetry_history`,
86
- null,
87
- { kind, start_date, end_date, time_zone },
88
- );
89
- }
90
-
91
- /**
92
- * Returns the energy measurements of the site, aggregated to the requested period.
93
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
94
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
95
- * @param start_dateStart date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
96
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
97
- * @param period Period of the window to retrieve backup events. This can be day, week, month, year, lifetime and should align with the window requested.
98
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
99
- * @returns
100
- */
101
- async energy_history(
102
- energy_site_id: number,
103
- kind: string,
104
- start_date: string,
105
- end_date: string,
106
- period: string,
107
- time_zone: string,
108
- ): Promise<Record<string, any>> {
109
- return this.parent._request(
110
- "GET",
111
- `api/1/energy_sites/${energy_site_id}/calendar_history`,
112
- null,
113
- { kind, start_date, end_date, period, time_zone },
114
- );
115
- }
116
-
117
- /**
118
- * Allow/disallow charging from the grid and exporting energy to the grid.
119
- * @param energy_site_id
120
- * @param disallow_charge_from_grid_with_solar_installed The desired behavior towards importing from the grid. Charging from the grid is disabled when set to true and enabled when set to false.
121
- * @param customer_preferred_export_rule The desired behavior for grid exporting. The available options are battery_ok, pv_only, and never.
122
- * @returns
123
- */
124
- async grid_import_export(
125
- energy_site_id: number,
126
- disallow_charge_from_grid_with_solar_installed: boolean | null = null,
127
- customer_preferred_export_rule: string | null = null,
128
- ): Promise<Record<string, any>> {
129
- return this.parent._request(
130
- "POST",
131
- `api/1/energy_sites/${energy_site_id}/grid_import_export`,
132
- null,
133
- {
134
- disallow_charge_from_grid_with_solar_installed,
135
- customer_preferred_export_rule,
136
- },
137
- );
138
- }
139
-
140
- /**
141
- * Returns the live status of the site (power, state of energy, grid status, storm mode).
142
- * @param energy_site_id
143
- * @returns
144
- */
145
- async live_status(energy_site_id: number): Promise<LiveStatusResponse> {
146
- return this.parent
147
- ._request("GET", `api/1/energy_sites/${energy_site_id}/live_status`)
148
- .then(({ response }) => response);
149
- }
150
-
151
- /**
152
- * Adjust the site's off-grid vehicle charging backup reserve.
153
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
154
- * @param off_grid_vehicle_charging_reserve_percent The desired off grid vehicle charging reserve percent.
155
- * @returns
156
- */
157
- async off_grid_vehicle_charging_reserve(
158
- energy_site_id: number,
159
- off_grid_vehicle_charging_reserve_percent: number,
160
- ): Promise<Record<string, any>> {
161
- return this.parent._request(
162
- "POST",
163
- `api/1/energy_sites/${energy_site_id}/off_grid_vehicle_charging_reserve`,
164
- null,
165
- {
166
- off_grid_vehicle_charging_reserve_percent,
167
- },
168
- );
169
- }
170
-
171
- /**
172
- * Set the site's mode.
173
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
174
- * @param default_real_mode The desired operation mode. Use autonomous for time-based control and self_consumption for self-powered mode.
175
- * @returns
176
- */
177
- async operation(
178
- energy_site_id: number,
179
- default_real_mode: string,
180
- ): Promise<Record<string, any>> {
181
- return this.parent._request(
182
- "POST",
183
- `api/1/energy_sites/${energy_site_id}/operation`,
184
- null,
185
- { default_real_mode },
186
- );
187
- }
188
-
189
- /**
190
- * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
191
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
192
- * @returns
193
- */
194
- async site_info(energy_site_id: number): Promise<SiteInfoResponse> {
195
- return this.parent
196
- ._request("GET", `api/1/energy_sites/${energy_site_id}/site_info`)
197
- .then(({ response }) => response);
198
- }
199
-
200
- /**
201
- * Update storm watch participation.
202
- * @param energy_site_id ID field of an energy site from /api/1/products endpoint.
203
- * @param enabled The storm mode participation value to set.
204
- * @returns
205
- */
206
- async storm_mode(
207
- energy_site_id: number,
208
- enabled: boolean,
209
- ): Promise<Record<string, any>> {
210
- return this.parent._request(
211
- "POST",
212
- `api/1/energy_sites/${energy_site_id}/storm_mode`,
213
- null,
214
- { enabled },
215
- );
216
- }
217
- }
@@ -1,116 +0,0 @@
1
- import Energy from "./energy.js";
2
- import { LiveStatusResponse } from "./types/live_status.js";
3
- import { SiteInfoResponse } from "./types/site_info.js";
4
-
5
- // Energy Class
6
- export default class EnergySpecific {
7
- parent: Energy;
8
- energy_site_id: number;
9
-
10
- constructor(parent: Energy, energy_site_id: number) {
11
- this.parent = parent;
12
- this.energy_site_id = energy_site_id;
13
- }
14
-
15
- /**
16
- * Adjust the site's backup reserve.
17
- * @param backup_reserve_percent The desired backup reserve percent.
18
- * @returns
19
- */
20
- async backup(backup_reserve_percent: number): Promise<Record<string, any>> {
21
- return this.parent.backup(this.energy_site_id, backup_reserve_percent);
22
- }
23
-
24
- /**
25
- * Returns the backup (off-grid) event history of the site in duration of seconds.
26
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
27
- * @param start_date Start date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
28
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
29
- * @param period Period of the window to retrieve backup events. This can be day, week, month, year, lifetime and should align with the window requested.
30
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
31
- * @returns
32
- */
33
- async backup_history(kind: string, start_date: string, end_date: string, period: string, time_zone: string): Promise<Record<string, any>> {
34
- return this.parent.backup_history(this.energy_site_id, kind, start_date, end_date, period, time_zone);
35
- }
36
-
37
- /**
38
- * Returns the charging history of a wall connector.
39
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
40
- * @param start_date Start date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
41
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
42
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
43
- * @returns
44
- */
45
- async charge_history(kind: string, start_date: string, end_date: string, time_zone: string): Promise<Record<string, any>> {
46
- return this.parent.charge_history(this.energy_site_id, kind, start_date, end_date, time_zone);
47
- }
48
-
49
- /**
50
- * Returns the energy history of the site in duration of seconds.
51
- * @param kind The kind of history to be requested. 'backup', 'charge', 'energy' are all supported.
52
- * @param start_date Start date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
53
- * @param end_date End date of the window to retrieve backup events in RFC3339 format. i.e. 2023-01-01T00:00:00-08:00
54
- * @param period Period of the window to retrieve backup events. This can be day, week, month, year, lifetime and should align with the window requested.
55
- * @param time_zone Timezone of the requested window in IANA name format. i.e. 'America/Los_Angeles'
56
- * @returns
57
- */
58
- async energy_history(kind: string, start_date: string, end_date: string, period: string, time_zone: string): Promise<Record<string, any>> {
59
- return this.parent.energy_history(this.energy_site_id, kind, start_date, end_date, period, time_zone);
60
- }
61
-
62
- /**
63
- * Allow/disallow charging from the grid and exporting energy to the grid.
64
- * @param disallow_charge_from_grid_with_solar_installed The desired behavior towards importing from the grid. Charging from the grid is disabled when set to true and enabled when set to false.
65
- * @param customer_preferred_export_rule The desired behavior for grid exporting. The available options are battery_ok, pv_only, and never.
66
- * @returns
67
- */
68
- async grid_import_export(
69
- disallow_charge_from_grid_with_solar_installed: boolean | null = null,
70
- customer_preferred_export_rule: string | null = null
71
- ): Promise<Record<string, any>> {
72
- return this.parent.grid_import_export(this.energy_site_id, disallow_charge_from_grid_with_solar_installed, customer_preferred_export_rule);
73
- }
74
-
75
- /**
76
- * Returns the live status of the site.
77
- * @returns
78
- */
79
- async live_status(): Promise<LiveStatusResponse> {
80
- return this.parent.live_status(this.energy_site_id);
81
- }
82
-
83
- /**
84
- * Adjust the site's off-grid vehicle charging backup reserve.
85
- * @param off_grid_vehicle_charging_reserve_percent The desired off grid vehicle charging reserve percent.
86
- * @returns
87
- */
88
- async off_grid_vehicle_charging_reserve(off_grid_vehicle_charging_reserve_percent: number): Promise<Record<string, any>> {
89
- return this.parent.off_grid_vehicle_charging_reserve(this.energy_site_id, off_grid_vehicle_charging_reserve_percent);
90
- }
91
-
92
- /**
93
- * Set the site's mode.
94
- * @param default_real_mode
95
- * @returns
96
- */
97
- async operation(default_real_mode: string): Promise<Record<string, any>> {
98
- return this.parent.operation(this.energy_site_id, default_real_mode);
99
- }
100
-
101
- /**
102
- * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
103
- */
104
- async site_info(): Promise<SiteInfoResponse> {
105
- return this.parent.site_info(this.energy_site_id);
106
- }
107
-
108
- /**
109
- * Update storm watch participation.
110
- * @param enabled The storm mode participation value to set.
111
- * @returns
112
- */
113
- async storm_mode(enabled: boolean): Promise<Record<string, any>> {
114
- return this.parent.storm_mode(this.energy_site_id, enabled);
115
- }
116
- }
package/src/helpers.ts DELETED
@@ -1,11 +0,0 @@
1
- import { CommandResponse } from "./types/commands.js";
2
-
3
- export const validate = async (body: CommandResponse): Promise<void> => {
4
- if (body?.error) {
5
- return Promise.reject(body.error);
6
- }
7
- if (body?.response?.result == false) {
8
- return Promise.reject(body.response.reason);
9
- }
10
- return Promise.resolve();
11
- };
package/src/index.ts DELETED
@@ -1,21 +0,0 @@
1
- import Commands from "./commands.js";
2
- import Energy from "./energy.js";
3
- import EnergySpecific from "./energyspecific.js";
4
- import TeslaFleetApi from "./teslafleetapi.js";
5
- import Teslemetry from "./teslemetry.js";
6
- import Tessie from "./tessie.js";
7
- import Vehicle from "./vehicle.js";
8
- import VehicleSigned from "./vehiclesigned.js";
9
- import VehicleSpecific from "./vehiclespecific.js";
10
-
11
- export { Commands, Energy, EnergySpecific, TeslaFleetApi, Teslemetry, Tessie, Vehicle, VehicleSigned, VehicleSpecific };
12
- export { Session } from "./signing/session.js";
13
- export {
14
- SignedCommandError,
15
- NotOnVehicleWhitelistError,
16
- SignedCommandFaultError,
17
- RetryableSignedCommandFaultError,
18
- } from "./signing/errors.js";
19
- export { getTariffPeriods } from "./tariff.js";
20
- export { Models } from "./types/vehicle.js";
21
- export type { TariffRate, TariffPeriod, TariffResolution } from "./tariff.js";
package/src/partner.ts DELETED
@@ -1,37 +0,0 @@
1
- import TeslaFleetApi from "./teslafleetapi.js";
2
-
3
- // Partner Class
4
- export default class Partner {
5
- parent: TeslaFleetApi;
6
-
7
- constructor(parent: TeslaFleetApi) {
8
- this.parent = parent;
9
- }
10
-
11
- /**
12
- * Returns the public key associated with a domain. It can be used to ensure the registration was successful.
13
- * @param domain Domain of the partner account.
14
- * @returns
15
- */
16
- async public_key(domain: string | null = null): Promise<Record<string, any>> {
17
- return this.parent._request("GET", "api/1/partner_accounts/public_key", { domain });
18
- }
19
-
20
- /**
21
- * Registers an existing account before it can be used for general API access. Each application from developer.tesla.com must complete this step.
22
- * @param domain Domain of the partner account.
23
- * @returns
24
- */
25
- async register(domain: string): Promise<Record<string, any>> {
26
- return this.parent._request("POST", "api/1/partner_accounts", null, { domain });
27
- }
28
-
29
- /**
30
- * Returns recent fleet telemetry errors reported by vehicles after receiving the config.
31
- * @param domain Domain of the partner account.
32
- * @returns
33
- */
34
- async fleet_telemetry_errors(domain: string): Promise<Record<string, any>> {
35
- return this.parent._request("GET", "api/1/partner_accounts/fleet_telemetry_errors", { domain });
36
- }
37
- }
@@ -1,29 +0,0 @@
1
- import crypto from "crypto";
2
-
3
- const CURVE = "prime256v1"; // NIST P-256, matches the vehicle-command protocol.
4
-
5
- /** Derive the uncompressed public key point for a raw P-256 private scalar. */
6
- export function publicKeyFor(privateKey: Buffer): Buffer {
7
- const ecdh = crypto.createECDH(CURVE);
8
- ecdh.setPrivateKey(privateKey);
9
- return ecdh.getPublicKey();
10
- }
11
-
12
- /**
13
- * Derive the 16-byte signed-command shared key: ECDH(ourPrivate, vehiclePublic),
14
- * then SHA-1 truncated to 16 bytes - matching the vehicle-command protocol
15
- * (not a general-purpose KDF, do not reuse this for anything else).
16
- */
17
- export function deriveSharedKey(privateKey: Buffer, vehiclePublicKey: Buffer): Buffer {
18
- const ecdh = crypto.createECDH(CURVE);
19
- ecdh.setPrivateKey(privateKey);
20
- const secret = ecdh.computeSecret(vehiclePublicKey);
21
- return crypto.createHash("sha1").update(secret).digest().subarray(0, 16);
22
- }
23
-
24
- /** Big-endian uint32, as used throughout the signed-command metadata tags. */
25
- export function uint32BE(value: number): Buffer {
26
- const buffer = Buffer.alloc(4);
27
- buffer.writeUInt32BE(value >>> 0, 0);
28
- return buffer;
29
- }
@@ -1,50 +0,0 @@
1
- import { MessageFaultE, messageFaultEToJSON } from "@teslemetry/tesla-protocol/command/universal_message";
2
-
3
- /**
4
- * Base class for every error raised by the signed-command layer.
5
- */
6
- export class SignedCommandError extends Error {}
7
-
8
- /**
9
- * The vehicle rejected the session handshake because this key has not been
10
- * paired with it (added via the Tesla app / NFC card).
11
- */
12
- export class NotOnVehicleWhitelistError extends SignedCommandError {
13
- constructor() {
14
- super(
15
- "This public key is not on the vehicle's key whitelist. Pair it with the vehicle first.",
16
- );
17
- }
18
- }
19
-
20
- /**
21
- * The vehicle rejected a signed command with a `MessageFaultE` other than
22
- * `MESSAGEFAULT_ERROR_NONE`.
23
- */
24
- export class SignedCommandFaultError extends SignedCommandError {
25
- fault: MessageFaultE;
26
-
27
- constructor(fault: MessageFaultE) {
28
- super(`Vehicle rejected signed command: ${messageFaultEToJSON(fault)}`);
29
- this.fault = fault;
30
- }
31
- }
32
-
33
- /**
34
- * A `SignedCommandFaultError` whose fault the vehicle resolves by handing back
35
- * fresh session info (epoch/counter drift) - `_command` retries these,
36
- * bounded, by re-signing against the updated session before giving up.
37
- */
38
- export class RetryableSignedCommandFaultError extends SignedCommandFaultError {}
39
-
40
- export function createFaultError(
41
- fault: MessageFaultE,
42
- ): SignedCommandFaultError {
43
- if (
44
- fault === MessageFaultE.MESSAGEFAULT_ERROR_INCORRECT_EPOCH ||
45
- fault === MessageFaultE.MESSAGEFAULT_ERROR_INVALID_TOKEN_OR_COUNTER
46
- ) {
47
- return new RetryableSignedCommandFaultError(fault);
48
- }
49
- return new SignedCommandFaultError(fault);
50
- }
@@ -1,132 +0,0 @@
1
- import crypto from "crypto";
2
- import { Domain } from "@teslemetry/tesla-protocol/command/universal_message";
3
- import {
4
- HMACPersonalizedSignatureData,
5
- SessionInfo,
6
- } from "@teslemetry/tesla-protocol/command/signatures";
7
-
8
- /** Key material derived (but not yet trusted/committed) for a candidate vehicle public key. */
9
- export interface SessionKeys {
10
- sharedKey: Buffer;
11
- hmacKey: Buffer;
12
- sessionInfoKey: Buffer;
13
- }
14
-
15
- /**
16
- * Per-domain (VCSEC / Infotainment) signed-command session: tracks the
17
- * anti-replay counter/epoch handed out by the vehicle's handshake reply and
18
- * the HMAC keys derived from it.
19
- *
20
- * Deriving key material (`keysFor`) is split from committing it (`commit`)
21
- * because the caller must authenticate a `SessionInfo` reply - by verifying
22
- * its `session_info_tag` against the very keys derived here - *before*
23
- * trusting anything in it, including the vehicle public key the shared key
24
- * itself is derived from. See `Commands.validateAndUpdateSession`.
25
- *
26
- * A `Session` is not itself thread-safe; `withLock` serializes the
27
- * message-build step (which mutates `counter`) so concurrent commands on the
28
- * same domain cannot race on the same counter value.
29
- */
30
- export class Session {
31
- readonly domain: Domain;
32
- counter: number = 0;
33
- epoch?: Buffer;
34
- delta?: number;
35
- sharedKey?: Buffer;
36
- hmacKey?: Buffer;
37
- sessionInfoKey?: Buffer;
38
- publicKey?: Buffer;
39
-
40
- /** Clock time of the last *authenticated* SessionInfo committed for the current epoch, guarding against replay/rollback. */
41
- private lastAuthenticatedClockTime?: number;
42
- private queue: Promise<void> = Promise.resolve();
43
-
44
- constructor(
45
- domain: Domain,
46
- private readonly deriveSharedKey: (vehiclePublicKey: Buffer) => Buffer,
47
- ) {
48
- this.domain = domain;
49
- }
50
-
51
- /** Whether the handshake has completed and commands can be signed. */
52
- get ready(): boolean {
53
- return this.epoch !== undefined && this.hmacKey !== undefined && this.delta !== undefined;
54
- }
55
-
56
- /**
57
- * Derive the shared key and its two HMAC sub-keys for a candidate vehicle
58
- * public key, without touching any session state. Pure and side-effect
59
- * free so a caller can verify authenticity first and discard the result
60
- * if verification fails.
61
- */
62
- keysFor(vehiclePublicKey: Buffer): SessionKeys {
63
- const sharedKey = this.deriveSharedKey(vehiclePublicKey);
64
- const hmacKey = crypto.createHmac("sha256", sharedKey).update("authenticated command").digest();
65
- const sessionInfoKey = crypto.createHmac("sha256", sharedKey).update("session info").digest();
66
- return { sharedKey, hmacKey, sessionInfoKey };
67
- }
68
-
69
- /**
70
- * Commit an already-authenticated `SessionInfo` plus the `keysFor` result
71
- * derived from its public key. Per the vehicle-command protocol, the
72
- * anti-replay counter must never roll back within the same epoch, and a
73
- * clock time that regresses within the same epoch marks the reply as
74
- * stale/replayed - returns `false` (without mutating any state) in that
75
- * case so the caller can reject it.
76
- */
77
- commit(sessionInfo: SessionInfo, keys: SessionKeys): boolean {
78
- const incomingEpoch = Buffer.from(sessionInfo.epoch);
79
- const sameEpoch = this.epoch !== undefined && this.epoch.equals(incomingEpoch);
80
-
81
- if (sameEpoch && this.lastAuthenticatedClockTime !== undefined && sessionInfo.clockTime < this.lastAuthenticatedClockTime) {
82
- return false;
83
- }
84
-
85
- this.counter = sameEpoch ? Math.max(this.counter, sessionInfo.counter) : sessionInfo.counter;
86
- this.epoch = incomingEpoch;
87
- this.delta = Math.floor(Date.now() / 1000) - sessionInfo.clockTime;
88
- this.lastAuthenticatedClockTime = sessionInfo.clockTime;
89
- this.publicKey = Buffer.from(sessionInfo.publicKey);
90
- this.sharedKey = keys.sharedKey;
91
- this.hmacKey = keys.hmacKey;
92
- this.sessionInfoKey = keys.sessionInfoKey;
93
- return true;
94
- }
95
-
96
- /**
97
- * Advance the anti-replay counter and return fresh signature metadata for
98
- * an HMAC-personalized command. The command expires 10 seconds from now,
99
- * corrected for clock drift against the vehicle (`delta`).
100
- */
101
- hmacPersonalized(): HMACPersonalizedSignatureData {
102
- if (!this.ready || !this.epoch || this.delta === undefined) {
103
- throw new Error("Session is not ready: perform the handshake first.");
104
- }
105
- this.counter++;
106
- return HMACPersonalizedSignatureData.create({
107
- epoch: this.epoch,
108
- counter: this.counter,
109
- expiresAt: Math.floor(Date.now() / 1000) - this.delta + 10,
110
- });
111
- }
112
-
113
- /**
114
- * Run `fn` with exclusive access to this session, queuing behind any
115
- * in-flight caller. Held only for as long as `fn` takes - callers should
116
- * keep it scoped to the synchronous message-build step, not a full
117
- * network round trip.
118
- */
119
- async withLock<T>(fn: () => T | Promise<T>): Promise<T> {
120
- const previous = this.queue;
121
- let release!: () => void;
122
- this.queue = new Promise<void>((resolve) => {
123
- release = resolve;
124
- });
125
- await previous.catch((): void => undefined);
126
- try {
127
- return await fn();
128
- } finally {
129
- release();
130
- }
131
- }
132
- }