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
@@ -0,0 +1,183 @@
1
+ const require_const = require("./const.cjs");
2
+ const require_exceptions = require("./exceptions.cjs");
3
+ const require_teslafleetapi = require("./teslafleetapi.cjs");
4
+ const require_teslemetryenergy = require("./teslemetryenergy.cjs");
5
+ const require_teslemetryvehicle = require("./teslemetryvehicle.cjs");
6
+ // src/teslemetry.ts
7
+ /** Teslemetry's OAuth dynamic client registration endpoint. */
8
+ const REGISTER_URL = "https://api.teslemetry.com/oauth/register";
9
+ /**
10
+ * Dynamically register an OAuth client with Teslemetry (RFC 7591). This always
11
+ * registers a new client: the caller persists the `client_id` and skips
12
+ * registration on later runs.
13
+ * @param client_name Human-readable client name shown during consent.
14
+ * @param software_id Identifier for the calling application.
15
+ * @param software_version Version string for the calling application.
16
+ * @param options `fetch` replaces the global `fetch`; `timeout` aborts after this many milliseconds.
17
+ * @throws TeslemetryRegistrationError when the endpoint cannot be reached or
18
+ * refuses, the body is not JSON, or it has no usable `client_id`. The reason is in `data`.
19
+ */
20
+ async function register_client(client_name, software_id, software_version, options = {}) {
21
+ const unreachable = "Could not reach Teslemetry to register a client";
22
+ let text;
23
+ try {
24
+ const resp = await (options.fetch ?? fetch)(REGISTER_URL, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json" },
27
+ body: JSON.stringify({
28
+ client_name,
29
+ software_id,
30
+ software_version
31
+ }),
32
+ signal: options.timeout != null ? AbortSignal.timeout(options.timeout) : null
33
+ });
34
+ if (!resp.ok) throw new require_exceptions.TeslemetryRegistrationError(unreachable, resp.status);
35
+ text = await resp.text();
36
+ } catch (error) {
37
+ if (error instanceof require_exceptions.TeslemetryRegistrationError) throw error;
38
+ throw new require_exceptions.TeslemetryRegistrationError(unreachable, null, { cause: error });
39
+ }
40
+ let registration;
41
+ try {
42
+ registration = JSON.parse(text);
43
+ } catch (error) {
44
+ throw new require_exceptions.TeslemetryRegistrationError("Teslemetry returned a malformed registration response", null, { cause: error });
45
+ }
46
+ const raw = registration !== null && typeof registration === "object" && !Array.isArray(registration) ? registration : null;
47
+ const client_id = raw?.client_id;
48
+ if (raw === null || typeof client_id !== "string" || !client_id) throw new require_exceptions.TeslemetryRegistrationError("Teslemetry registration response did not contain a client_id");
49
+ return {
50
+ client_id,
51
+ raw
52
+ };
53
+ }
54
+ var Teslemetry = class extends require_teslafleetapi.default {
55
+ static Vehicles = require_teslemetryvehicle.TeslemetryVehicles;
56
+ static EnergySites = require_teslemetryenergy.TeslemetryEnergySites;
57
+ _transport_name = "teslemetry";
58
+ constructor(accessToken, region = "api", options = {}) {
59
+ super({
60
+ ...options,
61
+ accessToken,
62
+ server: `https://${region}.teslemetry.com`,
63
+ partnerScope: false
64
+ });
65
+ }
66
+ /**
67
+ * Set the server from the account's region in `metadata()`.
68
+ * @returns The region, e.g. `"na"`.
69
+ */
70
+ async find_server() {
71
+ const { region } = await this.metadata(true);
72
+ return region.toLowerCase();
73
+ }
74
+ async _response(resp) {
75
+ if (resp.headers.has("x-region")) {
76
+ const region = resp.headers.get("x-region")?.toLowerCase();
77
+ if (region) this.server = `https://${region}.teslemetry.com`;
78
+ }
79
+ return super._response(resp);
80
+ }
81
+ /** Send a ping. */
82
+ async ping() {
83
+ return this._request("GET", "api/ping");
84
+ }
85
+ /**
86
+ * Test the connection to Teslemetry
87
+ */
88
+ async test() {
89
+ return this._request("GET", "api/test");
90
+ }
91
+ /** Get userdata. */
92
+ async userdata() {
93
+ return this._request("GET", "api/userdata");
94
+ }
95
+ /**
96
+ * Get details about your Teslemetry account
97
+ * @param update_region Update the server URL based on the region in the metadata
98
+ */
99
+ async metadata(update_region = true) {
100
+ return this._request("GET", "api/metadata").then((metadata) => {
101
+ if (update_region && metadata.region) {
102
+ const region = metadata.region.toLowerCase();
103
+ if (require_const.is_valid_region(region)) this.region = region;
104
+ this.server = `https://${region}.teslemetry.com`;
105
+ this._log(`Using server ${this.server}`);
106
+ }
107
+ return metadata;
108
+ });
109
+ }
110
+ /** Get the user's scopes. Leaves the server unchanged. */
111
+ async scopes() {
112
+ return this.metadata(false).then(({ scopes }) => scopes);
113
+ }
114
+ /**
115
+ * Get or set Auto mode.
116
+ * @param vin
117
+ * @param value `true` enables it, `false` disables it, omit to read it.
118
+ */
119
+ async server_side_polling(vin, value) {
120
+ const method = value === true ? "POST" : value === false ? "DELETE" : "GET";
121
+ return this._request(method, `api/auto/${vin}`).then(({ response }) => response);
122
+ }
123
+ /** Force a refresh of the vehicle data. */
124
+ async vehicle_data_refresh(vin) {
125
+ return this._request("GET", `api/refresh/${vin}`);
126
+ }
127
+ /**
128
+ * Migrate from an access token to OAuth.
129
+ * @param client_id
130
+ * @param name
131
+ * @returns The token response, with `expires_in` as an integer and `expires_at` in epoch seconds.
132
+ * @throws InvalidResponse when the reply has no usable `expires_in`.
133
+ */
134
+ async migrate_to_oauth(client_id = "homeassistant", name) {
135
+ const access_token = await this.access_token();
136
+ const new_token = await this._request("POST", "oauth/token", null, {
137
+ grant_type: "migrate",
138
+ client_id,
139
+ access_token: access_token.trim(),
140
+ name
141
+ });
142
+ const expires_in = Math.trunc(new_token?.expires_in == null ? NaN : Number(new_token.expires_in));
143
+ if (!Number.isFinite(expires_in)) throw new require_exceptions.InvalidResponse("Teslemetry token response did not contain a valid expires_in");
144
+ new_token.expires_in = expires_in;
145
+ new_token.expires_at = Date.now() / 1e3 + expires_in;
146
+ return new_token;
147
+ }
148
+ /** Get streaming field parameters and metadata. */
149
+ async fields() {
150
+ return this._request("GET", "fields.json");
151
+ }
152
+ /** Get the saved vehicle configuration. */
153
+ async vehicle_config(vin) {
154
+ return this._request("GET", `api/vehicle_config/${vin}`);
155
+ }
156
+ /** Get a vehicle's streaming configuration: certificate, hostname, port and configurable telemetry fields. */
157
+ async streaming_config(vin) {
158
+ return this._request("GET", `api/config/${vin}`);
159
+ }
160
+ /** Stop streaming data from a vehicle. */
161
+ async stop_streaming(vin) {
162
+ return this._request("DELETE", `api/config/${vin}`);
163
+ }
164
+ /**
165
+ * Modify a vehicle's streaming configuration.
166
+ * @param vin
167
+ * @param fields Fields to stream with their configuration.
168
+ */
169
+ async modify_streaming_config(vin, fields) {
170
+ return this._request("PATCH", `api/config/${vin}`, null, { fields });
171
+ }
172
+ /**
173
+ * Create or update a vehicle's streaming configuration.
174
+ * @param vin
175
+ * @param fields Fields to stream with their configuration.
176
+ */
177
+ async create_streaming_config(vin, fields) {
178
+ return this._request("POST", `api/config/${vin}`, null, { fields });
179
+ }
180
+ };
181
+ exports.REGISTER_URL = REGISTER_URL;
182
+ exports.default = Teslemetry;
183
+ exports.register_client = register_client;
@@ -0,0 +1,113 @@
1
+ import TeslaFleetApi, { AccessToken } from "./teslafleetapi.cjs";
2
+ import { Logger } from "./log.cjs";
3
+ import { TeslemetryEnergySites } from "./teslemetryenergy.cjs";
4
+ import { TeslemetryVehicles } from "./teslemetryvehicle.cjs";
5
+ import { Scope } from "./const.cjs";
6
+ import Vehicle from "./vehicle.cjs";
7
+ type Region = "na" | "eu" | "api";
8
+ type Metadata = {
9
+ uid: string;
10
+ region: "NA" | "EU";
11
+ scopes: Scope[];
12
+ vins: string[];
13
+ };
14
+ export type TeslemetryOptions = {
15
+ debug?: boolean;
16
+ logger?: Logger;
17
+ fetch?: typeof fetch;
18
+ timeout?: number;
19
+ };
20
+ /** Teslemetry's OAuth dynamic client registration endpoint. */
21
+ export declare const REGISTER_URL = "https://api.teslemetry.com/oauth/register";
22
+ /** The parsed result of `register_client`. */
23
+ export type TeslemetryClientRegistration = {
24
+ /** The OAuth client identifier to present for every future authorization, including reauthentication. */
25
+ readonly client_id: string;
26
+ /** The full decoded registration response. */
27
+ readonly raw: Record<string, any>;
28
+ };
29
+ /**
30
+ * Dynamically register an OAuth client with Teslemetry (RFC 7591). This always
31
+ * registers a new client: the caller persists the `client_id` and skips
32
+ * registration on later runs.
33
+ * @param client_name Human-readable client name shown during consent.
34
+ * @param software_id Identifier for the calling application.
35
+ * @param software_version Version string for the calling application.
36
+ * @param options `fetch` replaces the global `fetch`; `timeout` aborts after this many milliseconds.
37
+ * @throws TeslemetryRegistrationError when the endpoint cannot be reached or
38
+ * refuses, the body is not JSON, or it has no usable `client_id`. The reason is in `data`.
39
+ */
40
+ export declare function register_client(client_name: string, software_id: string, software_version: string, options?: {
41
+ fetch?: typeof fetch;
42
+ timeout?: number;
43
+ }): Promise<TeslemetryClientRegistration>;
44
+ export default class Teslemetry extends TeslaFleetApi {
45
+ static Vehicles: new (parent: TeslaFleetApi) => Vehicle;
46
+ vehicles: TeslemetryVehicles;
47
+ static EnergySites: typeof TeslemetryEnergySites;
48
+ energySites?: TeslemetryEnergySites;
49
+ readonly _transport_name: string;
50
+ constructor(accessToken: AccessToken, region?: Region, options?: TeslemetryOptions);
51
+ /**
52
+ * Set the server from the account's region in `metadata()`.
53
+ * @returns The region, e.g. `"na"`.
54
+ */
55
+ find_server(): Promise<string>;
56
+ _response(resp: Response): Promise<any>;
57
+ /** Send a ping. */
58
+ ping(): Promise<{
59
+ response: boolean;
60
+ }>;
61
+ /**
62
+ * Test the connection to Teslemetry
63
+ */
64
+ test(): Promise<{
65
+ response: boolean;
66
+ }>;
67
+ /** Get userdata. */
68
+ userdata(): Promise<Record<string, any>>;
69
+ /**
70
+ * Get details about your Teslemetry account
71
+ * @param update_region Update the server URL based on the region in the metadata
72
+ */
73
+ metadata(update_region?: boolean): Promise<Metadata>;
74
+ /** Get the user's scopes. Leaves the server unchanged. */
75
+ scopes(): Promise<Scope[]>;
76
+ /**
77
+ * Get or set Auto mode.
78
+ * @param vin
79
+ * @param value `true` enables it, `false` disables it, omit to read it.
80
+ */
81
+ server_side_polling(vin: string, value?: boolean | null): Promise<boolean | undefined>;
82
+ /** Force a refresh of the vehicle data. */
83
+ vehicle_data_refresh(vin: string): Promise<Record<string, any>>;
84
+ /**
85
+ * Migrate from an access token to OAuth.
86
+ * @param client_id
87
+ * @param name
88
+ * @returns The token response, with `expires_in` as an integer and `expires_at` in epoch seconds.
89
+ * @throws InvalidResponse when the reply has no usable `expires_in`.
90
+ */
91
+ migrate_to_oauth(client_id?: string, name?: string | null): Promise<Record<string, any>>;
92
+ /** Get streaming field parameters and metadata. */
93
+ fields(): Promise<Record<string, any>>;
94
+ /** Get the saved vehicle configuration. */
95
+ vehicle_config(vin: string): Promise<Record<string, any>>;
96
+ /** Get a vehicle's streaming configuration: certificate, hostname, port and configurable telemetry fields. */
97
+ streaming_config(vin: string): Promise<Record<string, any>>;
98
+ /** Stop streaming data from a vehicle. */
99
+ stop_streaming(vin: string): Promise<Record<string, any>>;
100
+ /**
101
+ * Modify a vehicle's streaming configuration.
102
+ * @param vin
103
+ * @param fields Fields to stream with their configuration.
104
+ */
105
+ modify_streaming_config(vin: string, fields: Record<string, any>): Promise<Record<string, any>>;
106
+ /**
107
+ * Create or update a vehicle's streaming configuration.
108
+ * @param vin
109
+ * @param fields Fields to stream with their configuration.
110
+ */
111
+ create_streaming_config(vin: string, fields: Record<string, any>): Promise<Record<string, any>>;
112
+ }
113
+ export {};
@@ -0,0 +1,113 @@
1
+ import TeslaFleetApi, { AccessToken } from "./teslafleetapi.mjs";
2
+ import { Logger } from "./log.mjs";
3
+ import { TeslemetryEnergySites } from "./teslemetryenergy.mjs";
4
+ import { TeslemetryVehicles } from "./teslemetryvehicle.mjs";
5
+ import { Scope } from "./const.mjs";
6
+ import Vehicle from "./vehicle.mjs";
7
+ type Region = "na" | "eu" | "api";
8
+ type Metadata = {
9
+ uid: string;
10
+ region: "NA" | "EU";
11
+ scopes: Scope[];
12
+ vins: string[];
13
+ };
14
+ export type TeslemetryOptions = {
15
+ debug?: boolean;
16
+ logger?: Logger;
17
+ fetch?: typeof fetch;
18
+ timeout?: number;
19
+ };
20
+ /** Teslemetry's OAuth dynamic client registration endpoint. */
21
+ export declare const REGISTER_URL = "https://api.teslemetry.com/oauth/register";
22
+ /** The parsed result of `register_client`. */
23
+ export type TeslemetryClientRegistration = {
24
+ /** The OAuth client identifier to present for every future authorization, including reauthentication. */
25
+ readonly client_id: string;
26
+ /** The full decoded registration response. */
27
+ readonly raw: Record<string, any>;
28
+ };
29
+ /**
30
+ * Dynamically register an OAuth client with Teslemetry (RFC 7591). This always
31
+ * registers a new client: the caller persists the `client_id` and skips
32
+ * registration on later runs.
33
+ * @param client_name Human-readable client name shown during consent.
34
+ * @param software_id Identifier for the calling application.
35
+ * @param software_version Version string for the calling application.
36
+ * @param options `fetch` replaces the global `fetch`; `timeout` aborts after this many milliseconds.
37
+ * @throws TeslemetryRegistrationError when the endpoint cannot be reached or
38
+ * refuses, the body is not JSON, or it has no usable `client_id`. The reason is in `data`.
39
+ */
40
+ export declare function register_client(client_name: string, software_id: string, software_version: string, options?: {
41
+ fetch?: typeof fetch;
42
+ timeout?: number;
43
+ }): Promise<TeslemetryClientRegistration>;
44
+ export default class Teslemetry extends TeslaFleetApi {
45
+ static Vehicles: new (parent: TeslaFleetApi) => Vehicle;
46
+ vehicles: TeslemetryVehicles;
47
+ static EnergySites: typeof TeslemetryEnergySites;
48
+ energySites?: TeslemetryEnergySites;
49
+ readonly _transport_name: string;
50
+ constructor(accessToken: AccessToken, region?: Region, options?: TeslemetryOptions);
51
+ /**
52
+ * Set the server from the account's region in `metadata()`.
53
+ * @returns The region, e.g. `"na"`.
54
+ */
55
+ find_server(): Promise<string>;
56
+ _response(resp: Response): Promise<any>;
57
+ /** Send a ping. */
58
+ ping(): Promise<{
59
+ response: boolean;
60
+ }>;
61
+ /**
62
+ * Test the connection to Teslemetry
63
+ */
64
+ test(): Promise<{
65
+ response: boolean;
66
+ }>;
67
+ /** Get userdata. */
68
+ userdata(): Promise<Record<string, any>>;
69
+ /**
70
+ * Get details about your Teslemetry account
71
+ * @param update_region Update the server URL based on the region in the metadata
72
+ */
73
+ metadata(update_region?: boolean): Promise<Metadata>;
74
+ /** Get the user's scopes. Leaves the server unchanged. */
75
+ scopes(): Promise<Scope[]>;
76
+ /**
77
+ * Get or set Auto mode.
78
+ * @param vin
79
+ * @param value `true` enables it, `false` disables it, omit to read it.
80
+ */
81
+ server_side_polling(vin: string, value?: boolean | null): Promise<boolean | undefined>;
82
+ /** Force a refresh of the vehicle data. */
83
+ vehicle_data_refresh(vin: string): Promise<Record<string, any>>;
84
+ /**
85
+ * Migrate from an access token to OAuth.
86
+ * @param client_id
87
+ * @param name
88
+ * @returns The token response, with `expires_in` as an integer and `expires_at` in epoch seconds.
89
+ * @throws InvalidResponse when the reply has no usable `expires_in`.
90
+ */
91
+ migrate_to_oauth(client_id?: string, name?: string | null): Promise<Record<string, any>>;
92
+ /** Get streaming field parameters and metadata. */
93
+ fields(): Promise<Record<string, any>>;
94
+ /** Get the saved vehicle configuration. */
95
+ vehicle_config(vin: string): Promise<Record<string, any>>;
96
+ /** Get a vehicle's streaming configuration: certificate, hostname, port and configurable telemetry fields. */
97
+ streaming_config(vin: string): Promise<Record<string, any>>;
98
+ /** Stop streaming data from a vehicle. */
99
+ stop_streaming(vin: string): Promise<Record<string, any>>;
100
+ /**
101
+ * Modify a vehicle's streaming configuration.
102
+ * @param vin
103
+ * @param fields Fields to stream with their configuration.
104
+ */
105
+ modify_streaming_config(vin: string, fields: Record<string, any>): Promise<Record<string, any>>;
106
+ /**
107
+ * Create or update a vehicle's streaming configuration.
108
+ * @param vin
109
+ * @param fields Fields to stream with their configuration.
110
+ */
111
+ create_streaming_config(vin: string, fields: Record<string, any>): Promise<Record<string, any>>;
112
+ }
113
+ export {};
@@ -0,0 +1,181 @@
1
+ import { is_valid_region } from "./const.mjs";
2
+ import { InvalidResponse, TeslemetryRegistrationError } from "./exceptions.mjs";
3
+ import TeslaFleetApi from "./teslafleetapi.mjs";
4
+ import { TeslemetryEnergySites } from "./teslemetryenergy.mjs";
5
+ import { TeslemetryVehicles } from "./teslemetryvehicle.mjs";
6
+ // src/teslemetry.ts
7
+ /** Teslemetry's OAuth dynamic client registration endpoint. */
8
+ const REGISTER_URL = "https://api.teslemetry.com/oauth/register";
9
+ /**
10
+ * Dynamically register an OAuth client with Teslemetry (RFC 7591). This always
11
+ * registers a new client: the caller persists the `client_id` and skips
12
+ * registration on later runs.
13
+ * @param client_name Human-readable client name shown during consent.
14
+ * @param software_id Identifier for the calling application.
15
+ * @param software_version Version string for the calling application.
16
+ * @param options `fetch` replaces the global `fetch`; `timeout` aborts after this many milliseconds.
17
+ * @throws TeslemetryRegistrationError when the endpoint cannot be reached or
18
+ * refuses, the body is not JSON, or it has no usable `client_id`. The reason is in `data`.
19
+ */
20
+ async function register_client(client_name, software_id, software_version, options = {}) {
21
+ const unreachable = "Could not reach Teslemetry to register a client";
22
+ let text;
23
+ try {
24
+ const resp = await (options.fetch ?? fetch)(REGISTER_URL, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json" },
27
+ body: JSON.stringify({
28
+ client_name,
29
+ software_id,
30
+ software_version
31
+ }),
32
+ signal: options.timeout != null ? AbortSignal.timeout(options.timeout) : null
33
+ });
34
+ if (!resp.ok) throw new TeslemetryRegistrationError(unreachable, resp.status);
35
+ text = await resp.text();
36
+ } catch (error) {
37
+ if (error instanceof TeslemetryRegistrationError) throw error;
38
+ throw new TeslemetryRegistrationError(unreachable, null, { cause: error });
39
+ }
40
+ let registration;
41
+ try {
42
+ registration = JSON.parse(text);
43
+ } catch (error) {
44
+ throw new TeslemetryRegistrationError("Teslemetry returned a malformed registration response", null, { cause: error });
45
+ }
46
+ const raw = registration !== null && typeof registration === "object" && !Array.isArray(registration) ? registration : null;
47
+ const client_id = raw?.client_id;
48
+ if (raw === null || typeof client_id !== "string" || !client_id) throw new TeslemetryRegistrationError("Teslemetry registration response did not contain a client_id");
49
+ return {
50
+ client_id,
51
+ raw
52
+ };
53
+ }
54
+ var Teslemetry = class extends TeslaFleetApi {
55
+ static Vehicles = TeslemetryVehicles;
56
+ static EnergySites = TeslemetryEnergySites;
57
+ _transport_name = "teslemetry";
58
+ constructor(accessToken, region = "api", options = {}) {
59
+ super({
60
+ ...options,
61
+ accessToken,
62
+ server: `https://${region}.teslemetry.com`,
63
+ partnerScope: false
64
+ });
65
+ }
66
+ /**
67
+ * Set the server from the account's region in `metadata()`.
68
+ * @returns The region, e.g. `"na"`.
69
+ */
70
+ async find_server() {
71
+ const { region } = await this.metadata(true);
72
+ return region.toLowerCase();
73
+ }
74
+ async _response(resp) {
75
+ if (resp.headers.has("x-region")) {
76
+ const region = resp.headers.get("x-region")?.toLowerCase();
77
+ if (region) this.server = `https://${region}.teslemetry.com`;
78
+ }
79
+ return super._response(resp);
80
+ }
81
+ /** Send a ping. */
82
+ async ping() {
83
+ return this._request("GET", "api/ping");
84
+ }
85
+ /**
86
+ * Test the connection to Teslemetry
87
+ */
88
+ async test() {
89
+ return this._request("GET", "api/test");
90
+ }
91
+ /** Get userdata. */
92
+ async userdata() {
93
+ return this._request("GET", "api/userdata");
94
+ }
95
+ /**
96
+ * Get details about your Teslemetry account
97
+ * @param update_region Update the server URL based on the region in the metadata
98
+ */
99
+ async metadata(update_region = true) {
100
+ return this._request("GET", "api/metadata").then((metadata) => {
101
+ if (update_region && metadata.region) {
102
+ const region = metadata.region.toLowerCase();
103
+ if (is_valid_region(region)) this.region = region;
104
+ this.server = `https://${region}.teslemetry.com`;
105
+ this._log(`Using server ${this.server}`);
106
+ }
107
+ return metadata;
108
+ });
109
+ }
110
+ /** Get the user's scopes. Leaves the server unchanged. */
111
+ async scopes() {
112
+ return this.metadata(false).then(({ scopes }) => scopes);
113
+ }
114
+ /**
115
+ * Get or set Auto mode.
116
+ * @param vin
117
+ * @param value `true` enables it, `false` disables it, omit to read it.
118
+ */
119
+ async server_side_polling(vin, value) {
120
+ const method = value === true ? "POST" : value === false ? "DELETE" : "GET";
121
+ return this._request(method, `api/auto/${vin}`).then(({ response }) => response);
122
+ }
123
+ /** Force a refresh of the vehicle data. */
124
+ async vehicle_data_refresh(vin) {
125
+ return this._request("GET", `api/refresh/${vin}`);
126
+ }
127
+ /**
128
+ * Migrate from an access token to OAuth.
129
+ * @param client_id
130
+ * @param name
131
+ * @returns The token response, with `expires_in` as an integer and `expires_at` in epoch seconds.
132
+ * @throws InvalidResponse when the reply has no usable `expires_in`.
133
+ */
134
+ async migrate_to_oauth(client_id = "homeassistant", name) {
135
+ const access_token = await this.access_token();
136
+ const new_token = await this._request("POST", "oauth/token", null, {
137
+ grant_type: "migrate",
138
+ client_id,
139
+ access_token: access_token.trim(),
140
+ name
141
+ });
142
+ const expires_in = Math.trunc(new_token?.expires_in == null ? NaN : Number(new_token.expires_in));
143
+ if (!Number.isFinite(expires_in)) throw new InvalidResponse("Teslemetry token response did not contain a valid expires_in");
144
+ new_token.expires_in = expires_in;
145
+ new_token.expires_at = Date.now() / 1e3 + expires_in;
146
+ return new_token;
147
+ }
148
+ /** Get streaming field parameters and metadata. */
149
+ async fields() {
150
+ return this._request("GET", "fields.json");
151
+ }
152
+ /** Get the saved vehicle configuration. */
153
+ async vehicle_config(vin) {
154
+ return this._request("GET", `api/vehicle_config/${vin}`);
155
+ }
156
+ /** Get a vehicle's streaming configuration: certificate, hostname, port and configurable telemetry fields. */
157
+ async streaming_config(vin) {
158
+ return this._request("GET", `api/config/${vin}`);
159
+ }
160
+ /** Stop streaming data from a vehicle. */
161
+ async stop_streaming(vin) {
162
+ return this._request("DELETE", `api/config/${vin}`);
163
+ }
164
+ /**
165
+ * Modify a vehicle's streaming configuration.
166
+ * @param vin
167
+ * @param fields Fields to stream with their configuration.
168
+ */
169
+ async modify_streaming_config(vin, fields) {
170
+ return this._request("PATCH", `api/config/${vin}`, null, { fields });
171
+ }
172
+ /**
173
+ * Create or update a vehicle's streaming configuration.
174
+ * @param vin
175
+ * @param fields Fields to stream with their configuration.
176
+ */
177
+ async create_streaming_config(vin, fields) {
178
+ return this._request("POST", `api/config/${vin}`, null, { fields });
179
+ }
180
+ };
181
+ export { REGISTER_URL, Teslemetry as default, register_client };