@nubisco/openbridge 0.29.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.
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/__tests__/homekit-service-type.test.d.ts +2 -0
- package/dist/__tests__/homekit-service-type.test.d.ts.map +1 -0
- package/dist/__tests__/homekit-service-type.test.js +239 -0
- package/dist/__tests__/homekit-service-type.test.js.map +1 -0
- package/dist/__tests__/homekit-visibility.test.d.ts +2 -0
- package/dist/__tests__/homekit-visibility.test.d.ts.map +1 -0
- package/dist/__tests__/homekit-visibility.test.js +157 -0
- package/dist/__tests__/homekit-visibility.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +837 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/timeseries.test.d.ts +2 -0
- package/dist/__tests__/timeseries.test.d.ts.map +1 -0
- package/dist/__tests__/timeseries.test.js +216 -0
- package/dist/__tests__/timeseries.test.js.map +1 -0
- package/dist/auth.d.ts +23 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +171 -0
- package/dist/auth.js.map +1 -0
- package/dist/daemon.d.ts +57 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +636 -0
- package/dist/daemon.js.map +1 -0
- package/dist/homekit-service-type.d.ts +82 -0
- package/dist/homekit-service-type.d.ts.map +1 -0
- package/dist/homekit-service-type.js +184 -0
- package/dist/homekit-service-type.js.map +1 -0
- package/dist/homekit-visibility.d.ts +79 -0
- package/dist/homekit-visibility.d.ts.map +1 -0
- package/dist/homekit-visibility.js +164 -0
- package/dist/homekit-visibility.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +17 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +52 -0
- package/dist/metrics.js.map +1 -0
- package/dist/platform-client.d.ts +42 -0
- package/dist/platform-client.d.ts.map +1 -0
- package/dist/platform-client.js +92 -0
- package/dist/platform-client.js.map +1 -0
- package/dist/server.d.ts +30 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1744 -0
- package/dist/server.js.map +1 -0
- package/dist/timeseries.d.ts +134 -0
- package/dist/timeseries.d.ts.map +1 -0
- package/dist/timeseries.js +378 -0
- package/dist/timeseries.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +28 -0
- package/dist/version.js.map +1 -0
- package/package.json +79 -0
- package/scripts/entrypoint.sh +82 -0
- package/scripts/fix-node-pty.mjs +22 -0
- package/ui-dist/android-chrome-192x192.png +0 -0
- package/ui-dist/android-chrome-512x512.png +0 -0
- package/ui-dist/apple-touch-icon.png +0 -0
- package/ui-dist/assets/index-Q0sxZHIR.css +32 -0
- package/ui-dist/assets/index-ZZYyAzBo.js +106 -0
- package/ui-dist/favicon-16x16.png +0 -0
- package/ui-dist/favicon-32x32.png +0 -0
- package/ui-dist/favicon.ico +0 -0
- package/ui-dist/fonts/MesloLGLDZNerdFontMono-Bold.woff2 +0 -0
- package/ui-dist/fonts/MesloLGLDZNerdFontMono-BoldItalic.woff2 +0 -0
- package/ui-dist/fonts/MesloLGLDZNerdFontMono-Italic.woff2 +0 -0
- package/ui-dist/fonts/MesloLGLDZNerdFontMono-Regular.woff2 +0 -0
- package/ui-dist/index.html +18 -0
- package/ui-dist/logo.svg +30 -0
- package/ui-dist/nubisco-logo.svg +120 -0
- package/ui-dist/site.webmanifest +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service types that are interchangeable: each requires exactly `Name` + `On`,
|
|
3
|
+
* so one can stand in for another without inventing or dropping state.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately excluded, despite looking like near neighbours: `Fanv2` and
|
|
6
|
+
* `Valve` are built on `Active` rather than `On` (and `Valve` additionally
|
|
7
|
+
* requires `InUse` and `ValveType`), so they are not drop-in substitutes.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CONVERTIBLE_SERVICES: {
|
|
10
|
+
readonly switch: {
|
|
11
|
+
readonly uuid: "00000049-0000-1000-8000-0026BB765291";
|
|
12
|
+
readonly service: "Switch";
|
|
13
|
+
readonly label: "Switch";
|
|
14
|
+
readonly category: 8;
|
|
15
|
+
};
|
|
16
|
+
readonly light: {
|
|
17
|
+
readonly uuid: "00000043-0000-1000-8000-0026BB765291";
|
|
18
|
+
readonly service: "Lightbulb";
|
|
19
|
+
readonly label: "Light";
|
|
20
|
+
readonly category: 5;
|
|
21
|
+
};
|
|
22
|
+
readonly outlet: {
|
|
23
|
+
readonly uuid: "00000047-0000-1000-8000-0026BB765291";
|
|
24
|
+
readonly service: "Outlet";
|
|
25
|
+
readonly label: "Outlet";
|
|
26
|
+
readonly category: 7;
|
|
27
|
+
};
|
|
28
|
+
readonly fan: {
|
|
29
|
+
readonly uuid: "00000040-0000-1000-8000-0026BB765291";
|
|
30
|
+
readonly service: "Fan";
|
|
31
|
+
readonly label: "Fan";
|
|
32
|
+
readonly category: 3;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type ServiceTypeKey = keyof typeof CONVERTIBLE_SERVICES;
|
|
36
|
+
/** True when a service is one of the interchangeable On-based types. */
|
|
37
|
+
export declare function isConvertible(serviceUuid: string): boolean;
|
|
38
|
+
/** Overrides keyed by accessory UUID, then by the service's own UUID. */
|
|
39
|
+
type Overrides = Record<string, Record<string, ServiceTypeKey>>;
|
|
40
|
+
export declare class HomeKitServiceTypes {
|
|
41
|
+
private readonly path;
|
|
42
|
+
private hap;
|
|
43
|
+
private overrides;
|
|
44
|
+
constructor(path: string, hap?: any);
|
|
45
|
+
setHap(hap: any): void;
|
|
46
|
+
private load;
|
|
47
|
+
private save;
|
|
48
|
+
all(): Overrides;
|
|
49
|
+
get(accessoryUuid: string, serviceUuid: string): ServiceTypeKey | null;
|
|
50
|
+
/**
|
|
51
|
+
* The type an accessory is presented as, ignoring which service carries it.
|
|
52
|
+
*
|
|
53
|
+
* A device maps to a single accessory and only one of its services is
|
|
54
|
+
* convertible, so the first override is the accessory's effective type. Used
|
|
55
|
+
* to label and icon the device card, which has no notion of services.
|
|
56
|
+
*/
|
|
57
|
+
typeForAccessory(accessoryUuid: string): ServiceTypeKey | null;
|
|
58
|
+
/**
|
|
59
|
+
* Record an override. Passing the service's own type (or null) clears it.
|
|
60
|
+
*
|
|
61
|
+
* Not applied live: an accessory already published to HomeKit cannot change
|
|
62
|
+
* service type in place: controllers cache the shape at pairing. The caller
|
|
63
|
+
* is expected to tell the user a restart is needed, as the visibility toggle
|
|
64
|
+
* does when it cannot apply immediately.
|
|
65
|
+
*/
|
|
66
|
+
set(accessoryUuid: string, serviceUuid: string, type: ServiceTypeKey | null): void;
|
|
67
|
+
/**
|
|
68
|
+
* Swap overridden services on an accessory before it reaches the bridge.
|
|
69
|
+
*
|
|
70
|
+
* The original service is not mutated. Rewriting `service.UUID` in place
|
|
71
|
+
* would be shorter, but the plugin looks its own services up by type
|
|
72
|
+
* (`accessory.getService(Service.Switch)`), so a plugin that re-resolves
|
|
73
|
+
* after startup would stop finding it. Instead a new service of the target
|
|
74
|
+
* type is added and the two are kept in sync: plugin-side updates flow out
|
|
75
|
+
* through `change` events, and HomeKit writes flow back into the original
|
|
76
|
+
* characteristic so the plugin's own `onSet` handler still runs.
|
|
77
|
+
*/
|
|
78
|
+
apply(accessory: any): void;
|
|
79
|
+
private swap;
|
|
80
|
+
}
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=homekit-service-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homekit-service-type.d.ts","sourceRoot":"","sources":["../src/homekit-service-type.ts"],"names":[],"mappings":"AA+BA;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;CAKvB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,oBAAoB,CAAA;AAM9D,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,yEAAyE;AACzE,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;AAE/D,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,GAAG;IAJb,OAAO,CAAC,SAAS,CAAgB;gBAGd,IAAI,EAAE,MAAM,EACrB,GAAG,GAAE,GAAU;IAKzB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAItB,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,IAAI;IASZ,GAAG,IAAI,SAAS;IAIhB,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAItE;;;;;;OAMG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM9D;;;;;;;OAOG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI;IAgBlF;;;;;;;;;;OAUG;IACH,KAAK,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI;IA8B3B,OAAO,CAAC,IAAI;CAyBb"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { Logger } from '@nubisco/openbridge-logger';
|
|
4
|
+
const log = Logger.create('homekit');
|
|
5
|
+
/**
|
|
6
|
+
* Per-service HomeKit type overrides.
|
|
7
|
+
*
|
|
8
|
+
* A plugin decides what HAP service to publish, and for a generic relay that
|
|
9
|
+
* decision is necessarily a guess: a Shelly channel is a `Switch` because the
|
|
10
|
+
* plugin cannot know it drives a pool light. HomeKit derives the tile, the
|
|
11
|
+
* icon, the Siri grammar and the room summary from that service type, so the
|
|
12
|
+
* guess is wrong in a way the user sees every day. Re-typing the accessory in
|
|
13
|
+
* the Home app does not stick, because the bridge re-publishes the original
|
|
14
|
+
* type on the next restart.
|
|
15
|
+
*
|
|
16
|
+
* Plugins can offer their own setting for this (the Shelly plugin has a
|
|
17
|
+
* per-channel `type`), but only for plugins that implement it. Enforcing it
|
|
18
|
+
* here covers every plugin, including Homebridge-compat ones, because both
|
|
19
|
+
* paths reach the bridge through `addBridgedAccessory`: the same reasoning as
|
|
20
|
+
* {@link HomeKitVisibility}, and applied at the same interception point.
|
|
21
|
+
*
|
|
22
|
+
* Scope is deliberately narrow: only services built around the `On`
|
|
23
|
+
* characteristic can stand in for one another. Presenting a thermostat as a
|
|
24
|
+
* lightbulb would drop every characteristic that gives it meaning, so those
|
|
25
|
+
* conversions are rejected rather than half-performed.
|
|
26
|
+
*/
|
|
27
|
+
const ON_CHARACTERISTIC = '00000025-0000-1000-8000-0026BB765291';
|
|
28
|
+
/**
|
|
29
|
+
* Service types that are interchangeable: each requires exactly `Name` + `On`,
|
|
30
|
+
* so one can stand in for another without inventing or dropping state.
|
|
31
|
+
*
|
|
32
|
+
* Deliberately excluded, despite looking like near neighbours: `Fanv2` and
|
|
33
|
+
* `Valve` are built on `Active` rather than `On` (and `Valve` additionally
|
|
34
|
+
* requires `InUse` and `ValveType`), so they are not drop-in substitutes.
|
|
35
|
+
*/
|
|
36
|
+
export const CONVERTIBLE_SERVICES = {
|
|
37
|
+
switch: { uuid: '00000049-0000-1000-8000-0026BB765291', service: 'Switch', label: 'Switch', category: 8 },
|
|
38
|
+
light: { uuid: '00000043-0000-1000-8000-0026BB765291', service: 'Lightbulb', label: 'Light', category: 5 },
|
|
39
|
+
outlet: { uuid: '00000047-0000-1000-8000-0026BB765291', service: 'Outlet', label: 'Outlet', category: 7 },
|
|
40
|
+
fan: { uuid: '00000040-0000-1000-8000-0026BB765291', service: 'Fan', label: 'Fan', category: 3 },
|
|
41
|
+
};
|
|
42
|
+
const UUID_TO_KEY = new Map(Object.keys(CONVERTIBLE_SERVICES).map((key) => [CONVERTIBLE_SERVICES[key].uuid, key]));
|
|
43
|
+
/** True when a service is one of the interchangeable On-based types. */
|
|
44
|
+
export function isConvertible(serviceUuid) {
|
|
45
|
+
return UUID_TO_KEY.has(serviceUuid);
|
|
46
|
+
}
|
|
47
|
+
export class HomeKitServiceTypes {
|
|
48
|
+
path;
|
|
49
|
+
hap;
|
|
50
|
+
overrides = {};
|
|
51
|
+
constructor(path, hap = null) {
|
|
52
|
+
this.path = path;
|
|
53
|
+
this.hap = hap;
|
|
54
|
+
this.load();
|
|
55
|
+
}
|
|
56
|
+
setHap(hap) {
|
|
57
|
+
this.hap = hap;
|
|
58
|
+
}
|
|
59
|
+
load() {
|
|
60
|
+
try {
|
|
61
|
+
if (!existsSync(this.path))
|
|
62
|
+
return;
|
|
63
|
+
const raw = JSON.parse(readFileSync(this.path, 'utf8'));
|
|
64
|
+
if (raw && typeof raw === 'object' && !Array.isArray(raw))
|
|
65
|
+
this.overrides = raw;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
log.warn(`Could not read HomeKit service type overrides, using plugin defaults: ${err}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
save() {
|
|
72
|
+
try {
|
|
73
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
74
|
+
writeFileSync(this.path, JSON.stringify(this.overrides, null, 2));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
log.warn(`Could not persist HomeKit service type overrides: ${err}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
all() {
|
|
81
|
+
return this.overrides;
|
|
82
|
+
}
|
|
83
|
+
get(accessoryUuid, serviceUuid) {
|
|
84
|
+
return this.overrides[accessoryUuid]?.[serviceUuid] ?? null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The type an accessory is presented as, ignoring which service carries it.
|
|
88
|
+
*
|
|
89
|
+
* A device maps to a single accessory and only one of its services is
|
|
90
|
+
* convertible, so the first override is the accessory's effective type. Used
|
|
91
|
+
* to label and icon the device card, which has no notion of services.
|
|
92
|
+
*/
|
|
93
|
+
typeForAccessory(accessoryUuid) {
|
|
94
|
+
const forAccessory = this.overrides[accessoryUuid];
|
|
95
|
+
if (!forAccessory)
|
|
96
|
+
return null;
|
|
97
|
+
return Object.values(forAccessory)[0] ?? null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Record an override. Passing the service's own type (or null) clears it.
|
|
101
|
+
*
|
|
102
|
+
* Not applied live: an accessory already published to HomeKit cannot change
|
|
103
|
+
* service type in place: controllers cache the shape at pairing. The caller
|
|
104
|
+
* is expected to tell the user a restart is needed, as the visibility toggle
|
|
105
|
+
* does when it cannot apply immediately.
|
|
106
|
+
*/
|
|
107
|
+
set(accessoryUuid, serviceUuid, type) {
|
|
108
|
+
const isNoOp = type === null || CONVERTIBLE_SERVICES[type]?.uuid === serviceUuid;
|
|
109
|
+
if (isNoOp) {
|
|
110
|
+
const forAccessory = this.overrides[accessoryUuid];
|
|
111
|
+
if (!forAccessory)
|
|
112
|
+
return;
|
|
113
|
+
delete forAccessory[serviceUuid];
|
|
114
|
+
if (Object.keys(forAccessory).length === 0)
|
|
115
|
+
delete this.overrides[accessoryUuid];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.overrides[accessoryUuid] ??= {};
|
|
119
|
+
this.overrides[accessoryUuid][serviceUuid] = type;
|
|
120
|
+
}
|
|
121
|
+
this.save();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Swap overridden services on an accessory before it reaches the bridge.
|
|
125
|
+
*
|
|
126
|
+
* The original service is not mutated. Rewriting `service.UUID` in place
|
|
127
|
+
* would be shorter, but the plugin looks its own services up by type
|
|
128
|
+
* (`accessory.getService(Service.Switch)`), so a plugin that re-resolves
|
|
129
|
+
* after startup would stop finding it. Instead a new service of the target
|
|
130
|
+
* type is added and the two are kept in sync: plugin-side updates flow out
|
|
131
|
+
* through `change` events, and HomeKit writes flow back into the original
|
|
132
|
+
* characteristic so the plugin's own `onSet` handler still runs.
|
|
133
|
+
*/
|
|
134
|
+
apply(accessory) {
|
|
135
|
+
const forAccessory = this.overrides[accessory?.UUID];
|
|
136
|
+
if (!forAccessory || !this.hap)
|
|
137
|
+
return;
|
|
138
|
+
for (const [serviceUuid, targetKey] of Object.entries(forAccessory)) {
|
|
139
|
+
const target = CONVERTIBLE_SERVICES[targetKey];
|
|
140
|
+
if (!target || serviceUuid === target.uuid)
|
|
141
|
+
continue;
|
|
142
|
+
const original = (accessory.services ?? []).find((s) => s.UUID === serviceUuid);
|
|
143
|
+
if (!original)
|
|
144
|
+
continue;
|
|
145
|
+
if (!isConvertible(serviceUuid)) {
|
|
146
|
+
log.warn(`Not re-typing "${original.displayName}": ${serviceUuid} is not an On-based service, ` +
|
|
147
|
+
`so presenting it as a ${target.label} would drop its characteristics`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
this.swap(accessory, original, target);
|
|
152
|
+
log.info(`Presenting "${original.displayName}" to HomeKit as a ${target.label}`);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
// The accessory is still perfectly usable with its original type, so a
|
|
156
|
+
// failure here degrades rather than breaks.
|
|
157
|
+
log.warn(`Could not re-type "${original.displayName}" as a ${target.label}: ${err}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
swap(accessory, original, target) {
|
|
162
|
+
const ServiceCtor = this.hap.Service[target.service];
|
|
163
|
+
if (!ServiceCtor)
|
|
164
|
+
throw new Error(`hap-nodejs has no Service.${target.service}`);
|
|
165
|
+
const replacement = new ServiceCtor(original.displayName, original.subtype);
|
|
166
|
+
const originalOn = original.characteristics?.find((c) => c.UUID === ON_CHARACTERISTIC);
|
|
167
|
+
const replacementOn = replacement.getCharacteristic(this.hap.Characteristic.On);
|
|
168
|
+
if (!originalOn || !replacementOn)
|
|
169
|
+
throw new Error('missing On characteristic on one side of the swap');
|
|
170
|
+
// Seed, then keep the two in step in both directions.
|
|
171
|
+
replacementOn.updateValue(originalOn.value);
|
|
172
|
+
originalOn.on('change', ({ newValue }) => replacementOn.updateValue(newValue));
|
|
173
|
+
replacementOn.onSet(async (value) => {
|
|
174
|
+
originalOn.setValue(value);
|
|
175
|
+
});
|
|
176
|
+
replacementOn.onGet(() => originalOn.value);
|
|
177
|
+
accessory.removeService(original);
|
|
178
|
+
accessory.addService(replacement);
|
|
179
|
+
// HomeKit picks the tile glyph from the accessory category, so leaving it
|
|
180
|
+
// as SWITCH would show a switch icon on a service that now says light.
|
|
181
|
+
accessory.category = target.category;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=homekit-service-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homekit-service-type.js","sourceRoot":"","sources":["../src/homekit-service-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-accessory HomeKit visibility.
|
|
3
|
+
*
|
|
4
|
+
* Some devices have no useful HomeKit representation. An energy meter is the
|
|
5
|
+
* clearest case: HAP has no characteristic for electrical power, so watts can
|
|
6
|
+
* only be smuggled through a light sensor's lux field, and voltage, current and
|
|
7
|
+
* power factor cannot be expressed at all. Users want those devices in
|
|
8
|
+
* OpenBridge and out of the Home app, without losing the sibling devices the
|
|
9
|
+
* same plugin provides (a Shelly plugin may serve both a pool switch worth
|
|
10
|
+
* exposing and a meter that is not).
|
|
11
|
+
*
|
|
12
|
+
* Plugins can offer their own `exposeToHomeKit` config, but that only works for
|
|
13
|
+
* plugins that implement it. Enforcing it here covers every plugin, including
|
|
14
|
+
* Homebridge-compat ones that have no such setting, because both paths reach
|
|
15
|
+
* the bridge through `addBridgedAccessory`.
|
|
16
|
+
*
|
|
17
|
+
* Visibility is keyed by HAP accessory UUID, the only identifier both plugin
|
|
18
|
+
* kinds share.
|
|
19
|
+
*/
|
|
20
|
+
export declare class HomeKitVisibility {
|
|
21
|
+
private readonly path;
|
|
22
|
+
private bridge;
|
|
23
|
+
/**
|
|
24
|
+
* Applied to each accessory on its way to the bridge. It rides along here
|
|
25
|
+
* rather than wrapping the bridge a second time so there stays exactly one
|
|
26
|
+
* interception point for everything OpenBridge overrides about an
|
|
27
|
+
* accessory before HomeKit sees it.
|
|
28
|
+
*/
|
|
29
|
+
private serviceTypes;
|
|
30
|
+
private hidden;
|
|
31
|
+
/** Accessories seen by the bridge, so a hidden one can be restored later. */
|
|
32
|
+
private known;
|
|
33
|
+
constructor(path: string, bridge?: any,
|
|
34
|
+
/**
|
|
35
|
+
* Applied to each accessory on its way to the bridge. It rides along here
|
|
36
|
+
* rather than wrapping the bridge a second time so there stays exactly one
|
|
37
|
+
* interception point for everything OpenBridge overrides about an
|
|
38
|
+
* accessory before HomeKit sees it.
|
|
39
|
+
*/
|
|
40
|
+
serviceTypes?: {
|
|
41
|
+
apply(accessory: any): void;
|
|
42
|
+
} | null);
|
|
43
|
+
private load;
|
|
44
|
+
private save;
|
|
45
|
+
isHidden(uuid: string): boolean;
|
|
46
|
+
hiddenList(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Wrap the HAP bridge so hidden accessories never reach it.
|
|
49
|
+
*
|
|
50
|
+
* A Proxy is used rather than subclassing because the bridge is a hap-nodejs
|
|
51
|
+
* instance shared with plugins: everything except the two intercepted methods
|
|
52
|
+
* must behave exactly as before.
|
|
53
|
+
*/
|
|
54
|
+
wrapBridge(bridge: any): any;
|
|
55
|
+
/**
|
|
56
|
+
* Change visibility and apply it immediately.
|
|
57
|
+
*
|
|
58
|
+
* Applying at runtime matters: without it the Home app keeps showing a device
|
|
59
|
+
* the user just hid until the next restart, which reads as the toggle being
|
|
60
|
+
* broken.
|
|
61
|
+
*/
|
|
62
|
+
setVisible(uuid: string, visible: boolean): {
|
|
63
|
+
changed: boolean;
|
|
64
|
+
applied: boolean;
|
|
65
|
+
};
|
|
66
|
+
/** Record an accessory without going through the bridge (used on restore). */
|
|
67
|
+
track(uuid: string, accessory: unknown): void;
|
|
68
|
+
/**
|
|
69
|
+
* Look up an accessory seen by the bridge, whichever plugin published it.
|
|
70
|
+
*
|
|
71
|
+
* Native plugins add accessories to the bridge directly rather than through
|
|
72
|
+
* the compat layer, so they never enter HomebridgeAPI's own map and are
|
|
73
|
+
* invisible to /api/accessories. They do all pass through the proxy above,
|
|
74
|
+
* which makes this the only place that knows about every accessory HomeKit
|
|
75
|
+
* has been told about.
|
|
76
|
+
*/
|
|
77
|
+
find(uuid: string): unknown | null;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=homekit-visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homekit-visibility.d.ts","sourceRoot":"","sources":["../src/homekit-visibility.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,MAAM;IACd;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAbtB,OAAO,CAAC,MAAM,CAAoB;IAClC,6EAA6E;IAC7E,OAAO,CAAC,KAAK,CAA6B;gBAGvB,IAAI,EAAE,MAAM,EACrB,MAAM,GAAE,GAAU;IAC1B;;;;;OAKG;IACK,YAAY,GAAE;QAAE,KAAK,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAAA;KAAE,GAAG,IAAW;IAKrE,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,IAAI;IASZ,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,UAAU,IAAI,MAAM,EAAE;IAItB;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;IAuC5B;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAsBlF,8EAA8E;IAC9E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAI7C;;;;;;;;OAQG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAGnC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { Logger } from '@nubisco/openbridge-logger';
|
|
4
|
+
const log = Logger.create('homekit');
|
|
5
|
+
/**
|
|
6
|
+
* Per-accessory HomeKit visibility.
|
|
7
|
+
*
|
|
8
|
+
* Some devices have no useful HomeKit representation. An energy meter is the
|
|
9
|
+
* clearest case: HAP has no characteristic for electrical power, so watts can
|
|
10
|
+
* only be smuggled through a light sensor's lux field, and voltage, current and
|
|
11
|
+
* power factor cannot be expressed at all. Users want those devices in
|
|
12
|
+
* OpenBridge and out of the Home app, without losing the sibling devices the
|
|
13
|
+
* same plugin provides (a Shelly plugin may serve both a pool switch worth
|
|
14
|
+
* exposing and a meter that is not).
|
|
15
|
+
*
|
|
16
|
+
* Plugins can offer their own `exposeToHomeKit` config, but that only works for
|
|
17
|
+
* plugins that implement it. Enforcing it here covers every plugin, including
|
|
18
|
+
* Homebridge-compat ones that have no such setting, because both paths reach
|
|
19
|
+
* the bridge through `addBridgedAccessory`.
|
|
20
|
+
*
|
|
21
|
+
* Visibility is keyed by HAP accessory UUID, the only identifier both plugin
|
|
22
|
+
* kinds share.
|
|
23
|
+
*/
|
|
24
|
+
export class HomeKitVisibility {
|
|
25
|
+
path;
|
|
26
|
+
bridge;
|
|
27
|
+
serviceTypes;
|
|
28
|
+
hidden = new Set();
|
|
29
|
+
/** Accessories seen by the bridge, so a hidden one can be restored later. */
|
|
30
|
+
known = new Map();
|
|
31
|
+
constructor(path, bridge = null,
|
|
32
|
+
/**
|
|
33
|
+
* Applied to each accessory on its way to the bridge. It rides along here
|
|
34
|
+
* rather than wrapping the bridge a second time so there stays exactly one
|
|
35
|
+
* interception point for everything OpenBridge overrides about an
|
|
36
|
+
* accessory before HomeKit sees it.
|
|
37
|
+
*/
|
|
38
|
+
serviceTypes = null) {
|
|
39
|
+
this.path = path;
|
|
40
|
+
this.bridge = bridge;
|
|
41
|
+
this.serviceTypes = serviceTypes;
|
|
42
|
+
this.load();
|
|
43
|
+
}
|
|
44
|
+
load() {
|
|
45
|
+
try {
|
|
46
|
+
if (!existsSync(this.path))
|
|
47
|
+
return;
|
|
48
|
+
const raw = JSON.parse(readFileSync(this.path, 'utf8'));
|
|
49
|
+
if (Array.isArray(raw))
|
|
50
|
+
this.hidden = new Set(raw.filter((v) => typeof v === 'string'));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
log.warn(`Could not read HomeKit visibility list, treating all accessories as visible: ${err}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
save() {
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
59
|
+
writeFileSync(this.path, JSON.stringify([...this.hidden], null, 2));
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
log.warn(`Could not persist HomeKit visibility list: ${err}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
isHidden(uuid) {
|
|
66
|
+
return this.hidden.has(uuid);
|
|
67
|
+
}
|
|
68
|
+
hiddenList() {
|
|
69
|
+
return [...this.hidden];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Wrap the HAP bridge so hidden accessories never reach it.
|
|
73
|
+
*
|
|
74
|
+
* A Proxy is used rather than subclassing because the bridge is a hap-nodejs
|
|
75
|
+
* instance shared with plugins: everything except the two intercepted methods
|
|
76
|
+
* must behave exactly as before.
|
|
77
|
+
*/
|
|
78
|
+
wrapBridge(bridge) {
|
|
79
|
+
this.bridge = bridge;
|
|
80
|
+
return new Proxy(bridge, {
|
|
81
|
+
get: (target, prop, receiver) => {
|
|
82
|
+
if (prop === 'addBridgedAccessory') {
|
|
83
|
+
return (accessory, ...rest) => {
|
|
84
|
+
const uuid = accessory?.UUID;
|
|
85
|
+
if (uuid) {
|
|
86
|
+
this.known.set(uuid, accessory);
|
|
87
|
+
if (this.hidden.has(uuid)) {
|
|
88
|
+
log.debug(`Not exposing "${accessory.displayName}" to HomeKit (hidden by user)`);
|
|
89
|
+
return accessory;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Must run before the accessory is published: HomeKit caches an
|
|
93
|
+
// accessory's shape, so a service type swapped afterwards is not
|
|
94
|
+
// picked up until re-pairing.
|
|
95
|
+
this.serviceTypes?.apply(accessory);
|
|
96
|
+
return target.addBridgedAccessory(accessory, ...rest);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (prop === 'removeBridgedAccessory') {
|
|
100
|
+
return (accessory, ...rest) => {
|
|
101
|
+
const uuid = accessory?.UUID;
|
|
102
|
+
// A hidden accessory was never added, so asking hap-nodejs to
|
|
103
|
+
// remove it would throw.
|
|
104
|
+
if (uuid && this.hidden.has(uuid))
|
|
105
|
+
return;
|
|
106
|
+
return target.removeBridgedAccessory(accessory, ...rest);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const value = Reflect.get(target, prop, receiver);
|
|
110
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Change visibility and apply it immediately.
|
|
116
|
+
*
|
|
117
|
+
* Applying at runtime matters: without it the Home app keeps showing a device
|
|
118
|
+
* the user just hid until the next restart, which reads as the toggle being
|
|
119
|
+
* broken.
|
|
120
|
+
*/
|
|
121
|
+
setVisible(uuid, visible) {
|
|
122
|
+
const wasHidden = this.hidden.has(uuid);
|
|
123
|
+
if (wasHidden === !visible)
|
|
124
|
+
return { changed: false, applied: true };
|
|
125
|
+
if (visible)
|
|
126
|
+
this.hidden.delete(uuid);
|
|
127
|
+
else
|
|
128
|
+
this.hidden.add(uuid);
|
|
129
|
+
this.save();
|
|
130
|
+
const accessory = this.known.get(uuid);
|
|
131
|
+
if (!accessory || !this.bridge)
|
|
132
|
+
return { changed: true, applied: false };
|
|
133
|
+
try {
|
|
134
|
+
if (visible)
|
|
135
|
+
this.bridge.addBridgedAccessory(accessory);
|
|
136
|
+
else
|
|
137
|
+
this.bridge.removeBridgedAccessory(accessory, false);
|
|
138
|
+
return { changed: true, applied: true };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
// The preference is saved regardless, so a restart still honours it.
|
|
142
|
+
log.warn(`Visibility saved but could not be applied live for ${uuid}: ${err}`);
|
|
143
|
+
return { changed: true, applied: false };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Record an accessory without going through the bridge (used on restore). */
|
|
147
|
+
track(uuid, accessory) {
|
|
148
|
+
if (uuid)
|
|
149
|
+
this.known.set(uuid, accessory);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Look up an accessory seen by the bridge, whichever plugin published it.
|
|
153
|
+
*
|
|
154
|
+
* Native plugins add accessories to the bridge directly rather than through
|
|
155
|
+
* the compat layer, so they never enter HomebridgeAPI's own map and are
|
|
156
|
+
* invisible to /api/accessories. They do all pass through the proxy above,
|
|
157
|
+
* which makes this the only place that knows about every accessory HomeKit
|
|
158
|
+
* has been told about.
|
|
159
|
+
*/
|
|
160
|
+
find(uuid) {
|
|
161
|
+
return this.known.get(uuid) ?? null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=homekit-visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homekit-visibility.js","sourceRoot":"","sources":["../src/homekit-visibility.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|