homebridge-melcloud-control 3.1.0-beta.0 → 3.1.0-beta.10
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/config.schema.json +63 -18
- package/homebridge-ui/public/index.html +34 -28
- package/package.json +2 -2
- package/src/deviceata.js +35 -28
- package/src/deviceatw.js +47 -40
- package/src/deviceerv.js +33 -26
package/config.schema.json
CHANGED
|
@@ -363,12 +363,31 @@
|
|
|
363
363
|
"description": "Select the operating mode for Auto, if this mode is not supported, it will be disabled.",
|
|
364
364
|
"required": true
|
|
365
365
|
},
|
|
366
|
+
"temperatureSensor": {
|
|
367
|
+
"title": "Room",
|
|
368
|
+
"type": "boolean",
|
|
369
|
+
"default": false,
|
|
370
|
+
"description": "This enable extra room temperature sensor to use with automations in HomeKit app.",
|
|
371
|
+
"required": false
|
|
372
|
+
},
|
|
373
|
+
"temperatureSensorOutdoor": {
|
|
374
|
+
"title": "Outdoor",
|
|
375
|
+
"type": "boolean",
|
|
376
|
+
"default": false,
|
|
377
|
+
"description": "This enable extra outdoor temperature sensor to use with automations in HomeKit app.",
|
|
378
|
+
"required": false
|
|
379
|
+
},
|
|
366
380
|
"presets": {
|
|
367
381
|
"title": "Presets",
|
|
368
382
|
"type": "array",
|
|
369
383
|
"items": {
|
|
370
384
|
"type": "object",
|
|
371
385
|
"properties": {
|
|
386
|
+
"id": {
|
|
387
|
+
"title": "ID",
|
|
388
|
+
"type": "integer",
|
|
389
|
+
"required": false
|
|
390
|
+
},
|
|
372
391
|
"name": {
|
|
373
392
|
"title": "Name",
|
|
374
393
|
"type": "string",
|
|
@@ -431,22 +450,11 @@
|
|
|
431
450
|
"required": false
|
|
432
451
|
}
|
|
433
452
|
}
|
|
453
|
+
},
|
|
454
|
+
"condition": {
|
|
455
|
+
"functionBody": "const presets = model.accounts[arrayIndices]?.devicesAta[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.id != null && preset.id !== ''); return hasValidPresets;"
|
|
434
456
|
}
|
|
435
457
|
},
|
|
436
|
-
"temperatureSensor": {
|
|
437
|
-
"title": "Room",
|
|
438
|
-
"type": "boolean",
|
|
439
|
-
"default": false,
|
|
440
|
-
"description": "This enable extra room temperature sensor to use with automations in HomeKit app.",
|
|
441
|
-
"required": false
|
|
442
|
-
},
|
|
443
|
-
"temperatureSensorOutdoor": {
|
|
444
|
-
"title": "Outdoor",
|
|
445
|
-
"type": "boolean",
|
|
446
|
-
"default": false,
|
|
447
|
-
"description": "This enable extra outdoor temperature sensor to use with automations in HomeKit app.",
|
|
448
|
-
"required": false
|
|
449
|
-
},
|
|
450
458
|
"buttonsSensors": {
|
|
451
459
|
"title": "Button / Sensor",
|
|
452
460
|
"type": "array",
|
|
@@ -735,6 +743,9 @@
|
|
|
735
743
|
"required": false
|
|
736
744
|
}
|
|
737
745
|
}
|
|
746
|
+
},
|
|
747
|
+
"condition": {
|
|
748
|
+
"functionBody": "const buttons = model.accounts[arrayIndices]?.devicesAta[arrayIndices]?.buttons || []; const hasValidButtons = buttons.length > 0 && buttons.every(button => button.name != null && button.name !== ''); return hasValidButtons;"
|
|
738
749
|
}
|
|
739
750
|
}
|
|
740
751
|
}
|
|
@@ -867,6 +878,11 @@
|
|
|
867
878
|
"items": {
|
|
868
879
|
"type": "object",
|
|
869
880
|
"properties": {
|
|
881
|
+
"id": {
|
|
882
|
+
"title": "ID",
|
|
883
|
+
"type": "integer",
|
|
884
|
+
"required": false
|
|
885
|
+
},
|
|
870
886
|
"name": {
|
|
871
887
|
"title": "Name",
|
|
872
888
|
"type": "string",
|
|
@@ -929,6 +945,9 @@
|
|
|
929
945
|
"required": false
|
|
930
946
|
}
|
|
931
947
|
}
|
|
948
|
+
},
|
|
949
|
+
"condition": {
|
|
950
|
+
"functionBody": "const presets = model.accounts[arrayIndices]?.devicesAtw[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.name != null && preset.name !== ''); return hasValidPresets;"
|
|
932
951
|
}
|
|
933
952
|
},
|
|
934
953
|
"buttonsSensors": {
|
|
@@ -1141,6 +1160,9 @@
|
|
|
1141
1160
|
"required": false
|
|
1142
1161
|
}
|
|
1143
1162
|
}
|
|
1163
|
+
},
|
|
1164
|
+
"condition": {
|
|
1165
|
+
"functionBody": "const buttons = model.accounts[arrayIndices]?.devicesAtw[arrayIndices]?.buttons || []; const hasValidButtons = buttons.length > 0 && buttons.every(button => button.name != null && button.name !== ''); return hasValidButtons;"
|
|
1144
1166
|
}
|
|
1145
1167
|
}
|
|
1146
1168
|
}
|
|
@@ -1180,7 +1202,7 @@
|
|
|
1180
1202
|
"type": "integer",
|
|
1181
1203
|
"minimum": 0,
|
|
1182
1204
|
"maximum": 2,
|
|
1183
|
-
"default":
|
|
1205
|
+
"default": 1,
|
|
1184
1206
|
"oneOf": [
|
|
1185
1207
|
{
|
|
1186
1208
|
"title": "None/Disabled",
|
|
@@ -1231,6 +1253,11 @@
|
|
|
1231
1253
|
"items": {
|
|
1232
1254
|
"type": "object",
|
|
1233
1255
|
"properties": {
|
|
1256
|
+
"id": {
|
|
1257
|
+
"title": "ID",
|
|
1258
|
+
"type": "integer",
|
|
1259
|
+
"required": false
|
|
1260
|
+
},
|
|
1234
1261
|
"name": {
|
|
1235
1262
|
"title": "Name",
|
|
1236
1263
|
"type": "string",
|
|
@@ -1293,6 +1320,9 @@
|
|
|
1293
1320
|
"required": false
|
|
1294
1321
|
}
|
|
1295
1322
|
}
|
|
1323
|
+
},
|
|
1324
|
+
"condition": {
|
|
1325
|
+
"functionBody": "const presets = model.accounts[arrayIndices]?.devicesErv[arrayIndices]?.presets || []; const hasValidPresets = presets.length > 0 && presets.every(preset => preset.name != null && preset.name !== ''); return hasValidPresets;"
|
|
1296
1326
|
}
|
|
1297
1327
|
},
|
|
1298
1328
|
"buttonsSensors": {
|
|
@@ -1457,6 +1487,9 @@
|
|
|
1457
1487
|
"required": false
|
|
1458
1488
|
}
|
|
1459
1489
|
}
|
|
1490
|
+
},
|
|
1491
|
+
"condition": {
|
|
1492
|
+
"functionBody": "const buttons = model.accounts[arrayIndices]?.devicesErv[arrayIndices]?.buttons || []; const hasValidButtons = buttons.length > 0 && buttons.every(button => button.name != null && button.name !== ''); return hasValidButtons;"
|
|
1460
1493
|
}
|
|
1461
1494
|
}
|
|
1462
1495
|
}
|
|
@@ -1706,8 +1739,12 @@
|
|
|
1706
1739
|
{
|
|
1707
1740
|
"key": "accounts[].ataDevices[].presets",
|
|
1708
1741
|
"type": "tabarray",
|
|
1709
|
-
"title": "{{ value.name
|
|
1742
|
+
"title": "{{ value.name }}",
|
|
1710
1743
|
"items": [
|
|
1744
|
+
{
|
|
1745
|
+
"key": "accounts[].ataDevices[].presets[].id",
|
|
1746
|
+
"readonly": true
|
|
1747
|
+
},
|
|
1711
1748
|
"accounts[].ataDevices[].presets[].name",
|
|
1712
1749
|
"accounts[].ataDevices[].presets[].displayType",
|
|
1713
1750
|
"accounts[].ataDevices[].presets[].namePrefix"
|
|
@@ -1796,8 +1833,12 @@
|
|
|
1796
1833
|
{
|
|
1797
1834
|
"key": "accounts[].atwDevices[].presets",
|
|
1798
1835
|
"type": "tabarray",
|
|
1799
|
-
"title": "{{ value.name
|
|
1836
|
+
"title": "{{ value.name }}",
|
|
1800
1837
|
"items": [
|
|
1838
|
+
{
|
|
1839
|
+
"key": "accounts[].atwDevices[].presets[].id",
|
|
1840
|
+
"readonly": true
|
|
1841
|
+
},
|
|
1801
1842
|
"accounts[].atwDevices[].presets[].name",
|
|
1802
1843
|
"accounts[].atwDevices[].presets[].displayType",
|
|
1803
1844
|
"accounts[].atwDevices[].presets[].namePrefix"
|
|
@@ -1880,8 +1921,12 @@
|
|
|
1880
1921
|
{
|
|
1881
1922
|
"key": "accounts[].ervDevices[].presets",
|
|
1882
1923
|
"type": "tabarray",
|
|
1883
|
-
"title": "{{ value.name
|
|
1924
|
+
"title": "{{ value.name }}",
|
|
1884
1925
|
"items": [
|
|
1926
|
+
{
|
|
1927
|
+
"key": "accounts[].ervDevices[].presets[].id",
|
|
1928
|
+
"readonly": true
|
|
1929
|
+
},
|
|
1885
1930
|
"accounts[].ervDevices[].presets[].name",
|
|
1886
1931
|
"accounts[].ervDevices[].presets[].displayType",
|
|
1887
1932
|
"accounts[].ervDevices[].presets[].namePrefix"
|
|
@@ -166,6 +166,8 @@
|
|
|
166
166
|
erv: [],
|
|
167
167
|
ervPresets: [],
|
|
168
168
|
};
|
|
169
|
+
|
|
170
|
+
//info text
|
|
169
171
|
let textAta = 'ATA: 0';
|
|
170
172
|
let textAtaPresets = 'Presets: 0';
|
|
171
173
|
let textAtw = 'ATW: 0';
|
|
@@ -178,12 +180,10 @@
|
|
|
178
180
|
case 0:
|
|
179
181
|
//get devices by type
|
|
180
182
|
for (const device of devices) {
|
|
181
|
-
const deviceId = device.DeviceID;
|
|
182
183
|
const deviceType = device.Type;
|
|
183
|
-
|
|
184
184
|
const pusDeviceTypeAta = deviceType === 0 ? devicesByType.ata.push(device) : false;
|
|
185
|
-
const pusDeviceTypeAtw = deviceType ===
|
|
186
|
-
const pusDeviceTypeErv = deviceType ===
|
|
185
|
+
const pusDeviceTypeAtw = deviceType === 1 ? devicesByType.atw.push(device) : false;
|
|
186
|
+
const pusDeviceTypeErv = deviceType === 3 ? devicesByType.erv.push(device) : false;
|
|
187
187
|
};
|
|
188
188
|
|
|
189
189
|
//get device info fom devices ata
|
|
@@ -192,9 +192,9 @@
|
|
|
192
192
|
const deviceType = device.Type;
|
|
193
193
|
const deviceTypeText = "Air Conditioner";
|
|
194
194
|
const deviceName = device.DeviceName;
|
|
195
|
-
const devicePresets = device.
|
|
195
|
+
const devicePresets = device.Presets ?? [];
|
|
196
196
|
|
|
197
|
-
//
|
|
197
|
+
//device ata
|
|
198
198
|
const deviceAta = {
|
|
199
199
|
id: deviceId,
|
|
200
200
|
type: deviceType,
|
|
@@ -219,22 +219,23 @@
|
|
|
219
219
|
textAta = `ATA: ${devicesCount}`
|
|
220
220
|
|
|
221
221
|
//presets
|
|
222
|
-
|
|
222
|
+
for (const preset of devicePresets) {
|
|
223
223
|
const presetId = preset.ID;
|
|
224
224
|
const presetName = preset.NumberDescription;
|
|
225
225
|
|
|
226
|
-
preset.
|
|
226
|
+
preset.id = presetId;
|
|
227
|
+
preset.name = presetName;
|
|
227
228
|
preset.displayType == 0;
|
|
228
229
|
preset.namePrefix = false;
|
|
229
230
|
|
|
230
231
|
const ataPresetsExist = pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets ?? false;
|
|
231
232
|
const ataPresets = ataPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].ataDevices[index].presets = [];
|
|
232
|
-
const ataPresetIdExist = ataPresets.some(preset => preset.
|
|
233
|
+
const ataPresetIdExist = ataPresets.some(preset => preset.id === presetId);
|
|
233
234
|
const pushPresetAta = ataPresetIdExist ? false : ataPresets.push(preset);
|
|
234
235
|
const pushNewPreset = ataPresetIdExist ? false : newDevices.ataPresets.push(preset);
|
|
235
236
|
const presetsCount = newDevices.ataPresets.length;
|
|
236
237
|
textAtaPresets = `ATA Presets: ${presetsCount}`
|
|
237
|
-
}
|
|
238
|
+
};
|
|
238
239
|
});
|
|
239
240
|
|
|
240
241
|
//get device info fom devices atw
|
|
@@ -243,9 +244,9 @@
|
|
|
243
244
|
const deviceType = device.Type;
|
|
244
245
|
const deviceTypeText = "Heat Pump";
|
|
245
246
|
const deviceName = device.DeviceName;
|
|
246
|
-
const devicePresets = device.
|
|
247
|
+
const devicePresets = device.Presets ?? [];
|
|
247
248
|
|
|
248
|
-
//
|
|
249
|
+
//device atw
|
|
249
250
|
const deviceAtw = {
|
|
250
251
|
id: deviceId,
|
|
251
252
|
type: deviceType,
|
|
@@ -271,35 +272,38 @@
|
|
|
271
272
|
const atwDeviceIdExist = atwDevices.some(device => device.id === deviceId);
|
|
272
273
|
const pushTypeAtw = atwDeviceIdExist ? false : atwDevices.push(deviceAtw);
|
|
273
274
|
const pushNewDevice = atwDeviceIdExist ? false : newDevices.atw.push(device);
|
|
274
|
-
const devicesCount = newDevices.
|
|
275
|
+
const devicesCount = newDevices.atw.length;
|
|
275
276
|
textAtw = `ATW: ${devicesCount}`
|
|
276
277
|
|
|
277
278
|
//presetzs
|
|
278
|
-
|
|
279
|
+
for (const preset of devicePresets) {
|
|
279
280
|
const presetId = preset.ID;
|
|
280
281
|
const presetName = preset.NumberDescription;
|
|
281
282
|
|
|
282
|
-
preset.
|
|
283
|
+
preset.id = presetId;
|
|
284
|
+
preset.name = presetName;
|
|
283
285
|
preset.displayType == 0;
|
|
284
286
|
preset.namePrefix = false;
|
|
285
287
|
|
|
286
288
|
const atwPresetsExist = pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets ?? false;
|
|
287
289
|
const atwPresets = atwPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].atwDevices[index].presets = [];
|
|
288
|
-
const atwPresetIdExist = atwPresets.some(preset => preset.
|
|
290
|
+
const atwPresetIdExist = atwPresets.some(preset => preset.id === presetId);
|
|
289
291
|
const pushPresetAtw = atwPresetIdExist ? false : atwPresets.push(preset);
|
|
290
292
|
const pushNewPreset = atwPresetIdExist ? false : newDevices.atwPresets.push(preset);
|
|
291
293
|
const presetsCount = newDevices.atwPresets.length;
|
|
292
294
|
textAtwPresets = `ATW Presets: ${presetsCount}`
|
|
293
|
-
}
|
|
295
|
+
};
|
|
294
296
|
});
|
|
295
297
|
|
|
296
298
|
//get device info fom devices erv
|
|
297
|
-
devicesByType.
|
|
299
|
+
devicesByType.erv.forEach((device, index) => {
|
|
298
300
|
const deviceId = device.DeviceID;
|
|
299
301
|
const deviceType = device.Type;
|
|
300
302
|
const deviceTypeText = "Energy Recovery Ventilation";
|
|
301
303
|
const deviceName = device.DeviceName;
|
|
302
|
-
const devicePresets = device.
|
|
304
|
+
const devicePresets = device.Presets ?? [];
|
|
305
|
+
|
|
306
|
+
//device erv
|
|
303
307
|
const deviceErv = {
|
|
304
308
|
id: deviceId,
|
|
305
309
|
type: deviceType,
|
|
@@ -319,33 +323,35 @@
|
|
|
319
323
|
const ervDeviceIdExist = ervDevices.some(device => device.id === deviceId);
|
|
320
324
|
const pushTypeerv = ervDeviceIdExist ? false : ervDevices.push(deviceErv);
|
|
321
325
|
const pushNewDevice = ervDeviceIdExist ? false : newDevices.erv.push(device);
|
|
322
|
-
const devicesCount = newDevices.
|
|
326
|
+
const devicesCount = newDevices.erv.length;
|
|
323
327
|
textErv = `ERV: ${devicesCount}`
|
|
324
328
|
|
|
325
329
|
//presets
|
|
326
|
-
|
|
330
|
+
for (const preset of devicePresets) {
|
|
327
331
|
const presetId = preset.ID;
|
|
328
332
|
const presetName = preset.NumberDescription;
|
|
329
333
|
|
|
330
|
-
preset.
|
|
334
|
+
preset.id = presetId;
|
|
335
|
+
preset.name = presetName;
|
|
331
336
|
preset.displayType == 0;
|
|
332
337
|
preset.namePrefix = false;
|
|
333
338
|
|
|
334
|
-
const
|
|
335
|
-
const
|
|
336
|
-
const ervPresetIdExist = ervPresets.some(preset => preset.
|
|
337
|
-
const pushPresetErv =
|
|
339
|
+
const ervPresetsExist = pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets ?? false;
|
|
340
|
+
const ervPresets = ervPresetsExist ? pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets : pluginConfig[0].accounts[this.deviceIndex].ervDevices[index].presets = [];
|
|
341
|
+
const ervPresetIdExist = ervPresets.some(preset => preset.id === presetId);
|
|
342
|
+
const pushPresetErv = ervPresetIdExist ? false : ervPresets.push(preset);
|
|
338
343
|
const pushNewPreset = ervPresetIdExist ? false : newDevices.ervPresets.push(preset);
|
|
339
344
|
const presetsCount = newDevices.ervPresets.length;
|
|
340
345
|
textErvPresets = `ERV Presets: ${presetsCount}`
|
|
341
|
-
}
|
|
346
|
+
};
|
|
342
347
|
});
|
|
343
348
|
|
|
344
349
|
const newDevicesCount = newDevices.ata.length + newDevices.atw.length + newDevices.erv.length;
|
|
345
350
|
const newPresetsCount = newDevices.ataPresets.length + newDevices.atwPresets.length + newDevices.ervPresets.length;
|
|
346
351
|
document.getElementById('info').innerHTML = `${newDevicesCount === 0 ? 'No new devices found.' : `Found, ${textAta}, ${textAtw}, ${textErv}. ${newDevicesCount === 0 ? '' : 'Now You can start to configure it.'}`}`;
|
|
352
|
+
document.getElementById('info').style.color = newDevicesCount === 0 ? 'yellow' : 'green';
|
|
347
353
|
document.getElementById('info1').innerHTML = `${newPresetsCount === 0 ? 'No new presets found.' : `Found, ${textAtaPresets}, ${textAtwPresets}, ${textErvPresets}. ${newPresetsCount === 0 ? '' : 'Now You can start to configure it.'}`}`;
|
|
348
|
-
document.getElementById('
|
|
354
|
+
document.getElementById('info1').style.color = newPresetsCount === 0 ? 'yellow' : 'green';
|
|
349
355
|
|
|
350
356
|
await homebridge.updatePluginConfig(pluginConfig);
|
|
351
357
|
await homebridge.savePluginConfig(pluginConfig);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "3.1.0-beta.
|
|
4
|
+
"version": "3.1.0-beta.10",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@homebridge/plugin-ui-utils": "^1.0.3",
|
|
36
36
|
"async-mqtt": "^2.6.3",
|
|
37
|
-
"axios": "^1.7.
|
|
37
|
+
"axios": "^1.7.6",
|
|
38
38
|
"express": "^4.19.2"
|
|
39
39
|
},
|
|
40
40
|
"keywords": [
|
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
|
-
|
|
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 =
|
|
1111
|
-
deviceState.Power =
|
|
1112
|
-
deviceState.OperationMode =
|
|
1113
|
-
deviceState.VaneHorizontal =
|
|
1114
|
-
deviceState.VaneVertical =
|
|
1115
|
-
deviceState.SetFanSpeed =
|
|
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
|
-
|
|
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 =
|
|
1559
|
-
deviceState.EcoHotWater =
|
|
1560
|
-
deviceState.OperationModeZone1 =
|
|
1561
|
-
deviceState.OperationModeZone2 =
|
|
1562
|
-
deviceState.SetTankWaterTemperature =
|
|
1563
|
-
deviceState.SetTemperatureZone1 =
|
|
1564
|
-
deviceState.SetTemperatureZone2 =
|
|
1565
|
-
deviceState.ForcedHotWaterMode =
|
|
1566
|
-
deviceState.SetHeatFlowTemperatureZone1 =
|
|
1567
|
-
deviceState.SetHeatFlowTemperatureZone2 =
|
|
1568
|
-
deviceState.SetCoolFlowTemperatureZone1 =
|
|
1569
|
-
deviceState.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
|
-
|
|
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 =
|
|
1108
|
-
deviceState.Power =
|
|
1109
|
-
deviceState.OperationMode =
|
|
1110
|
-
deviceState.VentilationMode =
|
|
1111
|
-
deviceState.SetFanSpeed =
|
|
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:
|