@homebridge-plugins/homebridge-updater 3.0.7

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 (85) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +117 -0
  3. package/config.schema.json +257 -0
  4. package/dist/Platform.HAP.d.ts +16 -0
  5. package/dist/Platform.HAP.d.ts.map +1 -0
  6. package/dist/Platform.HAP.js +77 -0
  7. package/dist/Platform.HAP.js.map +1 -0
  8. package/dist/Platform.Matter.d.ts +7 -0
  9. package/dist/Platform.Matter.d.ts.map +1 -0
  10. package/dist/Platform.Matter.js +21 -0
  11. package/dist/Platform.Matter.js.map +1 -0
  12. package/dist/configMigration.d.ts +4 -0
  13. package/dist/configMigration.d.ts.map +1 -0
  14. package/dist/configMigration.js +45 -0
  15. package/dist/configMigration.js.map +1 -0
  16. package/dist/configMigration.test.d.ts +2 -0
  17. package/dist/configMigration.test.d.ts.map +1 -0
  18. package/dist/configMigration.test.js +23 -0
  19. package/dist/configMigration.test.js.map +1 -0
  20. package/dist/configTypes.d.ts +24 -0
  21. package/dist/configTypes.d.ts.map +1 -0
  22. package/dist/configTypes.js +2 -0
  23. package/dist/configTypes.js.map +1 -0
  24. package/dist/configTypes.test.d.ts +2 -0
  25. package/dist/configTypes.test.d.ts.map +1 -0
  26. package/dist/configTypes.test.js +108 -0
  27. package/dist/configTypes.test.js.map +1 -0
  28. package/dist/failureSensor.d.ts +17 -0
  29. package/dist/failureSensor.d.ts.map +1 -0
  30. package/dist/failureSensor.js +36 -0
  31. package/dist/failureSensor.js.map +1 -0
  32. package/dist/homebridge-ui/public/index.html +230 -0
  33. package/dist/homebridge-ui/server.d.ts +2 -0
  34. package/dist/homebridge-ui/server.d.ts.map +1 -0
  35. package/dist/homebridge-ui/server.js +47 -0
  36. package/dist/homebridge-ui/server.js.map +1 -0
  37. package/dist/ignore-plugins.test.d.ts +2 -0
  38. package/dist/ignore-plugins.test.d.ts.map +1 -0
  39. package/dist/ignore-plugins.test.js +121 -0
  40. package/dist/ignore-plugins.test.js.map +1 -0
  41. package/dist/index.d.ts +4 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +12 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/index.test.d.ts +2 -0
  46. package/dist/index.test.d.ts.map +1 -0
  47. package/dist/index.test.js +8 -0
  48. package/dist/index.test.js.map +1 -0
  49. package/dist/schema.test.d.ts +2 -0
  50. package/dist/schema.test.d.ts.map +1 -0
  51. package/dist/schema.test.js +109 -0
  52. package/dist/schema.test.js.map +1 -0
  53. package/dist/sensorBase.d.ts +39 -0
  54. package/dist/sensorBase.d.ts.map +1 -0
  55. package/dist/sensorBase.js +309 -0
  56. package/dist/sensorBase.js.map +1 -0
  57. package/dist/settings.d.ts +11 -0
  58. package/dist/settings.d.ts.map +1 -0
  59. package/dist/settings.js +11 -0
  60. package/dist/settings.js.map +1 -0
  61. package/dist/ui-api.d.ts +40 -0
  62. package/dist/ui-api.d.ts.map +1 -0
  63. package/dist/ui-api.js +522 -0
  64. package/dist/ui-api.js.map +1 -0
  65. package/dist/updateCheckCore.d.ts +46 -0
  66. package/dist/updateCheckCore.d.ts.map +1 -0
  67. package/dist/updateCheckCore.js +433 -0
  68. package/dist/updateCheckCore.js.map +1 -0
  69. package/dist/updateSensor.d.ts +21 -0
  70. package/dist/updateSensor.d.ts.map +1 -0
  71. package/dist/updateSensor.js +75 -0
  72. package/dist/updateSensor.js.map +1 -0
  73. package/dist/updateSensor.test.d.ts +2 -0
  74. package/dist/updateSensor.test.d.ts.map +1 -0
  75. package/dist/updateSensor.test.js +133 -0
  76. package/dist/updateSensor.test.js.map +1 -0
  77. package/dist/utils.d.ts +22 -0
  78. package/dist/utils.d.ts.map +1 -0
  79. package/dist/utils.js +75 -0
  80. package/dist/utils.js.map +1 -0
  81. package/dist/utils.test.d.ts +2 -0
  82. package/dist/utils.test.d.ts.map +1 -0
  83. package/dist/utils.test.js +126 -0
  84. package/dist/utils.test.js.map +1 -0
  85. package/package.json +96 -0
@@ -0,0 +1,4 @@
1
+ import type { API } from 'homebridge';
2
+ declare const _default: (api: API) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;yBASrB,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAIC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import { PluginUpdatePlatform } from './Platform.HAP.js';
2
+ import { PluginUpdateMatterPlatform } from './Platform.Matter.js';
3
+ import { migrateLegacyPlatformAlias } from './configMigration.js';
4
+ import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
5
+ import { createPlatformProxy } from './utils.js';
6
+ // Register our platform with homebridge using HAP/Matter proxy.
7
+ export default (api) => {
8
+ void migrateLegacyPlatformAlias(api);
9
+ const ProxyCtor = createPlatformProxy(PluginUpdatePlatform, PluginUpdateMatterPlatform);
10
+ api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, ProxyCtor);
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,gEAAgE;AAChE,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,KAAK,0BAA0B,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,mBAAmB,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CAAA;IACvF,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAgB,CAAC,CAAA;AACpE,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ describe('plugin Configuration', () => {
3
+ it('should be able to import without errors', () => {
4
+ // Basic test to ensure the module can be imported
5
+ expect(true).toBe(true);
6
+ });
7
+ });
8
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../src/schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import Ajv from 'ajv';
5
+ import { beforeAll, describe, expect, it } from 'vitest';
6
+ // ESM equivalent of __dirname
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ describe('config schema validation', () => {
10
+ let schema;
11
+ let ajv;
12
+ beforeAll(() => {
13
+ // Load the config schema
14
+ const schemaPath = path.resolve(__dirname, '../config.schema.json');
15
+ const schemaContent = fs.readFileSync(schemaPath, 'utf8');
16
+ const fullSchema = JSON.parse(schemaContent);
17
+ schema = fullSchema.schema;
18
+ ajv = new Ajv({ strict: true });
19
+ // Homebridge config schemas include UI-only layout metadata.
20
+ ajv.addKeyword('layout');
21
+ });
22
+ describe('name field validation', () => {
23
+ it('should accept valid names with letters, numbers, spaces, hyphens, and underscores', () => {
24
+ const validNames = [
25
+ 'Plugin Update',
26
+ 'PluginUpdate V2',
27
+ 'Plugin-Update',
28
+ 'Plugin_Update',
29
+ 'Update123',
30
+ 'My Plugin Name',
31
+ 'Plugin-Update_V2 Test',
32
+ ];
33
+ validNames.forEach((name) => {
34
+ const config = {
35
+ name,
36
+ sensorType: 'motion',
37
+ platform: 'HomebridgeUpdater',
38
+ };
39
+ const validate = ajv.compile(schema);
40
+ const valid = validate(config);
41
+ expect(valid, `Expected "${name}" to be valid, but got errors: ${JSON.stringify(validate.errors)}`).toBe(true);
42
+ });
43
+ });
44
+ it('should reject names with periods and other invalid characters', () => {
45
+ const invalidNames = [
46
+ 'Plugin Update V2.0', // Period - the reported issue
47
+ 'Plugin.Update', // Period
48
+ 'Plugin@Update', // @ symbol
49
+ 'Plugin#Update', // # symbol
50
+ 'Plugin$Update', // $ symbol
51
+ 'Plugin%Update', // % symbol
52
+ 'Plugin&Update', // & symbol
53
+ 'Plugin*Update', // * symbol
54
+ 'Plugin+Update', // + symbol
55
+ 'Plugin=Update', // = symbol
56
+ 'Plugin/Update', // slash character
57
+ 'Plugin\\Update', // \ backslash
58
+ 'Plugin|Update', // | pipe
59
+ 'Plugin<Update>', // < > brackets
60
+ 'Plugin[Update]', // [ ] square brackets
61
+ 'Plugin{Update}', // { } curly brackets
62
+ 'Plugin(Update)', // ( ) parentheses
63
+ ];
64
+ invalidNames.forEach((name) => {
65
+ const config = {
66
+ name,
67
+ sensorType: 'motion',
68
+ platform: 'HomebridgeUpdater',
69
+ };
70
+ const validate = ajv.compile(schema);
71
+ const valid = validate(config);
72
+ expect(valid, `Expected "${name}" to be invalid, but validation passed`).toBe(false);
73
+ });
74
+ });
75
+ it('should reject empty names', () => {
76
+ const config = {
77
+ name: '',
78
+ sensorType: 'motion',
79
+ platform: 'HomebridgeUpdater',
80
+ };
81
+ const validate = ajv.compile(schema);
82
+ const valid = validate(config);
83
+ expect(valid).toBe(false);
84
+ });
85
+ it('should reject names that are too long', () => {
86
+ const longName = 'A'.repeat(65); // 65 characters, exceeds maxLength of 64
87
+ const config = {
88
+ name: longName,
89
+ sensorType: 'motion',
90
+ platform: 'HomebridgeUpdater',
91
+ };
92
+ const validate = ajv.compile(schema);
93
+ const valid = validate(config);
94
+ expect(valid).toBe(false);
95
+ });
96
+ it('should accept names at the maximum length', () => {
97
+ const maxLengthName = 'A'.repeat(64); // Exactly 64 characters
98
+ const config = {
99
+ name: maxLengthName,
100
+ sensorType: 'motion',
101
+ platform: 'HomebridgeUpdater',
102
+ };
103
+ const validate = ajv.compile(schema);
104
+ const valid = validate(config);
105
+ expect(valid).toBe(true);
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../src/schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { API, Logging, PlatformAccessory } from 'homebridge';
2
+ export interface SensorProtocol {
3
+ configure: (accessory: PlatformAccessory) => void;
4
+ setState: (state: boolean) => void;
5
+ }
6
+ export interface SensorOptions {
7
+ log: Logging;
8
+ api: API;
9
+ sensorType?: string;
10
+ }
11
+ export declare class HAPSensor implements SensorProtocol {
12
+ private readonly log;
13
+ private readonly hap;
14
+ private readonly sensorInfo;
15
+ private service?;
16
+ constructor(options: SensorOptions);
17
+ configure(accessory: PlatformAccessory): void;
18
+ setState(tripped: boolean): void;
19
+ private getSensorInfo;
20
+ }
21
+ export declare class MatterSensor implements SensorProtocol {
22
+ private readonly log;
23
+ private readonly api;
24
+ private readonly sensorType;
25
+ private matterInfo;
26
+ private uuid?;
27
+ private registered;
28
+ constructor(options: SensorOptions);
29
+ static getMatterInfo(api: API, sensorType?: string): {
30
+ deviceType: string;
31
+ cluster: string;
32
+ attribute: string;
33
+ trippedValue: any;
34
+ untrippedValue: any;
35
+ };
36
+ configure(accessory: PlatformAccessory): void;
37
+ setState(tripped: boolean): void;
38
+ }
39
+ //# sourceMappingURL=sensorBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensorBase.d.ts","sourceRoot":"","sources":["../src/sensorBase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAA4C,OAAO,EAAE,iBAAiB,EAAqB,MAAM,YAAY,CAAA;AAI9H,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAGD,qBAAa,SAAU,YAAW,cAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAK1B;IAED,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,OAAO,EAAE,aAAa;IAMlC,SAAS,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAO7C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQhC,OAAO,CAAC,aAAa;CAyBtB;AAED,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,UAAU,CAMjB;IAED,OAAO,CAAC,IAAI,CAAC,CAAQ;IACrB,OAAO,CAAC,UAAU,CAAiB;gBAEvB,OAAO,EAAE,aAAa;IAOlC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM;oBAKJ,MAAM;iBAAW,MAAM;mBAAa,MAAM;sBAAgB,GAAG;wBAAkB,GAAG;;IAuFhI,SAAS,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAkJ7C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAajC"}
@@ -0,0 +1,309 @@
1
+ // Unified sensor abstraction for HAP and Matter support
2
+ // This file provides a base for both main and failure sensors
3
+ import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
4
+ // HAP implementation
5
+ export class HAPSensor {
6
+ log;
7
+ hap;
8
+ sensorInfo;
9
+ service;
10
+ constructor(options) {
11
+ this.log = options.log;
12
+ this.hap = options.api.hap;
13
+ this.sensorInfo = this.getSensorInfo(options.sensorType);
14
+ }
15
+ configure(accessory) {
16
+ // Only add the correct service for the sensorType
17
+ const service = accessory.getService(this.sensorInfo.serviceType) || accessory.addService(this.sensorInfo.serviceType);
18
+ this.service = service;
19
+ this.setState(false);
20
+ }
21
+ setState(tripped) {
22
+ if (this.service) {
23
+ const value = tripped ? this.sensorInfo.trippedValue : this.sensorInfo.untrippedValue;
24
+ this.service.setCharacteristic(this.sensorInfo.characteristicType, value);
25
+ this.log.debug(`Set HAP sensor to ${tripped ? 'triggered' : 'normal'} state`);
26
+ }
27
+ }
28
+ getSensorInfo(sensorType) {
29
+ switch (sensorType?.toLowerCase()) {
30
+ case 'contact':
31
+ return { serviceType: this.hap.Service.ContactSensor, characteristicType: this.hap.Characteristic.ContactSensorState, untrippedValue: 0, trippedValue: 1 };
32
+ case 'occupancy':
33
+ return { serviceType: this.hap.Service.OccupancySensor, characteristicType: this.hap.Characteristic.OccupancyDetected, untrippedValue: 0, trippedValue: 1 };
34
+ case 'smoke':
35
+ return { serviceType: this.hap.Service.SmokeSensor, characteristicType: this.hap.Characteristic.SmokeDetected, untrippedValue: 0, trippedValue: 1 };
36
+ case 'leak':
37
+ return { serviceType: this.hap.Service.LeakSensor, characteristicType: this.hap.Characteristic.LeakDetected, untrippedValue: 0, trippedValue: 1 };
38
+ case 'light':
39
+ return { serviceType: this.hap.Service.LightSensor, characteristicType: this.hap.Characteristic.CurrentAmbientLightLevel, untrippedValue: 0.0001, trippedValue: 100000 };
40
+ case 'humidity':
41
+ return { serviceType: this.hap.Service.HumiditySensor, characteristicType: this.hap.Characteristic.CurrentRelativeHumidity, untrippedValue: 0, trippedValue: 100 };
42
+ case 'monoxide':
43
+ return { serviceType: this.hap.Service.CarbonMonoxideSensor, characteristicType: this.hap.Characteristic.CarbonMonoxideDetected, untrippedValue: 0, trippedValue: 1 };
44
+ case 'dioxide':
45
+ return { serviceType: this.hap.Service.CarbonDioxideSensor, characteristicType: this.hap.Characteristic.CarbonDioxideDetected, untrippedValue: 0, trippedValue: 1 };
46
+ case 'air':
47
+ return { serviceType: this.hap.Service.AirQualitySensor, characteristicType: this.hap.Characteristic.AirQuality, untrippedValue: 1, trippedValue: 5 };
48
+ case 'motion':
49
+ default:
50
+ return { serviceType: this.hap.Service.MotionSensor, characteristicType: this.hap.Characteristic.MotionDetected, untrippedValue: false, trippedValue: true };
51
+ }
52
+ }
53
+ }
54
+ export class MatterSensor {
55
+ log;
56
+ api;
57
+ sensorType;
58
+ matterInfo;
59
+ uuid;
60
+ registered = false;
61
+ constructor(options) {
62
+ this.log = options.log;
63
+ this.api = options.api;
64
+ this.sensorType = options.sensorType || 'motion';
65
+ this.matterInfo = MatterSensor.getMatterInfo(this.api, this.sensorType);
66
+ }
67
+ static getMatterInfo(api, sensorType) {
68
+ // Copied and adapted from Platform.Matter.ts
69
+ if (!api.matter) {
70
+ throw new Error('Matter API not available');
71
+ }
72
+ const typeMap = {
73
+ contact: {
74
+ deviceType: 'ContactSensor',
75
+ cluster: 'booleanState',
76
+ attribute: 'stateValue',
77
+ trippedValue: false, // open/triggered (inverted)
78
+ untrippedValue: true, // closed/normal
79
+ },
80
+ occupancy: {
81
+ deviceType: 'MotionSensor',
82
+ cluster: 'occupancySensing',
83
+ attribute: 'occupancy',
84
+ trippedValue: { occupied: true },
85
+ untrippedValue: { occupied: false },
86
+ },
87
+ motion: {
88
+ deviceType: 'MotionSensor',
89
+ cluster: 'occupancySensing',
90
+ attribute: 'occupancy',
91
+ trippedValue: { occupied: true },
92
+ untrippedValue: { occupied: false },
93
+ },
94
+ smoke: {
95
+ deviceType: 'SmokeSensor',
96
+ cluster: 'smokeCoAlarm',
97
+ attribute: 'smokeState',
98
+ trippedValue: 2, // Critical
99
+ untrippedValue: 0, // Normal
100
+ },
101
+ monoxide: {
102
+ deviceType: 'SmokeSensor',
103
+ cluster: 'smokeCoAlarm',
104
+ attribute: 'coState',
105
+ trippedValue: 2, // Critical
106
+ untrippedValue: 0, // Normal
107
+ },
108
+ leak: {
109
+ deviceType: 'LeakSensor',
110
+ cluster: 'booleanState',
111
+ attribute: 'stateValue',
112
+ trippedValue: true, // leak detected
113
+ untrippedValue: false, // dry
114
+ },
115
+ light: {
116
+ deviceType: 'LightSensor',
117
+ cluster: 'illuminanceMeasurement',
118
+ attribute: 'measuredValue',
119
+ trippedValue: 27000, // ~500 lux
120
+ untrippedValue: 5000, // ~3.16 lux
121
+ },
122
+ humidity: {
123
+ deviceType: 'HumiditySensor',
124
+ cluster: 'relativeHumidityMeasurement',
125
+ attribute: 'measuredValue',
126
+ trippedValue: 6550, // 65.5%
127
+ untrippedValue: 5500, // 55%
128
+ },
129
+ dioxide: {
130
+ deviceType: 'AirQualitySensor',
131
+ cluster: 'carbonDioxideMeasurement',
132
+ attribute: 'measuredValue',
133
+ trippedValue: 10000, // 10000 ppm
134
+ untrippedValue: 400, // 400 ppm
135
+ },
136
+ air: {
137
+ deviceType: 'AirQualitySensor',
138
+ cluster: 'airQuality',
139
+ attribute: 'airQuality',
140
+ trippedValue: 5, // Very Poor
141
+ untrippedValue: 1, // Good
142
+ },
143
+ temperature: {
144
+ deviceType: 'TemperatureSensor',
145
+ cluster: 'temperatureMeasurement',
146
+ attribute: 'measuredValue',
147
+ trippedValue: 2150, // 21.5°C
148
+ untrippedValue: 2100, // 21.0°C
149
+ },
150
+ };
151
+ const key = (sensorType || 'motion').toLowerCase();
152
+ const info = typeMap[key] || typeMap.motion;
153
+ if (!api.matter.deviceTypes[info.deviceType]) {
154
+ console.error(`[Matter] Invalid deviceType '${info.deviceType}'. Available: ${Object.keys(api.matter.deviceTypes).join(', ')}`);
155
+ }
156
+ return info;
157
+ }
158
+ configure(accessory) {
159
+ // Register the Matter accessory if not already registered
160
+ if (this.registered || !this.api.matter) {
161
+ return;
162
+ }
163
+ const deviceName = accessory.displayName || 'Plugin Update Sensor';
164
+ const uuid = this.api.matter.uuid.generate(deviceName);
165
+ this.uuid = uuid;
166
+ let matterDeviceType;
167
+ let clusters;
168
+ const info = this.matterInfo;
169
+ const availableTypes = Object.keys(this.api.matter.deviceTypes);
170
+ if (info.deviceType === 'MotionSensor') {
171
+ try {
172
+ matterDeviceType = this.api.matter.deviceTypes.MotionSensor.with(this.api.matter.deviceTypes.MotionSensor.requirements.OccupancySensingServer.with('PassiveInfrared'));
173
+ }
174
+ catch (e) {
175
+ this.log?.warn?.(`[Matter] Could not construct MotionSensor deviceType with OccupancySensingServer: ${e}`);
176
+ matterDeviceType = this.api.matter.deviceTypes.MotionSensor;
177
+ }
178
+ clusters = {
179
+ 'occupancy-sensing': {
180
+ occupancy: 0,
181
+ occupancySensorType: 0,
182
+ occupancySensorTypeBitmap: { pir: true, ultrasonic: false, physicalContact: false },
183
+ },
184
+ };
185
+ }
186
+ else if (info.deviceType === 'ContactSensor') {
187
+ try {
188
+ matterDeviceType = this.api.matter.deviceTypes.ContactSensor.with(this.api.matter.deviceTypes.ContactSensor.requirements.BooleanStateConfigurationServer);
189
+ }
190
+ catch (e) {
191
+ this.log?.warn?.(`[Matter] Could not construct ContactSensor deviceType with BooleanStateConfigurationServer: ${e}`);
192
+ matterDeviceType = this.api.matter.deviceTypes.ContactSensor;
193
+ }
194
+ clusters = {
195
+ contactSensor: {
196
+ contactState: 0,
197
+ },
198
+ };
199
+ }
200
+ else if (info.deviceType === 'SmokeSensor') {
201
+ try {
202
+ matterDeviceType = this.api.matter.deviceTypes.SmokeSensor.with(this.api.matter.deviceTypes.SmokeSensor.requirements.SmokeCoAlarmServer);
203
+ }
204
+ catch (e) {
205
+ this.log?.warn?.(`[Matter] Could not construct SmokeSensor deviceType with SmokeCoAlarmServer: ${e}`);
206
+ matterDeviceType = this.api.matter.deviceTypes.SmokeSensor;
207
+ }
208
+ clusters = {
209
+ smokeCoAlarm: {
210
+ smokeState: 0,
211
+ coState: 0,
212
+ },
213
+ };
214
+ }
215
+ else if (info.deviceType === 'LeakSensor') {
216
+ try {
217
+ matterDeviceType = this.api.matter.deviceTypes.LeakSensor.with(this.api.matter.deviceTypes.LeakSensor.requirements.BooleanStateServer);
218
+ }
219
+ catch (e) {
220
+ this.log?.warn?.(`[Matter] Could not construct LeakSensor deviceType with LeakDetectionServer: ${e}`);
221
+ matterDeviceType = this.api.matter.deviceTypes.LeakSensor;
222
+ }
223
+ clusters = {
224
+ leakDetection: {
225
+ leakState: 0,
226
+ },
227
+ };
228
+ }
229
+ else if (info.deviceType === 'LightSensor') {
230
+ try {
231
+ matterDeviceType = this.api.matter.deviceTypes.LightSensor.with(this.api.matter.deviceTypes.LightSensor.requirements.IlluminanceMeasurementServer);
232
+ }
233
+ catch (e) {
234
+ this.log?.warn?.(`[Matter] Could not construct LightSensor deviceType with IlluminanceMeasurementServer: ${e}`);
235
+ matterDeviceType = this.api.matter.deviceTypes.LightSensor;
236
+ }
237
+ clusters = {
238
+ illuminanceMeasurement: {
239
+ measuredValue: 1,
240
+ },
241
+ };
242
+ }
243
+ else if (info.deviceType === 'HumiditySensor') {
244
+ try {
245
+ matterDeviceType = this.api.matter.deviceTypes.HumiditySensor.with(this.api.matter.deviceTypes.HumiditySensor.requirements.RelativeHumidityMeasurementServer);
246
+ }
247
+ catch (e) {
248
+ this.log?.warn?.(`[Matter] Could not construct HumiditySensor deviceType with RelativeHumidityMeasurementServer: ${e}`);
249
+ matterDeviceType = this.api.matter.deviceTypes.HumiditySensor;
250
+ }
251
+ clusters = {
252
+ relativeHumidityMeasurement: {
253
+ measuredValue: 0,
254
+ },
255
+ };
256
+ }
257
+ else if (info.deviceType === 'AirQualitySensor') {
258
+ try {
259
+ matterDeviceType = this.api.matter.deviceTypes.AirQualitySensor.with(this.api.matter.deviceTypes.AirQualitySensor.requirements.AirQualityServer);
260
+ }
261
+ catch (e) {
262
+ this.log?.warn?.(`[Matter] Could not construct AirQualitySensor deviceType with AirQualityServer: ${e}`);
263
+ matterDeviceType = this.api.matter.deviceTypes.AirQualitySensor;
264
+ }
265
+ clusters = {
266
+ airQuality: {
267
+ airQuality: 1,
268
+ },
269
+ };
270
+ }
271
+ else {
272
+ matterDeviceType = this.api.matter.deviceTypes[info.deviceType];
273
+ if (!matterDeviceType) {
274
+ this.log?.warn?.(`[Matter] Unknown deviceType '${info.deviceType}', falling back to '${availableTypes[0]}'`);
275
+ matterDeviceType = this.api.matter.deviceTypes[availableTypes[0]];
276
+ }
277
+ clusters = {
278
+ [info.cluster]: {
279
+ [info.attribute]: info.untrippedValue,
280
+ },
281
+ };
282
+ }
283
+ const serialNumber = `matter-${info.deviceType.toLowerCase()}-sensor`;
284
+ const matterAccessory = {
285
+ displayName: deviceName,
286
+ UUID: uuid,
287
+ deviceType: matterDeviceType,
288
+ serialNumber,
289
+ manufacturer: 'homebridge-plugins',
290
+ model: 'UpdateSensor',
291
+ firmwareRevision: '1.0.0',
292
+ hardwareRevision: '1.0.0',
293
+ context: {},
294
+ clusters,
295
+ };
296
+ this.api.matter.registerPlatformAccessories?.(PLUGIN_NAME, PLATFORM_NAME, [matterAccessory]);
297
+ this.registered = true;
298
+ }
299
+ setState(tripped) {
300
+ if (!this.uuid || !this.api.matter) {
301
+ return;
302
+ }
303
+ const info = this.matterInfo;
304
+ this.api.matter.updateAccessoryState?.(this.uuid, info.cluster, {
305
+ [info.attribute]: tripped ? info.trippedValue : info.untrippedValue,
306
+ });
307
+ }
308
+ }
309
+ //# sourceMappingURL=sensorBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensorBase.js","sourceRoot":"","sources":["../src/sensorBase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
3
+ */
4
+ export declare const PLATFORM_NAME = "HomebridgeUpdater";
5
+ /**
6
+ * This must match the name of your plugin as defined in the package.json `name` property
7
+ */
8
+ export declare const PLUGIN_NAME = "@homebridge-plugins/homebridge-updater";
9
+ export declare const UPDATE_SENSOR_UUID_KEY = "PluginUpdateCheck-UpdateSensor";
10
+ export declare const FAILURE_SENSOR_UUID_KEY = "PluginUpdateCheck-FailureSensor";
11
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,WAAW,2CAA2C,CAAA;AAEnE,eAAO,MAAM,sBAAsB,mCAAmC,CAAA;AAEtE,eAAO,MAAM,uBAAuB,oCAAoC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
3
+ */
4
+ export const PLATFORM_NAME = 'HomebridgeUpdater';
5
+ /**
6
+ * This must match the name of your plugin as defined in the package.json `name` property
7
+ */
8
+ export const PLUGIN_NAME = '@homebridge-plugins/homebridge-updater';
9
+ export const UPDATE_SENSOR_UUID_KEY = 'PluginUpdateCheck-UpdateSensor';
10
+ export const FAILURE_SENSOR_UUID_KEY = 'PluginUpdateCheck-FailureSensor';
11
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAA;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAA;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { Logging } from 'homebridge';
2
+ export interface InstalledPlugin {
3
+ name: string;
4
+ installedVersion: string;
5
+ latestVersion: string;
6
+ updateAvailable: boolean;
7
+ }
8
+ export declare class UiApi {
9
+ private log;
10
+ private readonly secrets?;
11
+ private readonly baseUrl?;
12
+ private readonly httpsAgent?;
13
+ private token?;
14
+ private readonly dockerUrl?;
15
+ private readonly cacheable;
16
+ private readonly hbStoragePath;
17
+ constructor(hbStoragePath: string, log: Logging);
18
+ isConfigured(): boolean;
19
+ getHomebridge(): Promise<InstalledPlugin>;
20
+ getPlugins(): Promise<Array<InstalledPlugin>>;
21
+ getIgnoredPlugins(): Promise<Array<string>>;
22
+ getPluginConfig(pluginName: string): Promise<Array<Record<string, unknown>>>;
23
+ updatePluginConfig(pluginName: string, pluginConfig: Array<Record<string, unknown>>): Promise<void>;
24
+ savePluginConfig(pluginName: string): Promise<void>;
25
+ getDocker(): Promise<InstalledPlugin>;
26
+ updateHomebridge(targetVersion?: string): Promise<boolean>;
27
+ updatePlugin(pluginName: string, targetVersion?: string): Promise<boolean>;
28
+ updateNpm(targetVersion?: string): Promise<boolean>;
29
+ private runNpmCommand;
30
+ createBackup(): Promise<boolean>;
31
+ restartHomebridge(): Promise<boolean>;
32
+ private makeRestartCall;
33
+ private makeBackupCall;
34
+ private makeDockerCall;
35
+ private makeCall;
36
+ private nativeRequestWithRetry;
37
+ private nativeRequest;
38
+ getToken(): string;
39
+ }
40
+ //# sourceMappingURL=ui-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-api.d.ts","sourceRoot":"","sources":["../src/ui-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,OAAO,EAGR,MAAM,YAAY,CAAA;AAanB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;CACzB;AA4BD,qBAAa,KAAK;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;gBAE1B,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;IAmCxC,YAAY,IAAI,OAAO;IAIjB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAiBzC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAQ7C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IA6B3C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IA4B5E,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAsCrC,gBAAgB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1E,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAclD,aAAa;IAqCd,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAqChC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;YA4CpC,eAAe;YAyBf,cAAc;YAYd,cAAc;YAiBd,QAAQ;YAwBR,sBAAsB;IAiBpC,OAAO,CAAC,aAAa;IAuEd,QAAQ,IAAI,MAAM;CAoB1B"}