homebridge-dummy 0.9.2 → 1.0.0-alpha.1

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 (55) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +146 -81
  3. package/config.schema.json +150 -54
  4. package/dist/accessory/base.d.ts +23 -0
  5. package/dist/accessory/base.js +69 -0
  6. package/dist/accessory/base.js.map +1 -0
  7. package/dist/accessory/lightbulb.d.ts +15 -0
  8. package/dist/accessory/lightbulb.js +50 -0
  9. package/dist/accessory/lightbulb.js.map +1 -0
  10. package/dist/accessory/onoff.d.ts +16 -0
  11. package/dist/accessory/onoff.js +56 -0
  12. package/dist/accessory/onoff.js.map +1 -0
  13. package/dist/accessory/switch.d.ts +8 -0
  14. package/dist/accessory/switch.js +10 -0
  15. package/dist/accessory/switch.js.map +1 -0
  16. package/dist/homebridge/index.d.ts +3 -5
  17. package/dist/homebridge/index.js +4 -131
  18. package/dist/homebridge/index.js.map +1 -1
  19. package/dist/homebridge/platform.d.ts +15 -0
  20. package/dist/homebridge/platform.js +97 -0
  21. package/dist/homebridge/platform.js.map +1 -0
  22. package/dist/homebridge/settings.d.ts +3 -1
  23. package/dist/homebridge/settings.js +3 -1
  24. package/dist/homebridge/settings.js.map +1 -1
  25. package/dist/homebridge-ui/public/index.html +35 -0
  26. package/dist/homebridge-ui/public/ui.js +1 -0
  27. package/dist/homebridge-ui/server.d.ts +1 -0
  28. package/dist/homebridge-ui/server.js +15 -0
  29. package/dist/homebridge-ui/server.js.map +1 -0
  30. package/dist/i18n/en.d.ts +47 -12
  31. package/dist/i18n/en.js +53 -13
  32. package/dist/i18n/en.js.map +1 -1
  33. package/dist/i18n/i18n.d.ts +47 -12
  34. package/dist/i18n/template.d.ts +47 -12
  35. package/dist/i18n/zz.d.ts +47 -12
  36. package/dist/model/timer.d.ts +12 -0
  37. package/dist/model/timer.js +64 -0
  38. package/dist/model/timer.js.map +1 -0
  39. package/dist/model/types.d.ts +60 -0
  40. package/dist/model/types.js +13 -0
  41. package/dist/model/types.js.map +1 -0
  42. package/dist/tools/configMigration.d.ts +3 -0
  43. package/dist/tools/configMigration.js +86 -0
  44. package/dist/tools/configMigration.js.map +1 -0
  45. package/dist/tools/log.d.ts +14 -0
  46. package/dist/tools/log.js +25 -0
  47. package/dist/tools/log.js.map +1 -0
  48. package/dist/tools/storage.d.ts +4 -2
  49. package/dist/tools/storage.js +7 -4
  50. package/dist/tools/storage.js.map +1 -1
  51. package/dist/tools/validation.d.ts +3 -0
  52. package/dist/tools/validation.js +13 -0
  53. package/dist/tools/validation.js.map +1 -0
  54. package/package.json +33 -24
  55. package/src/homebridge-ui/public/index.html +35 -0
package/dist/i18n/en.js CHANGED
@@ -1,20 +1,60 @@
1
1
  const en = {
2
- brightness: {
3
- set: 'Brightness = %s',
2
+ accessory: {
3
+ missingRequired: '%s is missing required config variable %s',
4
+ lightbulb: {
5
+ brightness: '%s brightness is %s',
6
+ stateOn: '%s is on %s%',
7
+ },
8
+ onOff: {
9
+ stateOn: '%s is on',
10
+ stateOff: '%s is off',
11
+ },
12
+ timer: {
13
+ cancel: 'Cancelled the timer for %s',
14
+ reset: 'Reset the timer for %s',
15
+ setSeconds: '%s is waiting %s seconds',
16
+ setMinutes: '%s is waiting %s minutes',
17
+ setHours: '%s is waiting %s hours',
18
+ },
4
19
  },
5
20
  config: {
6
- support: 'For help and support please visit %s',
21
+ migrate: 'Are you upgrading from an earlier version?',
22
+ migrationDetails1: 'There are significant code changes in this version',
23
+ migrationDetails2: 'HomeKit automations using %s accessories will need to be reconfigured!',
24
+ migrationDetails3: '%s will try to migrate your accessories so they won\'t need to be recreated in Homebridge',
25
+ migrationDetails4: 'Would you like to migrate now?',
26
+ migrationDetails5: 'For more details, please visit %s',
27
+ migrationRestartTitle: 'Restart Homebridge',
28
+ migrationRestartDescription: 'Please restart Homebridge to begin %s migration',
29
+ support: 'For documentation and support please visit %s',
30
+ thankYou: 'Thank you for installing %s',
31
+ yes: 'Yes',
32
+ no: 'No',
33
+ description: {},
34
+ title: {
35
+ accessory: 'Accessory',
36
+ disableLogging: 'Disable Logging',
37
+ name: 'Name',
38
+ },
7
39
  },
8
- info: {
9
- dimmer: 'Dummy Dimmer',
10
- homebridge: 'Homebridge',
11
- switch: 'Dummy Switch',
12
- },
13
- switch: {
14
- delay_ms: 'Delaying %sms…',
15
- delay_s: 'Delaying %ss…',
16
- off: 'Off',
17
- on: 'On',
40
+ startup: {
41
+ migrationBridge: '‼️ Please restart Homebridge one more time for migration to take full effect ‼️',
42
+ migrationComplete: 'Successfully migrated %s accessories!',
43
+ migrationNoAccessories: 'Unable to find any accessories to migrate',
44
+ migrationIgnore: 'You may safely ignore \'No plugin was found…\' errors — they should go away the next time you restart Homebridge',
45
+ migrationFailed: 'Sorry, something went wrong with the accessory migration',
46
+ migrationRevert: 'If you encounter problems, you can find a backup config.json.bak in your Homebridge directory',
47
+ newAccessory: 'Adding new accessory:',
48
+ removeAccessory: 'Removing accessory:',
49
+ restoringAccessory: 'Restoring accessory:',
50
+ setupComplete: '✓ Setup complete',
51
+ unsupportedType: 'Unsupported accessory type %s',
52
+ welcome: [
53
+ 'Please ★ this plugin on GitHub if you\'re finding it useful! https://github.com/mpatfield/homebridge-dummy',
54
+ 'Would you like to sponsor this plugin? https://github.com/sponsors/mpatfield',
55
+ 'Please rate us on HOOBS! https://plugins.hoobs.org/plugin/homebridge-dummy',
56
+ 'Want to see this plugin in your own language? Please visit https://github.com/mpatfield/homebridge-dummy/issues/105',
57
+ ],
18
58
  },
19
59
  };
20
60
  export default en;
@@ -1 +1 @@
1
- {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,MAAM,EAAE,GAAG;IAET,UAAU,EAAE;QACV,GAAG,EAAE,iBAAiB;KACvB;IAED,MAAM,EAAE;QACN,OAAO,EAAE,sCAAsC;KAChD;IAED,IAAI,EAAE;QACJ,MAAM,EAAE,cAAc;QACtB,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,cAAc;KACvB;IAED,MAAM,EAAE;QACN,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,KAAK;QACV,EAAE,EAAE,IAAI;KACT;CACF,CAAC;AAEF,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,MAAM,EAAE,GAAG;IAET,SAAS,EAAE;QAET,eAAe,EAAE,2CAA2C;QAE5D,SAAS,EAAE;YACT,UAAU,EAAE,qBAAqB;YACjC,OAAO,EAAE,cAAc;SACxB;QAED,KAAK,EAAE;YACL,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,WAAW;SACtB;QAED,KAAK,EAAE;YACL,MAAM,EAAE,4BAA4B;YACpC,KAAK,EAAE,wBAAwB;YAC/B,UAAU,EAAE,0BAA0B;YACtC,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,wBAAwB;SACnC;KACF;IAED,MAAM,EAAE;QACN,OAAO,EAAE,4CAA4C;QACrD,iBAAiB,EAAE,oDAAoD;QACvE,iBAAiB,EAAE,wEAAwE;QAC3F,iBAAiB,EAAE,2FAA2F;QAC9G,iBAAiB,EAAE,gCAAgC;QACnD,iBAAiB,EAAE,mCAAmC;QACtD,qBAAqB,EAAE,oBAAoB;QAC3C,2BAA2B,EAAE,iDAAiD;QAC9E,OAAO,EAAE,+CAA+C;QACxD,QAAQ,EAAE,6BAA6B;QACvC,GAAG,EAAE,KAAK;QACV,EAAE,EAAE,IAAI;QAER,WAAW,EAAE,EACZ;QAED,KAAK,EAAE;YACL,SAAS,EAAE,WAAW;YACtB,cAAc,EAAE,iBAAiB;YACjC,IAAI,EAAE,MAAM;SACb;KACF;IAED,OAAO,EAAE;QACP,eAAe,EAAE,iFAAiF;QAClG,iBAAiB,EAAE,uCAAuC;QAC1D,sBAAsB,EAAE,2CAA2C;QACnE,eAAe,EAAE,kHAAkH;QACnI,eAAe,EAAE,0DAA0D;QAC3E,eAAe,EAAE,+FAA+F;QAChH,YAAY,EAAE,uBAAuB;QACrC,eAAe,EAAE,qBAAqB;QACtC,kBAAkB,EAAE,sBAAsB;QAC1C,aAAa,EAAE,kBAAkB;QACjC,eAAe,EAAE,+BAA+B;QAChD,OAAO,EAAE;YACP,4GAA4G;YAC5G,8EAA8E;YAC9E,4EAA4E;YAC5E,qHAAqH;SACtH;KACF;CACF,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -8,22 +8,57 @@ export declare function getLanguage(): Language;
8
8
  export declare function setLanguage(i18nLang: string): void;
9
9
  export declare function getAllTranslations(): Translation;
10
10
  declare const translations: {
11
- brightness: {
12
- set: string;
11
+ accessory: {
12
+ missingRequired: string;
13
+ lightbulb: {
14
+ brightness: string;
15
+ stateOn: string;
16
+ };
17
+ onOff: {
18
+ stateOn: string;
19
+ stateOff: string;
20
+ };
21
+ timer: {
22
+ cancel: string;
23
+ reset: string;
24
+ setSeconds: string;
25
+ setMinutes: string;
26
+ setHours: string;
27
+ };
13
28
  };
14
29
  config: {
30
+ migrate: string;
31
+ migrationDetails1: string;
32
+ migrationDetails2: string;
33
+ migrationDetails3: string;
34
+ migrationDetails4: string;
35
+ migrationDetails5: string;
36
+ migrationRestartTitle: string;
37
+ migrationRestartDescription: string;
15
38
  support: string;
39
+ thankYou: string;
40
+ yes: string;
41
+ no: string;
42
+ description: {};
43
+ title: {
44
+ accessory: string;
45
+ disableLogging: string;
46
+ name: string;
47
+ };
16
48
  };
17
- info: {
18
- dimmer: string;
19
- homebridge: string;
20
- switch: string;
21
- };
22
- switch: {
23
- delay_ms: string;
24
- delay_s: string;
25
- off: string;
26
- on: string;
49
+ startup: {
50
+ migrationBridge: string;
51
+ migrationComplete: string;
52
+ migrationNoAccessories: string;
53
+ migrationIgnore: string;
54
+ migrationFailed: string;
55
+ migrationRevert: string;
56
+ newAccessory: string;
57
+ removeAccessory: string;
58
+ restoringAccessory: string;
59
+ setupComplete: string;
60
+ unsupportedType: string;
61
+ welcome: string[];
27
62
  };
28
63
  };
29
64
  export { translations as strings };
@@ -1,20 +1,55 @@
1
1
  declare const REPLACE_THIS_WITH_ISO_CODE: {
2
- brightness: {
3
- set: string;
2
+ accessory: {
3
+ missingRequired: string;
4
+ lightbulb: {
5
+ brightness: string;
6
+ stateOn: string;
7
+ };
8
+ onOff: {
9
+ stateOn: string;
10
+ stateOff: string;
11
+ };
12
+ timer: {
13
+ cancel: string;
14
+ reset: string;
15
+ setSeconds: string;
16
+ setMinutes: string;
17
+ setHours: string;
18
+ };
4
19
  };
5
20
  config: {
21
+ migrate: string;
22
+ migrationDetails1: string;
23
+ migrationDetails2: string;
24
+ migrationDetails3: string;
25
+ migrationDetails4: string;
26
+ migrationDetails5: string;
27
+ migrationRestartTitle: string;
28
+ migrationRestartDescription: string;
6
29
  support: string;
30
+ thankYou: string;
31
+ yes: string;
32
+ no: string;
33
+ description: {};
34
+ title: {
35
+ accessory: string;
36
+ disableLogging: string;
37
+ name: string;
38
+ };
7
39
  };
8
- info: {
9
- dimmer: string;
10
- homebridge: string;
11
- switch: string;
12
- };
13
- switch: {
14
- delay_ms: string;
15
- delay_s: string;
16
- off: string;
17
- on: string;
40
+ startup: {
41
+ migrationBridge: string;
42
+ migrationComplete: string;
43
+ migrationNoAccessories: string;
44
+ migrationIgnore: string;
45
+ migrationFailed: string;
46
+ migrationRevert: string;
47
+ newAccessory: string;
48
+ removeAccessory: string;
49
+ restoringAccessory: string;
50
+ setupComplete: string;
51
+ unsupportedType: string;
52
+ welcome: string[];
18
53
  };
19
54
  };
20
55
  export default REPLACE_THIS_WITH_ISO_CODE;
package/dist/i18n/zz.d.ts CHANGED
@@ -1,20 +1,55 @@
1
1
  declare const zz: {
2
- brightness: {
3
- set: string;
2
+ accessory: {
3
+ missingRequired: string;
4
+ lightbulb: {
5
+ brightness: string;
6
+ stateOn: string;
7
+ };
8
+ onOff: {
9
+ stateOn: string;
10
+ stateOff: string;
11
+ };
12
+ timer: {
13
+ cancel: string;
14
+ reset: string;
15
+ setSeconds: string;
16
+ setMinutes: string;
17
+ setHours: string;
18
+ };
4
19
  };
5
20
  config: {
21
+ migrate: string;
22
+ migrationDetails1: string;
23
+ migrationDetails2: string;
24
+ migrationDetails3: string;
25
+ migrationDetails4: string;
26
+ migrationDetails5: string;
27
+ migrationRestartTitle: string;
28
+ migrationRestartDescription: string;
6
29
  support: string;
30
+ thankYou: string;
31
+ yes: string;
32
+ no: string;
33
+ description: {};
34
+ title: {
35
+ accessory: string;
36
+ disableLogging: string;
37
+ name: string;
38
+ };
7
39
  };
8
- info: {
9
- dimmer: string;
10
- homebridge: string;
11
- switch: string;
12
- };
13
- switch: {
14
- delay_ms: string;
15
- delay_s: string;
16
- off: string;
17
- on: string;
40
+ startup: {
41
+ migrationBridge: string;
42
+ migrationComplete: string;
43
+ migrationNoAccessories: string;
44
+ migrationIgnore: string;
45
+ migrationFailed: string;
46
+ migrationRevert: string;
47
+ newAccessory: string;
48
+ removeAccessory: string;
49
+ restoringAccessory: string;
50
+ setupComplete: string;
51
+ unsupportedType: string;
52
+ welcome: string[];
18
53
  };
19
54
  };
20
55
  export default zz;
@@ -0,0 +1,12 @@
1
+ import { Log } from '../tools/log.js';
2
+ import { TimerConfig } from './types.js';
3
+ export declare class Timer {
4
+ private readonly caller;
5
+ private readonly log?;
6
+ private timer;
7
+ constructor(caller: string, log?: Log | undefined);
8
+ start(config: TimerConfig, callback: () => Promise<void>): void;
9
+ cancel(): void;
10
+ teardown(): void;
11
+ private reset;
12
+ }
@@ -0,0 +1,64 @@
1
+ import { strings } from '../i18n/i18n.js';
2
+ import { TimeUnits } from './types.js';
3
+ const SECOND = 1000;
4
+ const MINUTE = 60 * SECOND;
5
+ const HOUR = 60 * MINUTE;
6
+ export class Timer {
7
+ caller;
8
+ log;
9
+ timer = undefined;
10
+ constructor(caller, log) {
11
+ this.caller = caller;
12
+ this.log = log;
13
+ }
14
+ start(config, callback) {
15
+ if (this.timer) {
16
+ this.log?.always(strings.accessory.timer.reset, this.caller);
17
+ this.reset();
18
+ }
19
+ let delay = config.delay;
20
+ switch (config.units) {
21
+ case TimeUnits.MILLIS:
22
+ break;
23
+ case TimeUnits.SECONDS:
24
+ delay *= SECOND;
25
+ break;
26
+ case TimeUnits.MINUTES:
27
+ delay *= MINUTE;
28
+ break;
29
+ case TimeUnits.HOURS:
30
+ delay *= HOUR;
31
+ break;
32
+ }
33
+ if (config.random) {
34
+ delay = Math.floor(Math.max(SECOND, Math.random() * delay));
35
+ }
36
+ if (delay < MINUTE) {
37
+ this.log?.always(strings.accessory.timer.setSeconds, this.caller, Math.round(delay / SECOND));
38
+ }
39
+ else if (delay < HOUR) {
40
+ this.log?.always(strings.accessory.timer.setMinutes, this.caller, Math.round(delay / MINUTE));
41
+ }
42
+ else {
43
+ this.log?.always(strings.accessory.timer.setSeconds, this.caller, Math.round(delay / HOUR));
44
+ }
45
+ this.timer = setTimeout(async () => {
46
+ this.reset();
47
+ await callback();
48
+ }, delay);
49
+ }
50
+ cancel() {
51
+ if (this.timer) {
52
+ this.log?.always(strings.accessory.timer.cancel, this.caller);
53
+ this.reset();
54
+ }
55
+ }
56
+ teardown() {
57
+ this.reset();
58
+ }
59
+ reset() {
60
+ clearTimeout(this.timer);
61
+ this.timer = undefined;
62
+ }
63
+ }
64
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../../src/model/timer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export type ServiceType = typeof import('homebridge').Service;
2
+ export type CharacteristicType = typeof import('homebridge').Characteristic;
3
+ export declare enum AccessoryType {
4
+ Lightbulb = "Lightbulb",
5
+ Switch = "Switch"
6
+ }
7
+ export type ChildBridge = {
8
+ username: string;
9
+ port?: number;
10
+ name?: string;
11
+ };
12
+ export type AccessoryConfig = {
13
+ accessory: string;
14
+ _bridge?: ChildBridge;
15
+ };
16
+ export type LegacyAccessoryConfig = AccessoryConfig & {
17
+ name: string;
18
+ dimmer?: boolean;
19
+ brightness?: number;
20
+ stateful?: boolean;
21
+ reverse?: boolean;
22
+ time?: number;
23
+ resettable?: boolean;
24
+ random?: boolean;
25
+ disableLogging?: boolean;
26
+ };
27
+ export type PlatformConfig = {
28
+ platform: string;
29
+ };
30
+ export type DummyPlatformConfig = PlatformConfig & {
31
+ accessories?: DummyAccessoryConfig[];
32
+ _bridge?: ChildBridge;
33
+ migrationNeeded?: boolean;
34
+ };
35
+ export declare enum TimeUnits {
36
+ MILLIS = "MILLIS",
37
+ SECONDS = "SECONDS",
38
+ MINUTES = "MINUTES",
39
+ HOURS = "HOURS"
40
+ }
41
+ export type Assertable = {};
42
+ export type TimerConfig = Assertable & {
43
+ delay: number;
44
+ units: TimeUnits;
45
+ random?: boolean;
46
+ };
47
+ export type DummyAccessoryConfig = {
48
+ name: string;
49
+ type: AccessoryType;
50
+ legacy?: boolean;
51
+ timer?: TimerConfig;
52
+ disableLogging?: boolean;
53
+ };
54
+ export type OnOffConfig = DummyAccessoryConfig & {
55
+ defaultOn: boolean;
56
+ };
57
+ export type SwitchConfig = OnOffConfig & {};
58
+ export type LightbulbConfig = OnOffConfig & {
59
+ defaultBrightness: number;
60
+ };
@@ -0,0 +1,13 @@
1
+ export var AccessoryType;
2
+ (function (AccessoryType) {
3
+ AccessoryType["Lightbulb"] = "Lightbulb";
4
+ AccessoryType["Switch"] = "Switch";
5
+ })(AccessoryType || (AccessoryType = {}));
6
+ export var TimeUnits;
7
+ (function (TimeUnits) {
8
+ TimeUnits["MILLIS"] = "MILLIS";
9
+ TimeUnits["SECONDS"] = "SECONDS";
10
+ TimeUnits["MINUTES"] = "MINUTES";
11
+ TimeUnits["HOURS"] = "HOURS";
12
+ })(TimeUnits || (TimeUnits = {}));
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,kCAAiB,CAAA;AACnB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAmCD,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;IACnB,4BAAe,CAAA;AACjB,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB"}
@@ -0,0 +1,3 @@
1
+ import { Log } from './log.js';
2
+ import { DummyAccessoryConfig } from '../model/types.js';
3
+ export declare function migrateAccessories(log: Log, configPath: string): Promise<DummyAccessoryConfig[] | undefined>;
@@ -0,0 +1,86 @@
1
+ import fs from 'fs';
2
+ import { strings } from '../i18n/i18n.js';
3
+ import { LEGACY_ALIAS, PLATFORM_NAME } from '../homebridge/settings.js';
4
+ import { AccessoryType, TimeUnits, } from '../model/types.js';
5
+ function migrateAccessory(legacyConfig) {
6
+ const dummyConfig = {
7
+ name: legacyConfig.name,
8
+ type: AccessoryType.Switch,
9
+ disableLogging: legacyConfig.disableLogging,
10
+ legacy: true,
11
+ };
12
+ if (legacyConfig.reverse) {
13
+ const onOffConfig = dummyConfig;
14
+ onOffConfig.defaultOn = true;
15
+ }
16
+ if (legacyConfig.dimmer) {
17
+ const lightbulbConfig = dummyConfig;
18
+ lightbulbConfig.type = AccessoryType.Lightbulb;
19
+ lightbulbConfig.defaultBrightness = legacyConfig.brightness ?? 0;
20
+ }
21
+ if (!legacyConfig.stateful && legacyConfig.time) {
22
+ dummyConfig.timer = {
23
+ delay: legacyConfig.time,
24
+ units: TimeUnits.MILLIS,
25
+ random: legacyConfig.random,
26
+ };
27
+ }
28
+ return dummyConfig;
29
+ }
30
+ export async function migrateAccessories(log, configPath) {
31
+ try {
32
+ const config = JSON.parse(fs.readFileSync(configPath, { encoding: 'utf8' }));
33
+ fs.writeFileSync(configPath + '.bak', JSON.stringify(config, null, 4));
34
+ let dummyPlatformConfig;
35
+ for (const platformConfig of config.platforms) {
36
+ if (platformConfig.platform !== PLATFORM_NAME) {
37
+ continue;
38
+ }
39
+ dummyPlatformConfig = platformConfig;
40
+ break;
41
+ }
42
+ if (!dummyPlatformConfig) {
43
+ log.error(strings.startup.migrationFailed);
44
+ return;
45
+ }
46
+ dummyPlatformConfig.accessories = dummyPlatformConfig.accessories?.length ? dummyPlatformConfig.accessories : [];
47
+ const migrated = [];
48
+ const others = [];
49
+ let childBridge;
50
+ for (const accessoryConfig of config.accessories) {
51
+ if (accessoryConfig.accessory !== LEGACY_ALIAS) {
52
+ others.push(accessoryConfig);
53
+ continue;
54
+ }
55
+ const dummyConfig = migrateAccessory(accessoryConfig);
56
+ migrated.push(dummyConfig);
57
+ dummyPlatformConfig.accessories.push(dummyConfig);
58
+ if (accessoryConfig._bridge?.port) {
59
+ childBridge = accessoryConfig._bridge;
60
+ }
61
+ }
62
+ config.accessories = others;
63
+ if (!dummyPlatformConfig._bridge) {
64
+ dummyPlatformConfig._bridge = childBridge;
65
+ }
66
+ delete dummyPlatformConfig.migrationNeeded;
67
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 4));
68
+ if (migrated.length === 0) {
69
+ log.warning(strings.startup.migrationNoAccessories);
70
+ return;
71
+ }
72
+ log.success(strings.startup.migrationComplete, migrated.length);
73
+ log.warning(strings.startup.migrationRevert);
74
+ if (childBridge) {
75
+ log.error(strings.startup.migrationBridge);
76
+ }
77
+ else {
78
+ log.warning(strings.startup.migrationIgnore);
79
+ }
80
+ return migrated;
81
+ }
82
+ catch (err) {
83
+ log.error(strings.startup.migrationFailed, err);
84
+ }
85
+ }
86
+ //# sourceMappingURL=configMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configMigration.js","sourceRoot":"","sources":["../../src/tools/configMigration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Logger } from 'homebridge';
2
+ export declare enum LogType {
3
+ ALWAYS = 0,
4
+ WARNING = 1,
5
+ ERROR = 2
6
+ }
7
+ export declare class Log {
8
+ private readonly logger;
9
+ constructor(logger: Logger);
10
+ always(message: string, ...parameters: any[]): void;
11
+ warning(message: string, ...parameters: any[]): void;
12
+ error(message: string, ...parameters: any[]): void;
13
+ success(message: string, ...parameters: any[]): void;
14
+ }
@@ -0,0 +1,25 @@
1
+ export var LogType;
2
+ (function (LogType) {
3
+ LogType[LogType["ALWAYS"] = 0] = "ALWAYS";
4
+ LogType[LogType["WARNING"] = 1] = "WARNING";
5
+ LogType[LogType["ERROR"] = 2] = "ERROR";
6
+ })(LogType || (LogType = {}));
7
+ export class Log {
8
+ logger;
9
+ constructor(logger) {
10
+ this.logger = logger;
11
+ }
12
+ always(message, ...parameters) {
13
+ this.logger.info(message, ...parameters);
14
+ }
15
+ warning(message, ...parameters) {
16
+ this.logger.warn(message, ...parameters);
17
+ }
18
+ error(message, ...parameters) {
19
+ this.logger.error(message, ...parameters);
20
+ }
21
+ success(message, ...parameters) {
22
+ this.logger.success(message, ...parameters);
23
+ }
24
+ }
25
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/tools/log.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACjB,yCAAM,CAAA;IACN,2CAAO,CAAA;IACP,uCAAK,CAAA;AACP,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,OAAO,GAAG;IAGK;IADnB,YACmB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEG,MAAM,CAAC,OAAe,EAAE,GAAG,UAAiB;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO,CAAC,OAAe,EAAE,GAAG,UAAiB;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,OAAe,EAAE,GAAG,UAAiB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAC5C,CAAC;IAEM,OAAO,CAAC,OAAe,EAAE,GAAG,UAAiB;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,2 +1,4 @@
1
- export declare function storageGet(dir: string, key: string): Promise<string | null>;
2
- export declare function storageSet(dir: string, key: string, value: string): Promise<void>;
1
+ export declare const STORAGE_KEY_SUFFIX_BRIGHTNESS = "Brightness";
2
+ export declare const STORAGE_KEY_SUFFIX_ON = "On";
3
+ export declare function storageGet(dir: string, key: string): Promise<any>;
4
+ export declare function storageSet(dir: string, key: string, value: any): Promise<void>;
@@ -1,21 +1,24 @@
1
1
  import storage from 'node-persist';
2
- import { PLUGIN_NAME } from '../homebridge/settings.js';
2
+ export const STORAGE_KEY_SUFFIX_BRIGHTNESS = 'Brightness';
3
+ export const STORAGE_KEY_SUFFIX_ON = 'On';
3
4
  async function init(dir) {
4
5
  await storage.init({ dir: dir, forgiveParseErrors: true });
5
6
  }
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
8
  export async function storageGet(dir, key) {
7
9
  try {
8
10
  await init(dir);
9
- return await storage.get(`${PLUGIN_NAME}:${key}`);
11
+ return await storage.get(key);
10
12
  }
11
13
  catch (err) {
12
- return null;
14
+ // Nothing
13
15
  }
14
16
  }
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
18
  export async function storageSet(dir, key, value) {
16
19
  try {
17
20
  await init(dir);
18
- storage.set(`${PLUGIN_NAME}:${key}`, value);
21
+ storage.set(key, value);
19
22
  }
20
23
  catch {
21
24
  // Nothing
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/tools/storage.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,KAAK,UAAU,IAAI,CAAC,GAAW;IAC7B,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW,EAAE,KAAa;IACtE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/tools/storage.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,MAAM,6BAA6B,GAAG,YAAY,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,KAAK,UAAU,IAAI,CAAC,GAAW;IAC7B,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW;IACvD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU;IACZ,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW,EAAE,KAAU;IACnE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Log } from './log.js';
2
+ import { Assertable } from '../model/types.js';
3
+ export declare function assert(log: Log, caller: string, assertable: Assertable, ...keys: (keyof any)[]): boolean;
@@ -0,0 +1,13 @@
1
+ import { strings } from '../i18n/i18n.js';
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ export function assert(log, caller, assertable, ...keys) {
4
+ let valid = true;
5
+ for (const key of keys) {
6
+ if (assertable[key] === undefined) {
7
+ log.error(strings.accessory.missingRequired, caller, `'${key.toString()}'`);
8
+ valid = false;
9
+ }
10
+ }
11
+ return valid;
12
+ }
13
+ //# sourceMappingURL=validation.js.map