@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.
- package/dist/{account-integration-offline-DvuqXgc8.mjs → account-integration-offline-34gaYDfb.mjs} +44 -2
- package/dist/{account-integration-offline-7DUtQrPy.js → account-integration-offline-DZLHsBZF.js} +55 -1
- package/dist/{dist-CYBUFKeW.js → dist-CRlugVId.js} +569 -104
- package/dist/{dist-B75tWQLF.mjs → dist-DGlq0nuG.mjs} +552 -105
- package/dist/home-connect/addon.js +128 -106
- package/dist/home-connect/addon.mjs +128 -106
- package/dist/homecom/addon.js +557 -433
- package/dist/homecom/addon.mjs +557 -433
- package/dist/shc/addon.js +331 -38
- package/dist/shc/addon.mjs +331 -38
- package/i18n/en.json +23 -19
- package/i18n/it.json +23 -19
- package/package.json +4 -1
package/dist/shc/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as
|
|
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({
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
64
|
+
titleKey: "provider-bosch:shc.s_connection.title",
|
|
51
65
|
description: "Local REST access to your Bosch Smart Home Controller.",
|
|
52
|
-
descriptionKey: "bosch
|
|
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
|
|
60
|
-
|
|
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
|
|
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
|
|
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
|
|
101
|
-
required:
|
|
102
|
-
showToggle:
|
|
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
|
|
113
|
-
required:
|
|
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
|
|
125
|
-
required:
|
|
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: {
|
|
23551
|
-
|
|
23552
|
-
|
|
23553
|
-
|
|
23554
|
-
|
|
23555
|
-
|
|
23556
|
-
|
|
23557
|
-
|
|
23558
|
-
|
|
23559
|
-
|
|
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
|
|
7
|
-
"homecom.s_account.__homecom-
|
|
8
|
-
"homecom.s_account.
|
|
9
|
-
"homecom.s_account.
|
|
10
|
-
"homecom.s_account.
|
|
11
|
-
"homecom.s_account.
|
|
12
|
-
"homecom.s_account.
|
|
13
|
-
"homecom.s_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": "
|
|
22
|
-
"home-connect.s_gateway.__home-connect-
|
|
23
|
-
"home-connect.s_gateway.
|
|
24
|
-
"home-connect.s_gateway.
|
|
25
|
-
"home-connect.s_gateway.
|
|
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
|
-
"
|
|
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
|
|
7
|
-
"homecom.s_account.__homecom-
|
|
8
|
-
"homecom.s_account.
|
|
9
|
-
"homecom.s_account.
|
|
10
|
-
"homecom.s_account.
|
|
11
|
-
"homecom.s_account.
|
|
12
|
-
"homecom.s_account.
|
|
13
|
-
"homecom.s_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": "
|
|
22
|
-
"home-connect.s_gateway.__home-connect-
|
|
23
|
-
"home-connect.s_gateway.
|
|
24
|
-
"home-connect.s_gateway.
|
|
25
|
-
"home-connect.s_gateway.
|
|
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
|
-
"
|
|
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.
|
|
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
|
},
|