@camstack/addon-provider-bosch 0.1.20 → 0.1.22

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.
@@ -1,4 +1,4 @@
1
- import { A as number, C as customAction, D as _enum, I as EventCategory, N as string, O as array, _ as temperatureSensorCapability, b as DeviceType, g as switchCapability, i as batteryCapability, j as object, k as literal, l as deviceAdoptionCapability, n as BaseDeviceProvider, o as climateControlCapability, p as heatingValveCapability, s as connectionTestCapability, t as BaseDevice, w as defineCustomActions, x as errMsg } from "../dist-B75tWQLF.mjs";
1
+ import { A as _enum, C as DeviceType, D as defineCustomActions, E as customAction, I as string, M as literal, N as number, P as object, a as batteryCapability, b as temperatureSensorCapability, c as connectionTestCapability, j as array, m as heatingValveCapability, n as BaseDeviceProvider, s as climateControlCapability, t as BaseDevice, u as deviceAdoptionCapability, w as errMsg, y as switchCapability, z as EventCategory } from "../dist-DGlq0nuG.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { request } from "node:https";
@@ -6,24 +6,38 @@ import { execFileSync } from "node:child_process";
6
6
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
7
7
  import { tmpdir } from "node:os";
8
8
  import { join } from "node:path";
9
+ import { createSocket } from "node:dgram";
9
10
  import { connect } from "node:net";
10
11
  //#region \0rolldown/runtime.js
11
12
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
12
13
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
13
14
  //#endregion
14
15
  //#region src/shc/custom-actions.ts
15
- var boschShcActions = defineCustomActions({ registerClient: customAction(object({
16
- host: string().min(1),
17
- systemPassword: string().min(1)
18
- }), object({
19
- sslCertificate: string().min(1),
20
- sslKey: string().min(1),
21
- token: string().min(1),
22
- summary: string()
23
- }), {
24
- kind: "mutation",
25
- auth: "admin"
26
- }) });
16
+ var boschShcActions = defineCustomActions({
17
+ discoverController: customAction(object({}), object({
18
+ hosts: array(object({
19
+ host: string(),
20
+ name: string()
21
+ })),
22
+ summary: string()
23
+ }), {
24
+ kind: "mutation",
25
+ auth: "admin"
26
+ }),
27
+ registerClient: customAction(object({
28
+ host: string().optional(),
29
+ hostManual: string().optional(),
30
+ systemPassword: string().min(1)
31
+ }), object({
32
+ sslCertificate: string().min(1).meta({ secret: true }),
33
+ sslKey: string().min(1).meta({ secret: true }),
34
+ token: string().min(1).meta({ secret: true }),
35
+ summary: string()
36
+ }), {
37
+ kind: "mutation",
38
+ auth: "admin"
39
+ })
40
+ });
27
41
  //#endregion
28
42
  //#region src/shc/config.ts
29
43
  /** Operator settings for one SHC integration (local mTLS + optional token). */
@@ -47,30 +61,48 @@ function buildConnectionFormSchema() {
47
61
  return { sections: [{
48
62
  id: "connection",
49
63
  title: "Smart Home Controller",
50
- titleKey: "bosch-shc:connection.s_connection.title",
64
+ titleKey: "provider-bosch:shc.s_connection.title",
51
65
  description: "Local REST access to your Bosch Smart Home Controller.",
52
- descriptionKey: "bosch-shc:connection.s_connection.description",
66
+ descriptionKey: "provider-bosch:shc.s_connection.description",
53
67
  columns: 1,
54
68
  fields: [
69
+ {
70
+ type: "addon-action-select",
71
+ addonId: "bosch-shc",
72
+ key: "__shc-discovered",
73
+ writesKey: "host",
74
+ omitFromSettings: true,
75
+ label: "Controller",
76
+ labelKey: "provider-bosch:shc.s_connection.__shc-discovered.label",
77
+ action: "discoverController",
78
+ mapOption: {
79
+ value: "host",
80
+ label: "name"
81
+ },
82
+ hideWhenFewerThan: 2,
83
+ emptyResultsMessage: "No controller found on the network."
84
+ },
55
85
  {
56
86
  type: "text",
57
87
  key: "host",
58
88
  label: "Host",
59
- labelKey: "bosch-shc:connection.s_connection.host.label",
60
- required: true,
89
+ labelKey: "provider-bosch:shc.s_connection.host.label",
90
+ description: "Filled when one controller is found. Type the address if it is not.",
91
+ descriptionKey: "provider-bosch:shc.s_connection.host.description",
92
+ required: false,
61
93
  placeholder: "192.168.1.50"
62
94
  },
63
95
  {
64
96
  type: "info",
65
97
  key: "__shc-pairing-hint",
66
98
  label: "Pair with the controller",
67
- content: "Enter the password you created in the Bosch Smart Home app (not the code printed on the controller). Then hold the pairing button until the LED blinks, and press Register on controller."
99
+ content: "Press the button on the controller until the LED blinks. Enter the password you created in the Bosch Smart Home app, not the code printed on the controller, then register."
68
100
  },
69
101
  {
70
102
  type: "password",
71
103
  key: "systemPassword",
72
104
  label: "System password",
73
- labelKey: "bosch-shc:connection.s_connection.systemPassword.label",
105
+ labelKey: "provider-bosch:shc.s_connection.systemPassword.label",
74
106
  required: true,
75
107
  showToggle: true
76
108
  },
@@ -93,13 +125,46 @@ function buildConnectionFormSchema() {
93
125
  },
94
126
  successMessage: "{summary}"
95
127
  },
128
+ {
129
+ type: "group",
130
+ key: "__shc-advanced",
131
+ label: "Advanced",
132
+ labelKey: "provider-bosch:shc.s_connection.__shc-advanced.label",
133
+ style: "accordion",
134
+ defaultCollapsed: true,
135
+ fields: [{
136
+ type: "secret-presence",
137
+ key: "__shc-registered",
138
+ label: "Client registration",
139
+ sourceKey: "sslCertificate",
140
+ yesLabel: "Client registered: yes",
141
+ noLabel: "Client registered: no"
142
+ }, {
143
+ type: "addon-action-button",
144
+ addonId: "bosch-shc",
145
+ key: "__shc-reregister",
146
+ label: "Register again",
147
+ buttonLabel: "Register again",
148
+ action: "registerClient",
149
+ paramsFromForm: {
150
+ host: "host",
151
+ systemPassword: "systemPassword"
152
+ },
153
+ assignResult: {
154
+ sslCertificate: "sslCertificate",
155
+ sslKey: "sslKey",
156
+ token: "token"
157
+ },
158
+ successMessage: "{summary}"
159
+ }]
160
+ },
96
161
  {
97
162
  type: "password",
98
163
  key: "token",
99
164
  label: "Controller token",
100
- labelKey: "bosch-shc:connection.s_connection.token.label",
101
- required: true,
102
- showToggle: true,
165
+ labelKey: "provider-bosch:shc.s_connection.token.label",
166
+ required: false,
167
+ showToggle: false,
103
168
  showWhen: {
104
169
  field: "host",
105
170
  equals: SHC_PAIRING_ONLY_SHOW_WHEN
@@ -109,8 +174,8 @@ function buildConnectionFormSchema() {
109
174
  type: "password",
110
175
  key: "sslCertificate",
111
176
  label: "Client certificate (PEM)",
112
- labelKey: "bosch-shc:connection.s_connection.sslCertificate.label",
113
- required: true,
177
+ labelKey: "provider-bosch:shc.s_connection.sslCertificate.label",
178
+ required: false,
114
179
  showToggle: true,
115
180
  showWhen: {
116
181
  field: "host",
@@ -121,8 +186,8 @@ function buildConnectionFormSchema() {
121
186
  type: "password",
122
187
  key: "sslKey",
123
188
  label: "Client private key (PEM)",
124
- labelKey: "bosch-shc:connection.s_connection.sslKey.label",
125
- required: true,
189
+ labelKey: "provider-bosch:shc.s_connection.sslKey.label",
190
+ required: false,
126
191
  showToggle: true,
127
192
  showWhen: {
128
193
  field: "host",
@@ -266,6 +331,211 @@ async function registerShcClient(deps) {
266
331
  };
267
332
  }
268
333
  //#endregion
334
+ //#region src/shc/shc-controller-discovery.ts
335
+ var SHC_MDNS_SERVICE = "_http._tcp.local";
336
+ var SHC_CONTROLLER_NAME_PREFIX = "Bosch SHC";
337
+ var SHC_DISCOVERY_TIMEOUT_MS = 1500;
338
+ var MDNS_PORT = 5353;
339
+ var MDNS_ADDRESS = "224.0.0.251";
340
+ var PTR = 12;
341
+ var A = 1;
342
+ var SRV = 33;
343
+ function isShcControllerName(name) {
344
+ return (name.split("._")[0] ?? name).toLowerCase().startsWith(SHC_CONTROLLER_NAME_PREFIX.toLowerCase());
345
+ }
346
+ function readName(buf, start) {
347
+ const labels = [];
348
+ let pos = start;
349
+ let end = start;
350
+ let jumped = false;
351
+ for (let hops = 0; hops < 16; hops++) {
352
+ if (pos < 0 || pos >= buf.length) return null;
353
+ const len = buf[pos] ?? 0;
354
+ if (len === 0) {
355
+ if (!jumped) end = pos + 1;
356
+ return {
357
+ name: labels.join("."),
358
+ end
359
+ };
360
+ }
361
+ if ((len & 192) === 192) {
362
+ if (pos + 1 >= buf.length) return null;
363
+ if (!jumped) end = pos + 2;
364
+ jumped = true;
365
+ pos = (len & 63) << 8 | (buf[pos + 1] ?? 0);
366
+ continue;
367
+ }
368
+ if ((len & 192) !== 0 || pos + 1 + len > buf.length) return null;
369
+ labels.push(buf.subarray(pos + 1, pos + 1 + len).toString("utf8"));
370
+ pos += 1 + len;
371
+ if (!jumped) end = pos;
372
+ }
373
+ return null;
374
+ }
375
+ function readRecords(buf, offset, count) {
376
+ const records = [];
377
+ let pos = offset;
378
+ for (let i = 0; i < count; i++) {
379
+ const name = readName(buf, pos);
380
+ if (name === null || name.end + 10 > buf.length) return null;
381
+ const type = buf.readUInt16BE(name.end);
382
+ const dataLength = buf.readUInt16BE(name.end + 8);
383
+ const dataOffset = name.end + 10;
384
+ if (dataOffset + dataLength > buf.length) return null;
385
+ records.push({
386
+ name: name.name,
387
+ type,
388
+ message: buf,
389
+ dataOffset,
390
+ dataLength
391
+ });
392
+ pos = dataOffset + dataLength;
393
+ }
394
+ return {
395
+ records,
396
+ next: pos
397
+ };
398
+ }
399
+ function ipv4(buf, offset, length) {
400
+ if (length !== 4 || offset + 4 > buf.length) return null;
401
+ return `${buf[offset] ?? 0}.${buf[offset + 1] ?? 0}.${buf[offset + 2] ?? 0}.${buf[offset + 3] ?? 0}`;
402
+ }
403
+ function hostsFromRecords(records) {
404
+ const instances = [];
405
+ const srv = /* @__PURE__ */ new Map();
406
+ const addresses = /* @__PURE__ */ new Map();
407
+ for (const rec of records) {
408
+ const key = rec.name.toLowerCase();
409
+ if (rec.type === PTR) {
410
+ const target = readName(rec.message, rec.dataOffset);
411
+ if (target !== null && isShcControllerName(target.name)) instances.push(target.name);
412
+ } else if (rec.type === SRV && rec.dataLength >= 6) {
413
+ const target = readName(rec.message, rec.dataOffset + 6);
414
+ if (target !== null) srv.set(key, target.name);
415
+ } else if (rec.type === A) {
416
+ const ip = ipv4(rec.message, rec.dataOffset, rec.dataLength);
417
+ if (ip !== null) addresses.set(key, ip);
418
+ }
419
+ }
420
+ const out = [];
421
+ const seen = /* @__PURE__ */ new Set();
422
+ for (const instance of instances) {
423
+ const viaSrv = srv.get(instance.toLowerCase());
424
+ const host = (viaSrv !== void 0 ? addresses.get(viaSrv.toLowerCase()) : void 0) ?? addresses.get(instance.toLowerCase());
425
+ if (host === void 0 || seen.has(host)) continue;
426
+ seen.add(host);
427
+ const label = instance.split("._")[0] ?? instance;
428
+ out.push({
429
+ host,
430
+ name: label
431
+ });
432
+ }
433
+ return out;
434
+ }
435
+ /** Hosts advertised as a Bosch Smart Home Controller on one mDNS message. */
436
+ function shcHostsFromDnsMessage(buf) {
437
+ if (buf.length < 12) return [];
438
+ const questions = buf.readUInt16BE(4);
439
+ const answers = buf.readUInt16BE(6);
440
+ const authorities = buf.readUInt16BE(8);
441
+ const extra = buf.readUInt16BE(10);
442
+ let pos = 12;
443
+ for (let i = 0; i < questions; i++) {
444
+ const name = readName(buf, pos);
445
+ if (name === null) return [];
446
+ pos = name.end + 4;
447
+ if (pos > buf.length) return [];
448
+ }
449
+ const answerRecords = readRecords(buf, pos, answers);
450
+ if (answerRecords === null) return [];
451
+ const authorityRecords = readRecords(buf, answerRecords.next, authorities);
452
+ if (authorityRecords === null) return [];
453
+ const extraRecords = readRecords(buf, authorityRecords.next, extra);
454
+ if (extraRecords === null) return [];
455
+ return hostsFromRecords([
456
+ ...answerRecords.records,
457
+ ...authorityRecords.records,
458
+ ...extraRecords.records
459
+ ]);
460
+ }
461
+ function mdnsPtrQuery(service) {
462
+ const encoded = service.split(".").filter((part) => part.length > 0).map((label) => Buffer.concat([Buffer.from([label.length]), Buffer.from(label)]));
463
+ const header = Buffer.alloc(12);
464
+ header.writeUInt16BE(1, 4);
465
+ const tail = Buffer.alloc(4);
466
+ tail.writeUInt16BE(PTR, 0);
467
+ tail.writeUInt16BE(1, 2);
468
+ return Buffer.concat([
469
+ header,
470
+ ...encoded,
471
+ Buffer.from([0]),
472
+ tail
473
+ ]);
474
+ }
475
+ function closeQuietly(socket) {
476
+ try {
477
+ socket.close();
478
+ } catch {}
479
+ }
480
+ function exchangeMdns(query, timeoutMs) {
481
+ return new Promise((resolve) => {
482
+ let socket;
483
+ try {
484
+ socket = createSocket({
485
+ type: "udp4",
486
+ reuseAddr: true
487
+ });
488
+ } catch {
489
+ resolve([]);
490
+ return;
491
+ }
492
+ const packets = [];
493
+ let settled = false;
494
+ const finish = () => {
495
+ if (settled) return;
496
+ settled = true;
497
+ closeQuietly(socket);
498
+ resolve(packets);
499
+ };
500
+ socket.on("error", () => finish());
501
+ socket.on("message", (msg) => {
502
+ packets.push(Buffer.from(msg));
503
+ });
504
+ socket.bind(0, () => {
505
+ try {
506
+ socket.send(query, MDNS_PORT, MDNS_ADDRESS);
507
+ } catch {
508
+ finish();
509
+ }
510
+ });
511
+ setTimeout(finish, timeoutMs);
512
+ });
513
+ }
514
+ async function browseShcControllers(exchange = exchangeMdns) {
515
+ let packets;
516
+ try {
517
+ packets = await exchange(mdnsPtrQuery(SHC_MDNS_SERVICE), SHC_DISCOVERY_TIMEOUT_MS);
518
+ } catch {
519
+ return [];
520
+ }
521
+ const hosts = [];
522
+ const seen = /* @__PURE__ */ new Set();
523
+ for (const packet of packets) for (const found of shcHostsFromDnsMessage(packet)) {
524
+ if (seen.has(found.host)) continue;
525
+ seen.add(found.host);
526
+ hosts.push(found);
527
+ }
528
+ return hosts;
529
+ }
530
+ /** Manual host wins. Otherwise the address discovery filled in. */
531
+ function resolveShcPairingHost(input) {
532
+ const manual = input.hostManual?.trim() ?? "";
533
+ if (manual.length > 0) return manual;
534
+ const host = input.host?.trim() ?? "";
535
+ if (host.length > 0) return host;
536
+ throw new Error("Enter the controller host or IP address.");
537
+ }
538
+ //#endregion
269
539
  //#region src/shc/shc-domain-mapping.ts
270
540
  var ROOM_CLIMATE_MODEL = "ROOM_CLIMATE_CONTROL";
271
541
  /** Classify a normalised device summary into an adoption / driver kind. */
@@ -23547,18 +23817,41 @@ var BoschShcProviderAddon = class extends BaseDeviceProvider {
23547
23817
  }
23548
23818
  ],
23549
23819
  customActions: boschShcActions,
23550
- actionHandlers: { registerClient: async (input) => {
23551
- const { sslCertificate, sslKey, token } = await registerShcClient({
23552
- host: input.host,
23553
- systemPassword: input.systemPassword
23554
- });
23555
- return {
23556
- sslCertificate,
23557
- sslKey,
23558
- token,
23559
- summary: "CamStack is registered with your Smart Home Controller."
23560
- };
23561
- } }
23820
+ actionHandlers: {
23821
+ discoverController: async () => {
23822
+ try {
23823
+ const hosts = await browseShcControllers();
23824
+ return {
23825
+ hosts: hosts.map((found) => ({
23826
+ host: found.host,
23827
+ name: found.name
23828
+ })),
23829
+ summary: hosts.length === 0 ? "No controller found on the network." : `Found ${hosts.length} controller${hosts.length === 1 ? "" : "s"}.`
23830
+ };
23831
+ } catch (err) {
23832
+ this.ctx.logger.warn("SHC controller discovery failed", { meta: { error: errMsg(err) } });
23833
+ return {
23834
+ hosts: [],
23835
+ summary: "No controller found on the network."
23836
+ };
23837
+ }
23838
+ },
23839
+ registerClient: async (input) => {
23840
+ const { sslCertificate, sslKey, token } = await registerShcClient({
23841
+ host: resolveShcPairingHost({
23842
+ host: input.host,
23843
+ hostManual: input.hostManual
23844
+ }),
23845
+ systemPassword: input.systemPassword
23846
+ });
23847
+ return {
23848
+ sslCertificate,
23849
+ sslKey,
23850
+ token,
23851
+ summary: "CamStack is registered with your Smart Home Controller."
23852
+ };
23853
+ }
23854
+ }
23562
23855
  };
23563
23856
  }
23564
23857
  async onShutdown() {
package/i18n/en.json CHANGED
@@ -3,29 +3,33 @@
3
3
  "bosch-home-connect.name": "Bosch Home Connect",
4
4
  "bosch-homecom.name": "Bosch HomeCom",
5
5
  "homecom.s_account.title": "HomeCom account",
6
- "homecom.s_account.description": "Sign in with your SingleKey ID, then paste the address the browser stops on (com.bosch.tt.dashtt.pointt://app/login?code=…). Find it in DevTools > Network.",
7
- "homecom.s_account.__homecom-begin.label": "HomeCom",
8
- "homecom.s_account.authorizeUrl.label": "Login link",
9
- "homecom.s_account.callback.label": "Redirect address or code",
10
- "homecom.s_account.state.label": "Login state",
11
- "homecom.s_account.verifier.label": "Login verifier",
12
- "homecom.s_account.__homecom-finish.label": "Finish",
13
- "homecom.s_account.username.label": "Account",
14
- "homecom.s_account.token.label": "Access token (filled by sign-in, or paste one)",
15
- "homecom.s_account.refresh.label": "Refresh token (filled by sign-in, or paste one)",
6
+ "homecom.s_account.description": "Sign in with your SingleKey ID. Bosch opens its app address; paste that address here.",
7
+ "homecom.s_account.__homecom-sign-in.label": "HomeCom",
8
+ "homecom.s_account.accountLabel.label": "Account",
9
+ "homecom.s_account.gatewayCount.label": "Gateways",
10
+ "homecom.s_account.username.label": "Account email",
11
+ "homecom.s_account.__homecom-advanced.label": "Advanced",
12
+ "homecom.s_account.token.label": "Access token",
13
+ "homecom.s_account.refresh.label": "Refresh token",
16
14
  "homecom.s_account.gatewayId.label": "Gateway id",
17
- "homecom.s_account.gatewayId.description": "Leave empty to use the first gateway of the account; the chosen one is stored here. For a second gateway add another HomeCom account entry and enter its id.",
18
15
  "homecom.s_account.brand.label": "Brand",
19
16
  "homecom.s_account.region.label": "Region",
20
17
  "home-connect.s_gateway.title": "Home Connect",
21
- "home-connect.s_gateway.description": "Open the login link, sign in, then paste the address the browser stops on (hcauth://auth/prod?code=…). Chrome: DevTools > Network > last redirect > Location.",
22
- "home-connect.s_gateway.__home-connect-begin.label": "Home Connect",
23
- "home-connect.s_gateway.authorizeUrl.label": "Login link",
24
- "home-connect.s_gateway.callback.label": "Redirect address or code",
25
- "home-connect.s_gateway.state.label": "Login state",
26
- "home-connect.s_gateway.verifier.label": "Login verifier",
27
- "home-connect.s_gateway.__home-connect-finish.label": "Finish",
18
+ "home-connect.s_gateway.description": "Sign in with your Home Connect account. Paste the address the browser stops on (hcauth://auth/prod?code=…).",
19
+ "home-connect.s_gateway.__home-connect-sign-in.label": "Home Connect",
20
+ "home-connect.s_gateway.accountLabel.label": "Account",
21
+ "home-connect.s_gateway.appliances.label": "Appliances",
22
+ "home-connect.s_gateway.__home-connect-advanced.label": "Advanced",
28
23
  "home-connect.s_gateway.token.label": "Access token",
29
24
  "home-connect.s_gateway.refresh.label": "Refresh token",
30
- "home-connect.s_gateway.appliances.label": "Appliances"
25
+ "shc.s_connection.title": "Smart Home Controller",
26
+ "shc.s_connection.description": "Local REST access to your Bosch Smart Home Controller.",
27
+ "shc.s_connection.__shc-discovered.label": "Controller",
28
+ "shc.s_connection.host.label": "Host",
29
+ "shc.s_connection.host.description": "Filled when one controller is found. Type the address if it is not.",
30
+ "shc.s_connection.systemPassword.label": "System password",
31
+ "shc.s_connection.__shc-advanced.label": "Advanced",
32
+ "shc.s_connection.token.label": "Controller token",
33
+ "shc.s_connection.sslCertificate.label": "Client certificate (PEM)",
34
+ "shc.s_connection.sslKey.label": "Client private key (PEM)"
31
35
  }
package/i18n/it.json CHANGED
@@ -3,29 +3,33 @@
3
3
  "bosch-home-connect.name": "Bosch Home Connect",
4
4
  "bosch-homecom.name": "Bosch HomeCom",
5
5
  "homecom.s_account.title": "Account HomeCom",
6
- "homecom.s_account.description": "Accedi con il tuo SingleKey ID, poi incolla l'indirizzo su cui si ferma il browser (com.bosch.tt.dashtt.pointt://app/login?code=…). Lo trovi in DevTools > Network.",
7
- "homecom.s_account.__homecom-begin.label": "HomeCom",
8
- "homecom.s_account.authorizeUrl.label": "Link di accesso",
9
- "homecom.s_account.callback.label": "Indirizzo di reindirizzamento o codice",
10
- "homecom.s_account.state.label": "Stato dell'accesso",
11
- "homecom.s_account.verifier.label": "Verificatore dell'accesso",
12
- "homecom.s_account.__homecom-finish.label": "Termina",
13
- "homecom.s_account.username.label": "Account",
14
- "homecom.s_account.token.label": "Token di accesso (compilato dall'accesso, o incollane uno)",
15
- "homecom.s_account.refresh.label": "Token di rinnovo (compilato dall'accesso, o incollane uno)",
6
+ "homecom.s_account.description": "Accedi con il tuo SingleKey ID. Bosch apre l'indirizzo dell'app; incolla qui quell'indirizzo.",
7
+ "homecom.s_account.__homecom-sign-in.label": "HomeCom",
8
+ "homecom.s_account.accountLabel.label": "Account",
9
+ "homecom.s_account.gatewayCount.label": "Gateway",
10
+ "homecom.s_account.username.label": "Email dell'account",
11
+ "homecom.s_account.__homecom-advanced.label": "Avanzate",
12
+ "homecom.s_account.token.label": "Token di accesso",
13
+ "homecom.s_account.refresh.label": "Token di rinnovo",
16
14
  "homecom.s_account.gatewayId.label": "Id del gateway",
17
- "homecom.s_account.gatewayId.description": "Lascia vuoto per usare il primo gateway dell'account; quello scelto viene salvato qui. Per un secondo gateway aggiungi un'altra voce account HomeCom e inserisci il suo id.",
18
15
  "homecom.s_account.brand.label": "Marchio",
19
16
  "homecom.s_account.region.label": "Regione",
20
17
  "home-connect.s_gateway.title": "Home Connect",
21
- "home-connect.s_gateway.description": "Apri il link di accesso, accedi, poi incolla l'indirizzo su cui si ferma il browser (hcauth://auth/prod?code=…). Chrome: DevTools > Network > ultimo redirect > Location.",
22
- "home-connect.s_gateway.__home-connect-begin.label": "Home Connect",
23
- "home-connect.s_gateway.authorizeUrl.label": "Link di accesso",
24
- "home-connect.s_gateway.callback.label": "Indirizzo di reindirizzamento o codice",
25
- "home-connect.s_gateway.state.label": "Stato dell'accesso",
26
- "home-connect.s_gateway.verifier.label": "Verificatore dell'accesso",
27
- "home-connect.s_gateway.__home-connect-finish.label": "Termina",
18
+ "home-connect.s_gateway.description": "Accedi con il tuo account Home Connect. Incolla l'indirizzo su cui si ferma il browser (hcauth://auth/prod?code=…).",
19
+ "home-connect.s_gateway.__home-connect-sign-in.label": "Home Connect",
20
+ "home-connect.s_gateway.accountLabel.label": "Account",
21
+ "home-connect.s_gateway.appliances.label": "Elettrodomestici",
22
+ "home-connect.s_gateway.__home-connect-advanced.label": "Avanzate",
28
23
  "home-connect.s_gateway.token.label": "Token di accesso",
29
24
  "home-connect.s_gateway.refresh.label": "Token di rinnovo",
30
- "home-connect.s_gateway.appliances.label": "Elettrodomestici"
25
+ "shc.s_connection.title": "Smart Home Controller",
26
+ "shc.s_connection.description": "Accesso REST locale al Bosch Smart Home Controller.",
27
+ "shc.s_connection.__shc-discovered.label": "Controller",
28
+ "shc.s_connection.host.label": "Host",
29
+ "shc.s_connection.host.description": "Compilato quando viene trovato un controller. Digita l'indirizzo se non lo è.",
30
+ "shc.s_connection.systemPassword.label": "Password di sistema",
31
+ "shc.s_connection.__shc-advanced.label": "Avanzate",
32
+ "shc.s_connection.token.label": "Token del controller",
33
+ "shc.s_connection.sslCertificate.label": "Certificato client (PEM)",
34
+ "shc.s_connection.sslKey.label": "Chiave privata client (PEM)"
31
35
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-bosch",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "Bosch smart-home device-provider addons for CamStack — SHC, Home Connect, and HomeCom cloud integrations (scaffold)",
5
5
  "keywords": [
6
6
  "camstack",
@@ -84,6 +84,9 @@
84
84
  },
85
85
  {
86
86
  "name": "consumables"
87
+ },
88
+ {
89
+ "name": "running-state"
87
90
  }
88
91
  ]
89
92
  },