homebridge-moonside 0.1.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.
@@ -0,0 +1,369 @@
1
+ export class MoonsideLampAccessory {
2
+ platform;
3
+ accessory;
4
+ device;
5
+ initialState;
6
+ service;
7
+ cachedState = {};
8
+ currentColor = { r: 1, g: 1, b: 1 };
9
+ targetHue = 0;
10
+ targetSaturation = 0;
11
+ colorUpdatePromise;
12
+ colorUpdateResolve;
13
+ colorUpdateReject;
14
+ colorUpdateTimeout;
15
+ pollTimer;
16
+ constructor(platform, accessory, device, initialState) {
17
+ this.platform = platform;
18
+ this.accessory = accessory;
19
+ this.device = device;
20
+ this.initialState = initialState;
21
+ this.accessory.getService(this.platform.Service.AccessoryInformation)
22
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Moonside')
23
+ .setCharacteristic(this.platform.Characteristic.Model, this.device.deviceId)
24
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.deviceId);
25
+ this.service = this.accessory.getService(this.platform.Service.Lightbulb)
26
+ || this.accessory.addService(this.platform.Service.Lightbulb);
27
+ this.service.setCharacteristic(this.platform.Characteristic.Name, device.name);
28
+ this.removeLegacyThemeSwitches();
29
+ this.service.getCharacteristic(this.platform.Characteristic.On)
30
+ .onSet(this.handleSetOn.bind(this))
31
+ .onGet(this.handleGetOn.bind(this));
32
+ this.service.getCharacteristic(this.platform.Characteristic.Brightness)
33
+ .onSet(this.handleSetBrightness.bind(this))
34
+ .onGet(this.handleGetBrightness.bind(this));
35
+ this.service.getCharacteristic(this.platform.Characteristic.Hue)
36
+ .onSet(this.handleSetHue.bind(this))
37
+ .onGet(this.handleGetHue.bind(this));
38
+ this.service.getCharacteristic(this.platform.Characteristic.Saturation)
39
+ .onSet(this.handleSetSaturation.bind(this))
40
+ .onGet(this.handleGetSaturation.bind(this));
41
+ if (this.initialState) {
42
+ this.updateFromCloud(this.initialState);
43
+ }
44
+ else {
45
+ void this.pollState();
46
+ }
47
+ if (this.platform.enablePolling) {
48
+ this.pollTimer = setInterval(() => this.pollState(), this.platform.pollingInterval);
49
+ }
50
+ }
51
+ updateFromCloud(update) {
52
+ if (!update) {
53
+ return;
54
+ }
55
+ this.cachedState = { ...this.cachedState, ...update };
56
+ this.applyStateFromCloud(this.cachedState);
57
+ }
58
+ getDeviceName() {
59
+ return this.device.name;
60
+ }
61
+ destroy() {
62
+ if (this.pollTimer) {
63
+ clearInterval(this.pollTimer);
64
+ }
65
+ if (this.colorUpdateTimeout) {
66
+ clearTimeout(this.colorUpdateTimeout);
67
+ }
68
+ this.settleColorPromise();
69
+ }
70
+ async pollState() {
71
+ if (!this.platform.apiClient) {
72
+ return;
73
+ }
74
+ try {
75
+ const state = await this.platform.apiClient.getDeviceState(this.device.deviceId);
76
+ this.updateFromCloud(state);
77
+ }
78
+ catch (error) {
79
+ this.platform.logger.warn('Failed to poll %s: %s', this.device.name, error instanceof Error ? error.message : String(error));
80
+ }
81
+ }
82
+ applyStateFromCloud(data) {
83
+ if (typeof data.deviceName === 'string' && data.deviceName && data.deviceName !== this.device.name) {
84
+ this.device = { ...this.device, name: data.deviceName };
85
+ this.service.setCharacteristic(this.platform.Characteristic.Name, data.deviceName);
86
+ }
87
+ const on = this.parsePowerState(data);
88
+ const brightness = this.parseBrightness(data);
89
+ this.service.updateCharacteristic(this.platform.Characteristic.On, on);
90
+ this.service.updateCharacteristic(this.platform.Characteristic.Brightness, brightness);
91
+ const color = this.parseColor(data);
92
+ if (color) {
93
+ this.currentColor = color;
94
+ const { h, s } = this.rgbToHsv(color);
95
+ this.targetHue = h;
96
+ this.targetSaturation = s;
97
+ this.service.updateCharacteristic(this.platform.Characteristic.Hue, h);
98
+ this.service.updateCharacteristic(this.platform.Characteristic.Saturation, s);
99
+ }
100
+ }
101
+ removeLegacyThemeSwitches() {
102
+ const switchUuid = this.platform.Service.Switch.UUID;
103
+ for (const service of this.accessory.services) {
104
+ if (service.UUID === switchUuid) {
105
+ this.platform.logger.debug('%s removing legacy theme switch "%s"', this.logPrefix(), service.displayName);
106
+ this.accessory.removeService(service);
107
+ }
108
+ }
109
+ }
110
+ parsePowerState(data) {
111
+ if (typeof data.controlData === 'string') {
112
+ const command = data.controlData.toUpperCase();
113
+ if (command.includes('LEDON')) {
114
+ return true;
115
+ }
116
+ if (command.includes('LEDOFF')) {
117
+ return false;
118
+ }
119
+ if (command.startsWith('THEME') || command.startsWith('COLOR') || command.startsWith('PIXEL')) {
120
+ return true;
121
+ }
122
+ }
123
+ if (typeof data.on === 'boolean') {
124
+ return data.on;
125
+ }
126
+ return this.service.getCharacteristic(this.platform.Characteristic.On).value ?? false;
127
+ }
128
+ parseBrightness(data) {
129
+ if (typeof data.brightness === 'number') {
130
+ return this.normalizeBrightness(data.brightness);
131
+ }
132
+ if (typeof data.controlData === 'string' && data.controlData.toUpperCase().startsWith('BRIGH')) {
133
+ const level = parseInt(data.controlData.slice(5), 10);
134
+ if (!Number.isNaN(level)) {
135
+ return this.normalizeBrightness(level);
136
+ }
137
+ }
138
+ const current = this.service.getCharacteristic(this.platform.Characteristic.Brightness).value;
139
+ return current ?? 100;
140
+ }
141
+ parseColor(data) {
142
+ if (typeof data.controlData === 'string' && data.controlData.toUpperCase().startsWith('COLOR')) {
143
+ const payload = data.controlData.slice(5).trim();
144
+ if (/^\d{9}$/.test(payload)) {
145
+ const r = parseInt(payload.slice(0, 3), 10) / 255;
146
+ const g = parseInt(payload.slice(3, 6), 10) / 255;
147
+ const b = parseInt(payload.slice(6, 9), 10) / 255;
148
+ if ([r, g, b].every(value => Number.isFinite(value))) {
149
+ return { r: this.clamp01(r), g: this.clamp01(g), b: this.clamp01(b) };
150
+ }
151
+ }
152
+ else {
153
+ const segments = payload.split(/(?=(?:0|1)(?:\.|$))/).filter(Boolean);
154
+ if (segments.length >= 3) {
155
+ const values = segments.slice(0, 3).map(segment => Number(segment));
156
+ if (values.every(value => Number.isFinite(value))) {
157
+ return {
158
+ r: this.clamp01(values[0]),
159
+ g: this.clamp01(values[1]),
160
+ b: this.clamp01(values[2]),
161
+ };
162
+ }
163
+ }
164
+ }
165
+ }
166
+ if (typeof data.colorHEXDecimal === 'number') {
167
+ const hex = data.colorHEXDecimal.toString(16).padStart(6, '0');
168
+ const r = parseInt(hex.slice(-6, -4), 16) / 255;
169
+ const g = parseInt(hex.slice(-4, -2), 16) / 255;
170
+ const b = parseInt(hex.slice(-2), 16) / 255;
171
+ if ([r, g, b].every(channel => !Number.isNaN(channel))) {
172
+ return { r, g, b };
173
+ }
174
+ }
175
+ return undefined;
176
+ }
177
+ normalizeBrightness(value) {
178
+ return Math.max(1, Math.min(100, Math.round(value)));
179
+ }
180
+ clamp01(value) {
181
+ return Math.max(0, Math.min(1, value));
182
+ }
183
+ async handleSetOn(value) {
184
+ if (!this.platform.apiClient) {
185
+ return;
186
+ }
187
+ const command = value ? 'LEDON' : 'LEDOFF';
188
+ this.platform.logger.debug('%s set On -> %s', this.logPrefix(), command);
189
+ try {
190
+ await this.platform.apiClient.sendControl(this.device.deviceId, command);
191
+ this.cachedState.on = !!value;
192
+ this.service.updateCharacteristic(this.platform.Characteristic.On, this.cachedState.on);
193
+ }
194
+ catch (error) {
195
+ this.platform.logger.error('Failed to set power for %s: %s', this.device.name, error instanceof Error ? error.message : String(error));
196
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
197
+ }
198
+ }
199
+ async handleGetOn() {
200
+ return this.service.getCharacteristic(this.platform.Characteristic.On).value ?? false;
201
+ }
202
+ async handleSetBrightness(value) {
203
+ if (!this.platform.apiClient) {
204
+ return;
205
+ }
206
+ const level = this.normalizeBrightness(value);
207
+ this.platform.logger.debug('%s set Brightness -> %d', this.logPrefix(), level);
208
+ try {
209
+ await this.platform.apiClient.sendControl(this.device.deviceId, `BRIGH${level}`);
210
+ this.cachedState.brightness = level;
211
+ this.service.updateCharacteristic(this.platform.Characteristic.Brightness, level);
212
+ }
213
+ catch (error) {
214
+ this.platform.logger.error('Failed to set brightness for %s: %s', this.device.name, error instanceof Error ? error.message : String(error));
215
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
216
+ }
217
+ }
218
+ async handleGetBrightness() {
219
+ return this.service.getCharacteristic(this.platform.Characteristic.Brightness).value ?? 100;
220
+ }
221
+ async handleSetHue(value) {
222
+ this.targetHue = value;
223
+ this.platform.logger.debug('%s set Hue -> %s', this.logPrefix(), this.targetHue);
224
+ return this.scheduleColorUpdate();
225
+ }
226
+ async handleGetHue() {
227
+ return this.targetHue;
228
+ }
229
+ async handleSetSaturation(value) {
230
+ this.targetSaturation = value;
231
+ this.platform.logger.debug('%s set Saturation -> %s', this.logPrefix(), this.targetSaturation);
232
+ return this.scheduleColorUpdate();
233
+ }
234
+ async handleGetSaturation() {
235
+ return this.targetSaturation;
236
+ }
237
+ scheduleColorUpdate() {
238
+ if (!this.colorUpdatePromise) {
239
+ this.colorUpdatePromise = new Promise((resolve, reject) => {
240
+ this.colorUpdateResolve = resolve;
241
+ this.colorUpdateReject = reject;
242
+ });
243
+ }
244
+ if (this.colorUpdateTimeout) {
245
+ clearTimeout(this.colorUpdateTimeout);
246
+ }
247
+ this.colorUpdateTimeout = setTimeout(() => {
248
+ this.colorUpdateTimeout = undefined;
249
+ void this.pushColorUpdate()
250
+ .then(() => this.settleColorPromise())
251
+ .catch(error => this.settleColorPromise(error));
252
+ }, 150);
253
+ return this.colorUpdatePromise;
254
+ }
255
+ settleColorPromise(error) {
256
+ if (error) {
257
+ this.colorUpdateReject?.(error);
258
+ }
259
+ else {
260
+ this.colorUpdateResolve?.();
261
+ }
262
+ this.colorUpdatePromise = undefined;
263
+ this.colorUpdateResolve = undefined;
264
+ this.colorUpdateReject = undefined;
265
+ }
266
+ async pushColorUpdate() {
267
+ if (!this.platform.apiClient) {
268
+ return;
269
+ }
270
+ const rgb = this.hsvToRgb(this.targetHue, this.targetSaturation, 1);
271
+ this.platform.logger.debug('%s pushing color (h=%s, s=%s) -> rgb(%s, %s, %s)', this.logPrefix(), this.targetHue, this.targetSaturation, rgb.r.toFixed(4), rgb.g.toFixed(4), rgb.b.toFixed(4));
272
+ try {
273
+ const command = this.buildColorCommand(rgb);
274
+ await this.platform.apiClient.sendControl(this.device.deviceId, command);
275
+ this.currentColor = rgb;
276
+ }
277
+ catch (error) {
278
+ this.platform.logger.error('Failed to set color for %s: %s', this.device.name, error instanceof Error ? error.message : String(error));
279
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
280
+ }
281
+ }
282
+ buildColorCommand(rgb) {
283
+ const clampByte = (value) => Math.max(0, Math.min(255, Math.round(value * 255)));
284
+ const pad = (value) => clampByte(value).toString().padStart(3, '0');
285
+ const components = [pad(rgb.r), pad(rgb.g), pad(rgb.b)];
286
+ return `COLOR${components.join('')}`;
287
+ }
288
+ rgbToHsv(rgb) {
289
+ const r = rgb.r;
290
+ const g = rgb.g;
291
+ const b = rgb.b;
292
+ const max = Math.max(r, g, b);
293
+ const min = Math.min(r, g, b);
294
+ const delta = max - min;
295
+ let hue = 0;
296
+ if (delta !== 0) {
297
+ switch (max) {
298
+ case r:
299
+ hue = ((g - b) / delta) % 6;
300
+ break;
301
+ case g:
302
+ hue = (b - r) / delta + 2;
303
+ break;
304
+ case b:
305
+ hue = (r - g) / delta + 4;
306
+ break;
307
+ }
308
+ hue *= 60;
309
+ if (hue < 0) {
310
+ hue += 360;
311
+ }
312
+ }
313
+ const saturation = max === 0 ? 0 : (delta / max) * 100;
314
+ return {
315
+ h: Math.round(hue * 100) / 100,
316
+ s: Math.round(saturation * 100) / 100,
317
+ };
318
+ }
319
+ hsvToRgb(hue, saturation, value) {
320
+ const h = (hue % 360) / 60;
321
+ const s = this.clamp01(saturation / 100);
322
+ const v = this.clamp01(value);
323
+ const c = v * s;
324
+ const x = c * (1 - Math.abs((h % 2) - 1));
325
+ const m = v - c;
326
+ let r = 0;
327
+ let g = 0;
328
+ let b = 0;
329
+ if (0 <= h && h < 1) {
330
+ r = c;
331
+ g = x;
332
+ b = 0;
333
+ }
334
+ else if (1 <= h && h < 2) {
335
+ r = x;
336
+ g = c;
337
+ b = 0;
338
+ }
339
+ else if (2 <= h && h < 3) {
340
+ r = 0;
341
+ g = c;
342
+ b = x;
343
+ }
344
+ else if (3 <= h && h < 4) {
345
+ r = 0;
346
+ g = x;
347
+ b = c;
348
+ }
349
+ else if (4 <= h && h < 5) {
350
+ r = x;
351
+ g = 0;
352
+ b = c;
353
+ }
354
+ else if (5 <= h && h < 6) {
355
+ r = c;
356
+ g = 0;
357
+ b = x;
358
+ }
359
+ return {
360
+ r: this.clamp01(r + m),
361
+ g: this.clamp01(g + m),
362
+ b: this.clamp01(b + m),
363
+ };
364
+ }
365
+ logPrefix() {
366
+ return `[${this.device.name}]`;
367
+ }
368
+ }
369
+ //# sourceMappingURL=platformAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformAccessory.js","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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 = "MoonsideCloud";
5
+ /**
6
+ * This must match the name of your plugin as defined the package.json `name` property
7
+ */
8
+ export declare const PLUGIN_NAME = "homebridge-moonside";
@@ -0,0 +1,9 @@
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 = 'MoonsideCloud';
5
+ /**
6
+ * This must match the name of your plugin as defined the package.json `name` property
7
+ */
8
+ export const PLUGIN_NAME = 'homebridge-moonside';
9
+ //# 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,eAAe,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { MoonsideCloudPlatform, MoonsideDeviceConfig } from './platform.js';
3
+ import type { ThemeDefinition } from './moonsideApi.js';
4
+ export declare class ThemeSwitchAccessory {
5
+ private readonly platform;
6
+ private readonly accessory;
7
+ private device;
8
+ private readonly services;
9
+ private themes;
10
+ constructor(platform: MoonsideCloudPlatform, accessory: PlatformAccessory, device: MoonsideDeviceConfig, initialThemes: ThemeDefinition[]);
11
+ updateDevice(device: MoonsideDeviceConfig): void;
12
+ private rehydrateExistingServiceMap;
13
+ updateThemes(definitions: ThemeDefinition[]): void;
14
+ destroy(): void;
15
+ private updateAccessoryName;
16
+ private handleThemeSet;
17
+ private applyServiceName;
18
+ }
@@ -0,0 +1,114 @@
1
+ export class ThemeSwitchAccessory {
2
+ platform;
3
+ accessory;
4
+ device;
5
+ services = new Map();
6
+ themes = [];
7
+ constructor(platform, accessory, device, initialThemes) {
8
+ this.platform = platform;
9
+ this.accessory = accessory;
10
+ this.device = device;
11
+ this.accessory.category = 7 /* this.platform.api.hap.Categories.OUTLET */;
12
+ this.accessory.getService(this.platform.Service.AccessoryInformation)
13
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Moonside')
14
+ .setCharacteristic(this.platform.Characteristic.Model, `${this.device.deviceId}-themes`)
15
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, `${this.device.deviceId}-themes`);
16
+ this.updateAccessoryName();
17
+ this.rehydrateExistingServiceMap();
18
+ this.updateThemes(initialThemes);
19
+ }
20
+ updateDevice(device) {
21
+ this.device = device;
22
+ this.updateAccessoryName();
23
+ }
24
+ rehydrateExistingServiceMap() {
25
+ const outletUuid = this.platform.Service.Outlet.UUID;
26
+ for (const service of this.accessory.services) {
27
+ if (service.UUID !== outletUuid) {
28
+ continue;
29
+ }
30
+ const subtype = service.subtype;
31
+ if (subtype) {
32
+ this.services.set(subtype, service);
33
+ service.updateCharacteristic(this.platform.Characteristic.On, false);
34
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
35
+ }
36
+ }
37
+ }
38
+ updateThemes(definitions) {
39
+ this.themes = definitions ?? [];
40
+ const desiredIds = new Set(this.themes.map(theme => theme.id));
41
+ for (const [id, service] of this.services.entries()) {
42
+ if (!desiredIds.has(id)) {
43
+ this.accessory.removeService(service);
44
+ this.services.delete(id);
45
+ }
46
+ else {
47
+ service.updateCharacteristic(this.platform.Characteristic.On, false);
48
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
49
+ }
50
+ }
51
+ for (const theme of this.themes) {
52
+ let service = this.services.get(theme.id);
53
+ if (!service) {
54
+ service = this.accessory.addService(this.platform.Service.Outlet, theme.name, theme.id);
55
+ service.getCharacteristic(this.platform.Characteristic.On)
56
+ .onSet(value => this.handleThemeSet(theme, service, value));
57
+ this.services.set(theme.id, service);
58
+ }
59
+ else {
60
+ // reconfigure existing service
61
+ }
62
+ this.applyServiceName(service, theme.name);
63
+ service.updateCharacteristic(this.platform.Characteristic.On, false);
64
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
65
+ }
66
+ }
67
+ destroy() {
68
+ // nothing to dispose currently
69
+ }
70
+ updateAccessoryName() {
71
+ const name = `${this.device.name} - Themes`;
72
+ this.accessory.displayName = name;
73
+ const info = this.accessory.getService(this.platform.Service.AccessoryInformation);
74
+ info?.setCharacteristic(this.platform.Characteristic.Name, name);
75
+ }
76
+ async handleThemeSet(theme, service, value) {
77
+ if (!value) {
78
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
79
+ return;
80
+ }
81
+ if (!this.platform.apiClient) {
82
+ this.platform.logger.warn('API client not ready, cannot trigger theme %s', theme.name);
83
+ service.updateCharacteristic(this.platform.Characteristic.On, false);
84
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
85
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
86
+ }
87
+ try {
88
+ await this.platform.apiClient.sendControl(this.device.deviceId, theme.controlData);
89
+ }
90
+ catch (error) {
91
+ this.platform.logger.error('Failed to trigger theme %s for %s: %s', theme.name, this.device.name, error instanceof Error ? error.message : String(error));
92
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
93
+ }
94
+ setTimeout(() => {
95
+ service.updateCharacteristic(this.platform.Characteristic.On, false);
96
+ service.updateCharacteristic(this.platform.Characteristic.OutletInUse, false);
97
+ }, 1000);
98
+ }
99
+ applyServiceName(service, name) {
100
+ service.displayName = name;
101
+ service.setCharacteristic(this.platform.Characteristic.Name, name);
102
+ const CharacteristicClass = this.platform.Characteristic;
103
+ const configuredNameCharacteristic = CharacteristicClass.ConfiguredName;
104
+ if (configuredNameCharacteristic) {
105
+ try {
106
+ service.updateCharacteristic(configuredNameCharacteristic, name);
107
+ }
108
+ catch {
109
+ // characteristic not supported on older HomeKit versions
110
+ }
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=themeSwitchAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeSwitchAccessory.js","sourceRoot":"","sources":["../src/themeSwitchAccessory.ts"],"names":[],"mappings":"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"}
package/eslint ADDED
File without changes
File without changes
package/npm ADDED
File without changes
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "homebridge-moonside",
3
+ "displayName": "Moonside",
4
+ "type": "module",
5
+ "version": "0.1.0",
6
+ "private": false,
7
+ "description": "Homebridge plugin that controls Moonside lamps over the official Firebase cloud API.",
8
+ "author": "Kyle Worrall",
9
+ "license": "Apache-2.0",
10
+ "homepage": "https://github.com/kylewhirl/homebridge-moonside#readme",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/kylewhirl/homebridge-moonside.git"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/kylewhirl/homebridge-moonside/issues"
17
+ },
18
+ "keywords": [
19
+ "homebridge-plugin",
20
+ "moonside",
21
+ "smart-light"
22
+ ],
23
+ "main": "dist/index.js",
24
+ "engines": {
25
+ "node": "^20.18.0 || ^22.10.0 || ^24.0.0",
26
+ "homebridge": "^1.8.0 || ^2.0.0-beta.0"
27
+ },
28
+ "scripts": {
29
+ "build": "rimraf ./dist && tsc",
30
+ "lint": "eslint . --max-warnings=0",
31
+ "prepublishOnly": "npm run lint && npm run build",
32
+ "watch": "npm run build && npm link && nodemon"
33
+ },
34
+ "dependencies": {},
35
+ "devDependencies": {
36
+ "@eslint/js": "^9.39.1",
37
+ "@types/node": "^24.10.1",
38
+ "eslint": "^9.39.1",
39
+ "homebridge": "^2.0.0-beta.55",
40
+ "nodemon": "^3.1.11",
41
+ "rimraf": "^6.1.0",
42
+ "ts-node": "^10.9.2",
43
+ "typescript": "^5.9.3",
44
+ "typescript-eslint": "^8.46.4"
45
+ }
46
+ }