homebridge-melcloud-control 4.7.3-beta.9 → 4.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -24,13 +24,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
24
  - For plugin < v4.6.0 use Homebridge UI <= v5.5.0
25
25
  - For plugin >= v4.6.0 use Homebridge UI >= v5.13.0
26
26
 
27
+ # [4.7.4] - (29.01.2026)
28
+
29
+ ## Changes
30
+
31
+ - fix ATW Zone 2
32
+ - cleanup
33
+
27
34
  # [4.7.3] - (29.01.2026)
28
35
 
29
36
  ## Changes
30
37
 
38
+ - fix [#235](https://github.com/grzegorz914/homebridge-melcloud-control/issues/235)
39
+ - fix 2 [#233](https://github.com/grzegorz914/homebridge-melcloud-control/issues/233)
31
40
  - fix ATW set temperature for Z1 and Z2
32
41
  - fix ATW zone operatin mode
33
- - other fixes for ATW
42
+ - config schema updated
43
+ - other fixes for ATA, ATW, ERV
34
44
  - cleanup
35
45
 
36
46
  # [4.7.2] - (29.01.2026)
@@ -362,7 +362,7 @@
362
362
  }
363
363
  ]
364
364
  },
365
- "temperatureSensor": {
365
+ "temperatureRoomSensor": {
366
366
  "title": "Room",
367
367
  "type": "boolean",
368
368
  "description": "This enable extra room temperature sensor to use with HomeKit automations."
@@ -1150,14 +1150,22 @@
1150
1150
  "functionBody": "return model.accounts[arrayIndices[0]].atwDevices[arrayIndices[1]].displayType > 0;"
1151
1151
  }
1152
1152
  },
1153
- "temperatureRoomSensor": {
1154
- "title": "Temperature Outdoor",
1153
+ "temperatureOutdoorSensor": {
1154
+ "title": "Temperature Sensor Outdoor",
1155
1155
  "type": "boolean",
1156
1156
  "description": "This enable extra Outdoor temperature sensor to use with HomeKit automations.",
1157
1157
  "condition": {
1158
1158
  "functionBody": "return model.accounts[arrayIndices[0]].type === 'melcloud';"
1159
1159
  }
1160
1160
  },
1161
+ "temperatureRoomSensor": {
1162
+ "title": "Temperature Room",
1163
+ "type": "boolean",
1164
+ "description": "This enable extra Room temperature sensor to use with HomeKit automations.",
1165
+ "condition": {
1166
+ "functionBody": "return model.accounts[arrayIndices[0]].type === 'melcloud';"
1167
+ }
1168
+ },
1161
1169
  "temperatureFlowSensor": {
1162
1170
  "title": "Temperature Sensor Flow",
1163
1171
  "type": "boolean",
@@ -1821,7 +1829,7 @@
1821
1829
  }
1822
1830
  ]
1823
1831
  },
1824
- "temperatureSensor": {
1832
+ "temperatureRoomSensor": {
1825
1833
  "title": "Temperature Sensor Room",
1826
1834
  "type": "boolean",
1827
1835
  "description": "This enable extra temperature sensor to use with HomeKit automations."
@@ -2817,7 +2825,8 @@
2817
2825
  {
2818
2826
  "title": "Sensors",
2819
2827
  "items": [
2820
- "accounts[].atwDevices[].temperatureSensor",
2828
+ "accounts[].atwDevices[].temperatureOutdoorSensor",
2829
+ "accounts[].atwDevices[].temperatureRoomSensor",
2821
2830
  "accounts[].atwDevices[].temperatureFlowSensor",
2822
2831
  "accounts[].atwDevices[].temperatureReturnSensor",
2823
2832
  "accounts[].atwDevices[].temperatureRoomZone1Sensor",
@@ -2986,8 +2995,8 @@
2986
2995
  {
2987
2996
  "title": "Sensors",
2988
2997
  "items": [
2989
- "accounts[].ervDevices[].temperatureSensor",
2990
2998
  "accounts[].ervDevices[].temperatureOutdoorSensor",
2999
+ "accounts[].ervDevices[].temperatureRoomSensor",
2991
3000
  "accounts[].ervDevices[].temperatureSensorSupply",
2992
3001
  "accounts[].ervDevices[].inStandbySensor",
2993
3002
  "accounts[].ervDevices[].connectSensor",
@@ -118,7 +118,7 @@
118
118
  // Tworzenie przycisków
119
119
  accounts.forEach((account, i) => {
120
120
  this.account = account;
121
-
121
+
122
122
  const button = document.createElement("button");
123
123
  button.type = "button";
124
124
  button.id = `button${i}`;
@@ -145,8 +145,6 @@
145
145
  formElements.accountType.value = account.type || 'disabled';
146
146
  formElements.logIn.disabled = !(account.name && account.user && account.passwd && account.language && account.type !== 'disabled');
147
147
  formElements.configButton.disabled = !((account.ataDevices?.length ?? 0) > 0 || (account.atwDevices?.length ?? 0) > 0 || (account.ervDevices?.length ?? 0) > 0);
148
-
149
- this.account = account;
150
148
  });
151
149
  });
152
150
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "4.7.3-beta.9",
4
+ "version": "4.7.4",
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
@@ -36,7 +36,7 @@ class DeviceAta extends EventEmitter {
36
36
  this.heatDryFanMode = device.heatDryFanMode || 1; //NONE, HEAT, DRY, FAN
37
37
  this.coolDryFanMode = device.coolDryFanMode || 1; //NONE, COOL, DRY, FAN
38
38
  this.autoDryFanMode = device.autoDryFanMode || 1; //NONE, AUTO, DRY, FAN
39
- this.temperatureSensor = device.temperatureSensor || false;
39
+ this.temperatureRoomSensor = device.temperatureRoomSensor || false;
40
40
  this.temperatureOutdoorSensor = device.temperatureOutdoorSensor || false;
41
41
  this.inStandbySensor = device.inStandbySensor || false;
42
42
  this.connectSensor = device.connectSensor || false;
@@ -449,8 +449,8 @@ class DeviceAta extends EventEmitter {
449
449
  };
450
450
  melCloudService.getCharacteristic(Characteristic.CoolingThresholdTemperature) // 16 - 31
451
451
  .setProps({
452
- minValue: this.accessory.minTempCoolDryAuto,
453
- maxValue: this.accessory.maxTempCoolDryAuto,
452
+ minValue: this.accessory.minSetCoolDryAutoRoomTemperature,
453
+ maxValue: this.accessory.maxSetHeatCoolDryAutoRoomTemperature,
454
454
  minStep: this.accessory.temperatureStep
455
455
  })
456
456
  .onGet(async () => {
@@ -470,8 +470,8 @@ class DeviceAta extends EventEmitter {
470
470
  if (supportsHeat) {
471
471
  melCloudService.getCharacteristic(Characteristic.HeatingThresholdTemperature) // 10 - 31
472
472
  .setProps({
473
- minValue: this.accessory.minTempHeat,
474
- maxValue: this.accessory.maxTempHeat,
473
+ minValue: this.accessory.minSetHeatRoomTemperature,
474
+ maxValue: this.accessory.maxSetHeatCoolDryAutoRoomTemperature,
475
475
  minStep: this.accessory.temperatureStep
476
476
  })
477
477
  .onGet(async () => {
@@ -584,8 +584,8 @@ class DeviceAta extends EventEmitter {
584
584
  });
585
585
  melCloudServiceT.getCharacteristic(Characteristic.TargetTemperature)
586
586
  .setProps({
587
- minValue: this.accessory.minTempCoolDryAuto,
588
- maxValue: this.accessory.maxTempCoolDryAuto,
587
+ minValue: this.accessory.minSetCoolDryAutoRoomTemperature,
588
+ maxValue: this.accessory.maxSetHeatCoolDryAutoRoomTemperature,
589
589
  minStep: this.accessory.temperatureStep
590
590
  })
591
591
  .onGet(async () => {
@@ -594,8 +594,8 @@ class DeviceAta extends EventEmitter {
594
594
  })
595
595
  .onSet(async (value) => {
596
596
  try {
597
- if (deviceData.Device.OperationMode === 1 && value < this.accessory.minTempHeat) {
598
- value = this.accessory.minTempHeat;
597
+ if (deviceData.Device.OperationMode === 1 && value < this.accessory.minSetHeatRoomTemperature) {
598
+ value = this.accessory.minSetHeatRoomTemperature;
599
599
  } else if (value < 16) {
600
600
  value = 16;
601
601
  }
@@ -630,7 +630,7 @@ class DeviceAta extends EventEmitter {
630
630
  };
631
631
 
632
632
  //temperature sensor services
633
- if (this.temperatureSensor && this.accessory.roomTemperature !== null) {
633
+ if (this.temperatureRoomSensor && this.accessory.roomTemperature !== null) {
634
634
  if (this.logDebug) this.emit('debug', `Prepare room temperature sensor service`);
635
635
  this.roomTemperatureSensorService = new Service.TemperatureSensor(`${serviceName} Room`, `roomTemperatureSensorService${deviceId}`);
636
636
  this.roomTemperatureSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
@@ -1538,10 +1538,9 @@ class DeviceAta extends EventEmitter {
1538
1538
  const supportsCool1 = deviceData.Device[supportCoolKey];
1539
1539
  const supportsCool = this.coolDryFanMode >= 1;
1540
1540
  const numberOfFanSpeeds = deviceData.Device.NumberOfFanSpeeds;
1541
- const minTempHeat = deviceData.Device.MinTempHeat ?? 10;
1542
- const maxTempHeat = deviceData.Device.MaxTempHeat ?? 31;
1543
- const minTempCoolDryAuto = accountTypeMelcloud ? 4 : deviceData.Device.MinTempAutomatic ?? 16;
1544
- const maxTempCoolDryAuto = deviceData.Device.MaxTempAutomatic ?? 31;
1541
+ const minSetHeatRoomTemperature = 10;
1542
+ const maxSetHeatCoolDryAutoRoomTemperature = 31;
1543
+ const minSetCoolDryAutoRoomTemperature = accountTypeMelcloud ? 4 : deviceData.Device.MinTempAutomatic ?? 16;
1545
1544
 
1546
1545
  //device state
1547
1546
  const power = deviceData.Device.Power ?? false;
@@ -1588,10 +1587,9 @@ class DeviceAta extends EventEmitter {
1588
1587
  supportsDry: supportsDry,
1589
1588
  supportsCool: supportsCool,
1590
1589
  supportsStanbyMode: supportsStanbyMode,
1591
- minTempHeat: minTempHeat,
1592
- maxTempHeat: maxTempHeat,
1593
- minTempCoolDryAuto: minTempCoolDryAuto,
1594
- maxTempCoolDryAuto: maxTempCoolDryAuto,
1590
+ minSetHeatRoomTemperature: minSetHeatRoomTemperature,
1591
+ maxSetHeatCoolDryAutoRoomTemperature: maxSetHeatCoolDryAutoRoomTemperature,
1592
+ minSetCoolDryAutoRoomTemperature: minSetCoolDryAutoRoomTemperature,
1595
1593
  power: power,
1596
1594
  inStandbyMode: inStandbyMode,
1597
1595
  operationMode: operationMode,
@@ -1877,7 +1875,11 @@ class DeviceAta extends EventEmitter {
1877
1875
  //buttons
1878
1876
  if (this.buttons.length > 0) {
1879
1877
  this.buttons.forEach((button, i) => {
1880
- const characteristicType = button.characteristicType;
1878
+ // helper function to update sensor characteristics
1879
+ const updateSensorCharacteristics = (service, characteristic, value) => {
1880
+ if (this.functions.isValidValue(value)) service?.[i]?.updateCharacteristic(characteristic, value);
1881
+ };
1882
+
1881
1883
  const mode = button.mode;
1882
1884
  switch (mode) {
1883
1885
  case 0: //POWER ON,OFF
@@ -1991,10 +1993,11 @@ class DeviceAta extends EventEmitter {
1991
1993
  };
1992
1994
 
1993
1995
  //control
1994
- if (button.displayType > 3) this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
1996
+ if (button.displayType > 3) updateSensorCharacteristics(this.buttonControlServices, Characteristic.On, button.state);
1995
1997
 
1996
1998
  //sensor
1997
- if (button.displayType < 7) this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1999
+ const characteristicType = button.characteristicType;
2000
+ if (button.displayType < 7) updateSensorCharacteristics(this.buttonControlSensorServices, characteristicType, button.state);
1998
2001
  });
1999
2002
  }
2000
2003
 
package/src/deviceatw.js CHANGED
@@ -34,6 +34,7 @@ class DeviceAtw extends EventEmitter {
34
34
  this.deviceTypeString = DeviceType[device.type];
35
35
  this.displayType = device.displayType;
36
36
  this.hideZone = device.hideZone;
37
+ this.temperatureOutdoorSensor = device.temperatureOutdoorSensor || false;
37
38
  this.temperatureRoomSensor = device.temperatureRoomSensor || false;
38
39
  this.temperatureFlowSensor = device.temperatureFlowSensor || false;
39
40
  this.temperatureReturnSensor = device.temperatureReturnSensor || false;
@@ -319,6 +320,8 @@ class DeviceAtw extends EventEmitter {
319
320
  const caseHotWaterSensor = this.accessory.caseHotWaterSensor;
320
321
  const caseZone2Sensor = this.accessory.caseZone2Sensor;
321
322
 
323
+ const supportsOutdoorTemperature = this.accessory.supportsOutdoorTemperature;
324
+
322
325
  //accessory
323
326
  if (this.logDebug) this.emit('debug', `Prepare accessory`);
324
327
  const accessoryName = deviceName;
@@ -1100,6 +1103,20 @@ class DeviceAtw extends EventEmitter {
1100
1103
  });
1101
1104
  }
1102
1105
 
1106
+ //outdoor temperature
1107
+ if (this.temperatureOutdoorSensor && supportsOutdoorTemperature && this.accessory.outdoorTemperature !== null) {
1108
+ if (this.logDebug) this.emit('debug', `Prepare outdoor temperature sensor service`);
1109
+ this.outdoorTemperatureSensorService = new Service.TemperatureSensor(`${serviceName} Outdoor`, `outdoorTemperatureSensorService${deviceId}`);
1110
+ this.outdoorTemperatureSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1111
+ this.outdoorTemperatureSensorService.setCharacteristic(Characteristic.ConfiguredName, `${accessoryName} Outdoor`);
1112
+ this.outdoorTemperatureSensorService.getCharacteristic(Characteristic.CurrentTemperature)
1113
+ .onGet(async () => {
1114
+ const state = this.accessory.outdoorTemperature;
1115
+ return state;
1116
+ })
1117
+ accessory.addService(this.outdoorTemperatureSensorService);
1118
+ }
1119
+
1103
1120
  //in standby sensor
1104
1121
  if (this.inStandbySensor && this.accessory.inStandbyMode !== null) {
1105
1122
  if (this.logDebug) this.emit('debug', `Prepare in standby mode service`);
@@ -1775,21 +1792,24 @@ class DeviceAtw extends EventEmitter {
1775
1792
  const holidayMode = deviceData.HolidayMode ?? {};
1776
1793
 
1777
1794
  //device info
1778
- const supportsStanbyMode = deviceData.Device[supportStandbyKey];
1795
+ const supportsStandbyMode = deviceData.Device[supportStandbyKey];
1779
1796
  const supportsHeatPump = ![1, 2, 3, 4, 5, 6, 7, 15].includes(this.hideZone);
1780
1797
  const supportsZone1 = ![2, 3, 4, 8, 9, 10, 11, 15].includes(this.hideZone);
1781
1798
  const supportsHotWaterTank = ![3, 5, 6, 9, 10, 12, 13, 15].includes(this.hideZone) && deviceData.Device[supportHotWaterKey];
1782
- const supportsZone2 = ![4, 6, 7, 10, 11, 13, 14, 15].includes(this.hideZone) && deviceData.Device.HasZone2 !== false && deviceData.Device.HasZone2 !== null;
1783
- const canHeat = deviceData.Device[supportHeatKey] ?? true;
1784
- const canCool = deviceData.Device[supportCoolKey] ?? false;
1785
- const heatCoolModes = canHeat && canCool ? 0 : canHeat ? 1 : canCool ? 2 : 3;
1799
+ const supportsZone2 = ![4, 6, 7, 10, 11, 13, 14, 15].includes(this.hideZone) && deviceData.Device.HasZone2 === true;
1800
+ const supportsHeat = deviceData.Device[supportHeatKey] ?? true;
1801
+ const supportsCool = deviceData.Device[supportCoolKey] ?? false;
1802
+ const supportsOutdoorTemperature = deviceData.Device.HasOutdoorTemperature;
1803
+ const heatCoolModes = supportsHeat && supportsCool ? 0 : supportsHeat ? 1 : supportsCool ? 2 : 3;
1786
1804
  const temperatureIncrement = deviceData.Device[tempStepKey] ?? 1;
1787
- const minSetHeatFlowTemperature = accountTypeMelcloud ? 25 : 10
1788
- const maxSetHeatFlowTemperature = accountTypeMelcloud ? 60 : 30;
1805
+ const minSetHeatFlowTemperature = 25;
1806
+ const maxSetHeatFlowTemperature = 60;
1789
1807
  const minSetCoolFlowTemperature = 16
1790
- const minSetTemperature = deviceData.Device.MinSetTemperature ?? 10;
1791
- const maxSetTemperature = deviceData.Device.MaxSetTemperature ?? 30;
1792
- const minSetTankTemperature = deviceData.Device.MinTankTemperature ?? 40;
1808
+ const maxSetCoolFlowTemperature = 30;
1809
+ const minSetHeatRoomTemperature = 10;
1810
+ const minSetCoolRoomTemperature = 16;
1811
+ const maxSetHeatCoolRoomTemperature = 30;
1812
+ const minSetTankTemperature = 10;
1793
1813
  const maxSetTankTemperature = deviceData.Device.MaxTankTemperature ?? 60;
1794
1814
 
1795
1815
  //zones
@@ -1832,11 +1852,11 @@ class DeviceAtw extends EventEmitter {
1832
1852
 
1833
1853
  //hot water
1834
1854
  const hotWaterName = 'Hot Water';
1835
- const tankWaterTemperature = deviceData.Device.TankWaterTemperature ?? 40;
1836
- const setTankWaterTemperature = deviceData.Device.SetTankWaterTemperature ?? 40;
1855
+ const tankWaterTemperature = deviceData.Device.TankWaterTemperature;
1856
+ const setTankWaterTemperature = deviceData.Device.SetTankWaterTemperature;
1837
1857
  const forcedHotWaterMode = deviceData.Device.ForcedHotWaterMode ? 1 : 0;
1838
- const ecoHotWater = deviceData.Device.EcoHotWater ?? false;
1839
- const prohibitHotWater = deviceData.Device.ProhibitHotWater ?? false;
1858
+ const ecoHotWater = deviceData.Device.EcoHotWater;
1859
+ const prohibitHotWater = deviceData.Device.ProhibitHotWater;
1840
1860
  const flowTemperatureWaterTank = deviceData.Device.FlowTemperatureBoiler;
1841
1861
  const returnTemperatureWaterTank = deviceData.Device.ReturnTemperatureBoiler;
1842
1862
 
@@ -1847,8 +1867,8 @@ class DeviceAtw extends EventEmitter {
1847
1867
  const setTemperatureZone2 = deviceData.Device.SetTemperatureZone2;
1848
1868
  const setHeatFlowTemperatureZone2 = deviceData.Device.SetHeatFlowTemperatureZone2;
1849
1869
  const setCoolFlowTemperatureZone2 = deviceData.Device.SetCoolFlowTemperatureZone2;
1850
- const prohibitZone2 = deviceData.Device.ProhibitZone2 ?? false;
1851
- const idleZone2 = deviceData.Device.IdleZone2 ?? false;
1870
+ const prohibitZone2 = deviceData.Device.ProhibitZone2;
1871
+ const idleZone2 = deviceData.Device.IdleZone2;
1852
1872
  const flowTemperatureZone2 = deviceData.Device.FlowTemperatureZone2;
1853
1873
  const returnTemperatureZone2 = deviceData.Device.ReturnTemperatureZone2;
1854
1874
 
@@ -1875,7 +1895,8 @@ class DeviceAtw extends EventEmitter {
1875
1895
  supportsHotWaterTank: supportsHotWaterTank,
1876
1896
  supportsZone2: supportsZone2,
1877
1897
  heatCoolModes: heatCoolModes,
1878
- supportsStanbyMode: supportsStanbyMode,
1898
+ supportsStandbyMode: supportsStandbyMode,
1899
+ supportsOutdoorTemperature: supportsOutdoorTemperature,
1879
1900
  caseHeatPump: caseHeatPump,
1880
1901
  caseZone1: caseZone1,
1881
1902
  caseHotWater: caseHotWater,
@@ -1894,6 +1915,7 @@ class DeviceAtw extends EventEmitter {
1894
1915
  zonesSensors: []
1895
1916
  };
1896
1917
 
1918
+ //zones
1897
1919
  for (let i = 0; i < zonesCount; i++) {
1898
1920
  //characteristics array
1899
1921
  const characteristics = [];
@@ -1949,22 +1971,35 @@ class DeviceAtw extends EventEmitter {
1949
1971
  setTemperature = setCoolFlowTemperatureZone1;
1950
1972
  roomTemperature = flowTemperatureZone1;
1951
1973
  temperatureSetPropsMinValue = minSetCoolFlowTemperature;
1952
- temperatureSetPropsMaxValue = maxSetTemperature;
1974
+ temperatureSetPropsMaxValue = maxSetCoolFlowTemperature;
1953
1975
  break;
1954
1976
  default:
1955
1977
  setTemperature = setTemperatureZone1;
1956
1978
  roomTemperature = roomTemperatureZone1;
1957
- temperatureSetPropsMinValue = minSetTemperature;
1958
- temperatureSetPropsMaxValue = maxSetTemperature;
1979
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
1980
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
1959
1981
  break
1960
1982
  };
1961
1983
  break;
1962
- default: //Melcloud Home
1963
- setTemperature = setTemperatureZone1;
1964
- roomTemperature = roomTemperatureZone1;
1965
- temperatureSetPropsMinValue = minSetTemperature;
1966
- temperatureSetPropsMaxValue = maxSetTemperature;
1984
+ case false: //Melcloud Home
1985
+ switch (operationModeZone1) {
1986
+ case 3: //COOL THERMOSTAT
1987
+ setTemperature = setTemperatureZone1;
1988
+ roomTemperature = roomTemperatureZone1;
1989
+ temperatureSetPropsMinValue = minSetCoolRoomTemperature;
1990
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
1991
+ break;
1992
+ default:
1993
+ setTemperature = setTemperatureZone1;
1994
+ roomTemperature = roomTemperatureZone1;
1995
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
1996
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
1997
+ break
1998
+ };
1967
1999
  break;
2000
+ default:
2001
+ if (this.logWarn) this.emit('warn', `${name}, Received unknown operation mode: ${operationModeZone1}`);
2002
+ return;
1968
2003
  }
1969
2004
 
1970
2005
  lockPhysicalControl = prohibitZone1 ? 1 : 0;
@@ -1993,32 +2028,58 @@ class DeviceAtw extends EventEmitter {
1993
2028
  currentOperationMode = !power ? 0 : (idleZone2 ? 1 : [2, 2, 2, 3, 3, 2][operationModeZone2]); //INACTIVE, IDLE, HEATING, COOLING
1994
2029
  targetOperationMode = [1, 2, 0, 1, 2, 1][operationModeZone2]; //AUTO, HEAT, COOL
1995
2030
 
1996
- switch (operationModeZone2) {
1997
- case 1: //HEAT FLOW
1998
- setTemperature = setHeatFlowTemperatureZone2;
1999
- roomTemperature = flowTemperatureZone2;
2000
- temperatureSetPropsMinValue = minSetHeatFlowTemperature;
2001
- temperatureSetPropsMaxValue = maxSetHeatFlowTemperature;
2031
+ switch (accountTypeMelcloud) {
2032
+ case true: //Melcloud
2033
+ switch (operationModeZone2) {
2034
+ case 1: //HEAT FLOW
2035
+ setTemperature = setHeatFlowTemperatureZone2;
2036
+ roomTemperature = flowTemperatureZone2;
2037
+ temperatureSetPropsMinValue = minSetHeatFlowTemperature;
2038
+ temperatureSetPropsMaxValue = maxSetHeatFlowTemperature;
2039
+ break;
2040
+ case 4: //COOL FLOW
2041
+ setTemperature = setCoolFlowTemperatureZone2;
2042
+ roomTemperature = flowTemperatureZone2;
2043
+ temperatureSetPropsMinValue = minSetCoolFlowTemperature;
2044
+ temperatureSetPropsMaxValue = maxSetCoolFlowTemperature;
2045
+ break;
2046
+ default:
2047
+ setTemperature = setTemperatureZone2;
2048
+ roomTemperature = roomTemperatureZone2;
2049
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2050
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2051
+ break
2052
+ };
2002
2053
  break;
2003
- case 4: //COOL FLOW
2004
- setTemperature = setCoolFlowTemperatureZone2;
2005
- roomTemperature = flowTemperatureZone2;
2006
- temperatureSetPropsMinValue = minSetCoolFlowTemperature;
2007
- temperatureSetPropsMaxValue = maxSetTemperature;
2054
+ case false: //Melcloud Home
2055
+ switch (operationModeZone2) {
2056
+ case 3: //COOL THERMOSTAT
2057
+ setTemperature = setTemperatureZone2;
2058
+ roomTemperature = roomTemperatureZone2;
2059
+ temperatureSetPropsMinValue = minSetCoolRoomTemperature;
2060
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2061
+ break;
2062
+ default:
2063
+ setTemperature = setTemperatureZone2;
2064
+ roomTemperature = roomTemperatureZone2;
2065
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2066
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2067
+ break
2068
+ };
2008
2069
  break;
2009
2070
  default:
2010
- setTemperature = setTemperatureZone2;
2011
- roomTemperature = roomTemperatureZone2;
2012
- temperatureSetPropsMinValue = minSetTemperature;
2013
- temperatureSetPropsMaxValue = maxSetTemperature;
2014
- break
2015
- };
2071
+ if (this.logWarn) this.emit('warn', `${name}, Received unknown operation mode: ${operationModeZone2}`);
2072
+ return;
2073
+ }
2016
2074
 
2017
2075
  lockPhysicalControl = prohibitZone2 ? 1 : 0;
2018
2076
  operationModeSetPropsMinValue = [0, 0, 1, 0][heatCoolModes];
2019
2077
  operationModeSetPropsMaxValue = [2, 2, 2, 0][heatCoolModes];
2020
2078
  operationModeSetPropsValidValues = [[0, 1, 2], [0, 1, 2], [1, 2], [0]][heatCoolModes];
2021
2079
  break;
2080
+ default:
2081
+ if (this.logWarn) this.emit('warn', `Received unknwn zone: ${i}`);
2082
+ return;
2022
2083
  };
2023
2084
 
2024
2085
  //create characteristics
@@ -2047,8 +2108,8 @@ class DeviceAtw extends EventEmitter {
2047
2108
  operationModeSetPropsMinValue = [0, 0, 0, 0][heatCoolModes];
2048
2109
  operationModeSetPropsMaxValue = [2, 1, 2, 0][heatCoolModes];
2049
2110
  operationModeSetPropsValidValues = [[0, 1, 2], [0, 1], [0, 2], [0]][heatCoolModes];
2050
- temperatureSetPropsMinValue = 10;
2051
- temperatureSetPropsMaxValue = 70;
2111
+ temperatureSetPropsMinValue = -35;
2112
+ temperatureSetPropsMaxValue = 100;
2052
2113
  break;
2053
2114
  case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2054
2115
  name = zone1Name;
@@ -2069,22 +2130,35 @@ class DeviceAtw extends EventEmitter {
2069
2130
  setTemperature = setCoolFlowTemperatureZone1;
2070
2131
  roomTemperature = flowTemperatureZone1;
2071
2132
  temperatureSetPropsMinValue = minSetCoolFlowTemperature;
2072
- temperatureSetPropsMaxValue = maxSetTemperature;
2133
+ temperatureSetPropsMaxValue = maxSetCoolFlowTemperature;
2073
2134
  break;
2074
2135
  default:
2075
2136
  setTemperature = setTemperatureZone1;
2076
2137
  roomTemperature = roomTemperatureZone1;
2077
- temperatureSetPropsMinValue = minSetTemperature;
2078
- temperatureSetPropsMaxValue = maxSetTemperature;
2138
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2139
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2079
2140
  break
2080
2141
  };
2081
2142
  break;
2082
- default: //Melcloud Home
2083
- setTemperature = setTemperatureZone1;
2084
- roomTemperature = roomTemperatureZone1;
2085
- temperatureSetPropsMinValue = minSetTemperature;
2086
- temperatureSetPropsMaxValue = maxSetTemperature;
2143
+ case false: //Melcloud Home
2144
+ switch (operationModeZone1) {
2145
+ case 3: //COOL THERMOSTAT
2146
+ setTemperature = setTemperatureZone1;
2147
+ roomTemperature = roomTemperatureZone1;
2148
+ temperatureSetPropsMinValue = minSetCoolRoomTemperature;
2149
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2150
+ break;
2151
+ default:
2152
+ setTemperature = setTemperatureZone1;
2153
+ roomTemperature = roomTemperatureZone1;
2154
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2155
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2156
+ break
2157
+ };
2087
2158
  break;
2159
+ default:
2160
+ if (this.logWarn) this.emit('warn', `${name}, Received unknown operation mode: ${operationModeZone1}`);
2161
+ return;
2088
2162
  }
2089
2163
 
2090
2164
  operationModeSetPropsMinValue = [1, 1, 1, 0][heatCoolModes];
@@ -2102,8 +2176,8 @@ class DeviceAtw extends EventEmitter {
2102
2176
  operationModeSetPropsMinValue = 1;
2103
2177
  operationModeSetPropsMaxValue = 3;
2104
2178
  operationModeSetPropsValidValues = [1, 3];
2105
- temperatureSetPropsMinValue = 0;
2106
- temperatureSetPropsMaxValue = 60;
2179
+ temperatureSetPropsMinValue = minSetTankTemperature;
2180
+ temperatureSetPropsMaxValue = maxSetTankTemperature;
2107
2181
  break;
2108
2182
  case caseZone2: //Zone 2 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2109
2183
  name = zone2Name;
@@ -2111,31 +2185,57 @@ class DeviceAtw extends EventEmitter {
2111
2185
  currentOperationMode = !power ? 0 : (idleZone2 ? 0 : [1, 1, 1, 2, 2, 1][operationModeZone2]); //OFF, HEAT, COOL
2112
2186
  targetOperationMode = [1, 2, 3, 1, 2, 1][operationModeZone2]; //OFF, HEAT, COOL, AUTO
2113
2187
 
2114
- switch (operationModeZone2) {
2115
- case 1: //HEAT FLOW
2116
- setTemperature = setHeatFlowTemperatureZone2;
2117
- roomTemperature = flowTemperatureZone2;
2118
- temperatureSetPropsMinValue = minSetHeatFlowTemperature;
2119
- temperatureSetPropsMaxValue = maxSetHeatFlowTemperature;
2188
+ switch (accountTypeMelcloud) {
2189
+ case true: //Melcloud
2190
+ switch (operationModeZone2) {
2191
+ case 1: //HEAT FLOW
2192
+ setTemperature = setHeatFlowTemperatureZone2;
2193
+ roomTemperature = flowTemperatureZone2;
2194
+ temperatureSetPropsMinValue = minSetHeatFlowTemperature;
2195
+ temperatureSetPropsMaxValue = maxSetHeatFlowTemperature;
2196
+ break;
2197
+ case 4: //COOL FLOW
2198
+ setTemperature = setCoolFlowTemperatureZone2;
2199
+ roomTemperature = flowTemperatureZone2;
2200
+ temperatureSetPropsMinValue = minSetCoolFlowTemperature;
2201
+ temperatureSetPropsMaxValue = maxSetCoolFlowTemperature;
2202
+ break;
2203
+ default:
2204
+ setTemperature = setTemperatureZone2;
2205
+ roomTemperature = roomTemperatureZone2;
2206
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2207
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2208
+ break
2209
+ };
2120
2210
  break;
2121
- case 4: //COOL FLOW
2122
- setTemperature = setCoolFlowTemperatureZone2;
2123
- roomTemperature = flowTemperatureZone2;
2124
- temperatureSetPropsMinValue = minSetCoolFlowTemperature;
2125
- temperatureSetPropsMaxValue = maxSetTemperature;
2211
+ case false: //Melcloud Home
2212
+ switch (operationModeZone2) {
2213
+ case 3: //COOL THERMOSTAT
2214
+ setTemperature = setTemperatureZone2;
2215
+ roomTemperature = roomTemperatureZone2;
2216
+ temperatureSetPropsMinValue = minSetCoolRoomTemperature;
2217
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2218
+ break;
2219
+ default:
2220
+ setTemperature = setTemperatureZone2;
2221
+ roomTemperature = roomTemperatureZone2;
2222
+ temperatureSetPropsMinValue = minSetHeatRoomTemperature;
2223
+ temperatureSetPropsMaxValue = maxSetHeatCoolRoomTemperature;
2224
+ break
2225
+ };
2126
2226
  break;
2127
2227
  default:
2128
- setTemperature = setTemperatureZone2;
2129
- roomTemperature = roomTemperatureZone2;
2130
- temperatureSetPropsMinValue = minSetTemperature;
2131
- temperatureSetPropsMaxValue = maxSetTemperature;
2132
- break
2133
- };
2228
+ if (this.logWarn) this.emit('warn', `${name}, Received unknown operation mode: ${operationModeZone2}`);
2229
+ return;
2230
+ }
2134
2231
 
2135
2232
  operationModeSetPropsMinValue = [1, 1, 1, 0][heatCoolModes];
2136
2233
  operationModeSetPropsMaxValue = [3, 3, 2, 0][heatCoolModes];
2137
2234
  operationModeSetPropsValidValues = [[1, 2, 3], [1, 2, 3], [1, 2], [0]][heatCoolModes];
2138
2235
  break;
2236
+ default:
2237
+ if (this.logWarn) this.emit('warn', `Received unknwn zone: ${i}`);
2238
+ return;
2139
2239
  };
2140
2240
 
2141
2241
  //create characteristics
@@ -2179,14 +2279,14 @@ class DeviceAtw extends EventEmitter {
2179
2279
  case caseHeatPump: //Heat Pump - HEAT, COOL, OFF
2180
2280
  this.emit('info', `${name} Power: ${power ? 'On' : 'Off'}`)
2181
2281
  this.emit('info', `${name} System status: ${HeatPump.SystemMapEnumToStringInfo[unitStatus]}`);
2182
- this.emit('info', `${name} Operation mode: ${HeatPump.OperationModeMapEnumToStringInfo[operationMode]}`);
2282
+ this.emit('info', `${name} Operation mode: ${HeatPump.OperationModeMapEnumToStringInfo[operationModeZone]}`);
2183
2283
  this.emit('info', `${name} Outdoor temperature: ${roomTemperature}${obj.temperatureUnit}`);
2184
2284
  this.emit('info', `${name} Temperature display unit: ${obj.temperatureUnit}`);
2185
2285
  this.emit('info', `${name} Lock physical controls: ${lockPhysicalControl ? 'Locked' : 'Unlocked'}`);
2186
2286
  if (!accountTypeMelcloud) this.emit('info', `Signal strength: ${deviceData.Rssi}dBm`);
2187
2287
  break;
2188
2288
  case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2189
- operationModeText = idleZone1 ? HeatPump.OperationModeZoneMapEnumToStringInfo[6] : HeatPump.OperationModeZoneMapEnumToStringInfo[operationModeZone1];
2289
+ operationModeText = idleZone1 ? HeatPump.OperationModeZoneMapEnumToStringInfo[6] : HeatPump.OperationModeZoneMapEnumToStringInfo[operationModeZone];
2190
2290
  this.emit('info', `${name} Operation mode: ${operationModeText}`);
2191
2291
  this.emit('info', `${name} Temperature: ${roomTemperature}${obj.temperatureUnit}`);
2192
2292
  this.emit('info', `${name} Target temperature: ${setTemperature}${obj.temperatureUnit}`)
@@ -2194,7 +2294,7 @@ class DeviceAtw extends EventEmitter {
2194
2294
  this.emit('info', `${name} Lock physical controls: ${lockPhysicalControl ? 'Locked' : 'Unlocked'}`);
2195
2295
  break;
2196
2296
  case caseHotWater: //Hot Water - AUTO, HEAT NOW
2197
- operationModeText = operationMode === 1 ? HeatPump.ForceDhwMapEnumToStringInfo[1] : HeatPump.ForceDhwMapEnumToStringInfo[forcedHotWaterMode ? 1 : 0];
2297
+ operationModeText = operationMode === 1 ? HeatPump.ForceDhwMapEnumToStringInfo[1] : HeatPump.ForceDhwMapEnumToStringInfo[operationModeZone ? 1 : 0];
2198
2298
  this.emit('info', `${name} Operation mode: ${operationModeText}`);
2199
2299
  this.emit('info', `${name} Temperature: ${roomTemperature}${obj.temperatureUnit}`);
2200
2300
  this.emit('info', `${name} Target temperature: ${setTemperature}${obj.temperatureUnit}`)
@@ -2202,7 +2302,7 @@ class DeviceAtw extends EventEmitter {
2202
2302
  this.emit('info', `${name} Lock physical controls: ${lockPhysicalControl ? 'Locked' : 'Unlocked'}`);
2203
2303
  break;
2204
2304
  case caseZone2: //Zone 2 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2205
- operationModeText = idleZone2 ? HeatPump.OperationModeZoneMapEnumToStringInfo[6] : HeatPump.OperationModeZoneMapEnumToStringInfo[operationModeZone2];
2305
+ operationModeText = idleZone2 ? HeatPump.OperationModeZoneMapEnumToStringInfo[6] : HeatPump.OperationModeZoneMapEnumToStringInfo[operationModeZone];
2206
2306
  this.emit('info', `${name} Operation mode: ${operationModeText}`);
2207
2307
  this.emit('info', `${name} Temperature: ${roomTemperature}${obj.temperatureUnit}`);
2208
2308
  this.emit('info', `${name} Target temperature: ${setTemperature}${obj.temperatureUnit}`)
@@ -2213,7 +2313,7 @@ class DeviceAtw extends EventEmitter {
2213
2313
  }
2214
2314
  }
2215
2315
 
2216
- //update sensors characteristics
2316
+ //zones sensors
2217
2317
  for (let i = 0; i < zonesSensorsCount; i++) {
2218
2318
 
2219
2319
  // helper function to update sensor characteristics
@@ -2281,33 +2381,15 @@ class DeviceAtw extends EventEmitter {
2281
2381
 
2282
2382
  //log current state
2283
2383
  if (this.logInfo) {
2284
- switch (i) {
2285
- case caseHeatPumpSensor: //Heat Pump - HEAT, COOL, OFF
2286
- if (outdoorTemperature !== null) this.emit('info', `${heatPumpName}, Outdoor temperature: ${outdoorTemperature}${obj.temperatureUnit}`);
2287
- if (flowTemperatureHeatPump !== null) this.emit('info', `${heatPumpName}, Flow temperature: ${flowTemperatureHeatPump}${obj.temperatureUnit}`);
2288
- if (returnTemperatureHeatPump !== null) this.emit('info', `${heatPumpName}, Return temperature: ${returnTemperatureHeatPump}${obj.temperatureUnit}`);
2289
- break;
2290
- case caseZone1Sensor: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2291
- if (roomTemperatureZone1 !== null) this.emit('info', `${zone1Name}, Room temperature: ${roomTemperatureZone1}${obj.temperatureUnit}`);
2292
- if (flowTemperatureZone1 !== null) this.emit('info', `${zone1Name}, Flow temperature: ${flowTemperatureZone1}${obj.temperatureUnit}`);
2293
- if (returnTemperatureZone1 !== null) this.emit('info', `${zone1Name}, Return temperature: ${returnTemperatureZone1}${obj.temperatureUnit}`);
2294
- break;
2295
- case caseHotWaterSensor: //Hot Water - AUTO, HEAT NOW
2296
- if (tankWaterTemperature !== null) this.emit('info', `${hotWaterName}, Temperature: ${tankWaterTemperature}${obj.temperatureUnit}`);
2297
- if (flowTemperatureWaterTank !== null) this.emit('info', `${hotWaterName}, Flow temperature: ${flowTemperatureWaterTank}${obj.temperatureUnit}`);
2298
- if (returnTemperatureWaterTank !== null) this.emit('info', `${hotWaterName}, Return temperature: ${returnTemperatureWaterTank}${obj.temperatureUnit}`);
2299
- break;
2300
- case caseZone2Sensor: //Zone 2 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
2301
- if (roomTemperatureZone2 !== null) this.emit('info', `${zone2Name}, Room temperature: ${roomTemperatureZone2}${obj.temperatureUnit}`);
2302
- if (flowTemperatureZone2 !== null) this.emit('info', `${zone2Name}, Flow temperature: ${flowTemperatureZone2}${obj.temperatureUnit}`);
2303
- if (returnTemperatureZone2 !== null) this.emit('info', `${zone2Name}, Return temperature: ${returnTemperatureZone2}${obj.temperatureUnit}`);
2304
- break;
2305
- };
2384
+ if (roomTemperature !== null) this.emit('info', `${name}, Outdoor temperature: ${roomTemperature}${obj.temperatureUnit}`);
2385
+ if (flowTemperature !== null) this.emit('info', `${name}, Flow temperature: ${flowTemperature}${obj.temperatureUnit}`);
2386
+ if (returnTemperature !== null) this.emit('info', `${name}, Return temperature: ${returnTemperature}${obj.temperatureUnit}`);
2306
2387
  };
2307
2388
  }
2308
2389
  this.accessory = obj;
2309
2390
 
2310
2391
  //other sensors
2392
+ this.outdoorTemperatureSensorService?.updateCharacteristic(Characteristic.CurrentTemperature, outdoorTemperature);
2311
2393
  this.inStandbyService?.updateCharacteristic(Characteristic.ContactSensorState, inStandbyMode);
2312
2394
  this.connectService?.updateCharacteristic(Characteristic.ContactSensorState, isConnected);
2313
2395
  this.errorService?.updateCharacteristic(Characteristic.ContactSensorState, isInError);
@@ -2400,7 +2482,11 @@ class DeviceAtw extends EventEmitter {
2400
2482
  //buttons
2401
2483
  if (this.buttons.length > 0) {
2402
2484
  this.buttons.forEach((button, i) => {
2403
- const characteristicType = button.characteristicType;
2485
+ // helper function to update sensor characteristics
2486
+ const updateSensorCharacteristics = (service, characteristic, value) => {
2487
+ if (this.functions.isValidValue(value)) service?.[i]?.updateCharacteristic(characteristic, value);
2488
+ };
2489
+
2404
2490
  const mode = button.mode;
2405
2491
  switch (mode) {
2406
2492
  case 0: //POWER ON,OFF
@@ -2478,10 +2564,11 @@ class DeviceAtw extends EventEmitter {
2478
2564
  };
2479
2565
 
2480
2566
  //control
2481
- if (button.displayType > 3) this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
2567
+ if (button.displayType > 3) updateSensorCharacteristics(this.buttonControlServices, Characteristic.On, button.state);
2482
2568
 
2483
2569
  //sensor
2484
- if (button.displayType < 7) this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
2570
+ const characteristicType = button.characteristicType;
2571
+ if (button.displayType < 7) updateSensorCharacteristics(this.buttonControlSensorServices, characteristicType, button.state);
2485
2572
  });
2486
2573
  }
2487
2574
  })
package/src/deviceerv.js CHANGED
@@ -33,7 +33,7 @@ class DeviceErv extends EventEmitter {
33
33
  this.deviceName = device.name;
34
34
  this.deviceTypeString = DeviceType[device.type];
35
35
  this.displayType = device.displayType;
36
- this.temperatureSensor = device.temperatureSensor || false;
36
+ this.temperatureRoomSensor = device.temperatureRoomSensor || false;
37
37
  this.temperatureOutdoorSensor = device.temperatureOutdoorSensor || false;
38
38
  this.temperatureSupplySensor = device.temperatureSupplySensor || false;
39
39
  this.inStandbySensor = device.inStandbySensor || false;
@@ -557,7 +557,7 @@ class DeviceErv extends EventEmitter {
557
557
  };
558
558
 
559
559
  //temperature sensor service room
560
- if (this.temperatureSensor && supportsRoomTemperature && this.accessory.roomTemperature !== null) {
560
+ if (this.temperatureRoomSensor && supportsRoomTemperature && this.accessory.roomTemperature !== null) {
561
561
  if (this.logDebug) this.emit('debug', `Prepare room temperature sensor service`);
562
562
  this.roomTemperatureSensorService = new Service.TemperatureSensor(`${serviceName} Room`, `roomTemperatureSensorService${deviceId}`);
563
563
  this.roomTemperatureSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
@@ -1483,7 +1483,11 @@ class DeviceErv extends EventEmitter {
1483
1483
  //buttons
1484
1484
  if (this.buttons.length > 0) {
1485
1485
  this.buttons.forEach((button, i) => {
1486
- const characteristicType = button.characteristicType;
1486
+ // helper function to update sensor characteristics
1487
+ const updateSensorCharacteristics = (service, characteristic, value) => {
1488
+ if (this.functions.isValidValue(value)) service?.[i]?.updateCharacteristic(characteristic, value);
1489
+ };
1490
+
1487
1491
  const mode = button.mode;
1488
1492
  switch (mode) {
1489
1493
  case 0: //POWER ON,OFF
@@ -1534,10 +1538,11 @@ class DeviceErv extends EventEmitter {
1534
1538
  };
1535
1539
 
1536
1540
  //control
1537
- if (button.displayType > 3) this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
1541
+ if (button.displayType > 3) updateSensorCharacteristics(this.buttonControlServices, Characteristic.On, button.state);
1538
1542
 
1539
1543
  //sensor
1540
- if (button.displayType < 7) this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1544
+ const characteristicType = button.characteristicType;
1545
+ if (button.displayType < 7) updateSensorCharacteristics(this.buttonControlSensorServices, characteristicType, button.state);
1541
1546
  });
1542
1547
  }
1543
1548
 
@@ -212,22 +212,22 @@ class MelCloudAtw extends EventEmitter {
212
212
  DeviceID: deviceData.Device.DeviceID,
213
213
  EffectiveFlags: deviceData.Device.EffectiveFlags,
214
214
  Power: deviceData.Device.Power,
215
- SetTemperatureZone1: deviceData.Device.SetTemperatureZone1,
216
- SetTemperatureZone2: deviceData.Device.SetTemperatureZone2,
217
215
  OperationMode: deviceData.Device.OperationMode,
218
216
  OperationModeZone1: deviceData.Device.OperationModeZone1,
219
- OperationModeZone2: deviceData.Device.OperationModeZone2,
217
+ SetTemperatureZone1: deviceData.Device.SetTemperatureZone1,
220
218
  SetHeatFlowTemperatureZone1: deviceData.Device.SetHeatFlowTemperatureZone1,
221
- SetHeatFlowTemperatureZone2: deviceData.Device.SetHeatFlowTemperatureZone2,
222
219
  SetCoolFlowTemperatureZone1: deviceData.Device.SetCoolFlowTemperatureZone1,
223
- SetCoolFlowTemperatureZone2: deviceData.Device.SetCoolFlowTemperatureZone2,
220
+ ProhibitZone1: deviceData.Device.ProhibitHeatingZone1,
224
221
  SetTankWaterTemperature: deviceData.Device.SetTankWaterTemperature,
225
222
  ForcedHotWaterMode: deviceData.Device.ForcedHotWaterMode,
226
223
  EcoHotWater: deviceData.Device.EcoHotWater,
227
- HolidayMode: deviceData.Device.HolidayMode,
228
- ProhibitZone1: deviceData.Device.ProhibitHeatingZone1,
229
- ProhibitZone2: deviceData.Device.ProhibitHeatingZone2,
230
224
  ProhibitHotWater: deviceData.Device.ProhibitHotWater,
225
+ OperationModeZone2: deviceData.Device.OperationModeZone2,
226
+ SetTemperatureZone2: deviceData.Device.SetTemperatureZone2,
227
+ SetHeatFlowTemperatureZone2: deviceData.Device.SetHeatFlowTemperatureZone2,
228
+ SetCoolFlowTemperatureZone2: deviceData.Device.SetCoolFlowTemperatureZone2,
229
+ ProhibitZone2: deviceData.Device.ProhibitHeatingZone2,
230
+ HolidayMode: deviceData.Device.HolidayMode,
231
231
  HasPendingCommand: true
232
232
  }
233
233
  path = ApiUrls.Post.Atw;
@@ -284,9 +284,9 @@ class MelCloudAtw extends EventEmitter {
284
284
  operationMode: HeatPump.OperationModeMapEnumToString[deviceData.Device.OperationMode],
285
285
  operationModeZone1: HeatPump.OperationModeMapEnumToString[deviceData.Device.OperationModeZone1],
286
286
  setTemperatureZone1: deviceData.Device.SetTemperatureZone1,
287
- prohibitHotWater: deviceData.Device.ProhibitHotWater,
288
287
  setTankWaterTemperature: deviceData.Device.SetTankWaterTemperature,
289
288
  forcedHotWaterMode: deviceData.Device.ForcedHotWaterMode,
289
+ prohibitHotWater: deviceData.Device.ProhibitHotWater,
290
290
  operationModeZone2: HeatPump.OperationModeMapEnumToString[deviceData.Device.OperationModeZone2],
291
291
  setTemperatureZone2: deviceData.Device.SetTemperatureZone2
292
292
  };