homebridge-cync-app 0.6.1 → 0.7.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.
- package/CHANGELOG.md +29 -0
- package/README.md +8 -0
- package/dist/cync/cync-light-accessory.js +3 -0
- package/dist/cync/cync-light-accessory.js.map +1 -1
- package/dist/cync/tcp-client.d.ts +10 -0
- package/dist/cync/tcp-client.js +200 -33
- package/dist/cync/tcp-client.js.map +1 -1
- package/dist/platform.d.ts +2 -2
- package/dist/platform.js +58 -14
- package/dist/platform.js.map +1 -1
- package/package.json +1 -1
- package/src/cync/cync-light-accessory.ts +3 -0
- package/src/cync/tcp-client.ts +288 -51
- package/src/platform.ts +79 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.7.0
|
|
4
|
+
|
|
5
|
+
**Release Date:** 2026-07-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Added automatic TCP reconnect handling after LAN socket closures so Cync state updates can resume without requiring a Homebridge restart.
|
|
9
|
+
- Added post-command mesh-state refreshes after accepted LAN commands to reconcile HomeKit state with device state.
|
|
10
|
+
- Added a shared periodic mesh-state refresh for configured devices to reduce stale HomeKit state during normal operation.
|
|
11
|
+
- Added parsed Cync compact `0x43` LAN state updates for on/off, brightness, RGB mode, and color temperature updates from the Cync app.
|
|
12
|
+
- Added Cync white-preset color-temperature calibration so Cync presets map onto HomeKit mired values more predictably.
|
|
13
|
+
- Added README documentation explaining how Cync white presets map to HomeKit color temperature controls.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Improved LAN power command handling to wait for real state confirmation from LAN or mesh-state updates instead of treating transport acceptance as final success.
|
|
17
|
+
- Improved bidirectional sync between the Cync app and Home app for plugs and lights, including on/off, brightness, RGB, and color temperature state.
|
|
18
|
+
- Consolidated per-device polling into a shared mesh refresh loop to reduce duplicate refresh traffic.
|
|
19
|
+
- Reduced routine LAN refresh and repeated already-cached update logging from info-level noise to debug-level diagnostics.
|
|
20
|
+
- Updated color-temperature state handling so HomeKit Hue and Saturation are neutralized when a light is in tunable-white mode.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Fixed LAN reconnect scheduling after socket close events.
|
|
24
|
+
- Fixed Cync app changes sometimes failing to appear in HomeKit until another command or restart occurred.
|
|
25
|
+
- Fixed color-temperature updates from Cync white presets being interpreted with an overly broad tone range.
|
|
26
|
+
- Fixed stale RGB state causing HomeKit to appear to show color mode after selecting a Cync white-temperature preset.
|
|
27
|
+
- Fixed command resolution for power changes by confirming the resulting device state instead of relying only on ACK/status frames.
|
|
28
|
+
|
|
29
|
+
### Notes
|
|
30
|
+
- This release includes the LAN sync improvements first published as `v0.7.0-beta.0` on 2026-06-27
|
|
31
|
+
|
|
3
32
|
## v0.6.1
|
|
4
33
|
|
|
5
34
|
**Release Date:** 2026-06-23
|
package/README.md
CHANGED
|
@@ -105,6 +105,14 @@ Show selections are stored by Cync device ID, so renaming a device does not rese
|
|
|
105
105
|
|
|
106
106
|
Some Cync devices expose both RGB color and color temperature controls. HomeKit may present these differently depending on the accessory category and Home app behavior.
|
|
107
107
|
|
|
108
|
+
Cync white presets are exposed to HomeKit as color temperature values, not as RGB colors. The Cync app presents presets such as **Cool White**, **Daylight**, **Sunlight**, **Natural White**, **Early Morning**, **Sunrise**, and **Warm White** as a discrete ladder. HomeKit represents the same idea as a continuous color-temperature slider using mired values, where lower mired values are cooler and higher mired values are warmer.
|
|
109
|
+
|
|
110
|
+
Because of that, the Home app may not visually match the Cync preset list one-for-one. For example, **Natural White** may appear near the center of HomeKit's temperature gradient, while **Cool White** and **Warm White** should appear near the cool and warm ends respectively. This is expected: HomeKit is showing the calibrated temperature position, while the Cync app is showing named presets.
|
|
111
|
+
|
|
112
|
+
The Home app's **Swatch** tab can look visually similar to Cync's white presets, but swatches are RGB color selections. Choosing a swatch may put the device into RGB color mode instead of tunable-white color-temperature mode. For best white-temperature behavior, use the Temperature control in HomeKit or the white preset list in the Cync app.
|
|
113
|
+
|
|
114
|
+
If a Cync white preset maps to an unexpected HomeKit position, enable debug logging and include the relevant `compact state 0x43` or `mesh state record` lines when opening an issue. These lines include the Cync tone byte and the HomeKit mired value used by the plugin.
|
|
115
|
+
|
|
108
116
|
### Outlets and Switches
|
|
109
117
|
|
|
110
118
|
Certain Cync device types are exposed as outlets instead of generic switches to improve HomeKit behavior and Siri integration.
|
|
@@ -317,6 +317,9 @@ export function configureCyncLightAccessory(env, mesh, device, accessory, device
|
|
|
317
317
|
// Treat CT as "white mode" (not RGB color mode)
|
|
318
318
|
cyncMeta.colorTemperature = mired;
|
|
319
319
|
cyncMeta.colorActive = false;
|
|
320
|
+
cyncMeta.hue = 0;
|
|
321
|
+
cyncMeta.saturation = 0;
|
|
322
|
+
cyncMeta.rgb = { r: 255, g: 255, b: 255 };
|
|
320
323
|
const brightness = typeof cyncMeta.brightness === 'number' ? cyncMeta.brightness : 100;
|
|
321
324
|
cyncMeta.on = brightness > 0;
|
|
322
325
|
cyncMeta.brightness = brightness;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cync-light-accessory.js","sourceRoot":"","sources":["../../src/cync/cync-light-accessory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cync-light-accessory.js","sourceRoot":"","sources":["../../src/cync/cync-light-accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export type LanDeviceUpdate = {
|
|
|
11
11
|
g: number;
|
|
12
12
|
b: number;
|
|
13
13
|
};
|
|
14
|
+
colorTemperatureMired?: number;
|
|
14
15
|
};
|
|
15
16
|
export type LanDeviceUpdateListener = (update: LanDeviceUpdate) => void;
|
|
16
17
|
export declare class TcpClient {
|
|
@@ -35,16 +36,22 @@ export declare class TcpClient {
|
|
|
35
36
|
private rawFrameListeners;
|
|
36
37
|
private controllerToDevice;
|
|
37
38
|
private reconnectTimer;
|
|
39
|
+
private meshStateRefreshTimer;
|
|
40
|
+
private meshStateRefreshInFlight;
|
|
38
41
|
private reconnectAttempt;
|
|
39
42
|
private connectInFlight;
|
|
40
43
|
private shuttingDown;
|
|
44
|
+
private readonly unparsedFrameLogCounts;
|
|
41
45
|
private readonly lanDeviceUpdateListeners;
|
|
42
46
|
private pendingPowerCommands;
|
|
43
47
|
onLanDeviceUpdate(listener: LanDeviceUpdateListener): void;
|
|
44
48
|
private emitLanDeviceUpdate;
|
|
49
|
+
private logUnparsedFrame;
|
|
50
|
+
private confirmPendingPowerCommand;
|
|
45
51
|
private enqueueCommand;
|
|
46
52
|
private parseSwitchStateFrame;
|
|
47
53
|
private parseLanSwitchUpdate;
|
|
54
|
+
private parseCompactStateFrame43;
|
|
48
55
|
constructor(logger?: CyncLogger);
|
|
49
56
|
private tryParseRgbFrom83;
|
|
50
57
|
connect(loginCode: Uint8Array, config: CyncCloudConfig): Promise<void>;
|
|
@@ -54,6 +61,9 @@ export declare class TcpClient {
|
|
|
54
61
|
}): void;
|
|
55
62
|
private ensureConnected;
|
|
56
63
|
private scheduleReconnect;
|
|
64
|
+
private scheduleMeshStateRefresh;
|
|
65
|
+
requestMeshStateRefresh(reason: string, delayMs?: number): void;
|
|
66
|
+
private refreshMeshState;
|
|
57
67
|
private establishSocket;
|
|
58
68
|
private cleanupSocket;
|
|
59
69
|
private openTlsSocket;
|
package/dist/cync/tcp-client.js
CHANGED
|
@@ -7,6 +7,12 @@ const defaultLogger = {
|
|
|
7
7
|
warn: (...args) => console.warn('[cync-tcp]', ...args),
|
|
8
8
|
error: (...args) => console.error('[cync-tcp]', ...args),
|
|
9
9
|
};
|
|
10
|
+
const POST_COMMAND_MESH_REFRESH_DELAY_MS = 750;
|
|
11
|
+
const POWER_STATE_CONFIRM_TIMEOUT_MS = 10_000;
|
|
12
|
+
const CTC_MIN_MIRED = 153;
|
|
13
|
+
const CTC_MAX_MIRED = 500;
|
|
14
|
+
const CYNC_CT_WARM_TONE = 24;
|
|
15
|
+
const CYNC_CT_COOL_TONE = 100;
|
|
10
16
|
function clampNumber(n, min, max) {
|
|
11
17
|
return Math.min(max, Math.max(min, n));
|
|
12
18
|
}
|
|
@@ -18,22 +24,31 @@ function hkBrightnessToPct100Byte(hkBrightness) {
|
|
|
18
24
|
// enforce 1–100 for ON state
|
|
19
25
|
return clampNumber(hk, 1, 100);
|
|
20
26
|
}
|
|
21
|
-
function
|
|
22
|
-
const
|
|
23
|
-
const t = (
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
function colorToneByteToMired(colorTone) {
|
|
28
|
+
const tone = clampNumber(Math.round(colorTone), 0, 255);
|
|
29
|
+
const t = clampNumber((tone - CYNC_CT_WARM_TONE) / (CYNC_CT_COOL_TONE - CYNC_CT_WARM_TONE), 0, 1);
|
|
30
|
+
return clampNumber(Math.round(CTC_MAX_MIRED - (t * (CTC_MAX_MIRED - CTC_MIN_MIRED))), CTC_MIN_MIRED, CTC_MAX_MIRED);
|
|
31
|
+
}
|
|
32
|
+
function miredToColorToneByte(mired, ctMinMired, ctMaxMired) {
|
|
33
|
+
const clampedMired = clampNumber(Math.round(mired), ctMinMired, ctMaxMired);
|
|
34
|
+
const coolness = (ctMaxMired - clampedMired) / (ctMaxMired - ctMinMired);
|
|
35
|
+
return clampNumber(Math.round(CYNC_CT_WARM_TONE + (coolness * (CYNC_CT_COOL_TONE - CYNC_CT_WARM_TONE))), CYNC_CT_WARM_TONE, CYNC_CT_COOL_TONE);
|
|
26
36
|
}
|
|
27
37
|
// TCP Hex Formatter: Makes packet dumps easier to compare byte-by-byte
|
|
28
38
|
// Formats buffers as spaced hex so working and failing packets can be visually diffed.
|
|
29
39
|
function formatHex(buffer) {
|
|
30
40
|
return buffer.toString('hex').match(/.{1,2}/g)?.join(' ') ?? '';
|
|
31
41
|
}
|
|
42
|
+
function formatHexPrefix(buffer, maxBytes = 32) {
|
|
43
|
+
const prefix = formatHex(buffer.subarray(0, maxBytes));
|
|
44
|
+
return buffer.length > maxBytes ? `${prefix} ...` : prefix;
|
|
45
|
+
}
|
|
32
46
|
export class TcpClient {
|
|
33
47
|
transportMode = null;
|
|
34
48
|
resetCommandSessionState(reason) {
|
|
35
49
|
const pendingCount = this.pendingPowerCommands.size;
|
|
36
50
|
for (const pending of this.pendingPowerCommands.values()) {
|
|
51
|
+
clearTimeout(pending.confirmationTimer);
|
|
37
52
|
pending.resolve?.(false);
|
|
38
53
|
}
|
|
39
54
|
this.pendingPowerCommands.clear();
|
|
@@ -65,9 +80,12 @@ export class TcpClient {
|
|
|
65
80
|
rawFrameListeners = [];
|
|
66
81
|
controllerToDevice = new Map();
|
|
67
82
|
reconnectTimer = null;
|
|
83
|
+
meshStateRefreshTimer = null;
|
|
84
|
+
meshStateRefreshInFlight = false;
|
|
68
85
|
reconnectAttempt = 0;
|
|
69
86
|
connectInFlight = null;
|
|
70
87
|
shuttingDown = false;
|
|
88
|
+
unparsedFrameLogCounts = new Map();
|
|
71
89
|
lanDeviceUpdateListeners = [];
|
|
72
90
|
pendingPowerCommands = new Map();
|
|
73
91
|
onLanDeviceUpdate(listener) {
|
|
@@ -83,6 +101,35 @@ export class TcpClient {
|
|
|
83
101
|
}
|
|
84
102
|
}
|
|
85
103
|
}
|
|
104
|
+
logUnparsedFrame(type, frame, reason) {
|
|
105
|
+
const subtype = frame.length >= 14 ? frame[13] : undefined;
|
|
106
|
+
const controllerId = frame.length >= 4 ? frame.readUInt32BE(0) : undefined;
|
|
107
|
+
const seq = frame.length >= 6 ? frame.readUInt16BE(4) : undefined;
|
|
108
|
+
const key = [
|
|
109
|
+
type.toString(16),
|
|
110
|
+
subtype === undefined ? 'none' : subtype.toString(16),
|
|
111
|
+
frame.length,
|
|
112
|
+
reason,
|
|
113
|
+
].join(':');
|
|
114
|
+
const count = (this.unparsedFrameLogCounts.get(key) ?? 0) + 1;
|
|
115
|
+
this.unparsedFrameLogCounts.set(key, count);
|
|
116
|
+
if (count !== 1 && count % 25 !== 0) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.log.debug('[Cync TCP] Unparsed frame (%s): type=0x%s subtype=%s len=%d controller=%s seq=%s seen=%d prefix=%s', reason, type.toString(16).padStart(2, '0'), subtype === undefined ? 'n/a' : `0x${subtype.toString(16).padStart(2, '0')}`, frame.length, controllerId === undefined ? 'n/a' : `0x${controllerId.toString(16).padStart(8, '0')}`, seq === undefined ? 'n/a' : String(seq), count, formatHexPrefix(frame));
|
|
120
|
+
}
|
|
121
|
+
confirmPendingPowerCommand(deviceId, on, source) {
|
|
122
|
+
for (const [key, pending] of this.pendingPowerCommands.entries()) {
|
|
123
|
+
if (pending.deviceId !== deviceId || pending.on !== on) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
clearTimeout(pending.confirmationTimer);
|
|
127
|
+
this.preferredControllerByDevice.set(deviceId, pending.controllerId);
|
|
128
|
+
pending.resolve?.(true);
|
|
129
|
+
this.pendingPowerCommands.delete(key);
|
|
130
|
+
this.log.info('[Cync TCP] Power state confirmed by %s: device=%s on=%s controller=0x%s ageMs=%d', source, deviceId, String(on), pending.controllerId.toString(16).padStart(8, '0'), Date.now() - pending.sentAt);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
86
133
|
enqueueCommand(fn) {
|
|
87
134
|
let resolveWrapper;
|
|
88
135
|
let rejectWrapper;
|
|
@@ -165,6 +212,48 @@ export class TcpClient {
|
|
|
165
212
|
this.log.debug('[Cync TCP] LAN parse bytes: typeByte=0x%s stateByte=%d levelByte=%d -> hkPct=%d lastNonZero=%s', typeByte.toString(16).padStart(2, '0'), stateByte, levelByte, brightnessPct, String(lastNonZeroBrightnessPct ?? 'none'));
|
|
166
213
|
return { controllerId, deviceId, on, brightnessPct, lastNonZeroBrightnessPct };
|
|
167
214
|
}
|
|
215
|
+
parseCompactStateFrame43(frame) {
|
|
216
|
+
if (frame.length < 26) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const controllerId = frame.readUInt32BE(0);
|
|
220
|
+
const homeId = this.switchIdToHomeId.get(controllerId);
|
|
221
|
+
if (!homeId) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const devices = this.homeDevices[homeId];
|
|
225
|
+
if (!devices || devices.length === 0) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
if (frame[9] !== 0x10) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
const deviceIndex = frame[10];
|
|
232
|
+
const deviceId = deviceIndex < devices.length ? devices[deviceIndex] : undefined;
|
|
233
|
+
if (!deviceId) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const on = frame[11] > 0;
|
|
237
|
+
const levelByte = frame[12];
|
|
238
|
+
const colorTone = frame[13];
|
|
239
|
+
const brightnessPct = on ? clampNumber(levelByte, 1, 100) : 0;
|
|
240
|
+
const lastNonZeroBrightnessPct = levelByte > 0 ? clampNumber(levelByte, 1, 100) : undefined;
|
|
241
|
+
const rgb = colorTone === 0xfe
|
|
242
|
+
? { r: frame[14], g: frame[15], b: frame[16] }
|
|
243
|
+
: undefined;
|
|
244
|
+
const colorTemperatureMired = colorTone !== 0xfe
|
|
245
|
+
? colorToneByteToMired(colorTone)
|
|
246
|
+
: undefined;
|
|
247
|
+
this.log.debug('[Cync TCP] compact state 0x43: device=%s index=%d on=%s level=%d tone=0x%s mired=%s rgb=%o prefix=%s', deviceId, deviceIndex, String(on), levelByte, colorTone.toString(16).padStart(2, '0'), colorTemperatureMired === undefined ? 'none' : String(colorTemperatureMired), rgb, formatHexPrefix(frame));
|
|
248
|
+
return {
|
|
249
|
+
deviceId,
|
|
250
|
+
on,
|
|
251
|
+
brightnessPct,
|
|
252
|
+
lastNonZeroBrightnessPct,
|
|
253
|
+
rgb,
|
|
254
|
+
colorTemperatureMired,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
168
257
|
constructor(logger) {
|
|
169
258
|
this.log = logger ?? defaultLogger;
|
|
170
259
|
}
|
|
@@ -262,13 +351,60 @@ export class TcpClient {
|
|
|
262
351
|
this.log.debug('[Cync TCP] Scheduling reconnect in %dms (%s)', delayMs, reason);
|
|
263
352
|
this.reconnectTimer = setTimeout(() => {
|
|
264
353
|
this.reconnectTimer = null;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
354
|
+
void (async () => {
|
|
355
|
+
try {
|
|
356
|
+
const connected = await this.ensureConnected();
|
|
357
|
+
if (!connected) {
|
|
358
|
+
this.log.debug('[Cync TCP] Reconnect attempt did not establish a socket.');
|
|
359
|
+
this.scheduleReconnect('retry');
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
this.log.debug('[Cync TCP] Reconnect attempt failed: %s', String(err));
|
|
364
|
+
this.scheduleReconnect('retry');
|
|
365
|
+
}
|
|
366
|
+
})();
|
|
367
|
+
}, delayMs);
|
|
368
|
+
}
|
|
369
|
+
scheduleMeshStateRefresh(reason, delayMs = POST_COMMAND_MESH_REFRESH_DELAY_MS) {
|
|
370
|
+
if (this.shuttingDown) {
|
|
371
|
+
this.log.debug('[Cync TCP] Not scheduling mesh-state refresh (shutting down): %s', reason);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (this.meshStateRefreshTimer) {
|
|
375
|
+
clearTimeout(this.meshStateRefreshTimer);
|
|
376
|
+
}
|
|
377
|
+
this.log.debug('[Cync TCP] Scheduling mesh-state refresh in %dms (%s)', delayMs, reason);
|
|
378
|
+
this.meshStateRefreshTimer = setTimeout(() => {
|
|
379
|
+
this.meshStateRefreshTimer = null;
|
|
380
|
+
void this.refreshMeshState(reason);
|
|
270
381
|
}, delayMs);
|
|
271
382
|
}
|
|
383
|
+
requestMeshStateRefresh(reason, delayMs = 0) {
|
|
384
|
+
this.scheduleMeshStateRefresh(reason, delayMs);
|
|
385
|
+
}
|
|
386
|
+
async refreshMeshState(reason) {
|
|
387
|
+
if (this.meshStateRefreshInFlight) {
|
|
388
|
+
this.log.debug('[Cync TCP] Mesh-state refresh already in flight; rescheduling (%s)', reason);
|
|
389
|
+
this.scheduleMeshStateRefresh(`in-flight: ${reason}`);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (!this.socket || this.socket.destroyed) {
|
|
393
|
+
this.log.debug('[Cync TCP] Mesh-state refresh skipped; socket unavailable (%s)', reason);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
this.meshStateRefreshInFlight = true;
|
|
397
|
+
try {
|
|
398
|
+
this.log.debug('[Cync TCP] Refreshing mesh state (%s)', reason);
|
|
399
|
+
await this.requestMeshState();
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
this.log.debug('[Cync TCP] Mesh-state refresh failed (%s): %s', reason, String(err));
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
this.meshStateRefreshInFlight = false;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
272
408
|
async establishSocket() {
|
|
273
409
|
const host = 'cm.gelighting.com';
|
|
274
410
|
const portTLS = 23779;
|
|
@@ -467,7 +603,16 @@ export class TcpClient {
|
|
|
467
603
|
const seq = this.nextSeq();
|
|
468
604
|
const packet = packetBuilder(candidateControllerId, seq);
|
|
469
605
|
const rejected = await new Promise((resolve) => {
|
|
470
|
-
|
|
606
|
+
const pendingKey = `${candidateControllerId}:${seq}`;
|
|
607
|
+
const confirmationTimer = setTimeout(() => {
|
|
608
|
+
const pending = this.pendingPowerCommands.get(pendingKey);
|
|
609
|
+
if (!pending) {
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
this.pendingPowerCommands.delete(pendingKey);
|
|
613
|
+
this.log.warn('[Cync TCP] %s state not confirmed within %dms: device=%s expectedOn=%s controller=0x%s seq=%d', logLabel, POWER_STATE_CONFIRM_TIMEOUT_MS, deviceId, String(expectedOn), candidateControllerId.toString(16).padStart(8, '0'), seq);
|
|
614
|
+
}, POWER_STATE_CONFIRM_TIMEOUT_MS);
|
|
615
|
+
this.pendingPowerCommands.set(pendingKey, {
|
|
471
616
|
deviceId,
|
|
472
617
|
on: expectedOn,
|
|
473
618
|
controllerId: candidateControllerId,
|
|
@@ -475,6 +620,7 @@ export class TcpClient {
|
|
|
475
620
|
seq,
|
|
476
621
|
sentAt: Date.now(),
|
|
477
622
|
packetHex: packet.toString('hex'),
|
|
623
|
+
confirmationTimer,
|
|
478
624
|
resolve: (confirmed) => resolve(!confirmed),
|
|
479
625
|
});
|
|
480
626
|
this.writeSocket(packet, logLabel);
|
|
@@ -483,11 +629,12 @@ export class TcpClient {
|
|
|
483
629
|
});
|
|
484
630
|
if (!rejected) {
|
|
485
631
|
this.preferredControllerByDevice.set(deviceId, candidateControllerId);
|
|
486
|
-
this.log.debug('[Cync TCP] %s command accepted
|
|
632
|
+
this.log.debug('[Cync TCP] %s command transport accepted; awaiting state confirmation: device=%s controller=0x%s', logLabel, deviceId, candidateControllerId.toString(16).padStart(8, '0'));
|
|
633
|
+
this.scheduleMeshStateRefresh(`${logLabel} command accepted`);
|
|
487
634
|
return;
|
|
488
635
|
}
|
|
489
636
|
}
|
|
490
|
-
this.log.warn('[Cync TCP] %s command
|
|
637
|
+
this.log.warn('[Cync TCP] %s command transport rejected for device=%s on=%s after trying %d controller(s).', logLabel, deviceId, String(expectedOn), controllerCandidates.length);
|
|
491
638
|
}
|
|
492
639
|
nextSeq() {
|
|
493
640
|
if (this.seq === 65535) {
|
|
@@ -873,14 +1020,19 @@ export class TcpClient {
|
|
|
873
1020
|
const rgb = colorTone === 0xfe
|
|
874
1021
|
? { r: rec[20], g: rec[21], b: rec[22] }
|
|
875
1022
|
: undefined;
|
|
876
|
-
|
|
1023
|
+
const colorTemperatureMired = colorTone !== 0xfe
|
|
1024
|
+
? colorToneByteToMired(colorTone)
|
|
1025
|
+
: undefined;
|
|
1026
|
+
this.log.debug('[Cync TCP] mesh state record: device=%s index=%d on=%s level=%d ct=%d mired=%s rgb=%o', deviceId, deviceIndex, String(on), levelByte, colorTone, colorTemperatureMired === undefined ? 'none' : String(colorTemperatureMired), rgb);
|
|
877
1027
|
this.emitLanDeviceUpdate({
|
|
878
1028
|
deviceId,
|
|
879
1029
|
on,
|
|
880
1030
|
brightnessPct,
|
|
881
1031
|
lastNonZeroBrightnessPct,
|
|
882
1032
|
rgb,
|
|
1033
|
+
colorTemperatureMired,
|
|
883
1034
|
});
|
|
1035
|
+
this.confirmPendingPowerCommand(deviceId, on, 'mesh state');
|
|
884
1036
|
}
|
|
885
1037
|
}
|
|
886
1038
|
async disconnect() {
|
|
@@ -892,6 +1044,11 @@ export class TcpClient {
|
|
|
892
1044
|
this.reconnectTimer = null;
|
|
893
1045
|
}
|
|
894
1046
|
this.reconnectAttempt = 0;
|
|
1047
|
+
if (this.meshStateRefreshTimer) {
|
|
1048
|
+
clearTimeout(this.meshStateRefreshTimer);
|
|
1049
|
+
this.meshStateRefreshTimer = null;
|
|
1050
|
+
}
|
|
1051
|
+
this.meshStateRefreshInFlight = false;
|
|
895
1052
|
if (this.heartbeatTimer) {
|
|
896
1053
|
clearInterval(this.heartbeatTimer);
|
|
897
1054
|
this.heartbeatTimer = null;
|
|
@@ -979,8 +1136,7 @@ export class TcpClient {
|
|
|
979
1136
|
const hkBrightness = Math.max(0, Math.min(100, Math.round(params.brightnessPct ?? 100)));
|
|
980
1137
|
const on = hkBrightness > 0;
|
|
981
1138
|
const level = hkBrightnessToPct100Byte(hkBrightness);
|
|
982
|
-
const
|
|
983
|
-
const tone = scaleToByte(mired, ctMinMired, ctMaxMired, invertTone);
|
|
1139
|
+
const tone = miredToColorToneByte(mired, ctMinMired, ctMaxMired);
|
|
984
1140
|
await this.sendWithControllerRetry(deviceId, record, on, (candidateControllerId, seq) => this.buildComboPacket(candidateControllerId, meshIndex, on, level, tone, { r: 255, g: 255, b: 255 }, seq), 'combo CT');
|
|
985
1141
|
});
|
|
986
1142
|
}
|
|
@@ -1086,7 +1242,7 @@ export class TcpClient {
|
|
|
1086
1242
|
this.readBuffer = Buffer.concat([this.readBuffer, chunk]);
|
|
1087
1243
|
this.processIncoming();
|
|
1088
1244
|
});
|
|
1089
|
-
socket.on('close', () => {
|
|
1245
|
+
socket.on('close', (hadError) => {
|
|
1090
1246
|
this.log.warn('[Cync TCP] Socket closed.');
|
|
1091
1247
|
this.resetCommandSessionState('establishSocket');
|
|
1092
1248
|
if (this.heartbeatTimer) {
|
|
@@ -1097,11 +1253,7 @@ export class TcpClient {
|
|
|
1097
1253
|
if (this.socket === socket) {
|
|
1098
1254
|
this.socket = null;
|
|
1099
1255
|
}
|
|
1100
|
-
this.
|
|
1101
|
-
if (this.reconnectTimer) {
|
|
1102
|
-
clearTimeout(this.reconnectTimer);
|
|
1103
|
-
this.reconnectTimer = null;
|
|
1104
|
-
}
|
|
1256
|
+
this.scheduleReconnect(hadError ? 'socket closed after error' : 'socket closed');
|
|
1105
1257
|
});
|
|
1106
1258
|
socket.on('error', (err) => {
|
|
1107
1259
|
this.log.error('[Cync TCP] Socket error:', String(err));
|
|
@@ -1146,8 +1298,11 @@ export class TcpClient {
|
|
|
1146
1298
|
? 'Command status frame'
|
|
1147
1299
|
: 'ACK frame (non-command)';
|
|
1148
1300
|
logFn.call(this.log, '[Cync TCP] %s: controller=%d controllerHex=0x%s seq=%d status=0x%s device=%s on=%s ageMs=%s body=%s packet=%s', label, controllerId, controllerId.toString(16).padStart(8, '0'), seq, status.toString(16).padStart(2, '0'), pending?.deviceId ?? 'unknown', pending ? String(pending.on) : 'unknown', ageMs !== undefined ? String(ageMs) : 'unknown', formatHex(body), pending?.packetHex ?? 'unknown');
|
|
1149
|
-
pending
|
|
1150
|
-
|
|
1301
|
+
if (pending) {
|
|
1302
|
+
clearTimeout(pending.confirmationTimer);
|
|
1303
|
+
pending.resolve?.(false);
|
|
1304
|
+
this.pendingPowerCommands.delete(pendingKey);
|
|
1305
|
+
}
|
|
1151
1306
|
this.handleIncomingFrame(body, type);
|
|
1152
1307
|
}
|
|
1153
1308
|
else {
|
|
@@ -1178,7 +1333,15 @@ export class TcpClient {
|
|
|
1178
1333
|
return;
|
|
1179
1334
|
}
|
|
1180
1335
|
if (type === 0x43) {
|
|
1181
|
-
|
|
1336
|
+
const compactParsed = this.parseCompactStateFrame43(frame);
|
|
1337
|
+
if (compactParsed) {
|
|
1338
|
+
payload = compactParsed;
|
|
1339
|
+
this.emitLanDeviceUpdate(compactParsed);
|
|
1340
|
+
this.confirmPendingPowerCommand(compactParsed.deviceId, compactParsed.on, 'compact LAN update');
|
|
1341
|
+
}
|
|
1342
|
+
else {
|
|
1343
|
+
this.logUnparsedFrame(type, frame, 'compact event/status frame');
|
|
1344
|
+
}
|
|
1182
1345
|
}
|
|
1183
1346
|
if ((type === 0x73 || type === 0x83) && frame.length >= 14) {
|
|
1184
1347
|
this.log.debug('[Cync TCP] routed frame type=0x%s innerSubtype=0x%s len=%d', type.toString(16).padStart(2, '0'), frame[13].toString(16).padStart(2, '0'), frame.length);
|
|
@@ -1197,14 +1360,7 @@ export class TcpClient {
|
|
|
1197
1360
|
lastNonZeroBrightnessPct: lanParsed.lastNonZeroBrightnessPct,
|
|
1198
1361
|
rgb,
|
|
1199
1362
|
});
|
|
1200
|
-
|
|
1201
|
-
if (pending.deviceId === devId && pending.on === lanParsed.on) {
|
|
1202
|
-
this.preferredControllerByDevice.set(devId, pending.controllerId);
|
|
1203
|
-
pending.resolve?.(true);
|
|
1204
|
-
this.pendingPowerCommands.delete(key);
|
|
1205
|
-
this.log.info('[Cync TCP] Power command confirmed: device=%s on=%s controller=0x%s', devId, String(lanParsed.on), pending.controllerId.toString(16).padStart(8, '0'));
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1363
|
+
this.confirmPendingPowerCommand(devId, lanParsed.on, 'LAN update');
|
|
1208
1364
|
}
|
|
1209
1365
|
else if (type === 0x83) {
|
|
1210
1366
|
// Fallback to legacy controller-level parsing only for 0x83
|
|
@@ -1215,9 +1371,20 @@ export class TcpClient {
|
|
|
1215
1371
|
...parsed,
|
|
1216
1372
|
deviceId,
|
|
1217
1373
|
};
|
|
1374
|
+
if (!deviceId) {
|
|
1375
|
+
this.logUnparsedFrame(type, frame, 'legacy switch update without device mapping');
|
|
1376
|
+
}
|
|
1218
1377
|
}
|
|
1219
1378
|
}
|
|
1220
1379
|
}
|
|
1380
|
+
if (payload === frame &&
|
|
1381
|
+
type !== 0x18 &&
|
|
1382
|
+
type !== 0x43 &&
|
|
1383
|
+
type !== 0x78 &&
|
|
1384
|
+
type !== 0x7b &&
|
|
1385
|
+
type !== 0xab) {
|
|
1386
|
+
this.logUnparsedFrame(type, frame, 'no parsed device update');
|
|
1387
|
+
}
|
|
1221
1388
|
if (this.deviceUpdateCb) {
|
|
1222
1389
|
this.deviceUpdateCb(payload);
|
|
1223
1390
|
}
|