homebridge-melcloud-control 3.1.0-beta.4 → 3.1.0-beta.6

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.
@@ -369,6 +369,11 @@
369
369
  "items": {
370
370
  "type": "object",
371
371
  "properties": {
372
+ "id": {
373
+ "title": "ID",
374
+ "type": "integer",
375
+ "required": false
376
+ },
372
377
  "name": {
373
378
  "title": "Name",
374
379
  "type": "string",
@@ -867,6 +872,11 @@
867
872
  "items": {
868
873
  "type": "object",
869
874
  "properties": {
875
+ "id": {
876
+ "title": "ID",
877
+ "type": "integer",
878
+ "required": false
879
+ },
870
880
  "name": {
871
881
  "title": "Name",
872
882
  "type": "string",
@@ -1180,7 +1190,7 @@
1180
1190
  "type": "integer",
1181
1191
  "minimum": 0,
1182
1192
  "maximum": 2,
1183
- "default": 0,
1193
+ "default": 1,
1184
1194
  "oneOf": [
1185
1195
  {
1186
1196
  "title": "None/Disabled",
@@ -1231,6 +1241,11 @@
1231
1241
  "items": {
1232
1242
  "type": "object",
1233
1243
  "properties": {
1244
+ "id": {
1245
+ "title": "ID",
1246
+ "type": "integer",
1247
+ "required": false
1248
+ },
1234
1249
  "name": {
1235
1250
  "title": "Name",
1236
1251
  "type": "string",
@@ -1708,6 +1723,10 @@
1708
1723
  "type": "tabarray",
1709
1724
  "title": "{{ value.name }}",
1710
1725
  "items": [
1726
+ {
1727
+ "key": "accounts[].ataDevices[].presets[].id",
1728
+ "readonly": true
1729
+ },
1711
1730
  "accounts[].ataDevices[].presets[].name",
1712
1731
  "accounts[].ataDevices[].presets[].displayType",
1713
1732
  "accounts[].ataDevices[].presets[].namePrefix"
@@ -1798,6 +1817,10 @@
1798
1817
  "type": "tabarray",
1799
1818
  "title": "{{ value.name }}",
1800
1819
  "items": [
1820
+ {
1821
+ "key": "accounts[].atwDevices[].presets[].id",
1822
+ "readonly": true
1823
+ },
1801
1824
  "accounts[].atwDevices[].presets[].name",
1802
1825
  "accounts[].atwDevices[].presets[].displayType",
1803
1826
  "accounts[].atwDevices[].presets[].namePrefix"
@@ -1882,6 +1905,10 @@
1882
1905
  "type": "tabarray",
1883
1906
  "title": "{{ value.name }}",
1884
1907
  "items": [
1908
+ {
1909
+ "key": "accounts[].ervDevices[].presets[].id",
1910
+ "readonly": true
1911
+ },
1885
1912
  "accounts[].ervDevices[].presets[].name",
1886
1913
  "accounts[].ervDevices[].presets[].displayType",
1887
1914
  "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';
@@ -192,7 +194,7 @@
192
194
  const deviceName = device.DeviceName;
193
195
  const devicePresets = device.Presets ?? [];
194
196
 
195
- //devices ata
197
+ //device ata
196
198
  const deviceAta = {
197
199
  id: deviceId,
198
200
  type: deviceType,
@@ -243,7 +245,7 @@
243
245
  const deviceName = device.DeviceName;
244
246
  const devicePresets = device.Presets ?? [];
245
247
 
246
- //devices atw
248
+ //device atw
247
249
  const deviceAtw = {
248
250
  id: deviceId,
249
251
  type: deviceType,
@@ -292,12 +294,14 @@
292
294
  });
293
295
 
294
296
  //get device info fom devices erv
295
- devicesByType.ata.forEach((device, index) => {
297
+ devicesByType.erv.forEach((device, index) => {
296
298
  const deviceId = device.DeviceID;
297
299
  const deviceType = device.Type;
298
300
  const deviceTypeText = "Energy Recovery Ventilation";
299
301
  const deviceName = device.DeviceName;
300
302
  const devicePresets = device.Presets ?? [];
303
+
304
+ //device erv
301
305
  const deviceErv = {
302
306
  id: deviceId,
303
307
  type: deviceType,
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.4",
4
+ "version": "3.1.0-beta.6",
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: