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 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;
@@ -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 scaleToByte(value, inMin, inMax, invert) {
22
- const v = clampNumber(value, inMin, inMax);
23
- const t = (v - inMin) / (inMax - inMin); // 0..1
24
- const u = invert ? (1 - t) : t;
25
- return clampNumber(Math.round(u * 255), 0, 255);
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
- // Fire and forget; ensureConnected() logs failures already
266
- void this.ensureConnected().catch((err) => {
267
- this.log.debug('[Cync TCP] Reconnect attempt failed: %s', String(err));
268
- this.scheduleReconnect('retry');
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
- this.pendingPowerCommands.set(`${candidateControllerId}:${seq}`, {
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/no immediate rejection: device=%s controller=0x%s', logLabel, deviceId, candidateControllerId.toString(16).padStart(8, '0'));
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 not confirmed for device=%s on=%s after trying %d controller(s).', logLabel, deviceId, String(expectedOn), controllerCandidates.length);
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
- this.log.debug('[Cync TCP] mesh state record: device=%s index=%d on=%s level=%d ct=%d rgb=%o', deviceId, deviceIndex, String(on), levelByte, colorTone, rgb);
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 invertTone = params.invertTone === true;
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.reconnectAttempt = 0;
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?.resolve?.(false);
1150
- this.pendingPowerCommands.delete(pendingKey);
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
- this.log.debug('[Cync TCP] compact frame 0x43: len=%d body=%s b0=%d b1=%d b2=%d b3=%d b4=%d b5=%d b6=%d', frame.length, formatHex(frame), frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]);
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
- for (const [key, pending] of this.pendingPowerCommands.entries()) {
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
  }