homebridge-switcher-laundry 1.0.4 → 1.0.6
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.
- package/README.md +3 -3
- package/config.schema.json +7 -5
- package/dist/platform.js +14 -4
- package/dist/platform.js.map +1 -1
- package/dist/switcher-power.d.ts +8 -3
- package/dist/switcher-power.js +61 -25
- package/dist/switcher-power.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -66,12 +66,12 @@ v1.0.2+ shares one UDP listener across all laundry plugs. Older builds could onl
|
|
|
66
66
|
|
|
67
67
|
Both plugins want Switcher UDP port **20002**. If Platform is already running, Laundry falls back to **TCP polling**.
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
**Every** laundry device should set both (required when Switcher Platform is installed):
|
|
70
70
|
|
|
71
71
|
- **`deviceId`** — hex id from Switcher Platform logs (e.g. `Found New Switcher ... | ID:e4eaf6`)
|
|
72
|
-
- **`deviceIp`** —
|
|
72
|
+
- **`deviceIp`** — IP from those same logs
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
After restart, logs must show `TCP mode for "…" → id=… ip=…`. If you see `WARNING: deviceId/deviceIp missing`, the UI fields were not saved into `config.json`.
|
|
75
75
|
|
|
76
76
|
### Calibrating thresholds
|
|
77
77
|
|
package/config.schema.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"type": "integer",
|
|
26
26
|
"default": 10,
|
|
27
27
|
"minimum": 5,
|
|
28
|
-
"description": "
|
|
28
|
+
"description": "How often to ask each plug for watts over TCP when deviceId + deviceIp are set."
|
|
29
29
|
},
|
|
30
30
|
"devices": {
|
|
31
31
|
"title": "Laundry devices",
|
|
@@ -47,14 +47,16 @@
|
|
|
47
47
|
"description": "Device id, IP address, or exact name from the Switcher app / Switcher Platform logs."
|
|
48
48
|
},
|
|
49
49
|
"deviceId": {
|
|
50
|
-
"title": "Device ID (for TCP
|
|
50
|
+
"title": "Device ID (required for TCP)",
|
|
51
51
|
"type": "string",
|
|
52
|
-
"
|
|
52
|
+
"required": true,
|
|
53
|
+
"description": "Hex id from Switcher Platform logs (e.g. e4eaf6). Required for washer and dryer when Switcher Platform is installed."
|
|
53
54
|
},
|
|
54
55
|
"deviceIp": {
|
|
55
|
-
"title": "Device IP (
|
|
56
|
+
"title": "Device IP (required for TCP)",
|
|
56
57
|
"type": "string",
|
|
57
|
-
"
|
|
58
|
+
"required": true,
|
|
59
|
+
"description": "Plug IP from Switcher Platform logs. Required together with Device ID."
|
|
58
60
|
},
|
|
59
61
|
"startWatts": {
|
|
60
62
|
"title": "Start threshold (W)",
|
package/dist/platform.js
CHANGED
|
@@ -20,7 +20,9 @@ class SwitcherLaundryPlatform {
|
|
|
20
20
|
deviceIp: device.deviceIp,
|
|
21
21
|
token: typeof this.config.token === 'string' ? this.config.token : undefined,
|
|
22
22
|
pollSeconds: Number(this.config.pollSeconds) || 10,
|
|
23
|
-
|
|
23
|
+
// Operational power-source lines must be visible (debug hides "TCP mode" / errors).
|
|
24
|
+
log: (message) => this.log.info(message),
|
|
25
|
+
debugLog: (message) => this.log.debug(message),
|
|
24
26
|
})) {
|
|
25
27
|
this.log = log;
|
|
26
28
|
this.config = config;
|
|
@@ -61,7 +63,14 @@ class SwitcherLaundryPlatform {
|
|
|
61
63
|
if (!existing) {
|
|
62
64
|
this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
|
|
63
65
|
}
|
|
64
|
-
|
|
66
|
+
const tcpReady = Boolean(device.deviceId && device.deviceIp);
|
|
67
|
+
this.log.info(`Watching ${device.name} (${device.identifier}) start≥${device.startWatts}W/${device.startSeconds}s stop≤${device.stopWatts}W/${device.stopSeconds}s`
|
|
68
|
+
+ (tcpReady
|
|
69
|
+
? ` TCP id=${device.deviceId} ip=${device.deviceIp}`
|
|
70
|
+
: ' WARNING: deviceId/deviceIp missing — TCP disabled'));
|
|
71
|
+
if (!tcpReady) {
|
|
72
|
+
this.log.error(`[${device.name}] Set Device ID and Device IP from Switcher Platform logs (Found New Switcher … | ID:… | IP:…). Name alone is not enough while Platform owns UDP.`);
|
|
73
|
+
}
|
|
65
74
|
}
|
|
66
75
|
const stale = this.cachedAccessories.filter((item) => !activeIds.has(item.UUID));
|
|
67
76
|
if (stale.length > 0) {
|
|
@@ -85,8 +94,9 @@ class SwitcherLaundryPlatform {
|
|
|
85
94
|
return null;
|
|
86
95
|
}
|
|
87
96
|
const name = String(item.name ?? identifier).trim() || identifier;
|
|
88
|
-
|
|
89
|
-
const
|
|
97
|
+
// Accept common aliases in case config was edited by hand.
|
|
98
|
+
const deviceId = String(item.deviceId ?? item.device_id ?? item.id ?? '').trim() || undefined;
|
|
99
|
+
const deviceIp = String(item.deviceIp ?? item.device_ip ?? item.ip ?? '').trim() || undefined;
|
|
90
100
|
return {
|
|
91
101
|
name,
|
|
92
102
|
identifier,
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;AAUA,2CAAyE;AACzE,yCAOoB;AACpB,qDAAyE;AAEzE,MAAa,uBAAuB;IAQhB;IACA;IACA;IACC;IAVH,OAAO,CAAiB;IACxB,cAAc,CAAwB;IACrC,iBAAiB,GAAwB,EAAE,CAAC;IAC5C,QAAQ,GAAuB,EAAE,CAAC;IAC5C,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEhD,YACkB,GAAY,EACZ,MAAsB,EACtB,GAAQ,EACP,eAA6D,CAAC,MAAM,EAAE,EAAE,CACvF,IAAI,oCAAmB,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAClD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/switcher-power.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface SwitcherPowerOptions {
|
|
|
21
21
|
token?: string;
|
|
22
22
|
pollSeconds?: number;
|
|
23
23
|
log?: (message: string) => void;
|
|
24
|
+
debugLog?: (message: string) => void;
|
|
24
25
|
}
|
|
25
26
|
interface SwitcherMessage {
|
|
26
27
|
device_id: string;
|
|
@@ -58,9 +59,8 @@ declare class SwitcherUdpHub {
|
|
|
58
59
|
}
|
|
59
60
|
/**
|
|
60
61
|
* Reads watts from the Switcher plug over the LAN.
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Eve/HomeKit energy history is unrelated — this talks to the plug directly.
|
|
62
|
+
* With deviceId + IP: TCP-only (recommended next to homebridge-switcher-platform).
|
|
63
|
+
* Without: shared UDP listen only.
|
|
64
64
|
*/
|
|
65
65
|
export declare class SwitcherPowerSource extends EventEmitter implements PowerSource {
|
|
66
66
|
private readonly options;
|
|
@@ -68,16 +68,21 @@ export declare class SwitcherPowerSource extends EventEmitter implements PowerSo
|
|
|
68
68
|
private device?;
|
|
69
69
|
private started;
|
|
70
70
|
private readonly log;
|
|
71
|
+
private readonly debugLog;
|
|
71
72
|
private readonly pollSeconds;
|
|
72
73
|
private resolvedId?;
|
|
73
74
|
private resolvedIp?;
|
|
74
75
|
private hubSubscriber?;
|
|
75
76
|
private usingTcp;
|
|
77
|
+
private loggedBadStatus;
|
|
78
|
+
private loggedFirstStatus;
|
|
79
|
+
private consecutiveFailures;
|
|
76
80
|
constructor(options: SwitcherPowerOptions);
|
|
77
81
|
start(): void;
|
|
78
82
|
private matchesMessage;
|
|
79
83
|
stop(): void;
|
|
80
84
|
private startTcpPoll;
|
|
85
|
+
private pollOnce;
|
|
81
86
|
private handleWatts;
|
|
82
87
|
}
|
|
83
88
|
/** Test double that feeds watt samples into the same PowerSource contract. */
|
package/dist/switcher-power.js
CHANGED
|
@@ -55,11 +55,7 @@ class SwitcherUdpHub {
|
|
|
55
55
|
}
|
|
56
56
|
this.started = true;
|
|
57
57
|
try {
|
|
58
|
-
|
|
59
|
-
this.listener = Switcher.listen((message) => {
|
|
60
|
-
// Keep library chatter at debug via first subscriber's logger if needed.
|
|
61
|
-
void message;
|
|
62
|
-
});
|
|
58
|
+
this.listener = Switcher.listen(() => undefined);
|
|
63
59
|
this.listener.on('error', (error) => {
|
|
64
60
|
this.failed = true;
|
|
65
61
|
this.failError = error;
|
|
@@ -101,9 +97,8 @@ class SwitcherUdpHub {
|
|
|
101
97
|
exports.SwitcherUdpHub = SwitcherUdpHub;
|
|
102
98
|
/**
|
|
103
99
|
* Reads watts from the Switcher plug over the LAN.
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* Eve/HomeKit energy history is unrelated — this talks to the plug directly.
|
|
100
|
+
* With deviceId + IP: TCP-only (recommended next to homebridge-switcher-platform).
|
|
101
|
+
* Without: shared UDP listen only.
|
|
107
102
|
*/
|
|
108
103
|
class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
109
104
|
options;
|
|
@@ -111,15 +106,20 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
111
106
|
device;
|
|
112
107
|
started = false;
|
|
113
108
|
log;
|
|
109
|
+
debugLog;
|
|
114
110
|
pollSeconds;
|
|
115
111
|
resolvedId;
|
|
116
112
|
resolvedIp;
|
|
117
113
|
hubSubscriber;
|
|
118
114
|
usingTcp = false;
|
|
115
|
+
loggedBadStatus = false;
|
|
116
|
+
loggedFirstStatus = false;
|
|
117
|
+
consecutiveFailures = 0;
|
|
119
118
|
constructor(options) {
|
|
120
119
|
super();
|
|
121
120
|
this.options = options;
|
|
122
121
|
this.log = options.log || (() => undefined);
|
|
122
|
+
this.debugLog = options.debugLog || this.log;
|
|
123
123
|
this.pollSeconds = Math.max(5, options.pollSeconds || 10);
|
|
124
124
|
this.resolvedId = options.deviceId || (isDeviceId(options.identifier) ? options.identifier : undefined);
|
|
125
125
|
this.resolvedIp = options.deviceIp || (isIpAddress(options.identifier) ? options.identifier : undefined);
|
|
@@ -129,11 +129,12 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
this.started = true;
|
|
132
|
-
// Prefer TCP whenever we already know id+ip — do not wait for UDP to fail.
|
|
133
|
-
// UDP can look "fine" (socket bound) while this plug never matches / stops broadcasting.
|
|
134
132
|
if (this.resolvedId && this.resolvedIp) {
|
|
133
|
+
this.log(`TCP mode for "${this.options.identifier}" → id=${this.resolvedId} ip=${this.resolvedIp} every ${this.pollSeconds}s`);
|
|
135
134
|
this.startTcpPoll();
|
|
135
|
+
return;
|
|
136
136
|
}
|
|
137
|
+
this.log(`UDP mode for "${this.options.identifier}" (deviceId/deviceIp missing — set both for reliable TCP next to Switcher Platform)`);
|
|
137
138
|
this.hubSubscriber = {
|
|
138
139
|
match: (message) => this.matchesMessage(message),
|
|
139
140
|
onMessage: (message) => {
|
|
@@ -142,10 +143,8 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
142
143
|
this.handleWatts(Number(message.state?.power_consumption), message.device_id, message.device_ip, message.name, Number(message.state?.power) === 1);
|
|
143
144
|
},
|
|
144
145
|
onUdpFailed: (error) => {
|
|
145
|
-
this.log(`UDP listen failed (${error.message})`);
|
|
146
|
-
|
|
147
|
-
this.startTcpPoll();
|
|
148
|
-
}
|
|
146
|
+
this.log(`UDP listen failed (${error.message}); cannot poll TCP without deviceId+deviceIp`);
|
|
147
|
+
this.emit('error', new Error(`UDP busy and deviceId/deviceIp not set for "${this.options.identifier}". Add both from Switcher Platform logs.`));
|
|
149
148
|
},
|
|
150
149
|
};
|
|
151
150
|
SwitcherUdpHub.get().subscribe(this.hubSubscriber);
|
|
@@ -190,25 +189,48 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
190
189
|
return;
|
|
191
190
|
}
|
|
192
191
|
if (!this.resolvedId || !this.resolvedIp) {
|
|
193
|
-
|
|
194
|
-
this.emit('error', error);
|
|
192
|
+
this.emit('error', new Error(`Cannot TCP-poll "${this.options.identifier}" — need deviceId and deviceIp`));
|
|
195
193
|
return;
|
|
196
194
|
}
|
|
197
195
|
this.usingTcp = true;
|
|
198
|
-
this.
|
|
199
|
-
this.device = new Switcher(this.resolvedId, this.resolvedIp, (message) => this.log(message), false, 'power_plug', undefined, this.options.token);
|
|
196
|
+
this.device = new Switcher(this.resolvedId, this.resolvedIp, (message) => this.debugLog(message), false, 'power_plug', undefined, this.options.token);
|
|
200
197
|
const tick = () => {
|
|
201
|
-
void this.
|
|
202
|
-
.then((status) => {
|
|
203
|
-
this.handleWatts(Number(status.power_consumption), this.resolvedId || this.options.identifier, this.resolvedIp || '0.0.0.0', this.options.identifier, Number(status.power) === 1 || status.power === 'ON');
|
|
204
|
-
})
|
|
205
|
-
.catch((error) => {
|
|
206
|
-
this.emit('error', error instanceof Error ? error : new Error(String(error)));
|
|
207
|
-
});
|
|
198
|
+
void this.pollOnce();
|
|
208
199
|
};
|
|
209
200
|
tick();
|
|
210
201
|
this.pollTimer = setInterval(tick, this.pollSeconds * 1000);
|
|
211
202
|
}
|
|
203
|
+
async pollOnce() {
|
|
204
|
+
if (!this.device) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const status = await withTimeout(this.device.status(), 8_000, 'Switcher TCP status');
|
|
209
|
+
this.consecutiveFailures = 0;
|
|
210
|
+
const watts = Number(status.power_consumption);
|
|
211
|
+
if (!this.loggedFirstStatus) {
|
|
212
|
+
this.loggedFirstStatus = true;
|
|
213
|
+
this.log(`TCP status ok for ${this.resolvedId}: ${JSON.stringify(status)}`);
|
|
214
|
+
}
|
|
215
|
+
if (!Number.isFinite(watts)) {
|
|
216
|
+
if (!this.loggedBadStatus) {
|
|
217
|
+
this.loggedBadStatus = true;
|
|
218
|
+
this.log(`TCP status missing watts: ${JSON.stringify(status)}`);
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.handleWatts(watts, this.resolvedId || this.options.identifier, this.resolvedIp || '0.0.0.0', this.options.identifier, Number(status.power) === 1 || status.power === 'ON');
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
this.consecutiveFailures += 1;
|
|
226
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
227
|
+
// Always surface the first few failures at info — silent hangs were hard to debug.
|
|
228
|
+
if (this.consecutiveFailures <= 3 || this.consecutiveFailures % 6 === 0) {
|
|
229
|
+
this.log(`TCP poll failed for ${this.resolvedId} @ ${this.resolvedIp}: ${message}`);
|
|
230
|
+
}
|
|
231
|
+
this.emit('error', error instanceof Error ? error : new Error(message));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
212
234
|
handleWatts(watts, deviceId, deviceIp, name, on) {
|
|
213
235
|
if (!Number.isFinite(watts)) {
|
|
214
236
|
return;
|
|
@@ -257,4 +279,18 @@ function isIpAddress(value) {
|
|
|
257
279
|
function isDeviceId(value) {
|
|
258
280
|
return /^[a-f0-9]{6,}$/i.test(value);
|
|
259
281
|
}
|
|
282
|
+
function withTimeout(promise, ms, label) {
|
|
283
|
+
return new Promise((resolve, reject) => {
|
|
284
|
+
const timer = setTimeout(() => {
|
|
285
|
+
reject(new Error(`${label} timed out after ${ms}ms — check deviceId/IP/token and that the plug is reachable`));
|
|
286
|
+
}, ms);
|
|
287
|
+
promise.then((value) => {
|
|
288
|
+
clearTimeout(timer);
|
|
289
|
+
resolve(value);
|
|
290
|
+
}, (error) => {
|
|
291
|
+
clearTimeout(timer);
|
|
292
|
+
reject(error);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
}
|
|
260
296
|
//# sourceMappingURL=switcher-power.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switcher-power.js","sourceRoot":"","sources":["../src/switcher-power.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"switcher-power.js","sourceRoot":"","sources":["../src/switcher-power.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-switcher-laundry",
|
|
3
3
|
"displayName": "Switcher Laundry",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.6",
|
|
5
5
|
"description": "Detect when a washer or dryer finishes by watching a Switcher Power Plug wattage.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"author": "mirimalulkasif",
|