@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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/__tests__/homekit-service-type.test.d.ts +2 -0
  4. package/dist/__tests__/homekit-service-type.test.d.ts.map +1 -0
  5. package/dist/__tests__/homekit-service-type.test.js +239 -0
  6. package/dist/__tests__/homekit-service-type.test.js.map +1 -0
  7. package/dist/__tests__/homekit-visibility.test.d.ts +2 -0
  8. package/dist/__tests__/homekit-visibility.test.d.ts.map +1 -0
  9. package/dist/__tests__/homekit-visibility.test.js +157 -0
  10. package/dist/__tests__/homekit-visibility.test.js.map +1 -0
  11. package/dist/__tests__/server.test.d.ts +2 -0
  12. package/dist/__tests__/server.test.d.ts.map +1 -0
  13. package/dist/__tests__/server.test.js +837 -0
  14. package/dist/__tests__/server.test.js.map +1 -0
  15. package/dist/__tests__/timeseries.test.d.ts +2 -0
  16. package/dist/__tests__/timeseries.test.d.ts.map +1 -0
  17. package/dist/__tests__/timeseries.test.js +216 -0
  18. package/dist/__tests__/timeseries.test.js.map +1 -0
  19. package/dist/auth.d.ts +23 -0
  20. package/dist/auth.d.ts.map +1 -0
  21. package/dist/auth.js +171 -0
  22. package/dist/auth.js.map +1 -0
  23. package/dist/daemon.d.ts +57 -0
  24. package/dist/daemon.d.ts.map +1 -0
  25. package/dist/daemon.js +636 -0
  26. package/dist/daemon.js.map +1 -0
  27. package/dist/homekit-service-type.d.ts +82 -0
  28. package/dist/homekit-service-type.d.ts.map +1 -0
  29. package/dist/homekit-service-type.js +184 -0
  30. package/dist/homekit-service-type.js.map +1 -0
  31. package/dist/homekit-visibility.d.ts +79 -0
  32. package/dist/homekit-visibility.d.ts.map +1 -0
  33. package/dist/homekit-visibility.js +164 -0
  34. package/dist/homekit-visibility.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +62 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/metrics.d.ts +17 -0
  40. package/dist/metrics.d.ts.map +1 -0
  41. package/dist/metrics.js +52 -0
  42. package/dist/metrics.js.map +1 -0
  43. package/dist/platform-client.d.ts +42 -0
  44. package/dist/platform-client.d.ts.map +1 -0
  45. package/dist/platform-client.js +92 -0
  46. package/dist/platform-client.js.map +1 -0
  47. package/dist/server.d.ts +30 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +1744 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/timeseries.d.ts +134 -0
  52. package/dist/timeseries.d.ts.map +1 -0
  53. package/dist/timeseries.js +378 -0
  54. package/dist/timeseries.js.map +1 -0
  55. package/dist/version.d.ts +4 -0
  56. package/dist/version.d.ts.map +1 -0
  57. package/dist/version.js +28 -0
  58. package/dist/version.js.map +1 -0
  59. package/package.json +79 -0
  60. package/scripts/entrypoint.sh +82 -0
  61. package/scripts/fix-node-pty.mjs +22 -0
  62. package/ui-dist/android-chrome-192x192.png +0 -0
  63. package/ui-dist/android-chrome-512x512.png +0 -0
  64. package/ui-dist/apple-touch-icon.png +0 -0
  65. package/ui-dist/assets/index-Q0sxZHIR.css +32 -0
  66. package/ui-dist/assets/index-ZZYyAzBo.js +106 -0
  67. package/ui-dist/favicon-16x16.png +0 -0
  68. package/ui-dist/favicon-32x32.png +0 -0
  69. package/ui-dist/favicon.ico +0 -0
  70. package/ui-dist/fonts/MesloLGLDZNerdFontMono-Bold.woff2 +0 -0
  71. package/ui-dist/fonts/MesloLGLDZNerdFontMono-BoldItalic.woff2 +0 -0
  72. package/ui-dist/fonts/MesloLGLDZNerdFontMono-Italic.woff2 +0 -0
  73. package/ui-dist/fonts/MesloLGLDZNerdFontMono-Regular.woff2 +0 -0
  74. package/ui-dist/index.html +18 -0
  75. package/ui-dist/logo.svg +30 -0
  76. package/ui-dist/nubisco-logo.svg +120 -0
  77. 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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}