homebridge-salus-cloud 0.1.37 → 0.1.39

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 CHANGED
@@ -25,8 +25,9 @@ The plugin follows the app's modern cloud stack:
25
25
  - Service API fallback: `/api/v2`
26
26
  - Discovery endpoints (in order): `GET /api/v1/occupants/slider_list` + `GET /api/v1/occupants/slider_details?id=...&type=gateway`, then fallback `GET /devices/`
27
27
  - Property shadow endpoint: `POST /devices/device_shadows` with `{ "device_codes": [...] }` (with compatibility fallback shapes)
28
- - Control write endpoint (primary): AWS IoT thing-shadow `POST /things/{dsn}/shadow` with SigV4 signing, using temporary credentials from Cognito Identity
29
- - Control write endpoint (fallback): `POST /devices/bulk` and `PATCH /devices/device_shadows` payload variants for compatibility fallback
28
+ - Control write endpoint (primary): AWS IoT shadow MQTT publish to `$aws/things/{dsn}/shadow/update` over SigV4-signed WebSocket, using temporary credentials from Cognito Identity
29
+ - Control write endpoint (secondary fallback): AWS IoT thing-shadow `POST /things/{dsn}/shadow` with SigV4 signing
30
+ - Control write endpoint (compatibility fallback): a single `POST /devices/bulk` properties payload
30
31
 
31
32
  ## Install
32
33
 
@@ -107,12 +108,14 @@ Examples:
107
108
  - Bounded `occupants/slider_details` traversal per poll (target-count + time budget) to avoid long stalls during upstream `5xx` bursts.
108
109
  - Automatic compatibility fallback to legacy Salus cloud auth/API (multi-path legacy sign-in probe + `/apiv1`) when modern API returns persistent authorization errors (for example `response_code=900008`).
109
110
  - Flexible shadow parser for multiple payload shapes.
110
- - Primary write path matches Salus app behavior via AWS IoT thing-shadow updates (`state.desired.<baseKey>.properties`).
111
+ - Primary write path matches Salus app behavior via AWS IoT MQTT shadow updates (`$aws/things/{dsn}/shadow/update` with `state.desired.<baseKey>.properties`).
112
+ - Automatic MQTT write retries for transient connection issues and AWS credential refresh on authorization failures.
111
113
  - Automatic AWS IoT credential refresh and signing-service fallback (`iotdevicegateway` -> `iotdata`) for tenant variations.
112
- - Service API write payload fallbacks remain enabled as a compatibility safety net.
114
+ - A single service-api bulk-write compatibility fallback is kept as a safety net (brute-force write shape probing removed).
113
115
  - Per-poll property refresh (with cached fallback on transient errors) to keep HomeKit target/current values up-to-date.
116
+ - Polling now uses a fast path: lightweight shadow refresh on most cycles and full discovery periodically, which improves Home app <-> Salus app sync latency.
114
117
  - Thermostat write confirmation loop verifies that setpoint actually changed in cloud state; failed convergence is surfaced as HomeKit communication failure instead of silent no-op.
115
- - Thermostat setpoint writes mirror both effective and command fields (`HeatingSetpoint*` + `SetHeatingSetpoint*`) to keep Salus app and Home app in sync when the cloud updates them asynchronously.
118
+ - Thermostat setpoint writes use command datapoints (`SetHeatingSetpoint*`) together with manual/working mode hints (`SetHoldType=2`, `SetSystemMode=4`) to match Salus app behavior.
116
119
  - Device online state is inferred from Salus connectivity datapoints (`connected`, `OnlineState`, `OnlineStatus_i`, etc.) and mapped to HomeKit reachability so disconnected devices can show as not responding.
117
120
  - Immediate short re-poll after write to keep HomeKit state aligned.
118
121
  - Detailed logs for auth, discovery, shadow sync, writes, retries, and failures.
@@ -122,7 +125,7 @@ Examples:
122
125
  For Salus thermostat UX parity (standby/working):
123
126
 
124
127
  - HomeKit `Off` -> Salus standby (`HoldType=7`, no active heating)
125
- - HomeKit `Heat` -> Salus working mode
128
+ - HomeKit `Heat` -> Salus working/manual mode (`HoldType=2`, `SystemMode=4`)
126
129
  - HomeKit `Cool` / `Auto` requests are forced to `Heat`
127
130
 
128
131
  Target mode characteristic is constrained to `Off` + `Heat` to avoid unsupported mode selection in Home app.
@@ -10,15 +10,20 @@ export declare class SalusHomebridgePlatform implements DynamicPlatformPlugin {
10
10
  private readonly configTyped;
11
11
  private readonly cloudClient;
12
12
  private readonly pollIntervalMs;
13
+ private readonly fullDiscoveryIntervalMs;
13
14
  private readonly maxParallelPropertyRequests;
14
15
  private readonly missingAccessoryPollCounts;
15
16
  private pollTimer;
16
17
  private pollInProgress;
18
+ private pollRequestedWhileBusy;
19
+ private lastBusyPollLogEpochMs;
20
+ private lastFullDiscoveryEpochMs;
17
21
  private launchCompleted;
18
22
  private hasLoggedDuplicateRegisterWorkaround;
19
23
  constructor(log: Logging, config: PlatformConfig, api: API);
20
24
  configureAccessory(accessory: PlatformAccessory): void;
21
25
  writeDeviceProperty(device: SalusDevice, propertyName: string, value: unknown): Promise<void>;
26
+ writeDeviceProperties(device: SalusDevice, properties: Record<string, unknown>): Promise<void>;
22
27
  readDeviceProperties(device: SalusDevice): Promise<SalusPropertyMap>;
23
28
  getUnmappedConstraintList(): string[];
24
29
  private schedulePoll;
package/dist/platform.js CHANGED
@@ -6,9 +6,11 @@ import { SalusPlatformAccessory } from './platformAccessory.js';
6
6
  import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
7
7
  const DEFAULT_POLL_INTERVAL_SECONDS = 20;
8
8
  const DEFAULT_MAX_PARALLEL_PROPERTY_REQUESTS = 4;
9
+ const DEFAULT_FULL_DISCOVERY_INTERVAL_SECONDS = 300;
9
10
  const MIN_POLL_INTERVAL_SECONDS = 10;
10
11
  const MAX_POLL_INTERVAL_SECONDS = 300;
11
12
  const STALE_ACCESSORY_REMOVAL_GRACE_POLLS = 3;
13
+ const POLL_BUSY_LOG_THROTTLE_MS = 30_000;
12
14
  const THERMOSTAT_PROPERTY_BASES = [
13
15
  'HeatingSetpoint_x100',
14
16
  'AutoHeatingSetpoint_x100',
@@ -146,10 +148,14 @@ export class SalusHomebridgePlatform {
146
148
  configTyped;
147
149
  cloudClient;
148
150
  pollIntervalMs;
151
+ fullDiscoveryIntervalMs;
149
152
  maxParallelPropertyRequests;
150
153
  missingAccessoryPollCounts = new Map();
151
154
  pollTimer = null;
152
155
  pollInProgress = false;
156
+ pollRequestedWhileBusy = false;
157
+ lastBusyPollLogEpochMs = 0;
158
+ lastFullDiscoveryEpochMs = 0;
153
159
  launchCompleted = false;
154
160
  hasLoggedDuplicateRegisterWorkaround = false;
155
161
  constructor(log, config, api) {
@@ -160,6 +166,7 @@ export class SalusHomebridgePlatform {
160
166
  this.configTyped = config;
161
167
  this.pollIntervalMs = Math.round(clamp(this.configTyped.pollIntervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, MAX_POLL_INTERVAL_SECONDS) * 1_000);
162
168
  this.maxParallelPropertyRequests = Math.max(1, Math.floor(this.configTyped.maxParallelPropertyRequests ?? DEFAULT_MAX_PARALLEL_PROPERTY_REQUESTS));
169
+ this.fullDiscoveryIntervalMs = Math.max(this.pollIntervalMs, Math.round((DEFAULT_FULL_DISCOVERY_INTERVAL_SECONDS) * 1_000));
163
170
  if (!this.configTyped.email || !this.configTyped.password) {
164
171
  this.cloudClient = null;
165
172
  this.log.error('Salus credentials are missing. Configure both "email" and "password" in Homebridge settings.');
@@ -185,16 +192,31 @@ export class SalusHomebridgePlatform {
185
192
  this.log.debug(`Restored cached accessory: ${accessory.displayName}`);
186
193
  }
187
194
  async writeDeviceProperty(device, propertyName, value) {
195
+ await this.writeDeviceProperties(device, { [propertyName]: value });
196
+ }
197
+ async writeDeviceProperties(device, properties) {
188
198
  if (!this.cloudClient) {
189
199
  throw new Error('Salus cloud client is not initialized due to missing credentials.');
190
200
  }
201
+ const entries = Object.entries(properties).filter(([name]) => name.trim() !== '');
202
+ if (entries.length === 0) {
203
+ throw new Error(`No writable properties were provided for ${device.name} (${device.dsn}).`);
204
+ }
191
205
  try {
192
- await this.cloudClient.setDatapoint(device.dsn, propertyName, value);
193
- this.log.debug(`Set datapoint ${propertyName}=${JSON.stringify(value)} for ${device.name} (${device.dsn})`);
206
+ await this.cloudClient.setDatapoints(device.dsn, Object.fromEntries(entries));
207
+ if (entries.length === 1) {
208
+ const [propertyName, value] = entries[0];
209
+ this.log.debug(`Set datapoint ${propertyName}=${JSON.stringify(value)} for ${device.name} (${device.dsn})`);
210
+ }
211
+ else {
212
+ const summary = entries.map(([name, value]) => `${name}=${JSON.stringify(value)}`).join(', ');
213
+ this.log.debug(`Set ${entries.length} datapoints for ${device.name} (${device.dsn}): ${summary}`);
214
+ }
194
215
  this.schedulePoll(2_000);
195
216
  }
196
217
  catch (error) {
197
- this.log.error(`Failed to set datapoint ${propertyName} on ${device.name}: ${asErrorMessage(error)}`);
218
+ const summary = entries.map(([name, value]) => `${name}=${JSON.stringify(value)}`).join(', ');
219
+ this.log.error(`Failed to set datapoint(s) on ${device.name}: ${summary}. ${asErrorMessage(error)}`);
198
220
  throw error;
199
221
  }
200
222
  }
@@ -227,14 +249,34 @@ export class SalusHomebridgePlatform {
227
249
  return;
228
250
  }
229
251
  if (this.pollInProgress) {
230
- this.log.info('Previous Salus poll is still in progress; delaying next cycle.');
231
- this.schedulePoll(2_000);
252
+ this.pollRequestedWhileBusy = true;
253
+ const now = Date.now();
254
+ if ((now - this.lastBusyPollLogEpochMs) >= POLL_BUSY_LOG_THROTTLE_MS) {
255
+ this.lastBusyPollLogEpochMs = now;
256
+ this.log.info('Previous Salus poll is still in progress; queued one immediate follow-up poll.');
257
+ }
232
258
  return;
233
259
  }
234
260
  this.pollInProgress = true;
235
261
  const discoveredUuids = new Set();
236
262
  try {
237
- const devices = await this.cloudClient.listDevices();
263
+ const now = Date.now();
264
+ const knownDevices = this.cloudClient.getKnownDevicesSnapshot();
265
+ const runFullDiscovery = knownDevices.length === 0
266
+ || (now - this.lastFullDiscoveryEpochMs) >= this.fullDiscoveryIntervalMs;
267
+ let devices;
268
+ if (runFullDiscovery) {
269
+ devices = await this.cloudClient.listDevices();
270
+ this.lastFullDiscoveryEpochMs = Date.now();
271
+ }
272
+ else {
273
+ await this.cloudClient.refreshKnownDeviceShadows();
274
+ devices = this.cloudClient.getKnownDevicesSnapshot();
275
+ if (devices.length === 0) {
276
+ devices = await this.cloudClient.listDevices();
277
+ this.lastFullDiscoveryEpochMs = Date.now();
278
+ }
279
+ }
238
280
  const dedupedByDsn = dedupeDevicesByDsn(devices)
239
281
  .filter((device) => !shouldIgnoreInfrastructureDevice(device))
240
282
  .map((device) => ({ ...device, name: sanitizeHomeKitName(device.name, device.model || device.dsn) }));
@@ -244,7 +286,10 @@ export class SalusHomebridgePlatform {
244
286
  }
245
287
  const deviceSnapshots = await mapWithConcurrency(uniqueDevices, this.maxParallelPropertyRequests, async (device) => {
246
288
  try {
247
- const properties = await this.cloudClient.listProperties(device.dsn);
289
+ const cached = this.cloudClient.getCachedProperties(device.dsn);
290
+ const properties = (cached && cached.size > 0)
291
+ ? cached
292
+ : await this.cloudClient.listProperties(device.dsn);
248
293
  const normalizedDevice = normalizeDeviceOnlineState(device, properties);
249
294
  const profile = this.deriveProfile(normalizedDevice, properties);
250
295
  return { device: normalizedDevice, properties, profile };
@@ -282,7 +327,13 @@ export class SalusHomebridgePlatform {
282
327
  }
283
328
  finally {
284
329
  this.pollInProgress = false;
285
- this.schedulePoll(this.pollIntervalMs);
330
+ if (this.pollRequestedWhileBusy) {
331
+ this.pollRequestedWhileBusy = false;
332
+ this.schedulePoll(0);
333
+ }
334
+ else {
335
+ this.schedulePoll(this.pollIntervalMs);
336
+ }
286
337
  }
287
338
  }
288
339
  addAccessory(device, profile, properties, uuid) {
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAI5D,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG3D,MAAM,6BAA6B,GAAG,EAAE,CAAC;AACzC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACjD,MAAM,uCAAuC,GAAG,GAAG,CAAC;AACpD,MAAM,yBAAyB,GAAG,EAAE,CAAC;AACrC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAC9C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,yBAAyB,GAAG;IAChC,sBAAsB;IACtB,0BAA0B;IAC1B,6BAA6B;IAC7B,wBAAwB;IACxB,2BAA2B;IAC3B,eAAe;IACf,mBAAmB;IACnB,8BAA8B;IAC9B,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,wBAAwB;IACxB,mBAAmB;IACnB,sBAAsB;IACtB,UAAU;IACV,cAAc;IACd,yBAAyB;IACzB,gBAAgB;IAChB,sBAAsB;IACtB,0BAA0B;IAC1B,6BAA6B;IAC7B,wBAAwB;IACxB,2BAA2B;IAC3B,eAAe;IACf,mBAAmB;IACnB,8BAA8B;IAC9B,oBAAoB;IACpB,iBAAiB;IACjB,qBAAqB;IACrB,wBAAwB;IACxB,mBAAmB;IACnB,sBAAsB;IACtB,UAAU;IACV,cAAc;IACd,yBAAyB;IACzB,eAAe;IACf,yBAAyB;IACzB,oBAAoB;IACpB,yBAAyB;IACzB,oBAAoB;IACpB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,aAAa;IACb,UAAU;IACV,aAAa;CACd,CAAC;AACF,MAAM,kCAAkC,GAAG;IACzC,sBAAsB;IACtB,0BAA0B;IAC1B,6BAA6B;IAC7B,mBAAmB;IACnB,8BAA8B;IAC9B,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,wBAAwB;IACxB,cAAc;IACd,yBAAyB;IACzB,gBAAgB;IAChB,sBAAsB;IACtB,0BAA0B;IAC1B,6BAA6B;IAC7B,mBAAmB;IACnB,8BAA8B;IAC9B,oBAAoB;IACpB,iBAAiB;IACjB,qBAAqB;IACrB,wBAAwB;IACxB,cAAc;IACd,yBAAyB;IACzB,eAAe;IACf,yBAAyB;IACzB,oBAAoB;IACpB,yBAAyB;IACzB,oBAAoB;IACpB,wBAAwB;IACxB,2BAA2B;IAC3B,eAAe;IACf,mBAAmB;IACnB,sBAAsB;IACtB,UAAU;CACX,CAAC;AACF,MAAM,mCAAmC,GAAG;IAC1C,eAAe;IACf,YAAY;IACZ,cAAc;IACd,aAAa;IACb,UAAU;IACV,aAAa;CACd,CAAC;AACF,MAAM,mCAAmC,GAAG;IAC1C,uBAAuB;IACvB,yBAAyB;IACzB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,eAAe;IACf,cAAc;IACd,cAAc;IACd,sBAAsB;IACtB,iBAAiB;CAClB,CAAC;AACF,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAC5E,MAAM,uBAAuB,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;AACrG,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAC1F,MAAM,yBAAyB,GAAG,CAAC,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AACzF,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACrE,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC/C,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACnD,MAAM,0BAA0B,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AACvG,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AACjE,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AAE9F,MAAM,uBAAuB,GAAG;IAC9B,wFAAwF;IACxF,mHAAmH;IACnH,wHAAwH;IACxH,iIAAiI;IACjI,uGAAuG;CACxG,CAAC;AAEF,MAAM,OAAO,uBAAuB;IAqBhB;IAEA;IAtBF,OAAO,CAAiB;IACxB,cAAc,CAAwB;IACtC,WAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;IAEvD,iBAAiB,GAAwC,IAAI,GAAG,EAAE,CAAC;IACnE,WAAW,CAAsB;IACjC,WAAW,CAA0B;IACrC,cAAc,CAAS;IACvB,uBAAuB,CAAS;IAChC,2BAA2B,CAAS;IACpC,0BAA0B,GAAwB,IAAI,GAAG,EAAE,CAAC;IACrE,SAAS,GAA0B,IAAI,CAAC;IACxC,cAAc,GAAG,KAAK,CAAC;IACvB,sBAAsB,GAAG,KAAK,CAAC;IAC/B,sBAAsB,GAAG,CAAC,CAAC;IAC3B,wBAAwB,GAAG,CAAC,CAAC;IAC7B,eAAe,GAAG,KAAK,CAAC;IACxB,oCAAoC,GAAG,KAAK,CAAC;IAErD,YACkB,GAAY,EAC5B,MAAsB,EACN,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAS;QAEZ,QAAG,GAAH,GAAG,CAAK;QAExB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,MAA6B,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CACpC,IAAI,CAAC,WAAW,CAAC,mBAAmB,IAAI,6BAA6B,EACrE,yBAAyB,EACzB,yBAAyB,CAC1B,GAAG,KAAK,CAAC,CAAC;QACX,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,GAAG,CACzC,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,2BAA2B,IAAI,sCAAsC,CAAC,CACnG,CAAC;QACF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CACrC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,KAAK,CAAC,CAAC,uCAAuC,CAAC,GAAG,KAAK,CAAC,CAC9D,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;QACjH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC/E,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;YAC3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,SAA4B;QAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,MAAmB,EAAE,YAAoB,EAAE,KAAc;QACxF,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,MAAmB,EAAE,UAAmC;QACzF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;YAC9G,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,MAAM,mBAAmB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,IAAI,KAAK,OAAO,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrG,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,MAAmB;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;IAEM,yBAAyB;QAC9B,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC;IACtC,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,yBAAyB,EAAE,CAAC;gBACrE,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;YAClG,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,CAAC;YAChE,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;mBAC7C,CAAC,GAAG,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAAC,uBAAuB,CAAC;YAE3E,IAAI,OAAsB,CAAC;YAC3B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,WAAW,CAAC,yBAAyB,EAAE,CAAC;gBACnD,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,CAAC;gBACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;oBAC/C,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC;iBAC7C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC;iBAC7D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACxG,MAAM,aAAa,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACnF,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAC9C,aAAa,EACb,IAAI,CAAC,2BAA2B,EAChC,KAAK,EAAE,MAAM,EAAE,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;wBAC5C,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,MAAM,IAAI,CAAC,WAAY,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACvD,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;oBACxE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;oBACjE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;gBAC3D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,cAAc,GAAG,IAAI,CAAC,WAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACzE,MAAM,kBAAkB,GAAG,cAAc,IAAI,IAAI,GAAG,EAAE,CAAC;oBACvD,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;oBAChF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;oBACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,8BAA8B,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,GAAG;0BACpF,oBAAoB,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,cAAc,CACxE,CAAC;oBACF,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC;gBAC/E,CAAC;YACH,CAAC,CACF,CAAC;YAEF,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAC3B,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,SAAS;gBACX,CAAC;gBACD,kBAAkB,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAI,iBAAiB,EAAE,CAAC;oBACtB,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC3G,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,aAAa,CAAC,MAAM,0BAA0B,kBAAkB,uBAAuB,CAAC,CAAC;QAClI,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,MAAmB,EAAE,OAAsB,EAAE,UAA4B,EAAE,IAAY;QAC1G,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAA8E,CAAC;QACrH,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,CAAC;YAC3C,oFAAoF;YACpF,6EAA6E;YAC7E,oBAAoB,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAI,SAAsD,CAAC,uBAAuB,CAAC;QACrG,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,oFAAoF,CAAC,CAAC;YAC5I,wEAAwE;YACxE,uEAAuE;YACvE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;YAChC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAmC,CAAC;QAC9D,OAAO,CAAC,MAAM,GAAG;YACf,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAErD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,kCAAkC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC;oBAC/C,IAAI,CAAC,oCAAoC,GAAG,IAAI,CAAC;oBACjD,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;wBACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,oFAAoF;8BAClF,uDAAuD,CAC1D,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;oBAC3C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;gBACvG,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,wBAAwB,CAC9B,SAA4B,EAC5B,MAAmB,EACnB,OAAsB,EACtB,UAA4B;QAE5B,MAAM,eAAe,GAAG,SAAS,CAAC,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC;QAC9D,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAmC,CAAC;QAC9D,OAAO,CAAC,MAAM,GAAG;YACf,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAEhD,IAAI,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACvE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IAEO,sBAAsB,CAAC,eAA4B;QACzD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YAC5D,IAAI,gBAAgB,GAAG,mCAAmC,EAAE,CAAC;gBAC3D,oBAAoB,IAAI,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wCAAwC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,iCAAiC,oBAAoB,yBAAyB;kBAC5E,wCAAwC,mCAAmC,qBAAqB,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,MAAmB,EAAE,UAA4B;QACrE,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACjE,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;QAE1E,MAAM,WAAW,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC;QACjD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;QAC1H,CAAC;QAED,OAAO;YACL,IAAI;YACJ,OAAO;YACP,WAAW;SACZ,CAAC;IACJ,CAAC;CACF;AAcD,SAAS,uBAAuB,CAAC,UAA4B;IAC3D,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,CAAC;QAC5D,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACzD,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACtD,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC1D,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAC3D,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC/D,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,uBAAuB,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC3H,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC/D,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC9D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CACxB,mBAAsD,EACtD,oBAAuD;IAEvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO,oBAAoB,IAAI,QAAQ,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,oBAAoB,IAAI,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;QAC1E,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,4DAA4D;IAC5D,IAAI,mBAAmB,KAAK,QAAQ,IAAI,oBAAoB,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IAAI,mBAAmB,KAAK,mBAAmB;WAC1C,CAAC,oBAAoB,KAAK,gBAAgB,IAAI,oBAAoB,KAAK,kBAAkB,CAAC,EAAE,CAAC;QAChG,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA4B;IACtD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,EAAE,kCAAkC,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,EAAE,mCAAmC,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,EAAE,mCAAmC,CAAC,CAAC;IAExF,OAAO,WAAW,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gCAAgC,CAAC,MAAmB;IAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACnD,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACnH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAsB;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAQ,EAAE,OAAsB,EAAE,GAAY;IAChF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CACN,iDAAiD,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,GAAG;kBAChF,YAAY,QAAQ,CAAC,GAAG,iBAAiB,MAAM,CAAC,GAAG,GAAG,CACzD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CACN,iDAAiD,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,GAAG;kBAChF,mBAAmB,MAAM,CAAC,GAAG,GAAG,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAiB,EAAE,KAAkB;IAClE,MAAM,SAAS,GAAG,iCAAiC,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iCAAiC,CAAC,MAAmB;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IACzD,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,SAAS;SACzB,SAAS,CAAC,MAAM,CAAC;SACjB,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAClC,UAAU,CAAC,kBAAkB,EAAE,GAAG,CAAC;SACnC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAC;IACV,MAAM,YAAY,GAAG,UAAU;SAC5B,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACjC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACjC,IAAI,EAAE,CAAC;IACV,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,kBAAkB,GAAG,CAAC,QAAQ,IAAI,cAAc,CAAC;SACpD,SAAS,CAAC,MAAM,CAAC;SACjB,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAClC,UAAU,CAAC,kBAAkB,EAAE,GAAG,CAAC;SACnC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAC;IACV,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAmB,EAAE,UAA4B;IACnF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,cAAc;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,UAA4B;IAClE,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,EAAE;QAClD,WAAW;QACX,aAAa;QACb,gBAAgB;QAChB,iBAAiB;QACjB,gBAAgB;QAChB,aAAa;KACd,CAAC,CAAC;IACH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,EAAE;QACpD,qBAAqB;KACtB,CAAC,CAAC;IACH,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,cAAc,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kCAAkC,CAAC,KAAc;IACxD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAU,EACV,WAAmB,EACnB,MAA+B;IAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,SAAS,CAAC;YACxB,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,QAAgB,EAAE,QAAgB;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -14,6 +14,7 @@ export declare class SalusPlatformAccessory {
14
14
  private writeTargets;
15
15
  private cachedTargetState;
16
16
  private cachedSystemMode;
17
+ private thermostatSetpointWriteSequence;
17
18
  constructor(platform: SalusHomebridgePlatform, accessory: PlatformAccessory, device: SalusDevice, profile: DeviceProfile);
18
19
  updateFromCloud(device: SalusDevice, profile: DeviceProfile, properties: SalusPropertyMap): void;
19
20
  private applyDeviceReachabilityState;
@@ -51,6 +52,8 @@ export declare class SalusPlatformAccessory {
51
52
  private resolveLockState;
52
53
  private resolveGenericBoolean;
53
54
  private getPropertyValue;
55
+ private firstDefined;
56
+ private encodeThermostatTemperatureForProperty;
54
57
  private setTargetTemperature;
55
58
  private ensureThermostatTargetApplied;
56
59
  private setTargetHeatingCoolingState;
@@ -158,6 +158,7 @@ export class SalusPlatformAccessory {
158
158
  writeTargets = {};
159
159
  cachedTargetState = 0;
160
160
  cachedSystemMode = SALUS_MODE.auto;
161
+ thermostatSetpointWriteSequence = 0;
161
162
  constructor(platform, accessory, device, profile) {
162
163
  this.platform = platform;
163
164
  this.accessory = accessory;
@@ -386,8 +387,8 @@ export class SalusPlatformAccessory {
386
387
  }
387
388
  updateThermostatCharacteristics() {
388
389
  const currentTempRaw = getNumberProperty(this.latestProperties, THERMOSTAT_CURRENT_TEMP);
389
- const heatingSetpointRaw = this.resolveEffectiveThermostatSetpoint(THERMOSTAT_HEAT_SETPOINT_COMMAND, THERMOSTAT_HEAT_SETPOINT_EFFECTIVE);
390
- const coolingSetpointRaw = this.resolveEffectiveThermostatSetpoint(THERMOSTAT_COOL_SETPOINT_COMMAND, THERMOSTAT_COOL_SETPOINT_EFFECTIVE);
390
+ const heatingSetpointRaw = this.resolveEffectiveThermostatSetpoint(THERMOSTAT_HEAT_SETPOINT_EFFECTIVE, THERMOSTAT_HEAT_SETPOINT_COMMAND);
391
+ const coolingSetpointRaw = this.resolveEffectiveThermostatSetpoint(THERMOSTAT_COOL_SETPOINT_EFFECTIVE, THERMOSTAT_COOL_SETPOINT_COMMAND);
391
392
  const systemModeRaw = getNumberProperty(this.latestProperties, THERMOSTAT_SYSTEM_MODE);
392
393
  const runningStateRaw = getNumberProperty(this.latestProperties, THERMOSTAT_RUNNING_STATE);
393
394
  const holdTypeRaw = getNumberProperty(this.latestProperties, THERMOSTAT_HOLD_TYPE);
@@ -432,8 +433,8 @@ export class SalusPlatformAccessory {
432
433
  this.service.updateCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity, clamp(humidity, 0, 100));
433
434
  }
434
435
  }
435
- resolveEffectiveThermostatSetpoint(primaryCandidates, commandCandidates) {
436
- const primaryRaw = getNumberProperty(this.latestProperties, primaryCandidates);
436
+ resolveEffectiveThermostatSetpoint(effectiveCandidates, commandCandidates) {
437
+ const primaryRaw = getNumberProperty(this.latestProperties, effectiveCandidates);
437
438
  const commandRaw = getNumberProperty(this.latestProperties, commandCandidates);
438
439
  if (primaryRaw !== undefined) {
439
440
  return primaryRaw;
@@ -626,79 +627,58 @@ export class SalusPlatformAccessory {
626
627
  }
627
628
  return this.latestProperties.get(name)?.value;
628
629
  }
630
+ firstDefined(...candidates) {
631
+ for (const candidate of candidates) {
632
+ if (candidate && candidate.trim() !== '') {
633
+ return candidate;
634
+ }
635
+ }
636
+ return undefined;
637
+ }
638
+ encodeThermostatTemperatureForProperty(propertyName, temperatureC) {
639
+ const sample = this.getPropertyValue(propertyName);
640
+ const numericSample = parseNumberLike(sample);
641
+ const normalizedName = propertyName.trim().toLowerCase();
642
+ const looksLikeX100 = normalizedName.includes('_x100')
643
+ || normalizedName.endsWith('x100')
644
+ || (numericSample !== undefined && Math.abs(numericSample) >= 100);
645
+ if (looksLikeX100) {
646
+ return Math.round(temperatureC * 100);
647
+ }
648
+ return Math.round(temperatureC * 10) / 10;
649
+ }
629
650
  async setTargetTemperature(value) {
630
651
  const numericValue = parseCharacteristicNumber(value);
631
652
  if (numericValue === undefined) {
632
653
  throw this.communicationFailure('Received invalid thermostat target temperature value from HomeKit');
633
654
  }
634
655
  const targetTemperature = clamp(numericValue, 4.5, 35);
635
- const scaledX100 = Math.round(targetTemperature * 100);
636
- const scaledPlain = Math.round(targetTemperature * 10) / 10;
637
- const targetState = this.cachedTargetState;
638
- const writes = [];
639
- const queuedProperties = new Set();
640
- const pickFirstProperty = (candidates) => {
641
- for (const candidate of candidates) {
642
- if (candidate) {
643
- return candidate;
644
- }
645
- }
646
- return undefined;
647
- };
648
- const enqueueWrite = (property) => {
649
- if (!property || queuedProperties.has(property)) {
650
- return;
651
- }
652
- const sample = this.getPropertyValue(property);
653
- const numericSample = parseNumberLike(sample);
654
- const lowerProperty = property.toLowerCase();
655
- const propertyNameLooksX100 = lowerProperty.includes('_x100') || lowerProperty.endsWith('x100');
656
- const sampleLooksX100 = propertyNameLooksX100 || (numericSample !== undefined && Math.abs(numericSample) >= 100);
657
- queuedProperties.add(property);
658
- writes.push({ property, value: sampleLooksX100 ? scaledX100 : scaledPlain });
659
- };
660
- const enqueueFirstDiscovered = (baseNames) => {
661
- enqueueWrite(findPropertyByBaseName(this.latestProperties, baseNames));
656
+ const writeSequence = ++this.thermostatSetpointWriteSequence;
657
+ const setpointProperty = this.firstDefined(this.writeTargets.heatSetpoint, this.writeTargets.autoHeatSetpoint, findPropertyByBaseName(this.latestProperties, THERMOSTAT_HEAT_SETPOINT_COMMAND), findPropertyByBaseName(this.latestProperties, THERMOSTAT_HEAT_SETPOINT_EFFECTIVE), this.writeTargets.coolSetpoint, this.writeTargets.autoCoolSetpoint, findPropertyByBaseName(this.latestProperties, THERMOSTAT_COOL_SETPOINT_COMMAND));
658
+ if (!setpointProperty) {
659
+ throw this.communicationFailure('No writable thermostat setpoint property was discovered');
660
+ }
661
+ const writes = {
662
+ [setpointProperty]: this.encodeThermostatTemperatureForProperty(setpointProperty, targetTemperature),
662
663
  };
663
- if (targetState === this.platform.Characteristic.TargetHeatingCoolingState.COOL) {
664
- const primary = pickFirstProperty([
665
- this.writeTargets.coolSetpoint,
666
- this.writeTargets.autoCoolSetpoint,
667
- this.writeTargets.heatSetpoint,
668
- ]);
669
- enqueueWrite(primary);
670
- enqueueFirstDiscovered(THERMOSTAT_COOL_SETPOINT_COMMAND);
671
- enqueueFirstDiscovered(THERMOSTAT_COOL_SETPOINT_EFFECTIVE);
672
- }
673
- else if (targetState === this.platform.Characteristic.TargetHeatingCoolingState.AUTO) {
674
- enqueueWrite(pickFirstProperty([this.writeTargets.autoHeatSetpoint, this.writeTargets.heatSetpoint]));
675
- enqueueWrite(pickFirstProperty([this.writeTargets.autoCoolSetpoint, this.writeTargets.coolSetpoint]));
676
- enqueueFirstDiscovered(THERMOSTAT_HEAT_SETPOINT_COMMAND);
677
- enqueueFirstDiscovered(THERMOSTAT_HEAT_SETPOINT_EFFECTIVE);
678
- enqueueFirstDiscovered(THERMOSTAT_COOL_SETPOINT_COMMAND);
679
- enqueueFirstDiscovered(THERMOSTAT_COOL_SETPOINT_EFFECTIVE);
664
+ // Match Salus app behavior: changing target temperature forces working/manual mode.
665
+ if (this.writeTargets.systemMode) {
666
+ writes[this.writeTargets.systemMode] = SALUS_MODE.heat;
680
667
  }
681
- else {
682
- const primary = pickFirstProperty([
683
- this.writeTargets.heatSetpoint,
684
- this.writeTargets.autoHeatSetpoint,
685
- this.writeTargets.coolSetpoint,
686
- this.writeTargets.autoCoolSetpoint,
687
- ]);
688
- enqueueWrite(primary);
689
- enqueueFirstDiscovered(THERMOSTAT_HEAT_SETPOINT_COMMAND);
690
- enqueueFirstDiscovered(THERMOSTAT_HEAT_SETPOINT_EFFECTIVE);
691
- }
692
- if (writes.length === 0) {
693
- throw this.communicationFailure('No writable thermostat setpoint property was discovered');
668
+ if (this.writeTargets.holdType) {
669
+ writes[this.writeTargets.holdType] = 2;
694
670
  }
695
- for (const write of writes) {
696
- await this.platform.writeDeviceProperty(this.device, write.property, write.value);
671
+ await this.platform.writeDeviceProperties(this.device, writes);
672
+ const confirmation = await this.ensureThermostatTargetApplied(targetTemperature, writeSequence);
673
+ if (confirmation === 'superseded') {
674
+ this.platform.log.debug(`Skipped outdated thermostat confirmation for ${this.device.name}; a newer target write is in progress.`);
675
+ return;
697
676
  }
698
- await this.ensureThermostatTargetApplied(targetTemperature, targetState);
677
+ this.cachedTargetState = this.platform.Characteristic.TargetHeatingCoolingState.HEAT;
678
+ this.cachedSystemMode = SALUS_MODE.heat;
699
679
  this.platform.log.info(`Set thermostat target for ${this.device.name} to ${targetTemperature.toFixed(1)}°C`);
700
680
  }
701
- async ensureThermostatTargetApplied(expectedTemperatureC, targetState) {
681
+ async ensureThermostatTargetApplied(expectedTemperatureC, writeSequence) {
702
682
  const maxAttempts = 10;
703
683
  const toleranceC = 0.4;
704
684
  let lastObserved;
@@ -706,14 +686,13 @@ export class SalusPlatformAccessory {
706
686
  let lastCommandObserved;
707
687
  let lastError;
708
688
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
689
+ if (writeSequence !== this.thermostatSetpointWriteSequence) {
690
+ return 'superseded';
691
+ }
709
692
  try {
710
693
  const properties = await this.platform.readDeviceProperties(this.device);
711
- const primaryObserved = targetState === this.platform.Characteristic.TargetHeatingCoolingState.COOL
712
- ? getNumberProperty(properties, THERMOSTAT_COOL_SETPOINT_EFFECTIVE)
713
- : getNumberProperty(properties, THERMOSTAT_HEAT_SETPOINT_EFFECTIVE);
714
- const commandObserved = targetState === this.platform.Characteristic.TargetHeatingCoolingState.COOL
715
- ? getNumberProperty(properties, THERMOSTAT_COOL_SETPOINT_COMMAND)
716
- : getNumberProperty(properties, THERMOSTAT_HEAT_SETPOINT_COMMAND);
694
+ const primaryObserved = getNumberProperty(properties, THERMOSTAT_HEAT_SETPOINT_EFFECTIVE);
695
+ const commandObserved = getNumberProperty(properties, THERMOSTAT_HEAT_SETPOINT_COMMAND);
717
696
  const primaryC = primaryObserved === undefined ? undefined : clamp(normalizeTemperatureFromX100(primaryObserved), 4.5, 35);
718
697
  const commandC = commandObserved === undefined ? undefined : clamp(normalizeTemperatureFromX100(commandObserved), 4.5, 35);
719
698
  if (primaryC !== undefined) {
@@ -727,9 +706,8 @@ export class SalusPlatformAccessory {
727
706
  }
728
707
  }
729
708
  const primaryMatches = primaryC !== undefined && Math.abs(primaryC - expectedTemperatureC) <= toleranceC;
730
- const commandMatches = commandC !== undefined && Math.abs(commandC - expectedTemperatureC) <= toleranceC;
731
- if (primaryMatches || commandMatches) {
732
- return;
709
+ if (primaryMatches) {
710
+ return 'applied';
733
711
  }
734
712
  }
735
713
  catch (error) {
@@ -764,26 +742,16 @@ export class SalusPlatformAccessory {
764
742
  if (!this.writeTargets.systemMode && !this.writeTargets.holdType) {
765
743
  throw this.communicationFailure('No writable thermostat mode/standby property was discovered');
766
744
  }
767
- const holdTypeCurrent = getNumberProperty(this.latestProperties, THERMOSTAT_HOLD_TYPE);
768
- if (mode !== SALUS_MODE.off && this.writeTargets.holdType && holdTypeCurrent !== undefined && Math.round(holdTypeCurrent) === 7) {
769
- try {
770
- await this.platform.writeDeviceProperty(this.device, this.writeTargets.holdType, 0);
771
- }
772
- catch (error) {
773
- this.platform.log.warn(`Unable to clear thermostat hold type for ${this.device.name}: ${asErrorMessage(error)}`);
774
- }
775
- }
745
+ const writes = {};
776
746
  if (this.writeTargets.systemMode) {
777
- await this.platform.writeDeviceProperty(this.device, this.writeTargets.systemMode, mode);
747
+ writes[this.writeTargets.systemMode] = mode;
778
748
  }
779
- if (mode === SALUS_MODE.off && this.writeTargets.holdType) {
780
- try {
781
- await this.platform.writeDeviceProperty(this.device, this.writeTargets.holdType, 7);
782
- }
783
- catch (error) {
784
- this.platform.log.warn(`Unable to apply thermostat off hold for ${this.device.name}: ${asErrorMessage(error)}`);
785
- }
749
+ if (this.writeTargets.holdType) {
750
+ // HomeKit mode mapping requested by user:
751
+ // OFF -> standby (7), HEAT -> working/manual (2).
752
+ writes[this.writeTargets.holdType] = requestedOff ? 7 : 2;
786
753
  }
754
+ await this.platform.writeDeviceProperties(this.device, writes);
787
755
  this.cachedTargetState = hkState;
788
756
  this.cachedSystemMode = mode;
789
757
  const modeLabel = hkState === this.platform.Characteristic.TargetHeatingCoolingState.OFF