homebridge-melcloud-control 3.1.18 → 3.2.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
@@ -16,6 +16,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
16
16
  - do not configure it manually, always using Config UI X
17
17
  - required Homebridge v2.0.0 and above
18
18
 
19
+ ## [3.2.0] - (11.09.2024)
20
+
21
+ ## Changes
22
+
23
+ - added possibility to set previous value for buttons [#154](https://github.com/grzegorz914/homebridge-melcloud-control/issues/154)
24
+ - move some message to warning
25
+ - presets previous settings apply improvement
26
+ - cleanup
27
+
19
28
  ## [3.1.11] - (09.09.2024)
20
29
 
21
30
  ## Changes
package/README.md CHANGED
@@ -30,9 +30,9 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
30
30
  * All devices are detected automatically.
31
31
  * Support multiple MELCloud accounts, buildings, floors, areas.
32
32
  * Support temperature display units `Celsius/Fahrenheit`.
33
- * Support control device `Presets`.
34
33
  * Support assing inividual operating mode for `Heat/Cool/Auto`.
35
- * Support direct device control using extra `Buttons`.
34
+ * Support direct `Presets` control using extra `Buttons`, switch it to `OFF` restore previous device state.
35
+ * Support direct `Functions` control using extra `Buttons`, switch it to `OFF` restore previous device state.
36
36
  * Support detect all device states using extra `Sensors`.
37
37
  * Support automations, shortcuts and Siri.
38
38
  * Support external integrations, [RESTFul](https://github.com/grzegorz914/homebridge-melcloud-control?tab=readme-ov-file#restful-integration), [MQTT](https://github.com/grzegorz914/homebridge-melcloud-control?tab=readme-ov-file#mqtt-integration).
@@ -275,7 +275,7 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
275
275
  | | `http//ip:port` | `ProhibitOperationMode` | `true`, `false` | boolean | Lock set operating mode. |
276
276
  | | `http//ip:port` | `ProhibitPower` | `true`, `false` | boolean | Lock set power. |
277
277
  | | `http//ip:port` | `OperationMode` | `1 - Heat`, `2 - Dry`, `3 - Cool`, `7 - Fan`, `8 - Auto` | integer | Operating mode. |
278
- | | `http//ip:port` | `SetFanSpeed` | `0 - Auto`, `1`, `2`, `3`, `4`, `5`, `6` | integer | Fan speed. |
278
+ | | `http//ip:port` | `FanSpeed` | `0 - Auto`, `1`, `2`, `3`, `4`, `5`, `6` | integer | Fan speed. |
279
279
  | | `http//ip:port` | `VaneHorizontalDirection` | `0`, `1`, `2`, `3`, `4`, `5`, `8 - Split`, `12 - Swing` | integer | Vane H mode. |
280
280
  | | `http//ip:port` | `VaneVerticalDirection` | `0`, `1`, `2`, `3`, `4`, `5`, `7 - Swing` | integer | Vane V mode. |
281
281
  | | `http//ip:port` | `SetTemperature` | `0.0` | float | Room temperature. |
@@ -330,7 +330,7 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
330
330
  | | `Set` | `ProhibitOperationMode` | `true`, `false` | boolean | Lock set operating mode. |
331
331
  | | `Set` | `ProhibitPower` | `true`, `false` | boolean | Lock set power. |
332
332
  | | `Set` | `OperationMode` | `1 - Heat`, `2 - Dry`, `3 - Cool`, `7 - Fan`, `8 - Auto` | integer | Operating mode. |
333
- | | `Set` | `SetFanSpeed` | `0 - Auto`, `1`, `2`, `3`, `4`, `5`, `6` | integer | Fan speed. |
333
+ | | `Set` | `FanSpeed` | `0 - Auto`, `1`, `2`, `3`, `4`, `5`, `6` | integer | Fan speed. |
334
334
  | | `Set` | `VaneHorizontalDirection` | `0`, `1`, `2`, `3`, `4`, `5`, `8 - Split`, `12 - Swing` | integer | Vane H mode. |
335
335
  | | `Set` | `VaneVerticalDirection` | `0`, `1`, `2`, `3`, `4`, `5`, `7 - Swing` | integer | Vane V mode. |
336
336
  | | `Set` | `SetTemperature` | `0.0` | float | Room temperature. |
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.18",
4
+ "version": "3.2.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
@@ -62,9 +62,10 @@ class DeviceAta extends EventEmitter {
62
62
  preset.serviceType = presetyServiceType;
63
63
  preset.characteristicType = presetCharacteristicType;
64
64
  preset.state = false;
65
+ preset.previousSettings = {};
65
66
  this.presetsConfigured.push(preset);
66
67
  } else {
67
- const log = presetDisplayType === 0 ? false : this.emit('message', `Preset Name: ${preset ? preset : 'Missing'}.`);
68
+ const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}.`);
68
69
  };
69
70
  }
70
71
  this.presetsConfiguredCount = this.presetsConfigured.length || 0;
@@ -83,9 +84,10 @@ class DeviceAta extends EventEmitter {
83
84
  button.serviceType = buttonServiceType;
84
85
  button.characteristicType = buttonCharacteristicType;
85
86
  button.state = false;
87
+ button.previousValue = 0;
86
88
  this.buttonsConfigured.push(button);
87
89
  } else {
88
- const log = buttonDisplayType === 0 ? false : this.emit('message', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
90
+ const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
89
91
  };
90
92
  }
91
93
  this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
@@ -237,7 +239,7 @@ class DeviceAta extends EventEmitter {
237
239
  const fanSpeed = deviceData.Device.FanSpeed;
238
240
  const operationMode = deviceData.Device.OperationMode;
239
241
  const vaneHorizontalDirection = deviceData.Device.VaneHorizontalDirection;
240
- const VaneVerticalDirection = deviceData.Device.VaneVerticalDirection;
242
+ const vaneVerticalDirection = deviceData.Device.VaneVerticalDirection;
241
243
  const hideVaneControls = deviceData.Device.HideVaneControls;
242
244
  const hideDryModeControl = deviceData.Device.HideDryModeControl;
243
245
  const prohibitSetTemperature = deviceData.Device.ProhibitSetTemperature ?? false;
@@ -253,8 +255,8 @@ class DeviceAta extends EventEmitter {
253
255
  this.accessory.setTemperature = setTemperature;
254
256
  this.accessory.fanSpeed = fanSpeed;
255
257
  this.accessory.vaneHorizontal = vaneHorizontalDirection;
256
- this.accessory.vaneVertical = VaneVerticalDirection;
257
- this.accessory.swingMode = swingFunction && vaneHorizontalDirection === 12 && VaneVerticalDirection === 7 ? 1 : 0;
258
+ this.accessory.vaneVertical = vaneVerticalDirection;
259
+ this.accessory.swingMode = swingFunction && vaneHorizontalDirection === 12 && vaneVerticalDirection === 7 ? 1 : 0;
258
260
  this.accessory.lockPhysicalControl = prohibitSetTemperature && prohibitOperationMode && prohibitPower ? 1 : 0;
259
261
  this.accessory.temperatureIncrement = temperatureIncrement;
260
262
  this.accessory.useFahrenheit = this.useFahrenheit;
@@ -679,7 +681,7 @@ class DeviceAta extends EventEmitter {
679
681
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.SetTemperature;
680
682
  set = await this.melCloudAta.send(deviceData);
681
683
  break;
682
- case 'SetFanSpeed':
684
+ case 'FanSpeed':
683
685
  deviceData.Device[key] = value;
684
686
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
685
687
  set = await this.melCloudAta.send(deviceData);
@@ -1097,7 +1099,6 @@ class DeviceAta extends EventEmitter {
1097
1099
  if (this.presetsConfiguredCount > 0) {
1098
1100
  const debug = this.enableDebugMode ? this.emit('debug', `Prepare presets services`) : false;
1099
1101
  this.presetsServices = [];
1100
- const previousPresets = [];
1101
1102
 
1102
1103
  for (let i = 0; i < this.presetsConfiguredCount; i++) {
1103
1104
  const preset = this.presetsConfigured[i];
@@ -1124,7 +1125,7 @@ class DeviceAta extends EventEmitter {
1124
1125
  try {
1125
1126
  switch (state) {
1126
1127
  case true:
1127
- previousPresets[i] = deviceData.Device;
1128
+ preset.previousSettings = deviceData.Device;
1128
1129
  deviceData.Device.SetTemperature = presetData.SetTemperature;
1129
1130
  deviceData.Device.Power = presetData.Power;
1130
1131
  deviceData.Device.OperationMode = presetData.OperationMode;
@@ -1134,17 +1135,22 @@ class DeviceAta extends EventEmitter {
1134
1135
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power;
1135
1136
  break;
1136
1137
  case false:
1137
- deviceData.Device = previousPresets[i];
1138
+ deviceData.Device.SetTemperature = preset.previousSettings.SetTemperature;
1139
+ deviceData.Device.Power = preset.previousSettings.Power;
1140
+ deviceData.Device.OperationMode = preset.previousSettings.OperationMode;
1141
+ deviceData.Device.VaneHorizontalDirection = preset.previousSettings.VaneHorizontalDirection;
1142
+ deviceData.Device.VaneVerticalDirection = preset.previousSettings.VaneVerticalDirection;
1143
+ deviceData.Device.FanSpeed = preset.previousSettings.FanSpeed;
1144
+ deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power;
1138
1145
  break;
1139
1146
  };
1140
1147
 
1141
1148
  await this.melCloudAta.send(deviceData);
1142
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${presetName}`);
1149
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set:' : 'Unset:'} ${presetName}`);
1143
1150
  } catch (error) {
1144
1151
  this.emit('warn', `Set preset error: ${error}`);
1145
1152
  };
1146
1153
  });
1147
- previousPresets.push(deviceData.Device);
1148
1154
  this.presetsServices.push(presetService);
1149
1155
  accessory.addService(presetService);
1150
1156
  };
@@ -1186,149 +1192,177 @@ class DeviceAta extends EventEmitter {
1186
1192
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power;
1187
1193
  break;
1188
1194
  case 1: //OPERATING MODE HEAT
1195
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1189
1196
  deviceData.Device.Power = true;
1190
- deviceData.Device.OperationMode = 1;
1197
+ deviceData.Device.OperationMode = state ? 1 : button.previousValue;
1191
1198
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1192
1199
  break;
1193
1200
  case 2: //OPERATING MODE DRY
1201
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1194
1202
  deviceData.Device.Power = true;
1195
- deviceData.Device.OperationMode = 2;
1203
+ deviceData.Device.OperationMode = state ? 2 : button.previousValue;
1196
1204
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1197
1205
  break
1198
1206
  case 3: //OPERATING MODE COOL
1207
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1199
1208
  deviceData.Device.Power = true;
1200
- deviceData.Device.OperationMode = 3;
1209
+ deviceData.Device.OperationMode = state ? 3 : button.previousValue;
1201
1210
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1202
1211
  break;
1203
1212
  case 4: //OPERATING MODE FAN
1213
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1204
1214
  deviceData.Device.Power = true;
1205
- deviceData.Device.OperationMode = 7;
1215
+ deviceData.Device.OperationMode = state ? 7 : button.previousValue;
1206
1216
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1207
1217
  break;
1208
1218
  case 5: //OPERATING MODE AUTO
1219
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1209
1220
  deviceData.Device.Power = true;
1210
- deviceData.Device.OperationMode = 8;
1221
+ deviceData.Device.OperationMode = state ? 8 : button.previousValue;
1211
1222
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1212
1223
  break;
1213
1224
  case 6: //OPERATING MODE PURIFY
1225
+ button.previousValue = state ? deviceData.Device.OperationMode : button.previousValue;
1214
1226
  deviceData.Device.Power = true;
1215
- deviceData.Device.OperationMode = 9;
1227
+ deviceData.Device.OperationMode = state ? 9 : button.previousValue;
1216
1228
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.OperationMode;
1217
1229
  break;
1218
1230
  case 7: //OPERATING MODE DRY CONTROL HIDE
1219
1231
  deviceData.Device.HideDryModeControl = state;
1220
1232
  break;
1221
1233
  case 10: //VANE H SWING MODE AUTO
1234
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1222
1235
  deviceData.Device.Power = true;
1223
- deviceData.Device.VaneHorizontalDirection = 0;
1236
+ deviceData.Device.VaneHorizontalDirection = state ? 0 : button.previousValue;
1224
1237
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1225
1238
  break;
1226
1239
  case 11: //VANE H SWING MODE 1
1240
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1227
1241
  deviceData.Device.Power = true;
1228
- deviceData.Device.VaneHorizontalDirection = 1;
1242
+ deviceData.Device.VaneHorizontalDirection = state ? 1 : button.previousValue;
1229
1243
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1230
1244
  break;
1231
1245
  case 12: //VANE H SWING MODE 2
1246
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1232
1247
  deviceData.Device.Power = true;
1233
- deviceData.Device.VaneHorizontalDirection = 2;
1248
+ deviceData.Device.VaneHorizontalDirection = state ? 2 : button.previousValue;
1234
1249
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1235
1250
  break;
1236
1251
  case 13: //VANE H SWING MODE 3
1252
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1237
1253
  deviceData.Device.Power = true;
1238
- deviceData.Device.VaneHorizontalDirection = 3;
1254
+ deviceData.Device.VaneHorizontalDirection = state ? 3 : button.previousValue;
1239
1255
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1240
1256
  break;
1241
1257
  case 14: //VANE H SWING MODE 4
1258
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1242
1259
  deviceData.Device.Power = true;
1243
- deviceData.Device.VaneHorizontalDirection = 4;
1260
+ deviceData.Device.VaneHorizontalDirection = state ? 4 : button.previousValue;
1244
1261
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1245
1262
  break;
1246
1263
  case 15: //VANE H SWING MODE 5
1264
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1247
1265
  deviceData.Device.Power = true;
1248
- deviceData.Device.VaneHorizontalDirection = 5;
1266
+ deviceData.Device.VaneHorizontalDirection = state ? 5 : button.previousValue;
1249
1267
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1250
1268
  break;
1251
1269
  case 16: //VANE H SWING MODE SPLIT
1270
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1252
1271
  deviceData.Device.Power = true;
1253
- deviceData.Device.VaneHorizontalDirection = 8;
1272
+ deviceData.Device.VaneHorizontalDirection = state ? 8 : button.previousValue;
1254
1273
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1255
1274
  break;
1256
1275
  case 17: //VANE H SWING MODE SWING
1276
+ button.previousValue = state ? deviceData.Device.VaneHorizontalDirection : button.previousValue;
1257
1277
  deviceData.Device.Power = true;
1258
- deviceData.Device.VaneHorizontalDirection = 12;
1278
+ deviceData.Device.VaneHorizontalDirection = state ? 12 : button.previousValue;
1259
1279
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneHorizontal;
1260
1280
  break;
1261
1281
  case 20: //VANE V SWING MODE AUTO
1282
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1262
1283
  deviceData.Device.Power = true;
1263
- deviceData.Device.VaneVerticalDirection = 0;
1284
+ deviceData.Device.VaneVerticalDirection = state ? 0 : button.previousValue;
1264
1285
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1265
1286
  break;
1266
1287
  case 21: //VANE V SWING MODE 1
1288
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1267
1289
  deviceData.Device.Power = true;
1268
- deviceData.Device.VaneVerticalDirection = 1;
1290
+ deviceData.Device.VaneVerticalDirection = state ? 1 : button.previousValue;
1269
1291
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1270
1292
  break;
1271
1293
  case 22: //VANE V SWING MODE 2
1294
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1272
1295
  deviceData.Device.Power = true;
1273
- deviceData.Device.VaneVerticalDirection = 2;
1296
+ deviceData.Device.VaneVerticalDirection = state ? 2 : button.previousValue;
1274
1297
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1275
1298
  break;
1276
1299
  case 23: //VANE V SWING MODE 3
1300
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1277
1301
  deviceData.Device.Power = true;
1278
- deviceData.Device.VaneVerticalDirection = 3;
1302
+ deviceData.Device.VaneVerticalDirection = state ? 3 : button.previousValue;
1279
1303
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1280
1304
  break;
1281
1305
  case 24: //VANE V SWING MODE 4
1306
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1282
1307
  deviceData.Device.Power = true;
1283
- deviceData.Device.VaneVerticalDirection = 4;
1308
+ deviceData.Device.VaneVerticalDirection = state ? 4 : button.previousValue;
1284
1309
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1285
1310
  break;
1286
1311
  case 25: //VANE V SWING MODE 5
1312
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1287
1313
  deviceData.Device.Power = true;
1288
- deviceData.Device.VaneVerticalDirection = 5;
1314
+ deviceData.Device.VaneVerticalDirection = state ? 5 : button.previousValue;
1289
1315
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1290
1316
  break;
1291
1317
  case 26: //VANE V SWING MODE SWING
1318
+ button.previousValue = state ? deviceData.Device.VaneVerticalDirection : button.previousValue;
1292
1319
  deviceData.Device.Power = true;
1293
- deviceData.Device.VaneVerticalDirection = 7;
1320
+ deviceData.Device.VaneVerticalDirection = state ? 7 : button.previousValue;
1294
1321
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.VaneVertical;
1295
1322
  break;
1296
1323
  case 27: //VANE H/V CONTROLS HIDE
1297
1324
  deviceData.Device.HideVaneControls = state;
1298
1325
  break;
1299
1326
  case 30: //FAN SPEED MODE AUTO
1327
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1300
1328
  deviceData.Device.Power = true;
1301
- deviceData.Device.FanSpeed = 0;
1329
+ deviceData.Device.FanSpeed = state ? 0 : button.previousValue;
1302
1330
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1303
1331
  break;
1304
1332
  case 31: //FAN SPEED MODE 1
1333
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1305
1334
  deviceData.Device.Power = true;
1306
- deviceData.Device.FanSpeed = 1;
1335
+ deviceData.Device.FanSpeed = state ? 1 : button.previousValue;
1307
1336
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1308
1337
  break;
1309
1338
  case 32: //FAN SPEED MODE 2
1339
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1310
1340
  deviceData.Device.Power = true;
1311
- deviceData.Device.FanSpeed = 2;
1341
+ deviceData.Device.FanSpeed = state ? 2 : button.previousValue;
1312
1342
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1313
1343
  break;
1314
1344
  case 33: //FAN SPEED MODE 3
1345
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1315
1346
  deviceData.Device.Power = true;
1316
- deviceData.Device.FanSpeed = 3;
1347
+ deviceData.Device.FanSpeed = state ? 3 : button.previousValue;
1317
1348
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1318
1349
  break;
1319
1350
  case 34: //FAN MODE 4
1351
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1320
1352
  deviceData.Device.Power = true;
1321
- deviceData.Device.FanSpeed = 4;
1353
+ deviceData.Device.FanSpeed = state ? 4 : button.previousValue;
1322
1354
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1323
1355
  break;
1324
1356
  case 35: //FAN SPEED MODE 5
1357
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1325
1358
  deviceData.Device.Power = true;
1326
- deviceData.Device.FanSpeed = 5;
1359
+ deviceData.Device.FanSpeed = state ? 5 : button.previousValue;
1327
1360
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1328
1361
  break;
1329
1362
  case 36: //FAN SPEED MODE 6
1363
+ button.previousValue = state ? deviceData.Device.FanSpeed : button.previousValue;
1330
1364
  deviceData.Device.Power = true;
1331
- deviceData.Device.FanSpeed = 6;
1365
+ deviceData.Device.FanSpeed = state ? 6 : button.previousValue;
1332
1366
  deviceData.Device.EffectiveFlags = CONSTANTS.AirConditioner.EffectiveFlags.Power + CONSTANTS.AirConditioner.EffectiveFlags.SetFanSpeed;
1333
1367
  break;
1334
1368
  case 37: //PHYSICAL LOCK CONTROLS
@@ -1355,7 +1389,7 @@ class DeviceAta extends EventEmitter {
1355
1389
  };
1356
1390
 
1357
1391
  await this.melCloudAta.send(deviceData);
1358
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${buttonName}`);
1392
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set: ' : 'Unset:'} ${buttonName}, Value: ${button.previousValue}`);
1359
1393
  } catch (error) {
1360
1394
  this.emit('warn', `Set button error: ${error}`);
1361
1395
  };
package/src/deviceatw.js CHANGED
@@ -66,9 +66,10 @@ class DeviceAtw extends EventEmitter {
66
66
  preset.serviceType = presetyServiceType;
67
67
  preset.characteristicType = presetCharacteristicType;
68
68
  preset.state = false;
69
+ preset.previousSettings = {};
69
70
  this.presetsConfigured.push(preset);
70
71
  } else {
71
- const log = presetDisplayType === 0 ? false : this.emit('message', `Preset Name: ${preset ? preset : 'Missing'}.`);
72
+ const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}.`);
72
73
  };
73
74
  }
74
75
  this.presetsConfiguredCount = this.presetsConfigured.length || 0;
@@ -87,9 +88,10 @@ class DeviceAtw extends EventEmitter {
87
88
  button.serviceType = buttonServiceType;
88
89
  button.characteristicType = buttonCharacteristicType;
89
90
  button.state = false;
91
+ button.previousValue = 0;
90
92
  this.buttonsConfigured.push(button);
91
93
  } else {
92
- const log = buttonDisplayType === 0 ? false : this.emit('message', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
94
+ const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
93
95
  };
94
96
  }
95
97
  this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
@@ -1563,7 +1565,6 @@ class DeviceAtw extends EventEmitter {
1563
1565
  if (this.presetsConfiguredCount > 0) {
1564
1566
  const debug = this.enableDebugMode ? this.emit('debug', `Prepare presets services`) : false;
1565
1567
  this.presetsServices = [];
1566
- const previousPresets = [];
1567
1568
 
1568
1569
  for (let i = 0; i < this.presetsConfiguredCount; i++) {
1569
1570
  const preset = this.presetsConfigured[i];
@@ -1590,7 +1591,7 @@ class DeviceAtw extends EventEmitter {
1590
1591
  try {
1591
1592
  switch (state) {
1592
1593
  case true:
1593
- previousPresets[i] = deviceData.Device;
1594
+ preset.previousSettings = deviceData.Device;
1594
1595
  deviceData.Device.Power = presetData.Power;
1595
1596
  deviceData.Device.EcoHotWater = presetData.EcoHotWater;
1596
1597
  deviceData.Device.OperationModeZone1 = presetData.OperationModeZone1;
@@ -1606,17 +1607,28 @@ class DeviceAtw extends EventEmitter {
1606
1607
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power;
1607
1608
  break;
1608
1609
  case false:
1609
- deviceData.Device = previousPresets[i];
1610
+ deviceData.Device.Power = preset.previousSettings.Power;
1611
+ deviceData.Device.EcoHotWater = preset.previousSettings.EcoHotWater;
1612
+ deviceData.Device.OperationModeZone1 = preset.previousSettings.OperationModeZone1;
1613
+ deviceData.Device.OperationModeZone2 = preset.previousSettings.OperationModeZone2;
1614
+ deviceData.Device.SetTankWaterTemperature = preset.previousSettings.SetTankWaterTemperature;
1615
+ deviceData.Device.SetTemperatureZone1 = preset.previousSettings.SetTemperatureZone1;
1616
+ deviceData.Device.SetTemperatureZone2 = preset.previousSettings.SetTemperatureZone2;
1617
+ deviceData.Device.ForcedHotWaterMode = preset.previousSettings.ForcedHotWaterMode;
1618
+ deviceData.Device.SetHeatFlowTemperatureZone1 = preset.previousSettings.SetHeatFlowTemperatureZone1;
1619
+ deviceData.Device.SetHeatFlowTemperatureZone2 = preset.previousSettings.SetHeatFlowTemperatureZone2;
1620
+ deviceData.Device.SetCoolFlowTemperatureZone1 = preset.previousSettings.SetCoolFlowTemperatureZone1;
1621
+ deviceData.Device.SetCoolFlowTemperatureZone2 = preset.previousSettings.SetCoolFlowTemperatureZone2;
1622
+ deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power;
1610
1623
  break;
1611
1624
  };
1612
1625
 
1613
1626
  await this.melCloudAtw.send(deviceData);
1614
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${presetName}`);
1627
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set:' : 'Unset:'} ${presetName}`);
1615
1628
  } catch (error) {
1616
1629
  this.emit('warn', `Set preset error: ${error}`);
1617
1630
  };
1618
1631
  });
1619
- previousPresets.push(deviceData.Device);
1620
1632
  this.presetsServices.push(presetService);
1621
1633
  accessory.addService(presetService);
1622
1634
  };
@@ -1662,13 +1674,15 @@ class DeviceAtw extends EventEmitter {
1662
1674
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power;
1663
1675
  break;
1664
1676
  case 1: //HEAT PUMP HEAT
1677
+ button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue;
1665
1678
  deviceData.Device.Power = true;
1666
- deviceData.Device.UnitStatus = 0;
1679
+ deviceData.Device.UnitStatus = state ? 0 : button.previousValue;
1667
1680
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationMode;
1668
1681
  break;
1669
1682
  case 2: //COOL
1683
+ button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue;
1670
1684
  deviceData.Device.Power = true;
1671
- deviceData.Device.UnitStatus = 1;
1685
+ deviceData.Device.UnitStatus = state ? 1 : button.previousValue;
1672
1686
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationMode;
1673
1687
  break;
1674
1688
  case 3: //HOLIDAY
@@ -1682,33 +1696,39 @@ class DeviceAtw extends EventEmitter {
1682
1696
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.ProhibitHeatingZone1 + CONSTANTS.HeatPump.EffectiveFlags.ProhibitHotWater + CONSTANTS.HeatPump.EffectiveFlags.ProhibitHeatingZone2;
1683
1697
  break;
1684
1698
  case 20: //ZONE 1 HEAT THERMOSTAT
1699
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1685
1700
  deviceData.Device.Power = true;
1686
- deviceData.Device.OperationModeZone1 = 0;
1701
+ deviceData.Device.OperationModeZone1 = state ? 0 : button.previousValue;
1687
1702
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1688
1703
  break;
1689
1704
  case 21: //HEAT FLOW
1705
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1690
1706
  deviceData.Device.Power = true;
1691
- deviceData.Device.OperationModeZone1 = 1;
1707
+ deviceData.Device.OperationModeZone1 = state ? 1 : button.previousValue;
1692
1708
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1693
1709
  break;
1694
1710
  case 22: //HEAT CURVE
1711
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1695
1712
  deviceData.Device.Power = true;
1696
- deviceData.Device.OperationModeZone1 = 2;
1713
+ deviceData.Device.OperationModeZone1 = state ? 2 : button.previousValue;
1697
1714
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1698
1715
  break;
1699
1716
  case 23: //COOL THERMOSTAT
1717
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1700
1718
  deviceData.Device.Power = true;
1701
- deviceData.Device.OperationModeZone1 = 3;
1719
+ deviceData.Device.OperationModeZone1 = state ? 3 : button.previousValue;
1702
1720
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1703
1721
  break;
1704
1722
  case 24: //COOL FLOW
1723
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1705
1724
  deviceData.Device.Power = true;
1706
- deviceData.Device.OperationModeZone1 = 4;
1725
+ deviceData.Device.OperationModeZone1 = state ? 4 : button.previousValue;
1707
1726
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1708
1727
  break;
1709
1728
  case 25: //FLOOR DRY UP
1729
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue;
1710
1730
  deviceData.Device.Power = true;
1711
- deviceData.Device.OperationModeZone1 = 5;
1731
+ deviceData.Device.OperationModeZone1 = state ? 5 : button.previousValue;
1712
1732
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone1;
1713
1733
  break;
1714
1734
  case 30: //PHYSICAL LOCK CONTROL
@@ -1730,33 +1750,39 @@ class DeviceAtw extends EventEmitter {
1730
1750
  CONSTANTS.HeatPump.EffectiveFlags.ProhibitHotWater;
1731
1751
  break;
1732
1752
  case 60: //ZONE 2 HEAT THERMOSTAT
1753
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1733
1754
  deviceData.Device.Power = true;
1734
- deviceData.Device.OperationModeZone2 = 0;
1755
+ deviceData.Device.OperationModeZone2 = state ? 0 : button.previousValue;
1735
1756
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1736
1757
  break;
1737
1758
  case 61: // HEAT FLOW
1759
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1738
1760
  deviceData.Device.Power = true;
1739
- deviceData.Device.OperationModeZone2 = 1;
1761
+ deviceData.Device.OperationModeZone2 = state ? 1 : button.previousValue;
1740
1762
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1741
1763
  break;
1742
1764
  case 62: //HEAT CURVE
1765
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1743
1766
  deviceData.Device.Power = true;
1744
- deviceData.Device.OperationModeZone2 = 2;
1767
+ deviceData.Device.OperationModeZone2 = state ? 2 : button.previousValue;
1745
1768
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1746
1769
  break;
1747
1770
  case 63: //COOL THERMOSTAT
1771
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1748
1772
  deviceData.Device.Power = true;
1749
- deviceData.Device.OperationModeZone2 = 3;
1773
+ deviceData.Device.OperationModeZone2 = state ? 3 : button.previousValue;
1750
1774
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1751
1775
  break;
1752
1776
  case 64: //COOL FLOW
1777
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1753
1778
  deviceData.Device.Power = true;
1754
- deviceData.Device.OperationModeZone2 = 4;
1779
+ deviceData.Device.OperationModeZone2 = state ? 4 : button.previousValue;
1755
1780
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1756
1781
  break;
1757
1782
  case 65: //FLOOR DRY UP
1783
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue;
1758
1784
  deviceData.Device.Power = true;
1759
- deviceData.Device.OperationModeZone2 = 5;
1785
+ deviceData.Device.OperationModeZone2 = state ? 5 : button.previousValue;
1760
1786
  deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.Power + CONSTANTS.HeatPump.EffectiveFlags.OperationModeZone2;
1761
1787
  break;
1762
1788
  case 70: //PHYSICAL LOCK CONTROL
@@ -1769,7 +1795,7 @@ class DeviceAtw extends EventEmitter {
1769
1795
  };
1770
1796
 
1771
1797
  await this.melCloudAtw.send(deviceData);
1772
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${buttonName}`);
1798
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set:' : 'Unset:'} ${buttonName}, Value: ${button.previousValue}`);
1773
1799
  } catch (error) {
1774
1800
  this.emit('warn', `Set button error: ${error}`);
1775
1801
  };
package/src/deviceerv.js CHANGED
@@ -60,9 +60,10 @@ class DeviceErv extends EventEmitter {
60
60
  preset.serviceType = presetyServiceType;
61
61
  preset.characteristicType = presetCharacteristicType;
62
62
  preset.state = false;
63
+ preset.previousSettings = {};
63
64
  this.presetsConfigured.push(preset);
64
65
  } else {
65
- const log = presetDisplayType === 0 ? false : this.emit('message', `Preset Name: ${preset ? preset : 'Missing'}.`);
66
+ const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}.`);
66
67
  };
67
68
  }
68
69
  this.presetsConfiguredCount = this.presetsConfigured.length || 0;
@@ -81,9 +82,10 @@ class DeviceErv extends EventEmitter {
81
82
  button.serviceType = buttonServiceType;
82
83
  button.characteristicType = buttonCharacteristicType;
83
84
  button.state = false;
85
+ button.previousValue = 0;
84
86
  this.buttonsConfigured.push(button);
85
87
  } else {
86
- const log = buttonDisplayType === 0 ? false : this.emit('message', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
88
+ const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}.`);
87
89
  };
88
90
  }
89
91
  this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
@@ -702,7 +704,7 @@ class DeviceErv extends EventEmitter {
702
704
  switch (displayMode) {
703
705
  case 1: //Heater Cooler
704
706
  const debug = this.enableDebugMode ? this.emit('debug', `Prepare heather/cooler service`) : false;
705
- this.melCloudService = accessory.addService(Service.HeaterCooler, serviceName, `HeaterCooler ${deviceId}`);
707
+ this.melCloudService = new Service.HeaterCooler(serviceName, `HeaterCooler ${deviceId}`);
706
708
  this.melCloudService.getCharacteristic(Characteristic.Active)
707
709
  .onGet(async () => {
708
710
  const state = this.accessory.power;
@@ -757,6 +759,11 @@ class DeviceErv extends EventEmitter {
757
759
  this.emit('warn', `Set operation mode error: ${error}`);
758
760
  };
759
761
  });
762
+ this.melCloudService.getCharacteristic(Characteristic.CurrentTemperature)
763
+ .onGet(async () => {
764
+ const value = this.accessory.roomTemperature;
765
+ return value;
766
+ });
760
767
  this.melCloudService.getCharacteristic(Characteristic.RotationSpeed)
761
768
  .setProps({
762
769
  minValue: 0,
@@ -792,16 +799,6 @@ class DeviceErv extends EventEmitter {
792
799
  this.emit('warn', `Set fan speed mode error: ${error}`);
793
800
  };
794
801
  });
795
- this.melCloudService.getCharacteristic(Characteristic.CurrentTemperature)
796
- .setProps({
797
- minValue: -35,
798
- maxValue: 150,
799
- minStep: 0.5
800
- })
801
- .onGet(async () => {
802
- const value = this.accessory.roomTemperature;
803
- return value;
804
- });
805
802
  //device can heat
806
803
  if (hasHeatOperationMode) {
807
804
  this.melCloudService.getCharacteristic(Characteristic.HeatingThresholdTemperature)
@@ -879,10 +876,11 @@ class DeviceErv extends EventEmitter {
879
876
  this.emit('warn', `Set temperature display unit error: ${error}`);
880
877
  };
881
878
  });
879
+ accessory.addService(this.melCloudService);
882
880
  break;
883
881
  case 2: //Thermostat
884
882
  const debug1 = this.enableDebugMode ? this.emit('debug', `Prepare thermostat service`) : false;
885
- this.melCloudService = accessory.addService(Service.Thermostat, serviceName, `Thermostat ${deviceId}`);
883
+ this.melCloudService = new Service.Thermostat(serviceName, `Thermostat ${deviceId}`);
886
884
  this.melCloudService.getCharacteristic(Characteristic.CurrentHeatingCoolingState)
887
885
  .onGet(async () => {
888
886
  const value = this.accessory.currentOperationMode;
@@ -930,11 +928,6 @@ class DeviceErv extends EventEmitter {
930
928
  };
931
929
  });
932
930
  this.melCloudService.getCharacteristic(Characteristic.CurrentTemperature)
933
- .setProps({
934
- minValue: -35,
935
- maxValue: 150,
936
- minStep: 0.5
937
- })
938
931
  .onGet(async () => {
939
932
  const value = this.accessory.roomTemperature;
940
933
  return value;
@@ -973,6 +966,7 @@ class DeviceErv extends EventEmitter {
973
966
  this.emit('warn', `Set temperature display unit error: ${error}`);
974
967
  };
975
968
  });
969
+ accessory.addService(this.melCloudService);
976
970
  break;
977
971
  };
978
972
 
@@ -1101,7 +1095,6 @@ class DeviceErv extends EventEmitter {
1101
1095
  if (this.presetsConfiguredCount > 0) {
1102
1096
  const debug = this.enableDebugMode ? this.emit('debug', `Prepare presets services`) : false;
1103
1097
  this.presetsServices = [];
1104
- const previousPresets = [];
1105
1098
 
1106
1099
  for (let i = 0; i < this.presetsConfiguredCount; i++) {
1107
1100
  const preset = this.presetsConfigured[i];
@@ -1128,7 +1121,7 @@ class DeviceErv extends EventEmitter {
1128
1121
  try {
1129
1122
  switch (state) {
1130
1123
  case true:
1131
- previousPresets[i] = deviceData.Device;
1124
+ preset.previousSettings = deviceData.Device;
1132
1125
  deviceData.Device.SetTemperature = presetData.SetTemperature;
1133
1126
  deviceData.Device.Power = presetData.Power;
1134
1127
  deviceData.Device.OperationMode = presetData.OperationMode;
@@ -1137,18 +1130,22 @@ class DeviceErv extends EventEmitter {
1137
1130
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power;
1138
1131
  break;
1139
1132
  case false:
1140
- deviceData.Device = previousPresets[i];
1133
+ deviceData.Device.SetTemperature = preset.previousSettings.SetTemperature;
1134
+ deviceData.Device.Power = preset.previousSettings.Power;
1135
+ deviceData.Device.OperationMode = preset.previousSettings.OperationMode;
1136
+ deviceData.Device.VentilationMode = preset.previousSettings.VentilationMode;
1137
+ deviceData.Device.SetFanSpeed = preset.previousSettings.FanSpeed;
1138
+ deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power;
1141
1139
  break;
1142
1140
  };
1143
1141
 
1144
1142
  await this.melCloudErv.send(deviceData);
1145
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${presetName}`);
1143
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set:' : 'Unset:'} ${presetName}`);
1146
1144
  } catch (error) {
1147
1145
  this.emit('warn', `Set preset error: ${error}`);
1148
1146
  };
1149
1147
  });
1150
1148
  };
1151
- previousPresets.push(deviceData.Device);
1152
1149
  this.presetsServices.push(presetService);
1153
1150
  accessory.addService(presetService);
1154
1151
  };
@@ -1189,18 +1186,21 @@ class DeviceErv extends EventEmitter {
1189
1186
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power;
1190
1187
  break;
1191
1188
  case 1: //OPERATING MODE RECOVERY
1189
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue;
1192
1190
  deviceData.Device.Power = true;
1193
- deviceData.Device.VentilationMode = 0;
1191
+ deviceData.Device.VentilationMode = state ? 0 : button.previousValue;
1194
1192
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.VentilationMode;
1195
1193
  break;
1196
1194
  case 2: //OPERATING MODE BYPASS
1195
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue;
1197
1196
  deviceData.Device.Power = true;
1198
- deviceData.Device.VentilationMode = 1;
1197
+ deviceData.Device.VentilationMode = state ? 1 : button.previousValue;
1199
1198
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.VentilationMode;
1200
1199
  break
1201
1200
  case 3: //OPERATING MODE AUTO
1201
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue;
1202
1202
  deviceData.Device.Power = true;
1203
- deviceData.Device.VentilationMode = 2;
1203
+ deviceData.Device.VentilationMode = state ? 2 : button.previousValue;
1204
1204
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.VentilationMode;
1205
1205
  break;
1206
1206
  case 4: //NIGHT PURGE MODE
@@ -1209,28 +1209,33 @@ class DeviceErv extends EventEmitter {
1209
1209
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power
1210
1210
  break;
1211
1211
  case 10: //FAN SPEED MODE AUTO
1212
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue;
1212
1213
  deviceData.Device.Power = true;
1213
- deviceData.Device.SetFanSpeed = 0;
1214
+ deviceData.Device.SetFanSpeed = state ? 0 : button.previousValue;
1214
1215
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.SetFanSpeed;
1215
1216
  break;
1216
1217
  case 11: //FAN SPEED MODE 1
1218
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue;
1217
1219
  deviceData.Device.Power = true;
1218
- deviceData.Device.SetFanSpeed = 1;
1220
+ deviceData.Device.SetFanSpeed = state ? 1 : button.previousValue;
1219
1221
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.SetFanSpeed;
1220
1222
  break;
1221
1223
  case 12: //FAN SPEED MODE 2
1224
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue;
1222
1225
  deviceData.Device.Power = true;
1223
- deviceData.Device.SetFanSpeed = 2;
1226
+ deviceData.Device.SetFanSpeed = state ? 2 : button.previousValue;
1224
1227
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.SetFanSpeed;
1225
1228
  break;
1226
1229
  case 13: //FAN SPEED MODE 3
1230
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue;
1227
1231
  deviceData.Device.Power = true;
1228
- deviceData.Device.SetFanSpeed = 3;
1232
+ deviceData.Device.SetFanSpeed = state ? 3 : button.previousValue;
1229
1233
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.SetFanSpeed;
1230
1234
  break;
1231
1235
  case 14: //FAN MODE 4
1236
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue;
1232
1237
  deviceData.Device.Power = true;
1233
- deviceData.Device.SetFanSpeed = 4;
1238
+ deviceData.Device.SetFanSpeed = state ? 4 : button.previousValue;
1234
1239
  deviceData.Device.EffectiveFlags = CONSTANTS.Ventilation.EffectiveFlags.Power + CONSTANTS.Ventilation.EffectiveFlags.SetFanSpeed;
1235
1240
  break;
1236
1241
  case 15: //PHYSICAL LOCK CONTROLS
@@ -1252,7 +1257,7 @@ class DeviceErv extends EventEmitter {
1252
1257
  };
1253
1258
 
1254
1259
  await this.melCloudErv.send(deviceData);
1255
- const info = this.disableLogInfo ? false : this.emit('message', `Set: ${buttonName}`);
1260
+ const info = this.disableLogInfo ? false : this.emit('message', `${state ? 'Set:' : 'Unset:'} ${buttonName}, Value: ${button.previousValue}`);
1256
1261
  } catch (error) {
1257
1262
  this.emit('warn', `Set button error: ${error}`);
1258
1263
  };