homebridge-melcloud-control 4.3.8-beta.2 → 4.3.9-beta.0
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 +8 -0
- package/homebridge-ui/public/index.html +23 -28
- package/index.js +2 -2
- package/package.json +1 -1
- package/src/melcloudhome.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -22,6 +22,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
22
22
|
|
|
23
23
|
- Do not use Homebridge UI > v5.5.0 because of break config.json
|
|
24
24
|
|
|
25
|
+
# [4.3.8] - (29.11.2025)
|
|
26
|
+
|
|
27
|
+
## Changes
|
|
28
|
+
|
|
29
|
+
- display warning if device is disabled in config
|
|
30
|
+
- display warning if device not exist in MELCLoud and is configured in config
|
|
31
|
+
- cleanup
|
|
32
|
+
|
|
25
33
|
# [4.3.7] - (28.11.2025)
|
|
26
34
|
|
|
27
35
|
## Changes
|
|
@@ -230,11 +230,12 @@
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
document.getElementById('logIn').addEventListener('click', async () => {
|
|
233
|
+
homebridge.showSpinner();
|
|
234
|
+
|
|
233
235
|
document.getElementById(`logIn`).className = "btn btn-primary";
|
|
234
236
|
updateInfo('info', '', 'white');
|
|
235
237
|
updateInfo('info1', '', 'white');
|
|
236
238
|
updateInfo('info2', '', 'white');
|
|
237
|
-
homebridge.showSpinner();
|
|
238
239
|
|
|
239
240
|
try {
|
|
240
241
|
const account = this.account;
|
|
@@ -246,32 +247,27 @@
|
|
|
246
247
|
}
|
|
247
248
|
|
|
248
249
|
// Initialize devices arrays
|
|
249
|
-
const
|
|
250
|
-
const
|
|
250
|
+
const newInMelCloud = { ata: [], ataPresets: [], ataSchedules: [], atw: [], atwPresets: [], atwSchedules: [], erv: [], ervPresets: [], ervSchedules: [], scenes: [] };
|
|
251
|
+
const devicesInMelCloudByType = { ata: [], atw: [], erv: [] };
|
|
252
|
+
const scenesInMelCloud = response.Scenes ?? []
|
|
251
253
|
|
|
252
254
|
response.Devices.forEach(device => {
|
|
253
|
-
device.
|
|
254
|
-
if (device.Type ===
|
|
255
|
-
if (device.Type ===
|
|
256
|
-
if (device.Type === 3) devicesByType.erv.push(device);
|
|
255
|
+
if (device.Type === 0) devicesInMelCloudByType.ata.push(device);
|
|
256
|
+
if (device.Type === 1) devicesInMelCloudByType.atw.push(device);
|
|
257
|
+
if (device.Type === 3) devicesInMelCloudByType.erv.push(device);
|
|
257
258
|
});
|
|
258
259
|
|
|
259
260
|
account.ataDevices ??= [];
|
|
260
261
|
account.atwDevices ??= [];
|
|
261
262
|
account.ervDevices ??= [];
|
|
262
263
|
|
|
263
|
-
const removedAta = removeStaleDevices(account.ataDevices,
|
|
264
|
-
const removedAtw = removeStaleDevices(account.atwDevices,
|
|
265
|
-
const removedErv = removeStaleDevices(account.ervDevices,
|
|
264
|
+
const removedAta = removeStaleDevices(account.ataDevices, devicesInMelCloudByType.ata);
|
|
265
|
+
const removedAtw = removeStaleDevices(account.atwDevices, devicesInMelCloudByType.atw);
|
|
266
|
+
const removedErv = removeStaleDevices(account.ervDevices, devicesInMelCloudByType.erv);
|
|
266
267
|
|
|
267
|
-
const handleDevices = (devicesInMelCloud, devicesInConfig, typeString,
|
|
268
|
+
const handleDevices = (devicesInMelCloud, devicesInConfig, typeString, newDevices, newPresets, newSchedules, newScenes) => {
|
|
268
269
|
try {
|
|
269
270
|
const configDevicesMap = new Map(devicesInConfig.map(dev => [String(dev.id), dev]));
|
|
270
|
-
const isMelcloud = account.type === 'melcloud';
|
|
271
|
-
|
|
272
|
-
const idKey = isMelcloud ? 'ID' : 'Id';
|
|
273
|
-
const typeKey = isMelcloud ? 'Presets' : 'Schedule';
|
|
274
|
-
const typeKey1 = isMelcloud ? 'presets' : 'schedules';
|
|
275
271
|
|
|
276
272
|
devicesInMelCloud.forEach(device => {
|
|
277
273
|
const deviceId = String(device.DeviceID);
|
|
@@ -291,7 +287,7 @@
|
|
|
291
287
|
buttonsSensors: []
|
|
292
288
|
};
|
|
293
289
|
devicesInConfig.push(deviceInConfig);
|
|
294
|
-
|
|
290
|
+
newDevices.push(deviceInConfig);
|
|
295
291
|
configDevicesMap.set(deviceId, deviceInConfig);
|
|
296
292
|
}
|
|
297
293
|
|
|
@@ -369,7 +365,6 @@
|
|
|
369
365
|
}
|
|
370
366
|
|
|
371
367
|
// === Process scenes ===
|
|
372
|
-
const scenesInMelCloud = device.Scenes || [];
|
|
373
368
|
const scenesInConfig = deviceInConfig.scenes || [];
|
|
374
369
|
const sceneIds = new Set(scenesInConfig.map(s => String(s.id)));
|
|
375
370
|
|
|
@@ -411,25 +406,25 @@
|
|
|
411
406
|
}
|
|
412
407
|
};
|
|
413
408
|
|
|
414
|
-
account.ataDevices = handleDevices(
|
|
415
|
-
account.atwDevices = handleDevices(
|
|
416
|
-
account.ervDevices = handleDevices(
|
|
409
|
+
account.ataDevices = handleDevices(devicesInMelCloudByType.ata, account.ataDevices, "Air Conditioner", newInMelCloud.ata, newInMelCloud.ataPresets, newInMelCloud.ataSchedules, newInMelCloud.scenes);
|
|
410
|
+
account.atwDevices = handleDevices(devicesInMelCloudByType.atw, account.atwDevices, "Heat Pump", newInMelCloud.atw, newInMelCloud.atwPresets, newInMelCloud.atwSchedules, newInMelCloud.scenes);
|
|
411
|
+
account.ervDevices = handleDevices(devicesInMelCloudByType.erv, account.ervDevices, "Energy Recovery Ventilation", newInMelCloud.erv, newInMelCloud.ervPresets, newInMelCloud.ervSchedules, newInMelCloud.scenes);
|
|
417
412
|
|
|
418
|
-
const newDevicesCount =
|
|
419
|
-
const newPresetsCount =
|
|
420
|
-
const newSchedulesCount =
|
|
421
|
-
const newScenesCount =
|
|
413
|
+
const newDevicesCount = newInMelCloud.ata.length + newInMelCloud.atw.length + newInMelCloud.erv.length;
|
|
414
|
+
const newPresetsCount = newInMelCloud.ataPresets.length + newInMelCloud.atwPresets.length + newInMelCloud.ervPresets.length;
|
|
415
|
+
const newSchedulesCount = newInMelCloud.ataSchedules.length + newInMelCloud.atwSchedules.length + newInMelCloud.ervSchedules.length;
|
|
416
|
+
const newScenesCount = newInMelCloud.scenes.length;
|
|
422
417
|
const removedDevicesCount = removedAta.length + removedAtw.length + removedErv.length;
|
|
423
418
|
|
|
424
419
|
if (!newDevicesCount && !newPresetsCount && !newSchedulesCount && !newScenesCount && !removedDevicesCount) {
|
|
425
420
|
updateInfo('info', 'No changes detected.', 'white');
|
|
426
421
|
} else {
|
|
427
422
|
if (newDevicesCount)
|
|
428
|
-
updateInfo('info', `Found new devices: ${
|
|
423
|
+
updateInfo('info', `Found new devices: ${newInMelCloud.ata.length ? `ATA: ${newInMelCloud.ata.length},` : ''} ${newInMelCloud.atw.length ? `ATW: ${newInMelCloud.atw.length},` : ''} ${newInMelCloud.erv.length ? `ERV: ${newInMelCloud.erv.length},` : ''}.`, 'green');
|
|
429
424
|
if (newPresetsCount)
|
|
430
|
-
updateInfo('info1', `Found new presets: ${
|
|
425
|
+
updateInfo('info1', `Found new presets: ${newInMelCloud.ataPresets.length ? `ATA: ${newInMelCloud.ataPresets.length},` : ''} ${newInMelCloud.atwPresets.length ? `ATW: ${newInMelCloud.atwPresets.length},` : ''} ${newInMelCloud.ervPresets.length ? `ERV: ${newInMelCloud.ervPresets.length}` : ''}.`, 'green');
|
|
431
426
|
if (newScenesCount || newSchedulesCount)
|
|
432
|
-
updateInfo('info1', `Found new ${newSchedulesCount ? `schedules:` : ''} ${
|
|
427
|
+
updateInfo('info1', `Found new ${newSchedulesCount ? `schedules:` : ''} ${newInMelCloud.ataSchedules.length ? `ATA: ${newInMelCloud.ataSchedules.length},` : ''} ${newInMelCloud.atwSchedules.length ? `ATW: ${newInMelCloud.atwSchedules.length},` : ''} ${newInMelCloud.ervSchedules.length ? `ERV: ${newInMelCloud.ervSchedules.length},` : ''} ${newScenesCount ? `scenes: ${newScenesCount}` : ''}.`, 'green');
|
|
433
428
|
if (removedDevicesCount)
|
|
434
429
|
updateInfo('info2', `Removed devices: ${removedAta.length ? `ATA: ${removedAta.length},` : ''} ${removedAtw.length ? `ATW: ${removedAtw.length},` : ''} ${removedErv.length ? `ERV: ${removedErv.length}` : ''}.`, 'orange');
|
|
435
430
|
}
|
package/index.js
CHANGED
|
@@ -140,14 +140,14 @@ class MelCloudPlatform {
|
|
|
140
140
|
//chack device is not disabled in config
|
|
141
141
|
const displayType = device.displayType > 0;
|
|
142
142
|
if (!displayType) {
|
|
143
|
-
if (logLevel.warn) log.warn(`${accountName}, ${deviceTypeString}, ${deviceName} disabled in config, will not be published in Home app.`);
|
|
143
|
+
if (logLevel.warn) log.warn(`${accountName}, ${deviceTypeString}, ${deviceName}, disabled in config, will not be published in Home app.`);
|
|
144
144
|
continue;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
//chack device from config exist on melcloud
|
|
148
148
|
const deviceExistInMelCloud = melcloudDevicesList.Devices.some(dev => dev.DeviceID === device.id);
|
|
149
149
|
if (!deviceExistInMelCloud) {
|
|
150
|
-
if (logLevel.warn) log.warn(`${accountName}, ${deviceTypeString}, ${deviceName} not exist
|
|
150
|
+
if (logLevel.warn) log.warn(`${accountName}, ${deviceTypeString}, ${deviceName}, not exist on server, please login to MELCLoud from plugin UI to fix this issue.`);
|
|
151
151
|
continue;
|
|
152
152
|
}
|
|
153
153
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.3.
|
|
4
|
+
"version": "4.3.9-beta.0",
|
|
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/melcloudhome.js
CHANGED
|
@@ -264,7 +264,7 @@ class MelCloudHome extends EventEmitter {
|
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
devicesList.State = true;
|
|
267
|
-
devicesList.Info = `Found ${devicesCount} devices and ${scenes.length} scenes`;
|
|
267
|
+
devicesList.Info = `Found ${devicesCount} devices ${scenes.length > 0 ? `and ${scenes.length} scenes` : ''}`;
|
|
268
268
|
devicesList.Devices = devices;
|
|
269
269
|
devicesList.Scenes = scenes;
|
|
270
270
|
devicesList.Headers = this.headers;
|