@say4n/homebridge-tapo-smart-light 1.0.3 → 1.0.4
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.
|
@@ -6,8 +6,13 @@ export declare class TapoPlatformAccessory {
|
|
|
6
6
|
private service;
|
|
7
7
|
private tapoDevice;
|
|
8
8
|
private loginPromise;
|
|
9
|
+
private pendingUpdates;
|
|
10
|
+
private updateTimeout;
|
|
11
|
+
private readonly debounceMs;
|
|
9
12
|
constructor(platform: TapoHomebridgePlatform, accessory: PlatformAccessory);
|
|
10
13
|
getTapoDevice(): Promise<any>;
|
|
14
|
+
private scheduleUpdate;
|
|
15
|
+
private applyPendingUpdates;
|
|
11
16
|
setOn(value: CharacteristicValue): Promise<void>;
|
|
12
17
|
getOn(): Promise<CharacteristicValue>;
|
|
13
18
|
setBrightness(value: CharacteristicValue): Promise<void>;
|
|
@@ -7,6 +7,10 @@ export class TapoPlatformAccessory {
|
|
|
7
7
|
tapoDevice;
|
|
8
8
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
9
|
loginPromise = null;
|
|
10
|
+
// Debouncing state
|
|
11
|
+
pendingUpdates = {};
|
|
12
|
+
updateTimeout = null;
|
|
13
|
+
debounceMs = 300; // 300ms debounce
|
|
10
14
|
constructor(platform, accessory) {
|
|
11
15
|
this.platform = platform;
|
|
12
16
|
this.accessory = accessory;
|
|
@@ -46,21 +50,54 @@ export class TapoPlatformAccessory {
|
|
|
46
50
|
});
|
|
47
51
|
return this.loginPromise;
|
|
48
52
|
}
|
|
49
|
-
|
|
53
|
+
scheduleUpdate() {
|
|
54
|
+
// Clear existing timeout
|
|
55
|
+
if (this.updateTimeout) {
|
|
56
|
+
clearTimeout(this.updateTimeout);
|
|
57
|
+
}
|
|
58
|
+
// Schedule new update
|
|
59
|
+
this.updateTimeout = setTimeout(() => {
|
|
60
|
+
this.applyPendingUpdates();
|
|
61
|
+
}, this.debounceMs);
|
|
62
|
+
}
|
|
63
|
+
async applyPendingUpdates() {
|
|
64
|
+
const updates = { ...this.pendingUpdates };
|
|
65
|
+
this.pendingUpdates = {};
|
|
66
|
+
this.updateTimeout = null;
|
|
67
|
+
if (Object.keys(updates).length === 0) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
50
70
|
try {
|
|
51
71
|
const device = await this.getTapoDevice();
|
|
52
|
-
if
|
|
53
|
-
|
|
72
|
+
// Handle on/off state first if present
|
|
73
|
+
if (updates.on !== undefined) {
|
|
74
|
+
if (updates.on) {
|
|
75
|
+
await device.turnOn();
|
|
76
|
+
this.platform.log.debug('Set device On');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
await device.turnOff();
|
|
80
|
+
this.platform.log.debug('Set device Off');
|
|
81
|
+
return; // If turning off, skip other updates
|
|
82
|
+
}
|
|
54
83
|
}
|
|
55
|
-
|
|
56
|
-
|
|
84
|
+
// Handle color/brightness updates together
|
|
85
|
+
if (updates.hue !== undefined || updates.saturation !== undefined || updates.brightness !== undefined) {
|
|
86
|
+
const hue = updates.hue ?? this.service.getCharacteristic(this.platform.Characteristic.Hue).value;
|
|
87
|
+
const saturation = updates.saturation ?? this.service.getCharacteristic(this.platform.Characteristic.Saturation).value;
|
|
88
|
+
const brightness = updates.brightness ?? this.service.getCharacteristic(this.platform.Characteristic.Brightness).value;
|
|
89
|
+
await device.setHSL(hue, saturation, brightness);
|
|
90
|
+
this.platform.log.debug('Set HSL ->', { hue, saturation, brightness });
|
|
57
91
|
}
|
|
58
|
-
this.platform.log.debug('Set Characteristic On ->', value);
|
|
59
92
|
}
|
|
60
93
|
catch (error) {
|
|
61
|
-
this.platform.log.error('Failed to
|
|
94
|
+
this.platform.log.error('Failed to apply pending updates:', error);
|
|
62
95
|
}
|
|
63
96
|
}
|
|
97
|
+
async setOn(value) {
|
|
98
|
+
this.pendingUpdates.on = value;
|
|
99
|
+
this.scheduleUpdate();
|
|
100
|
+
}
|
|
64
101
|
async getOn() {
|
|
65
102
|
try {
|
|
66
103
|
const device = await this.getTapoDevice();
|
|
@@ -75,39 +112,17 @@ export class TapoPlatformAccessory {
|
|
|
75
112
|
}
|
|
76
113
|
}
|
|
77
114
|
async setBrightness(value) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
await device.setBrightness(brightnessLevel);
|
|
82
|
-
this.platform.log.debug('Set Characteristic Brightness -> ', brightnessLevel);
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
this.platform.log.error('Failed to set Brightness characteristic:', error);
|
|
86
|
-
}
|
|
115
|
+
const brightnessLevel = typeof value === 'number' ? Math.max(0, Math.min(100, value)) : 100;
|
|
116
|
+
this.pendingUpdates.brightness = brightnessLevel;
|
|
117
|
+
this.scheduleUpdate();
|
|
87
118
|
}
|
|
88
119
|
async setHue(value) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const saturation = this.service.getCharacteristic(this.platform.Characteristic.Saturation).value;
|
|
92
|
-
const brightness = this.service.getCharacteristic(this.platform.Characteristic.Brightness).value;
|
|
93
|
-
await device.setHSL(value, saturation, brightness);
|
|
94
|
-
this.platform.log.debug('Set Characteristic Hue -> ', value);
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
this.platform.log.error('Failed to set Hue characteristic:', error);
|
|
98
|
-
}
|
|
120
|
+
this.pendingUpdates.hue = value;
|
|
121
|
+
this.scheduleUpdate();
|
|
99
122
|
}
|
|
100
123
|
async setSaturation(value) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const hue = this.service.getCharacteristic(this.platform.Characteristic.Hue).value;
|
|
104
|
-
const brightness = this.service.getCharacteristic(this.platform.Characteristic.Brightness).value;
|
|
105
|
-
await device.setHSL(hue, value, brightness);
|
|
106
|
-
this.platform.log.debug('Set Characteristic Saturation -> ', value);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
this.platform.log.error('Failed to set Saturation characteristic:', error);
|
|
110
|
-
}
|
|
124
|
+
this.pendingUpdates.saturation = value;
|
|
125
|
+
this.scheduleUpdate();
|
|
111
126
|
}
|
|
112
127
|
}
|
|
113
128
|
//# sourceMappingURL=TapoPlatformAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TapoPlatformAccessory.js","sourceRoot":"","sources":["../src/TapoPlatformAccessory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIrD,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"TapoPlatformAccessory.js","sourceRoot":"","sources":["../src/TapoPlatformAccessory.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@say4n/homebridge-tapo-smart-light",
|
|
3
3
|
"displayName": "Homebridge Tapo L630",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.4",
|
|
6
6
|
"description": "A Homebridge plugin for Tapo L630 smart lights.",
|
|
7
7
|
"author": "say4n",
|
|
8
8
|
"license": "Apache-2.0",
|