homebridge-switcher-laundry 1.0.4 → 1.0.5
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 +5 -3
- package/dist/switcher-power.js +22 -19
- 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,11 +68,13 @@ 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;
|
|
76
78
|
constructor(options: SwitcherPowerOptions);
|
|
77
79
|
start(): void;
|
|
78
80
|
private matchesMessage;
|
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,18 @@ 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;
|
|
119
116
|
constructor(options) {
|
|
120
117
|
super();
|
|
121
118
|
this.options = options;
|
|
122
119
|
this.log = options.log || (() => undefined);
|
|
120
|
+
this.debugLog = options.debugLog || this.log;
|
|
123
121
|
this.pollSeconds = Math.max(5, options.pollSeconds || 10);
|
|
124
122
|
this.resolvedId = options.deviceId || (isDeviceId(options.identifier) ? options.identifier : undefined);
|
|
125
123
|
this.resolvedIp = options.deviceIp || (isIpAddress(options.identifier) ? options.identifier : undefined);
|
|
@@ -129,11 +127,12 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
129
127
|
return;
|
|
130
128
|
}
|
|
131
129
|
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
130
|
if (this.resolvedId && this.resolvedIp) {
|
|
131
|
+
this.log(`TCP mode for "${this.options.identifier}" → id=${this.resolvedId} ip=${this.resolvedIp} every ${this.pollSeconds}s`);
|
|
135
132
|
this.startTcpPoll();
|
|
133
|
+
return;
|
|
136
134
|
}
|
|
135
|
+
this.log(`UDP mode for "${this.options.identifier}" (deviceId/deviceIp missing — set both for reliable TCP next to Switcher Platform)`);
|
|
137
136
|
this.hubSubscriber = {
|
|
138
137
|
match: (message) => this.matchesMessage(message),
|
|
139
138
|
onMessage: (message) => {
|
|
@@ -142,10 +141,8 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
142
141
|
this.handleWatts(Number(message.state?.power_consumption), message.device_id, message.device_ip, message.name, Number(message.state?.power) === 1);
|
|
143
142
|
},
|
|
144
143
|
onUdpFailed: (error) => {
|
|
145
|
-
this.log(`UDP listen failed (${error.message})`);
|
|
146
|
-
|
|
147
|
-
this.startTcpPoll();
|
|
148
|
-
}
|
|
144
|
+
this.log(`UDP listen failed (${error.message}); cannot poll TCP without deviceId+deviceIp`);
|
|
145
|
+
this.emit('error', new Error(`UDP busy and deviceId/deviceIp not set for "${this.options.identifier}". Add both from Switcher Platform logs.`));
|
|
149
146
|
},
|
|
150
147
|
};
|
|
151
148
|
SwitcherUdpHub.get().subscribe(this.hubSubscriber);
|
|
@@ -190,17 +187,23 @@ class SwitcherPowerSource extends node_events_1.EventEmitter {
|
|
|
190
187
|
return;
|
|
191
188
|
}
|
|
192
189
|
if (!this.resolvedId || !this.resolvedIp) {
|
|
193
|
-
|
|
194
|
-
this.emit('error', error);
|
|
190
|
+
this.emit('error', new Error(`Cannot TCP-poll "${this.options.identifier}" — need deviceId and deviceIp`));
|
|
195
191
|
return;
|
|
196
192
|
}
|
|
197
193
|
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);
|
|
194
|
+
this.device = new Switcher(this.resolvedId, this.resolvedIp, (message) => this.debugLog(message), false, 'power_plug', undefined, this.options.token);
|
|
200
195
|
const tick = () => {
|
|
201
196
|
void this.device?.status()
|
|
202
197
|
.then((status) => {
|
|
203
|
-
|
|
198
|
+
const watts = Number(status.power_consumption);
|
|
199
|
+
if (!Number.isFinite(watts)) {
|
|
200
|
+
if (!this.loggedBadStatus) {
|
|
201
|
+
this.loggedBadStatus = true;
|
|
202
|
+
this.log(`TCP status missing watts: ${JSON.stringify(status)}`);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
this.handleWatts(watts, this.resolvedId || this.options.identifier, this.resolvedIp || '0.0.0.0', this.options.identifier, Number(status.power) === 1 || status.power === 'ON');
|
|
204
207
|
})
|
|
205
208
|
.catch((error) => {
|
|
206
209
|
this.emit('error', error instanceof Error ? error : new Error(String(error)));
|
|
@@ -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.5",
|
|
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",
|