homebridge-melcloud-control 3.1.0-beta.1 → 3.1.0-beta.11

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.
@@ -363,12 +363,31 @@
363
363
  "description": "Select the operating mode for Auto, if this mode is not supported, it will be disabled.",
364
364
  "required": true
365
365
  },
366
+ "temperatureSensor": {
367
+ "title": "Room",
368
+ "type": "boolean",
369
+ "default": false,
370
+ "description": "This enable extra room temperature sensor to use with automations in HomeKit app.",
371
+ "required": false
372
+ },
373
+ "temperatureSensorOutdoor": {
374
+ "title": "Outdoor",
375
+ "type": "boolean",
376
+ "default": false,
377
+ "description": "This enable extra outdoor temperature sensor to use with automations in HomeKit app.",
378
+ "required": false
379
+ },
366
380
  "presets": {
367
381
  "title": "Presets",
368
382
  "type": "array",
369
383
  "items": {
370
384
  "type": "object",
371
385
  "properties": {
386
+ "id": {
387
+ "title": "ID",
388
+ "type": "integer",
389
+ "required": false
390
+ },
372
391
  "name": {
373
392
  "title": "Name",
374
393
  "type": "string",
@@ -431,22 +450,11 @@
431
450
  "required": false
432
451
  }
433
452
  }
453
+ },
454
+ "condition": {
455
+ "functionBody": "const presets = model.accounts[arrayIndices]?.devicesAta[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.id != null && preset.id !== ''); return hasValidPresets;"
434
456
  }
435
457
  },
436
- "temperatureSensor": {
437
- "title": "Room",
438
- "type": "boolean",
439
- "default": false,
440
- "description": "This enable extra room temperature sensor to use with automations in HomeKit app.",
441
- "required": false
442
- },
443
- "temperatureSensorOutdoor": {
444
- "title": "Outdoor",
445
- "type": "boolean",
446
- "default": false,
447
- "description": "This enable extra outdoor temperature sensor to use with automations in HomeKit app.",
448
- "required": false
449
- },
450
458
  "buttonsSensors": {
451
459
  "title": "Button / Sensor",
452
460
  "type": "array",
@@ -867,6 +875,11 @@
867
875
  "items": {
868
876
  "type": "object",
869
877
  "properties": {
878
+ "id": {
879
+ "title": "ID",
880
+ "type": "integer",
881
+ "required": false
882
+ },
870
883
  "name": {
871
884
  "title": "Name",
872
885
  "type": "string",
@@ -929,6 +942,9 @@
929
942
  "required": false
930
943
  }
931
944
  }
945
+ },
946
+ "condition": {
947
+ "functionBody": "const presets = model.accounts[arrayIndices]?.devicesAtw[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.name != null && preset.name !== ''); return hasValidPresets;"
932
948
  }
933
949
  },
934
950
  "buttonsSensors": {
@@ -1180,7 +1196,7 @@
1180
1196
  "type": "integer",
1181
1197
  "minimum": 0,
1182
1198
  "maximum": 2,
1183
- "default": 0,
1199
+ "default": 1,
1184
1200
  "oneOf": [
1185
1201
  {
1186
1202
  "title": "None/Disabled",
@@ -1231,6 +1247,11 @@
1231
1247
  "items": {
1232
1248
  "type": "object",
1233
1249
  "properties": {
1250
+ "id": {
1251
+ "title": "ID",
1252
+ "type": "integer",
1253
+ "required": false
1254
+ },
1234
1255
  "name": {
1235
1256
  "title": "Name",
1236
1257
  "type": "string",
@@ -1293,6 +1314,9 @@
1293
1314
  "required": false
1294
1315
  }
1295
1316
  }
1317
+ },
1318
+ "condition": {
1319
+ "functionBody": "const presets = model.accounts[arrayIndices]?.devicesErv[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.name != null && preset.name !== ''); return hasValidPresets;"
1296
1320
  }
1297
1321
  },
1298
1322
  "buttonsSensors": {
@@ -1706,8 +1730,12 @@
1706
1730
  {
1707
1731
  "key": "accounts[].ataDevices[].presets",
1708
1732
  "type": "tabarray",
1709
- "title": "{{ value.name || 'button/sensor' }}",
1733
+ "title": "{{ value.name }}",
1710
1734
  "items": [
1735
+ {
1736
+ "key": "accounts[].ataDevices[].presets[].id",
1737
+ "readonly": true
1738
+ },
1711
1739
  "accounts[].ataDevices[].presets[].name",
1712
1740
  "accounts[].ataDevices[].presets[].displayType",
1713
1741
  "accounts[].ataDevices[].presets[].namePrefix"
@@ -1796,8 +1824,12 @@
1796
1824
  {
1797
1825
  "key": "accounts[].atwDevices[].presets",
1798
1826
  "type": "tabarray",
1799
- "title": "{{ value.name || 'button/sensor' }}",
1827
+ "title": "{{ value.name }}",
1800
1828
  "items": [
1829
+ {
1830
+ "key": "accounts[].atwDevices[].presets[].id",
1831
+ "readonly": true
1832
+ },
1801
1833
  "accounts[].atwDevices[].presets[].name",
1802
1834
  "accounts[].atwDevices[].presets[].displayType",
1803
1835
  "accounts[].atwDevices[].presets[].namePrefix"
@@ -1880,8 +1912,12 @@
1880
1912
  {
1881
1913
  "key": "accounts[].ervDevices[].presets",
1882
1914
  "type": "tabarray",
1883
- "title": "{{ value.name || 'button/sensor' }}",
1915
+ "title": "{{ value.name }}",
1884
1916
  "items": [
1917
+ {
1918
+ "key": "accounts[].ervDevices[].presets[].id",
1919
+ "readonly": true
1920
+ },
1885
1921
  "accounts[].ervDevices[].presets[].name",
1886
1922
  "accounts[].ervDevices[].presets[].displayType",
1887
1923
  "accounts[].ervDevices[].presets[].namePrefix"
@@ -166,6 +166,8 @@
166
166
  erv: [],
167
167
  ervPresets: [],
168
168
  };
169
+
170
+ //info text
169
171
  let textAta = 'ATA: 0';
170
172
  let textAtaPresets = 'Presets: 0';
171
173
  let textAtw = 'ATW: 0';
@@ -178,12 +180,10 @@
178
180
  case 0:
179
181
  //get devices by type
180
182
  for (const device of devices) {
181
- const deviceId = device.DeviceID;
182
183
  const deviceType = device.Type;
183
-
184
184
  const pusDeviceTypeAta = deviceType === 0 ? devicesByType.ata.push(device) : false;
185
- const pusDeviceTypeAtw = deviceType === 0 ? devicesByType.atw.push(device) : false;
186
- const pusDeviceTypeErv = deviceType === 0 ? devicesByType.erv.push(device) : false;
185
+ const pusDeviceTypeAtw = deviceType === 1 ? devicesByType.atw.push(device) : false;
186
+ const pusDeviceTypeErv = deviceType === 3 ? devicesByType.erv.push(device) : false;
187
187
  };
188
188
 
189
189
  //get device info fom devices ata
@@ -192,9 +192,9 @@
192
192
  const deviceType = device.Type;
193
193
  const deviceTypeText = "Air Conditioner";
194
194
  const deviceName = device.DeviceName;
195
- const devicePresets = device.presets ?? [];
195
+ const devicePresets = device.Presets ?? [];
196
196
 
197
- //devices ata
197
+ //device ata
198
198
  const deviceAta = {
199
199
  id: deviceId,
200
200
  type: deviceType,
@@ -219,22 +219,23 @@
219
219
  textAta = `ATA: ${devicesCount}`
220
220
 
221
221
  //presets
222
- presets.forEach((preset, index1) => {
222
+ for (const preset of devicePresets) {
223
223
  const presetId = preset.ID;
224
224
  const presetName = preset.NumberDescription;
225
225
 
226
- preset.name = deviceName;
226
+ preset.id = presetId;
227
+ preset.name = presetName;
227
228
  preset.displayType == 0;
228
229
  preset.namePrefix = false;
229
230
 
230
231
  const ataPresetsExist = pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets ?? false;
231
232
  const ataPresets = ataPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets = [];
232
- const ataPresetIdExist = ataPresets.some(preset => preset.ID === presetId);
233
+ const ataPresetIdExist = ataPresets.some(preset => preset.id === presetId);
233
234
  const pushPresetAta = ataPresetIdExist ? false : ataPresets.push(preset);
234
235
  const pushNewPreset = ataPresetIdExist ? false : newDevices.ataPresets.push(preset);
235
236
  const presetsCount = newDevices.ataPresets.length;
236
237
  textAtaPresets = `ATA Presets: ${presetsCount}`
237
- });
238
+ };
238
239
  });
239
240
 
240
241
  //get device info fom devices atw
@@ -243,9 +244,9 @@
243
244
  const deviceType = device.Type;
244
245
  const deviceTypeText = "Heat Pump";
245
246
  const deviceName = device.DeviceName;
246
- const devicePresets = device.presets ?? [];
247
+ const devicePresets = device.Presets ?? [];
247
248
 
248
- //devices atw
249
+ //device atw
249
250
  const deviceAtw = {
250
251
  id: deviceId,
251
252
  type: deviceType,
@@ -271,35 +272,38 @@
271
272
  const atwDeviceIdExist = atwDevices.some(device => device.id === deviceId);
272
273
  const pushTypeAtw = atwDeviceIdExist ? false : atwDevices.push(deviceAtw);
273
274
  const pushNewDevice = atwDeviceIdExist ? false : newDevices.atw.push(device);
274
- const devicesCount = newDevices.ata.length;
275
+ const devicesCount = newDevices.atw.length;
275
276
  textAtw = `ATW: ${devicesCount}`
276
277
 
277
278
  //presetzs
278
- presets.forEach((preset, index1) => {
279
+ for (const preset of devicePresets) {
279
280
  const presetId = preset.ID;
280
281
  const presetName = preset.NumberDescription;
281
282
 
282
- preset.name = deviceName;
283
+ preset.id = presetId;
284
+ preset.name = presetName;
283
285
  preset.displayType == 0;
284
286
  preset.namePrefix = false;
285
287
 
286
288
  const atwPresetsExist = pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets ?? false;
287
289
  const atwPresets = atwPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets = [];
288
- const atwPresetIdExist = atwPresets.some(preset => preset.ID === presetId);
290
+ const atwPresetIdExist = atwPresets.some(preset => preset.id === presetId);
289
291
  const pushPresetAtw = atwPresetIdExist ? false : atwPresets.push(preset);
290
292
  const pushNewPreset = atwPresetIdExist ? false : newDevices.atwPresets.push(preset);
291
293
  const presetsCount = newDevices.atwPresets.length;
292
294
  textAtwPresets = `ATW Presets: ${presetsCount}`
293
- });
295
+ };
294
296
  });
295
297
 
296
298
  //get device info fom devices erv
297
- devicesByType.ata.forEach((device, index) => {
299
+ devicesByType.erv.forEach((device, index) => {
298
300
  const deviceId = device.DeviceID;
299
301
  const deviceType = device.Type;
300
302
  const deviceTypeText = "Energy Recovery Ventilation";
301
303
  const deviceName = device.DeviceName;
302
- const devicePresets = device.presets ?? [];
304
+ const devicePresets = device.Presets ?? [];
305
+
306
+ //device erv
303
307
  const deviceErv = {
304
308
  id: deviceId,
305
309
  type: deviceType,
@@ -319,33 +323,35 @@
319
323
  const ervDeviceIdExist = ervDevices.some(device => device.id === deviceId);
320
324
  const pushTypeerv = ervDeviceIdExist ? false : ervDevices.push(deviceErv);
321
325
  const pushNewDevice = ervDeviceIdExist ? false : newDevices.erv.push(device);
322
- const devicesCount = newDevices.ata.length;
326
+ const devicesCount = newDevices.erv.length;
323
327
  textErv = `ERV: ${devicesCount}`
324
328
 
325
329
  //presets
326
- presets.forEach((preset, index1) => {
330
+ for (const preset of devicePresets) {
327
331
  const presetId = preset.ID;
328
332
  const presetName = preset.NumberDescription;
329
333
 
330
- preset.name = deviceName;
334
+ preset.id = presetId;
335
+ preset.name = presetName;
331
336
  preset.displayType == 0;
332
337
  preset.namePrefix = false;
333
338
 
334
- const etvPresetsExist = pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets ?? false;
335
- const ataPresets = ervPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets = [];
336
- const ervPresetIdExist = ervPresets.some(preset => preset.ID === presetId);
337
- const pushPresetErv = ataPresetIdExist ? false : ervPresets.push(preset);
339
+ const ervPresetsExist = pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets ?? false;
340
+ const ervPresets = ervPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets = [];
341
+ const ervPresetIdExist = ervPresets.some(preset => preset.id === presetId);
342
+ const pushPresetErv = ervPresetIdExist ? false : ervPresets.push(preset);
338
343
  const pushNewPreset = ervPresetIdExist ? false : newDevices.ervPresets.push(preset);
339
344
  const presetsCount = newDevices.ervPresets.length;
340
345
  textErvPresets = `ERV Presets: ${presetsCount}`
341
- });
346
+ };
342
347
  });
343
348
 
344
349
  const newDevicesCount = newDevices.ata.length + newDevices.atw.length + newDevices.erv.length;
345
350
  const newPresetsCount = newDevices.ataPresets.length + newDevices.atwPresets.length + newDevices.ervPresets.length;
346
351
  document.getElementById('info').innerHTML = `${newDevicesCount === 0 ? 'No new devices found.' : `Found, ${textAta}, ${textAtw}, ${textErv}. ${newDevicesCount === 0 ? '' : 'Now You can start to configure it.'}`}`;
352
+ document.getElementById('info').style.color = newDevicesCount === 0 ? 'yellow' : 'green';
347
353
  document.getElementById('info1').innerHTML = `${newPresetsCount === 0 ? 'No new presets found.' : `Found, ${textAtaPresets}, ${textAtwPresets}, ${textErvPresets}. ${newPresetsCount === 0 ? '' : 'Now You can start to configure it.'}`}`;
348
- document.getElementById('info').style.color = 'green';
354
+ document.getElementById('info1').style.color = newPresetsCount === 0 ? 'yellow' : 'green';
349
355
 
350
356
  await homebridge.updatePluginConfig(pluginConfig);
351
357
  await homebridge.savePluginConfig(pluginConfig);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "3.1.0-beta.1",
4
+ "version": "3.1.0-beta.11",
5
5
  "description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
6
6
  "license": "MIT",
7
7
  "author": "grzegorz914",
package/src/deviceata.js CHANGED
@@ -204,6 +204,9 @@ class DeviceAta extends EventEmitter {
204
204
  const outdoorTemperature = deviceData.Device.OutdoorTemperature;
205
205
  const temperatureUnit = CONSTANTS.TemperatureDisplayUnits[useFahrenheit];
206
206
 
207
+ //presets
208
+ const presetsOnServer = deviceData.Presets ?? [];
209
+
207
210
  //device state
208
211
  const roomTemperature = deviceState.RoomTemperature;
209
212
  const setTemperature = deviceState.SetTemperature;
@@ -221,6 +224,7 @@ class DeviceAta extends EventEmitter {
221
224
  const offline = deviceState.Offline;
222
225
 
223
226
  //accessory
227
+ this.accessory.presetsOnServer = presetsOnServer;
224
228
  this.accessory.power = power;
225
229
  this.accessory.offline = offline;
226
230
  this.accessory.roomTemperature = roomTemperature;
@@ -425,6 +429,28 @@ class DeviceAta extends EventEmitter {
425
429
  .updateCharacteristic(Characteristic.CurrentTemperature, outdoorTemperature)
426
430
  };
427
431
 
432
+ //update presets state
433
+ if (this.presetsConfigured.length > 0) {
434
+ for (let i = 0; i < this.presetsConfigured.length; i++) {
435
+ const preset = this.presetsConfigured[i];
436
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
437
+ const presetData = presetsOnServer[index];
438
+
439
+ preset.state = presetData ? (presetData.Power === power
440
+ && presetData.SetTemperature === setTemperature
441
+ && presetData.OperationMode === operationMode
442
+ && presetData.VaneHorizontal === vaneHorizontal
443
+ && presetData.VaneVertical === vaneVertical
444
+ && presetData.FanSpeed === setFanSpeed) : false;
445
+
446
+ if (this.presetsServices) {
447
+ const characteristicType = preset.characteristicType;
448
+ this.presetsServices[i]
449
+ .updateCharacteristic(characteristicType, preset.state)
450
+ };
451
+ };
452
+ };
453
+
428
454
  //update buttons state
429
455
  if (this.buttonsConfiguredCount > 0) {
430
456
  for (let i = 0; i < this.buttonsConfiguredCount; i++) {
@@ -550,25 +576,6 @@ class DeviceAta extends EventEmitter {
550
576
  };
551
577
  };
552
578
 
553
- //update presets state
554
- if (this.presetsConfigured.length > 0) {
555
- for (let i = 0; i < this.presetsConfigured.length; i++) {
556
- const preset = this.presetsConfigured[i];
557
- preset.state = (preset.Power === power
558
- && preset.SetTemperature === setTemperature
559
- && preset.OperationMode === operationMode
560
- && preset.VaneHorizontal === vaneHorizontal
561
- && preset.VaneVertical === vaneVertical
562
- && preset.FanSpeed === setFanSpeed) ?? false;
563
-
564
- if (this.presetsServices) {
565
- const characteristicType = preset.characteristicType;
566
- this.presetsServices[i]
567
- .updateCharacteristic(characteristicType, preset.state)
568
- };
569
- };
570
- };
571
-
572
579
  //log current state
573
580
  if (!this.disableLogInfo) {
574
581
  const operationModeText = !power ? CONSTANTS.AirConditioner.System[0] : CONSTANTS.AirConditioner.DriveMode[operationMode];
@@ -708,6 +715,7 @@ class DeviceAta extends EventEmitter {
708
715
  .setCharacteristic(Characteristic.FirmwareRevision, this.firmwareRevision);
709
716
 
710
717
  //melcloud services
718
+ const presetsOnServer = this.accessory.presetsOnServer;
711
719
  const displayMode = this.displayMode;
712
720
  const temperatureSensor = this.temperatureSensor;
713
721
  const temperatureSensorOutdoor = this.temperatureSensorOutdoor;
@@ -1081,9 +1089,8 @@ class DeviceAta extends EventEmitter {
1081
1089
 
1082
1090
  for (let i = 0; i < presetsConfiguredCount; i++) {
1083
1091
  const preset = presetsConfigured[i];
1084
-
1085
- //get button display type
1086
- const displayType = preset.displayType;
1092
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
1093
+ const presetData = presetsOnServer[index];
1087
1094
 
1088
1095
  //get button name
1089
1096
  const presetName = preset.name;
@@ -1107,12 +1114,12 @@ class DeviceAta extends EventEmitter {
1107
1114
  switch (state) {
1108
1115
  case true:
1109
1116
  previousPresets[i] = deviceState;
1110
- deviceState.SetTemperature = preset.SetTemperature;
1111
- deviceState.Power = preset.Power;
1112
- deviceState.OperationMode = preset.OperationMode;
1113
- deviceState.VaneHorizontal = preset.VaneHorizontal;
1114
- deviceState.VaneVertical = preset.VaneVertical;
1115
- deviceState.SetFanSpeed = preset.FanSpeed;
1117
+ deviceState.SetTemperature = presetData.SetTemperature;
1118
+ deviceState.Power = presetData.Power;
1119
+ deviceState.OperationMode = presetData.OperationMode;
1120
+ deviceState.VaneHorizontal = presetData.VaneHorizontal;
1121
+ deviceState.VaneVertical = presetData.VaneVertical;
1122
+ deviceState.SetFanSpeed = presetData.FanSpeed;
1116
1123
  deviceState.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power;
1117
1124
  break;
1118
1125
  case false:
package/src/deviceatw.js CHANGED
@@ -214,6 +214,9 @@ class DeviceAtw extends EventEmitter {
214
214
  const returnTemperatureZone2 = deviceData.Device.ReturnTemperatureZone2;
215
215
  const returnTemperatureWaterTank = deviceData.Device.ReturnTemperatureBoiler;
216
216
 
217
+ //presets
218
+ const presetsOnServer = deviceData.Presets ?? [];
219
+
217
220
  //zones
218
221
  const hotWater = hasHotWaterTank ? 1 : 0;
219
222
  const zone2 = hasZone2 ? 1 : 0;
@@ -254,6 +257,7 @@ class DeviceAtw extends EventEmitter {
254
257
  const offline = deviceState.Offline;
255
258
 
256
259
  //accessory
260
+ this.accessory.presetsOnServer = presetsOnServer;
257
261
  this.accessory.power = power;
258
262
  this.accessory.offline = offline;
259
263
  this.accessory.unitStatus = unitStatus;
@@ -570,6 +574,34 @@ class DeviceAtw extends EventEmitter {
570
574
  };
571
575
  };
572
576
 
577
+ //update presets state
578
+ if (this.presetsConfigured.length > 0) {
579
+ for (let i = 0; i < this.presetsConfigured.length; i++) {
580
+ const preset = this.presetsConfigured[i];
581
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
582
+ const presetData = presetsOnServer[index];
583
+
584
+ preset.state = presetData ? (preset.Power === power
585
+ && preset.EcoHotWater === ecoHotWater
586
+ && preset.OperationModeZone1 === operationModeZone1
587
+ && preset.OperationModeZone2 === operationModeZone2
588
+ && preset.SetTankWaterTemperature === setTankWaterTemperature
589
+ && preset.SetTemperatureZone1 === setTemperatureZone1
590
+ && preset.SetTemperatureZone2 === setTemperatureZone2
591
+ && preset.ForcedHotWaterMode === forcedHotWaterMode
592
+ && preset.SetHeatFlowTemperatureZone1 === setHeatFlowTemperatureZone1
593
+ && preset.SetHeatFlowTemperatureZone2 === setHeatFlowTemperatureZone2
594
+ && preset.SetCoolFlowTemperatureZone1 === setCoolFlowTemperatureZone1
595
+ && preset.SetCoolFlowTemperatureZone2 === setCoolFlowTemperatureZone2) : false;
596
+
597
+ if (this.presetsServices) {
598
+ const characteristicType = preset.characteristicType;
599
+ this.presetsServices[i]
600
+ .updateCharacteristic(characteristicType, preset.state)
601
+ };
602
+ };
603
+ };
604
+
573
605
  //update buttons state
574
606
  if (this.buttonsConfiguredCount > 0) {
575
607
  for (let i = 0; i < this.buttonsConfiguredCount; i++) {
@@ -659,31 +691,6 @@ class DeviceAtw extends EventEmitter {
659
691
  };
660
692
  };
661
693
 
662
- //update presets state
663
- if (this.presetsConfigured.length > 0) {
664
- for (let i = 0; i < this.presetsConfigured.length; i++) {
665
- const preset = this.presetsConfigured[i];
666
- preset.state = (preset.Power === power
667
- && preset.EcoHotWater === ecoHotWater
668
- && preset.OperationModeZone1 === operationModeZone1
669
- && preset.OperationModeZone2 === operationModeZone2
670
- && preset.SetTankWaterTemperature === setTankWaterTemperature
671
- && preset.SetTemperatureZone1 === setTemperatureZone1
672
- && preset.SetTemperatureZone2 === setTemperatureZone2
673
- && preset.ForcedHotWaterMode === forcedHotWaterMode
674
- && preset.SetHeatFlowTemperatureZone1 === setHeatFlowTemperatureZone1
675
- && preset.SetHeatFlowTemperatureZone2 === setHeatFlowTemperatureZone2
676
- && preset.SetCoolFlowTemperatureZone1 === setCoolFlowTemperatureZone1
677
- && preset.SetCoolFlowTemperatureZone2 === setCoolFlowTemperatureZone2) ?? false;
678
-
679
- if (this.presetsServices) {
680
- const characteristicType = preset.characteristicType;
681
- this.presetsServices[i]
682
- .updateCharacteristic(characteristicType, preset.state)
683
- };
684
- };
685
- };
686
-
687
694
  //start prepare accessory
688
695
  if (this.startPrepareAccessory) {
689
696
  try {
@@ -827,6 +834,7 @@ class DeviceAtw extends EventEmitter {
827
834
 
828
835
  //melcloud services
829
836
  const zonesCount = this.zonesCount;
837
+ const presetsOnServer = this.accessory.presetsOnServer;
830
838
  const temperatureSensor = this.temperatureSensor;
831
839
  const temperatureSensorFlow = this.temperatureSensorFlow;
832
840
  const temperatureSensorReturn = this.temperatureSensorReturn;
@@ -1529,9 +1537,8 @@ class DeviceAtw extends EventEmitter {
1529
1537
 
1530
1538
  for (let i = 0; i < presetsConfiguredCount; i++) {
1531
1539
  const preset = presetsConfigured[i];
1532
-
1533
- //get button display type
1534
- const displayType = preset.displayType;
1540
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
1541
+ const presetData = presetsOnServer[index];
1535
1542
 
1536
1543
  //get button name
1537
1544
  const presetName = preset.name;
@@ -1555,18 +1562,18 @@ class DeviceAtw extends EventEmitter {
1555
1562
  switch (state) {
1556
1563
  case true:
1557
1564
  previousPresets[i] = deviceState;
1558
- deviceState.Power = preset.Power;
1559
- deviceState.EcoHotWater = preset.EcoHotWater;
1560
- deviceState.OperationModeZone1 = preset.OperationModeZone1;
1561
- deviceState.OperationModeZone2 = preset.OperationModeZone2;
1562
- deviceState.SetTankWaterTemperature = preset.SetTankWaterTemperature;
1563
- deviceState.SetTemperatureZone1 = preset.SetTemperatureZone1;
1564
- deviceState.SetTemperatureZone2 = preset.SetTemperatureZone2;
1565
- deviceState.ForcedHotWaterMode = preset.ForcedHotWaterMode;
1566
- deviceState.SetHeatFlowTemperatureZone1 = preset.SetHeatFlowTemperatureZone1;
1567
- deviceState.SetHeatFlowTemperatureZone2 = preset.SetHeatFlowTemperatureZone2;
1568
- deviceState.SetCoolFlowTemperatureZone1 = preset.SetCoolFlowTemperatureZone1;
1569
- deviceState.SetCoolFlowTemperatureZone2 = preset.SetCoolFlowTemperatureZone2;
1565
+ deviceState.Power = presetData.Power;
1566
+ deviceState.EcoHotWater = presetData.EcoHotWater;
1567
+ deviceState.OperationModeZone1 = presetData.OperationModeZone1;
1568
+ deviceState.OperationModeZone2 = presetData.OperationModeZone2;
1569
+ deviceState.SetTankWaterTemperature = presetData.SetTankWaterTemperature;
1570
+ deviceState.SetTemperatureZone1 = presetData.SetTemperatureZone1;
1571
+ deviceState.SetTemperatureZone2 = presetData.SetTemperatureZone2;
1572
+ deviceState.ForcedHotWaterMode = presetData.ForcedHotWaterMode;
1573
+ deviceState.SetHeatFlowTemperatureZone1 = presetData.SetHeatFlowTemperatureZone1;
1574
+ deviceState.SetHeatFlowTemperatureZone2 = presetData.SetHeatFlowTemperatureZone2;
1575
+ deviceState.SetCoolFlowTemperatureZone1 = presetData.SetCoolFlowTemperatureZone1;
1576
+ deviceState.SetCoolFlowTemperatureZone2 = presetData.SetCoolFlowTemperatureZone2;
1570
1577
  deviceState.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power;
1571
1578
  break;
1572
1579
  case false:
package/src/deviceerv.js CHANGED
@@ -211,6 +211,9 @@ class DeviceErv extends EventEmitter {
211
211
  const numberOfFanSpeeds = deviceData.Device.NumberOfFanSpeeds ?? 0;
212
212
  const temperatureIncrement = deviceData.Device.TemperatureIncrement ?? 1;
213
213
 
214
+ //presets
215
+ const presetsOnServer = deviceData.Presets ?? [];
216
+
214
217
  //device state
215
218
  const roomTemperature = deviceState.RoomTemperature;
216
219
  const supplyTemperature = deviceState.SupplyTemperature;
@@ -231,6 +234,7 @@ class DeviceErv extends EventEmitter {
231
234
  const targetTemperature = hasCoolOperationMode || hasHeatOperationMode ? setTemperature : 20;
232
235
 
233
236
  //accessory
237
+ this.accessory.presetsOnServer = presetsOnServer;
234
238
  this.accessory.power = power;
235
239
  this.accessory.offline = offline;
236
240
  this.accessory.roomTemperature = roomTemperature;
@@ -434,6 +438,27 @@ class DeviceErv extends EventEmitter {
434
438
  .updateCharacteristic(Characteristic.PM2_5Density, pM25Level)
435
439
  }
436
440
 
441
+ //update presets state
442
+ if (this.presetsConfigured.length > 0) {
443
+ for (let i = 0; i < this.presetsConfigured.length; i++) {
444
+ const preset = this.presetsConfigured[i];
445
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
446
+ const presetData = presetsOnServer[index];
447
+
448
+ preset.state = presetData ? (preset.Power === power
449
+ && preset.SetTemperature === targetTemperature
450
+ && preset.OperationMode === operationMode
451
+ && preset.VentilationMode === ventilationMode
452
+ && preset.FanSpeed === setFanSpeed) : false;
453
+
454
+ if (this.presetsServices) {
455
+ const characteristicType = preset.characteristicType;
456
+ this.presetsServices[i]
457
+ .updateCharacteristic(characteristicType, preset.state)
458
+ };
459
+ };
460
+ };
461
+
437
462
  //update buttons state
438
463
  if (this.buttonsConfiguredCount > 0) {
439
464
  for (let i = 0; i < this.buttonsConfiguredCount; i++) {
@@ -496,24 +521,6 @@ class DeviceErv extends EventEmitter {
496
521
  };
497
522
  };
498
523
 
499
- //update presets state
500
- if (this.presetsConfigured.length > 0) {
501
- for (let i = 0; i < this.presetsConfigured.length; i++) {
502
- const preset = this.presetsConfigured[i];
503
- preset.state = (preset.Power === power
504
- && preset.SetTemperature === targetTemperature
505
- && preset.OperationMode === operationMode
506
- && preset.VentilationMode === ventilationMode
507
- && preset.FanSpeed === setFanSpeed) ?? false;
508
-
509
- if (this.presetsServices) {
510
- const characteristicType = preset.characteristicType;
511
- this.presetsServices[i]
512
- .updateCharacteristic(characteristicType, preset.state)
513
- };
514
- };
515
- };
516
-
517
524
  //log current state
518
525
  if (!this.disableLogInfo) {
519
526
  const operationModeText = !power ? CONSTANTS.Ventilation.System[0] : CONSTANTS.Ventilation.OperationMode[ventilationMode];
@@ -648,6 +655,7 @@ class DeviceErv extends EventEmitter {
648
655
  .setCharacteristic(Characteristic.FirmwareRevision, this.firmwareRevision);
649
656
 
650
657
  //melcloud services
658
+ const presetsOnServer = this.accessory.presetsOnServer;
651
659
  const displayMode = this.displayMode;
652
660
  const temperatureSensor = this.temperatureSensor;
653
661
  const temperatureSensorOutdoor = this.temperatureSensorOutdoor;
@@ -1078,9 +1086,8 @@ class DeviceErv extends EventEmitter {
1078
1086
 
1079
1087
  for (let i = 0; i < presetsConfiguredCount; i++) {
1080
1088
  const preset = presetsConfigured[i];
1081
-
1082
- //get button display type
1083
- const displayType = preset.displayType;
1089
+ const index = presetsOnServer.findIndex(p => p.ID === preset.Id);
1090
+ const presetData = presetsOnServer[index]
1084
1091
 
1085
1092
  //get button name
1086
1093
  const presetName = preset.name;
@@ -1104,11 +1111,11 @@ class DeviceErv extends EventEmitter {
1104
1111
  switch (state) {
1105
1112
  case true:
1106
1113
  previousPresets[i] = deviceState;
1107
- deviceState.SetTemperature = preset.SetTemperature;
1108
- deviceState.Power = preset.Power;
1109
- deviceState.OperationMode = preset.OperationMode;
1110
- deviceState.VentilationMode = preset.VentilationMode;
1111
- deviceState.SetFanSpeed = preset.FanSpeed;
1114
+ deviceState.SetTemperature = presetData.SetTemperature;
1115
+ deviceState.Power = presetData.Power;
1116
+ deviceState.OperationMode = presetData.OperationMode;
1117
+ deviceState.VentilationMode = presetData.VentilationMode;
1118
+ deviceState.SetFanSpeed = presetData.FanSpeed;
1112
1119
  deviceState.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power;
1113
1120
  break;
1114
1121
  case false: