@homebridge-plugins/homebridge-firstalert 0.0.1-beta.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 (121) hide show
  1. package/.gitattributes +2 -0
  2. package/.github/FUNDING.yml +4 -0
  3. package/.github/ISSUE_TEMPLATE/bug-report.yml +97 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature-request.yml +38 -0
  6. package/.github/ISSUE_TEMPLATE/support-request.yml +85 -0
  7. package/.github/ISSUE_TEMPLATE.md +52 -0
  8. package/.github/PULL_REQUEST_TEMPLATE/pull_request.md +27 -0
  9. package/.github/dependabot.yml +17 -0
  10. package/.github/labeler.yml +38 -0
  11. package/.github/release-drafter.yml +33 -0
  12. package/.github/workflows/beta-release.yml +55 -0
  13. package/.github/workflows/build.yml +18 -0
  14. package/.github/workflows/changerelease.yml +11 -0
  15. package/.github/workflows/labeler.yml +9 -0
  16. package/.github/workflows/release-drafter.yml +14 -0
  17. package/.github/workflows/release.yml +35 -0
  18. package/.github/workflows/stale.yml +12 -0
  19. package/CHANGELOG.md +10 -0
  20. package/LICENSE +14 -0
  21. package/README.md +67 -0
  22. package/SECURITY.md +19 -0
  23. package/branding/Homebridge_x_FirstAlert.svg +48 -0
  24. package/branding/icon.png +0 -0
  25. package/config.schema.json +58 -0
  26. package/dist/homebridge-ui/public/index.html +548 -0
  27. package/dist/src/api/resideoClient.d.ts +32 -0
  28. package/dist/src/api/resideoClient.d.ts.map +1 -0
  29. package/dist/src/api/resideoClient.js +76 -0
  30. package/dist/src/api/resideoClient.js.map +1 -0
  31. package/dist/src/devices/device.d.ts +40 -0
  32. package/dist/src/devices/device.d.ts.map +1 -0
  33. package/dist/src/devices/device.js +207 -0
  34. package/dist/src/devices/device.js.map +1 -0
  35. package/dist/src/devices/leaksensors.d.ts +34 -0
  36. package/dist/src/devices/leaksensors.d.ts.map +1 -0
  37. package/dist/src/devices/leaksensors.js +163 -0
  38. package/dist/src/devices/leaksensors.js.map +1 -0
  39. package/dist/src/devices/smoke.d.ts +35 -0
  40. package/dist/src/devices/smoke.d.ts.map +1 -0
  41. package/dist/src/devices/smoke.js +150 -0
  42. package/dist/src/devices/smoke.js.map +1 -0
  43. package/dist/src/devices/thermostats.d.ts +42 -0
  44. package/dist/src/devices/thermostats.d.ts.map +1 -0
  45. package/dist/src/devices/thermostats.js +192 -0
  46. package/dist/src/devices/thermostats.js.map +1 -0
  47. package/dist/src/devices/valve.d.ts +21 -0
  48. package/dist/src/devices/valve.d.ts.map +1 -0
  49. package/dist/src/devices/valve.js +131 -0
  50. package/dist/src/devices/valve.js.map +1 -0
  51. package/dist/src/homebridge-ui/server.d.ts +5 -0
  52. package/dist/src/homebridge-ui/server.d.ts.map +1 -0
  53. package/dist/src/homebridge-ui/server.js +95 -0
  54. package/dist/src/homebridge-ui/server.js.map +1 -0
  55. package/dist/src/index.d.ts +4 -0
  56. package/dist/src/index.d.ts.map +1 -0
  57. package/dist/src/index.js +7 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/dist/src/platform.d.ts +18 -0
  60. package/dist/src/platform.d.ts.map +1 -0
  61. package/dist/src/platform.js +108 -0
  62. package/dist/src/platform.js.map +1 -0
  63. package/dist/src/settings.d.ts +341 -0
  64. package/dist/src/settings.d.ts.map +1 -0
  65. package/dist/src/settings.js +25 -0
  66. package/dist/src/settings.js.map +1 -0
  67. package/dist/src/utils.d.ts +21 -0
  68. package/dist/src/utils.d.ts.map +1 -0
  69. package/dist/src/utils.js +58 -0
  70. package/dist/src/utils.js.map +1 -0
  71. package/dist/test/index.test.d.ts +2 -0
  72. package/dist/test/index.test.d.ts.map +1 -0
  73. package/dist/test/index.test.js +14 -0
  74. package/dist/test/index.test.js.map +1 -0
  75. package/dist/test/platform.test.d.ts +2 -0
  76. package/dist/test/platform.test.d.ts.map +1 -0
  77. package/dist/test/platform.test.js +56 -0
  78. package/dist/test/platform.test.js.map +1 -0
  79. package/dist/test/settings.test.d.ts +2 -0
  80. package/dist/test/settings.test.d.ts.map +1 -0
  81. package/dist/test/settings.test.js +48 -0
  82. package/dist/test/settings.test.js.map +1 -0
  83. package/dist/test/utils.test.d.ts +2 -0
  84. package/dist/test/utils.test.d.ts.map +1 -0
  85. package/dist/test/utils.test.js +17 -0
  86. package/dist/test/utils.test.js.map +1 -0
  87. package/docs/.nojekyll +1 -0
  88. package/docs/assets/hierarchy.js +1 -0
  89. package/docs/assets/highlight.css +22 -0
  90. package/docs/assets/icons.js +18 -0
  91. package/docs/assets/icons.svg +1 -0
  92. package/docs/assets/main.js +60 -0
  93. package/docs/assets/navigation.js +1 -0
  94. package/docs/assets/search.js +1 -0
  95. package/docs/assets/style.css +1633 -0
  96. package/docs/hierarchy.html +1 -0
  97. package/docs/index.html +77 -0
  98. package/docs/modules.html +1 -0
  99. package/docs/variables/default.html +1 -0
  100. package/eslint.config.js +44 -0
  101. package/nodemon.json +10 -0
  102. package/package.json +106 -0
  103. package/scripts/free-dev-ports.mjs +105 -0
  104. package/src/api/resideoClient.ts +106 -0
  105. package/src/devices/device.ts +226 -0
  106. package/src/devices/leaksensors.ts +206 -0
  107. package/src/devices/smoke.ts +173 -0
  108. package/src/devices/thermostats.ts +243 -0
  109. package/src/devices/valve.ts +162 -0
  110. package/src/homebridge-ui/public/index.html +548 -0
  111. package/src/homebridge-ui/server.ts +102 -0
  112. package/src/index.ts +13 -0
  113. package/src/platform.ts +112 -0
  114. package/src/settings.ts +402 -0
  115. package/src/utils.ts +61 -0
  116. package/test/index.test.ts +18 -0
  117. package/test/platform.test.ts +65 -0
  118. package/test/settings.test.ts +56 -0
  119. package/test/utils.test.ts +20 -0
  120. package/tsconfig.json +27 -0
  121. package/typedoc.json +22 -0
@@ -0,0 +1,95 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import crypto from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import { HomebridgePluginUiServer } from '@homebridge/plugin-ui-utils';
5
+ export class PluginUiServer extends HomebridgePluginUiServer {
6
+ constructor() {
7
+ super();
8
+ // OAuth PKCE flow handler
9
+ this.onRequest('startOAuthFlow', async (payload) => {
10
+ try {
11
+ const { consumerKey, consumerSecret, code, codeVerifier } = payload || {};
12
+ if (!consumerKey || !consumerSecret) {
13
+ return { status: 'error', data: 'Missing consumerKey or consumerSecret' };
14
+ }
15
+ // If no code, generate PKCE and return authUrl for UI
16
+ if (!code) {
17
+ const generatedVerifier = crypto.randomBytes(32).toString('base64url');
18
+ const challenge = crypto.createHash('sha256').update(generatedVerifier).digest('base64url');
19
+ const redirectUri = 'urn:ietf:wg:oauth:2.0:oob';
20
+ const authUrl = `https://api.honeywell.com/oauth2/authorize?response_type=code&client_id=${encodeURIComponent(consumerKey)}&redirect_uri=${encodeURIComponent(redirectUri)}&code_challenge=${encodeURIComponent(challenge)}&code_challenge_method=S256&appSelect=1`;
21
+ return { status: 'need_code', data: { authUrl, codeVerifier: generatedVerifier } };
22
+ }
23
+ // Exchange code for tokens
24
+ if (!codeVerifier) {
25
+ return { status: 'error', data: 'Missing PKCE code_verifier' };
26
+ }
27
+ const redirectUri = 'urn:ietf:wg:oauth:2.0:oob';
28
+ const tokenRes = await fetch('https://api.honeywell.com/oauth2/token', {
29
+ method: 'POST',
30
+ headers: {
31
+ 'Authorization': `Basic ${Buffer.from(`${consumerKey}:${consumerSecret}`).toString('base64')}`,
32
+ 'Accept': 'application/json',
33
+ 'Content-Type': 'application/x-www-form-urlencoded',
34
+ },
35
+ body: `grant_type=authorization_code&code=${encodeURIComponent(code)}&redirect_uri=${encodeURIComponent(redirectUri)}&code_verifier=${encodeURIComponent(codeVerifier)}`,
36
+ });
37
+ const tokenData = await tokenRes.json();
38
+ if (tokenData.refresh_token) {
39
+ return { status: 'ok', data: { refreshToken: tokenData.refresh_token, accessToken: tokenData.access_token } };
40
+ }
41
+ else {
42
+ return { status: 'error', data: tokenData };
43
+ }
44
+ }
45
+ catch (err) {
46
+ return { status: 'error', data: (err && typeof err === 'object' && 'message' in err) ? err.message : String(err) };
47
+ }
48
+ });
49
+ // Device discovery handler
50
+ this.onRequest('discoverDevices', async (payload) => {
51
+ try {
52
+ const { accessToken } = payload || {};
53
+ if (!accessToken) {
54
+ return { status: 'error', data: 'No access token provided' };
55
+ }
56
+ const res = await fetch('https://api.honeywell.com/v2/devices', {
57
+ headers: {
58
+ Authorization: `Bearer ${accessToken}`,
59
+ Accept: 'application/json',
60
+ },
61
+ });
62
+ if (!res.ok) {
63
+ return { status: 'error', data: await res.text() };
64
+ }
65
+ const data = await res.json();
66
+ return { status: 'ok', data };
67
+ }
68
+ catch (err) {
69
+ return { status: 'error', data: (err && typeof err === 'object' && 'message' in err) ? err.message : String(err) };
70
+ }
71
+ });
72
+ // Legacy: getCachedAccessories for older config-ui-x
73
+ this.onRequest('/getCachedAccessories', async () => {
74
+ try {
75
+ const plugin = '@homebridge-plugins/homebridge-firstalert';
76
+ const devicesToReturn = [];
77
+ const accFile = `${this.homebridgeStoragePath}/accessories/cachedAccessories`;
78
+ if (fs.existsSync(accFile)) {
79
+ const cachedAccessoriesData = await fs.promises.readFile(accFile, 'utf8');
80
+ const cachedAccessories = JSON.parse(cachedAccessoriesData);
81
+ cachedAccessories
82
+ .filter((accessory) => accessory.plugin === plugin)
83
+ .forEach((accessory) => devicesToReturn.push(accessory));
84
+ }
85
+ return { status: 'ok', data: devicesToReturn };
86
+ }
87
+ catch (err) {
88
+ return { status: 'error', data: [] };
89
+ }
90
+ });
91
+ this.ready();
92
+ }
93
+ }
94
+ (() => new PluginUiServer())();
95
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/homebridge-ui/server.ts"],"names":[],"mappings":"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"}
@@ -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":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;yBAMrB,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAEC"}
@@ -0,0 +1,7 @@
1
+ import { ResideoPlatform } from './platform.js';
2
+ import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
3
+ // Register our platform with homebridge.
4
+ export default (api) => {
5
+ api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, ResideoPlatform);
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE1D,yCAAyC;AACzC,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,eAAe,CAAC,CAAA;AACnE,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { API, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig } from 'homebridge';
2
+ import { ResideoClient } from './api/resideoClient.js';
3
+ export declare class ResideoPlatform implements DynamicPlatformPlugin {
4
+ private readonly log;
5
+ private readonly config;
6
+ private readonly api;
7
+ private readonly pollInterval;
8
+ readonly client: ResideoClient;
9
+ private pollTimer?;
10
+ private accessories;
11
+ private deviceInstances;
12
+ constructor(log: Logger, config: PlatformConfig, api: API);
13
+ discoverDevices(): Promise<void>;
14
+ startPolling(deviceIds: string[]): void;
15
+ pollDevices(deviceIds: string[]): Promise<void>;
16
+ configureAccessory(accessory: PlatformAccessory): void;
17
+ }
18
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAOtD,qBAAa,eAAgB,YAAW,qBAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,SAAgB,MAAM,EAAG,aAAa,CAAA;IACtC,OAAO,CAAC,SAAS,CAAC,CAAK;IACvB,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,eAAe,CAAiC;gBAE5C,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG;IAanD,eAAe;IA+CrB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE;IAQ1B,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE;IAoBrC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;CAIhD"}
@@ -0,0 +1,108 @@
1
+ import { ResideoClient } from './api/resideoClient.js';
2
+ import { Thermostats } from './devices/thermostats.js';
3
+ import { LeakSensor } from './devices/leaksensors.js';
4
+ import { Valve } from './devices/valve.js';
5
+ import { SmokeSensor } from './devices/smoke.js';
6
+ export class ResideoPlatform {
7
+ log;
8
+ config;
9
+ api;
10
+ pollInterval;
11
+ client;
12
+ pollTimer;
13
+ accessories = [];
14
+ deviceInstances = {};
15
+ constructor(log, config, api) {
16
+ this.log = log;
17
+ this.config = config;
18
+ this.api = api;
19
+ this.pollInterval = config.pollInterval || 60;
20
+ if (!config.refreshToken) {
21
+ this.log.error('No refresh token configured. Please log in via the Homebridge UI.');
22
+ return;
23
+ }
24
+ this.client = new ResideoClient(config.refreshToken);
25
+ api.on('didFinishLaunching', () => this.discoverDevices());
26
+ }
27
+ async discoverDevices() {
28
+ try {
29
+ const account = await this.client.getAccount();
30
+ for (const device of account.devices) {
31
+ // Find or create accessory
32
+ let accessory = this.accessories.find(a => a.context.deviceID === device.deviceId);
33
+ if (!accessory) {
34
+ accessory = new this.api.platformAccessory(device.name, this.api.hap.uuid.generate(device.deviceId));
35
+ accessory.context.deviceID = device.deviceId;
36
+ accessory.context.deviceType = device.globalDeviceType;
37
+ this.api.registerPlatformAccessories('@homebridge-plugins/homebridge-firstalert', 'FirstAlert', [accessory]);
38
+ this.accessories.push(accessory);
39
+ this.log.info(`Registered new accessory: ${device.name} (${device.deviceId})`);
40
+ }
41
+ // Instantiate correct device class
42
+ let instance;
43
+ switch (device.globalDeviceType) {
44
+ case 'thermostat':
45
+ instance = new Thermostats(this, accessory, device);
46
+ break;
47
+ case 'leakSensor':
48
+ instance = new LeakSensor(this, accessory, device);
49
+ break;
50
+ case 'valve':
51
+ instance = new Valve(this, accessory, device);
52
+ break;
53
+ case 'smoke':
54
+ case 'smokeSensor':
55
+ case 'smokeDetector':
56
+ case 'carbonMonoxideSensor':
57
+ case 'carbonDioxideSensor':
58
+ instance = new SmokeSensor(this, accessory, device);
59
+ break;
60
+ default:
61
+ this.log.warn(`Unknown device type: ${device.globalDeviceType} (${device.deviceId})`);
62
+ }
63
+ if (instance) {
64
+ this.deviceInstances[device.deviceId] = instance;
65
+ }
66
+ this.log.info(`Discovered device: ${device.name} (${device.deviceId})`);
67
+ }
68
+ this.startPolling(account.devices.map(d => d.deviceId));
69
+ }
70
+ catch (err) {
71
+ this.log.error('Failed to discover devices:', err);
72
+ }
73
+ }
74
+ startPolling(deviceIds) {
75
+ if (this.pollTimer) {
76
+ clearInterval(this.pollTimer);
77
+ }
78
+ this.pollTimer = setInterval(() => this.pollDevices(deviceIds), this.pollInterval * 1000);
79
+ this.pollDevices(deviceIds); // Initial poll
80
+ }
81
+ async pollDevices(deviceIds) {
82
+ for (const deviceId of deviceIds) {
83
+ const instance = this.deviceInstances[deviceId];
84
+ if (instance && typeof instance.updateState === 'function') {
85
+ try {
86
+ await instance.updateState();
87
+ }
88
+ catch (err) {
89
+ this.log.warn(`Failed to update state for device ${deviceId}:`, err);
90
+ }
91
+ }
92
+ else {
93
+ try {
94
+ const state = await this.client.getDeviceState(deviceId);
95
+ this.log.debug(`Polled device ${deviceId}:`, JSON.stringify(state));
96
+ }
97
+ catch (err) {
98
+ this.log.warn(`Failed to poll device ${deviceId}:`, err);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ configureAccessory(accessory) {
104
+ // Required for restoring cached accessories
105
+ this.accessories.push(accessory);
106
+ }
107
+ }
108
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,341 @@
1
+ import type { PlatformConfig } from 'homebridge';
2
+ /**
3
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
4
+ */
5
+ export declare const PLATFORM_NAME = "FirstAlert";
6
+ /**
7
+ * This must match the name of your plugin as defined the package.json
8
+ */
9
+ export declare const PLUGIN_NAME = "@homebridge-plugins/homebridge-firstalert";
10
+ /**
11
+ * This is the main url used to access FirstAlert API
12
+ */
13
+ export declare const AuthorizeURL = "https://api.honeywell.com/oauth2/authorize?";
14
+ /**
15
+ * This is the main url used to access FirstAlert API
16
+ */
17
+ export declare const TokenURL = "https://api.honeywell.com/oauth2/token";
18
+ /**
19
+ * This is the main url used to access FirstAlert API
20
+ */
21
+ export declare const LocationURL = "https://api.honeywell.com/v2/locations";
22
+ /**
23
+ * This is the main url used to access FirstAlert API
24
+ */
25
+ export declare const DeviceURL = "https://api.honeywell.com/v2/devices";
26
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';
27
+ export interface ResideoPlatformConfig extends PlatformConfig {
28
+ credentials?: credentials;
29
+ callbackUrl?: string;
30
+ port?: string;
31
+ }
32
+ export interface credentials {
33
+ accessToken?: string;
34
+ refreshToken?: string;
35
+ consumerKey?: string;
36
+ consumerSecret?: string;
37
+ }
38
+ export interface modes {
39
+ Off: number;
40
+ Heat: number;
41
+ Cool: number;
42
+ Auto: number;
43
+ }
44
+ export interface holdModes {
45
+ NoHold: number;
46
+ TemporaryHold: number;
47
+ PermanentHold: number;
48
+ }
49
+ export interface payload {
50
+ mode?: string;
51
+ heatSetpoint?: number;
52
+ coolSetpoint?: number;
53
+ thermostatSetpointStatus?: string;
54
+ nextPeriodTime?: string;
55
+ autoChangeoverActive?: boolean;
56
+ thermostatSetpoint?: number;
57
+ unit?: string;
58
+ state?: string;
59
+ }
60
+ export type locations = location[];
61
+ export interface location {
62
+ locationID: string | number;
63
+ name: string;
64
+ devices: resideoDevice[];
65
+ }
66
+ export interface resideoDevice {
67
+ deviceID: string | number;
68
+ deviceClass: string;
69
+ deviceModel: string;
70
+ userDefinedDeviceName: string;
71
+ firmware?: string;
72
+ thermostatVersion?: string;
73
+ external?: boolean;
74
+ groups?: T9groups[];
75
+ inBuiltSensorState?: inBuiltSensorState;
76
+ settings?: Settings;
77
+ deviceType: string;
78
+ name?: string;
79
+ isAlive: boolean;
80
+ priorityType?: string;
81
+ units?: string;
82
+ indoorTemperature?: number;
83
+ allowedModes?: string[];
84
+ minHeatSetpoint?: number;
85
+ maxHeatSetpoint?: number;
86
+ minCoolSetpoint?: number;
87
+ maxCoolSetpoint?: number;
88
+ changeableValues?: ChangeableValues;
89
+ operationStatus?: OperationStatus;
90
+ indoorHumidity?: number;
91
+ displayedOutdoorHumidity?: number;
92
+ scheduleStatus?: string;
93
+ allowedTimeIncrements?: number;
94
+ isUpgrading?: boolean;
95
+ isProvisioned?: boolean;
96
+ macID?: string;
97
+ dataSyncStatus?: string;
98
+ outdoorTemperature?: number;
99
+ deadband?: number;
100
+ hasDualSetpointStatus?: boolean;
101
+ parentDeviceId?: number;
102
+ service: Service;
103
+ deviceSettings: Record<string, unknown>;
104
+ firmwareVersion?: string;
105
+ vacationHold?: VacationHold;
106
+ currentSchedulePeriod?: CurrentSchedulePeriod;
107
+ scheduleCapabilities?: ScheduleCapabilities;
108
+ scheduleType?: ScheduleType;
109
+ changeSource?: ChangeSource;
110
+ partnerInfo?: PartnerInfo;
111
+ deviceRegistrationDate?: Date;
112
+ indoorHumidityStatus?: string;
113
+ waterPresent: boolean;
114
+ currentSensorReadings: CurrentSensorReadings;
115
+ batteryRemaining: number;
116
+ isRegistered: boolean;
117
+ hasDeviceCheckedIn: boolean;
118
+ isDeviceOffline: boolean;
119
+ deviceMac: string;
120
+ dataSyncInfo: dataSyncInfo;
121
+ lastCheckin: Date;
122
+ actuatorValve: actuatorValve;
123
+ daylightSavingsInfo: daylightSavingsInfo;
124
+ maintenance: maintenance;
125
+ }
126
+ export interface T9groups {
127
+ id: number;
128
+ }
129
+ export interface inBuiltSensorState {
130
+ roomId: number;
131
+ roomName: string;
132
+ }
133
+ export interface Settings {
134
+ homeSetPoints?: HomeSetPoints;
135
+ awaySetPoints?: AwaySetPoints;
136
+ fan: Fan;
137
+ temperatureMode?: TemperatureMode;
138
+ specialMode?: SpecialMode;
139
+ hardwareSettings?: HardwareSettings;
140
+ devicePairingEnabled?: boolean;
141
+ }
142
+ export interface ChangeableValues {
143
+ mode: string;
144
+ autoChangeoverActive?: boolean;
145
+ heatSetpoint: number;
146
+ coolSetpoint: number;
147
+ thermostatSetpointStatus?: string;
148
+ nextPeriodTime?: string;
149
+ endHeatSetpoint?: number;
150
+ endCoolSetpoint?: number;
151
+ heatCoolMode: string;
152
+ emergencyHeatActive?: boolean;
153
+ }
154
+ export interface OperationStatus {
155
+ mode: string;
156
+ fanRequest?: boolean;
157
+ circulationFanRequest?: boolean;
158
+ }
159
+ export interface Service {
160
+ mode: string;
161
+ }
162
+ export interface AwaySetPoints {
163
+ awayHeatSP: number;
164
+ awayCoolSP: number;
165
+ smartCoolSP: number;
166
+ smartHeatSP: number;
167
+ useAutoSmart: boolean;
168
+ units: string;
169
+ }
170
+ export interface HomeSetPoints {
171
+ homeHeatSP: number;
172
+ homeCoolSP: number;
173
+ units: string;
174
+ }
175
+ export interface TemperatureMode {
176
+ feelsLike?: boolean;
177
+ air: boolean;
178
+ }
179
+ export interface SpecialMode {
180
+ autoChangeoverActive: boolean;
181
+ emergencyHeatActive?: boolean;
182
+ }
183
+ export interface Fan {
184
+ allowedModes: string[];
185
+ changeableValues: FanChangeableValues;
186
+ fanRunning: boolean;
187
+ allowedSpeeds?: AllowedSpeed[];
188
+ }
189
+ export interface FanChangeableValues {
190
+ mode: string;
191
+ }
192
+ export interface AllowedSpeed {
193
+ item: string;
194
+ value: Value;
195
+ }
196
+ export interface Value {
197
+ speed?: number;
198
+ mode: string;
199
+ }
200
+ export interface VacationHold {
201
+ enabled: boolean;
202
+ }
203
+ export interface CurrentSchedulePeriod {
204
+ day: string;
205
+ period: string;
206
+ }
207
+ export interface ScheduleCapabilities {
208
+ availableScheduleTypes: string[];
209
+ schedulableFan: boolean;
210
+ }
211
+ export interface ScheduleType {
212
+ scheduleType: string;
213
+ scheduleSubType: string;
214
+ }
215
+ export interface ChangeSource {
216
+ by: string;
217
+ name: string;
218
+ }
219
+ export interface HardwareSettings {
220
+ brightness: number;
221
+ maxBrightness: number;
222
+ }
223
+ export interface PartnerInfo {
224
+ singleOrMultiODUConfiguration: number;
225
+ parentDeviceModelId: number;
226
+ parentDeviceBrandId: number;
227
+ oduName: string;
228
+ }
229
+ export interface DeviceSettings {
230
+ temp: Temp;
231
+ humidity: Humidity;
232
+ userDefinedName: string;
233
+ buzzerMuted: boolean;
234
+ checkinPeriod: number;
235
+ currentSensorReadPeriod: number;
236
+ }
237
+ export interface Humidity {
238
+ high: Record<string, unknown>;
239
+ low: Record<string, unknown>;
240
+ }
241
+ export interface CurrentSensorReadings {
242
+ temperature: number;
243
+ humidity: number;
244
+ }
245
+ export interface Temp {
246
+ high: Record<string, unknown>;
247
+ low: Record<string, unknown>;
248
+ }
249
+ export interface sensorAccessory {
250
+ accessoryId: number;
251
+ accessoryAttribute: accessoryAttribute;
252
+ accessoryValue: accessoryValue;
253
+ roomId: number;
254
+ }
255
+ export interface accessoryAttribute {
256
+ type: string;
257
+ connectionMethod: string;
258
+ name: string;
259
+ model: string;
260
+ serialNumber: string;
261
+ softwareRevision: string;
262
+ hardwareRevision: string;
263
+ }
264
+ export interface accessoryValue {
265
+ coolSetpoint: number;
266
+ heatSetpoint: number;
267
+ indoorHumidity: number;
268
+ indoorTemperature: number;
269
+ motionDet: boolean;
270
+ occupancyDet: boolean;
271
+ excludeTemp: boolean;
272
+ excludeMotion: boolean;
273
+ pressure: number;
274
+ occupancyTimeout: number;
275
+ status: string;
276
+ batteryStatus: string;
277
+ rssiAverage: number;
278
+ occupancySensitivity: string;
279
+ }
280
+ export interface roomPriorityStatus {
281
+ deviceId: string;
282
+ status: string;
283
+ currentPriority: CurrentPriority;
284
+ }
285
+ export interface CurrentPriority {
286
+ priorityType: string;
287
+ selectedRooms: Record<string, unknown>;
288
+ rooms: PriorityRooms[];
289
+ }
290
+ export interface PriorityRooms {
291
+ rooms: PriorityRoom;
292
+ }
293
+ export interface PriorityRoom {
294
+ id: number;
295
+ roomName: string;
296
+ roomAvgTemp: number;
297
+ roomAvgHumidity: number;
298
+ overallMotion: boolean;
299
+ accessories: Accessory[];
300
+ }
301
+ export interface Accessory {
302
+ id: number;
303
+ type: string;
304
+ excludeTemp: boolean;
305
+ excludeMotion: boolean;
306
+ temperature: number;
307
+ status: string;
308
+ detectMotion: boolean;
309
+ }
310
+ export interface dataSyncInfo {
311
+ state: string;
312
+ transactionId: string;
313
+ }
314
+ export interface actuatorValve {
315
+ commandSource: string;
316
+ runningTime: number;
317
+ valveStatus: string;
318
+ motorCycles: number;
319
+ motorCurrentAverage: number;
320
+ motorCurrentMax: number;
321
+ deviceTemperature: number;
322
+ lastAntiScaleTime: Date;
323
+ leakStatus: string;
324
+ timeValveChanged: Date;
325
+ }
326
+ export interface daylightSavingsInfo {
327
+ isDaylightSaving: boolean;
328
+ nextOffsetChange: Date;
329
+ }
330
+ export interface maintenance {
331
+ antiScaleSettings: string;
332
+ antiScaleDOWSettings: string;
333
+ antiScaleDOMSettings: number;
334
+ antiScaleTimeSettings: string;
335
+ }
336
+ export interface fanStatus {
337
+ changeableValues: {
338
+ mode: string;
339
+ };
340
+ }
341
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
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 = 'FirstAlert';
5
+ /**
6
+ * This must match the name of your plugin as defined the package.json
7
+ */
8
+ export const PLUGIN_NAME = '@homebridge-plugins/homebridge-firstalert';
9
+ /**
10
+ * This is the main url used to access FirstAlert API
11
+ */
12
+ export const AuthorizeURL = 'https://api.honeywell.com/oauth2/authorize?';
13
+ /**
14
+ * This is the main url used to access FirstAlert API
15
+ */
16
+ export const TokenURL = 'https://api.honeywell.com/oauth2/token';
17
+ /**
18
+ * This is the main url used to access FirstAlert API
19
+ */
20
+ export const LocationURL = 'https://api.honeywell.com/v2/locations';
21
+ /**
22
+ * This is the main url used to access FirstAlert API
23
+ */
24
+ export const DeviceURL = 'https://api.honeywell.com/v2/devices';
25
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAA;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,2CAA2C,CAAA;AAEtE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,6CAA6C,CAAA;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,wCAAwC,CAAA;AAEhE;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAA;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,sCAAsC,CAAA"}