homebridge-melcloud-control 4.4.1-beta.40 → 4.4.1-beta.42
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/homebridge-ui/public/index.html +46 -30
- package/package.json +1 -1
|
@@ -205,12 +205,13 @@
|
|
|
205
205
|
});
|
|
206
206
|
|
|
207
207
|
// Generic remove function
|
|
208
|
-
function removeStaleEntities(configEntities, MelcloudEntities, getConfigId, getMelcloudId) {
|
|
209
|
-
const serverIds = new Set(MelcloudEntities.map(item => String(getMelcloudId(item))));
|
|
208
|
+
function removeStaleEntities(configEntities, MelcloudEntities, getConfigId, getMelcloudId, filterFn) {
|
|
209
|
+
const serverIds = new Set((MelcloudEntities ?? []).map(item => String(getMelcloudId(item))));
|
|
210
210
|
const removedEntities = [];
|
|
211
211
|
|
|
212
212
|
for (let i = configEntities.length - 1; i >= 0; i--) {
|
|
213
213
|
const entity = configEntities[i];
|
|
214
|
+
if (filterFn && !filterFn(entity)) continue; // jeśli nie dotyczy tego urządzenia, pomiń
|
|
214
215
|
const entityId = String(getConfigId(entity));
|
|
215
216
|
|
|
216
217
|
if (!serverIds.has(entityId)) {
|
|
@@ -222,6 +223,8 @@
|
|
|
222
223
|
return removedEntities;
|
|
223
224
|
}
|
|
224
225
|
|
|
226
|
+
|
|
227
|
+
// Update info on page
|
|
225
228
|
function updateInfo(id, text, color) {
|
|
226
229
|
const el = document.getElementById(id);
|
|
227
230
|
if (el) {
|
|
@@ -230,6 +233,22 @@
|
|
|
230
233
|
}
|
|
231
234
|
}
|
|
232
235
|
|
|
236
|
+
// Map UnitId → Scenes for quick lookup
|
|
237
|
+
function mapUnitIdToScenes(scenesInMelCloud) {
|
|
238
|
+
const map = new Map();
|
|
239
|
+
|
|
240
|
+
(scenesInMelCloud ?? []).forEach(scene => {
|
|
241
|
+
const allSceneSettings = [...(scene.AtaSceneSettings ?? []), ...(scene.AtwSceneSettings ?? []), ...(scene.ErvSceneSettings ?? [])];
|
|
242
|
+
allSceneSettings.forEach(setting => {
|
|
243
|
+
const unitId = String(setting.UnitId);
|
|
244
|
+
if (!map.has(unitId)) map.set(unitId, []);
|
|
245
|
+
map.get(unitId).push(scene);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
return map;
|
|
250
|
+
}
|
|
251
|
+
|
|
233
252
|
// Login & Sync Logic
|
|
234
253
|
document.getElementById('logIn').addEventListener('click', async () => {
|
|
235
254
|
homebridge.showSpinner();
|
|
@@ -253,12 +272,14 @@
|
|
|
253
272
|
const devicesInMelCloudByType = { ata: [], atw: [], erv: [] };
|
|
254
273
|
const scenesInMelCloud = response.Scenes ?? [];
|
|
255
274
|
|
|
256
|
-
|
|
275
|
+
// Split devices by type
|
|
276
|
+
response.Devices ?? [].forEach(device => {
|
|
257
277
|
if (device.Type === 0) devicesInMelCloudByType.ata.push(device);
|
|
258
278
|
if (device.Type === 1) devicesInMelCloudByType.atw.push(device);
|
|
259
279
|
if (device.Type === 3) devicesInMelCloudByType.erv.push(device);
|
|
260
280
|
});
|
|
261
281
|
|
|
282
|
+
// Clean up local config
|
|
262
283
|
account.ataDevices = (account.ataDevices ?? []).filter(d => String(d.id) !== '0');
|
|
263
284
|
account.atwDevices = (account.atwDevices ?? []).filter(d => String(d.id) !== '0');
|
|
264
285
|
account.ervDevices = (account.ervDevices ?? []).filter(d => String(d.id) !== '0');
|
|
@@ -268,32 +289,28 @@
|
|
|
268
289
|
const removedFromConfigErv = removeStaleEntities(account.ervDevices, devicesInMelCloudByType.erv, d => d.id, d => d.DeviceID);
|
|
269
290
|
const removedFromConfig = { ataPresets: [], atwPresets: [], ervPresets: [], ataSchedules: [], atwSchedules: [], ervSchedules: [], scenes: [] };
|
|
270
291
|
|
|
292
|
+
// Map UnitId → Scenes
|
|
293
|
+
const unitIdToScenes = mapUnitIdToScenes(scenesInMelCloud);
|
|
271
294
|
|
|
272
|
-
//
|
|
295
|
+
// Generic device handler (obsługuje urządzenia, presety, harmonogramy i sceny)
|
|
273
296
|
const handleDevices = (devicesInMelCloud, devicesInConfig, deviceTypeString, newDevices, newPresets, newSchedules, newScenes) => {
|
|
274
297
|
const configDevicesMap = new Map(devicesInConfig.map(dev => [String(dev.id), dev]));
|
|
275
298
|
|
|
276
299
|
devicesInMelCloud.forEach(device => {
|
|
277
|
-
const deviceId = String(device.DeviceID);
|
|
300
|
+
const deviceId = String(device.DeviceID);
|
|
278
301
|
let deviceInConfig = configDevicesMap.get(deviceId);
|
|
279
302
|
|
|
280
303
|
if (!deviceInConfig) {
|
|
281
|
-
deviceInConfig = {
|
|
282
|
-
id: deviceId,
|
|
283
|
-
type: device.Type,
|
|
284
|
-
deviceTypeString,
|
|
285
|
-
displayType: 0,
|
|
286
|
-
name: device.DeviceName,
|
|
287
|
-
};
|
|
304
|
+
deviceInConfig = { id: deviceId, type: device.Type, deviceTypeString, displayType: 0, name: device.DeviceName };
|
|
288
305
|
devicesInConfig.push(deviceInConfig);
|
|
289
306
|
newDevices.push(deviceInConfig);
|
|
290
307
|
configDevicesMap.set(deviceId, deviceInConfig);
|
|
291
308
|
}
|
|
292
309
|
|
|
293
|
-
//
|
|
310
|
+
// PRESETS (melcloud)
|
|
294
311
|
if (account.type === 'melcloud') {
|
|
295
312
|
deviceInConfig.presets = deviceInConfig.presets ?? [];
|
|
296
|
-
const presetsInMelCloud = device.Presets
|
|
313
|
+
const presetsInMelCloud = device.Presets ?? [];
|
|
297
314
|
removedFromConfig.ataPresets.push(...removeStaleEntities(deviceInConfig.presets, presetsInMelCloud, p => p.id, p => p.ID));
|
|
298
315
|
const presetIds = new Set(deviceInConfig.presets.map(p => String(p.id)));
|
|
299
316
|
presetsInMelCloud.forEach((preset, index) => {
|
|
@@ -311,11 +328,11 @@
|
|
|
311
328
|
});
|
|
312
329
|
}
|
|
313
330
|
|
|
314
|
-
//
|
|
331
|
+
// SCHEDULES & SCENES (melcloudhome)
|
|
315
332
|
if (account.type === 'melcloudhome') {
|
|
316
333
|
// SCHEDULES
|
|
317
334
|
deviceInConfig.schedules = deviceInConfig.schedules ?? [];
|
|
318
|
-
const schedulesInMelCloud = device.Schedule
|
|
335
|
+
const schedulesInMelCloud = device.Schedule ?? [];
|
|
319
336
|
removedFromConfig.ataSchedules.push(...removeStaleEntities(deviceInConfig.schedules, schedulesInMelCloud, s => s.id, s => s.Id));
|
|
320
337
|
const scheduleIds = new Set(deviceInConfig.schedules.map(s => String(s.id)));
|
|
321
338
|
schedulesInMelCloud.forEach((schedule, index) => {
|
|
@@ -334,17 +351,16 @@
|
|
|
334
351
|
|
|
335
352
|
// SCENES
|
|
336
353
|
deviceInConfig.scenes = deviceInConfig.scenes ?? [];
|
|
354
|
+
const scenesForDevice = unitIdToScenes.get(deviceId) ?? [];
|
|
337
355
|
|
|
338
|
-
//
|
|
339
|
-
removedFromConfig.scenes.push(...removeStaleEntities(deviceInConfig.scenes,
|
|
340
|
-
const sceneIds = new Set(deviceInConfig.scenes.map(s => String(s.id)));
|
|
341
|
-
scenesInMelCloud.forEach((scene, index) => {
|
|
342
|
-
const sceneId = String(scene.Id);
|
|
343
|
-
|
|
344
|
-
// Sprawdzamy, czy scena dotyczy danego urządzenia w AtaSceneSettings lub AtwSceneSettings
|
|
345
|
-
const appliesToDevice = (scene.AtaSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id) || (scene.AtwSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id) || (scene.ErvSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id);
|
|
356
|
+
// Usuń stare sceny tylko dla tego urządzenia
|
|
357
|
+
removedFromConfig.scenes.push(...removeStaleEntities(deviceInConfig.scenes, scenesForDevice, s => s.id, s => s.Id));
|
|
346
358
|
|
|
347
|
-
|
|
359
|
+
// Dodaj nowe sceny dla tego urządzenia
|
|
360
|
+
const existingSceneIds = new Set(deviceInConfig.scenes.map(s => String(s.id)));
|
|
361
|
+
scenesForDevice.forEach((scene, index) => {
|
|
362
|
+
const sceneId = String(scene.Id);
|
|
363
|
+
if (!existingSceneIds.has(sceneId)) {
|
|
348
364
|
const sceneObj = {
|
|
349
365
|
id: sceneId,
|
|
350
366
|
displayType: 0,
|
|
@@ -356,7 +372,6 @@
|
|
|
356
372
|
}
|
|
357
373
|
});
|
|
358
374
|
|
|
359
|
-
|
|
360
375
|
}
|
|
361
376
|
});
|
|
362
377
|
|
|
@@ -368,7 +383,7 @@
|
|
|
368
383
|
account.atwDevices = handleDevices(devicesInMelCloudByType.atw, account.atwDevices, "Heat Pump", newInMelCloud.atw, newInMelCloud.atwPresets, newInMelCloud.atwSchedules, newInMelCloud.scenes);
|
|
369
384
|
account.ervDevices = handleDevices(devicesInMelCloudByType.erv, account.ervDevices, "Energy Recovery Ventilation", newInMelCloud.erv, newInMelCloud.ervPresets, newInMelCloud.ervSchedules, newInMelCloud.scenes);
|
|
370
385
|
|
|
371
|
-
// Summary
|
|
386
|
+
// Summary counts
|
|
372
387
|
const newDevicesCount = newInMelCloud.ata.length + newInMelCloud.atw.length + newInMelCloud.erv.length;
|
|
373
388
|
const newPresetsCount = newInMelCloud.ataPresets.length + newInMelCloud.atwPresets.length + newInMelCloud.ervPresets.length;
|
|
374
389
|
const newSchedulesCount = newInMelCloud.ataSchedules.length + newInMelCloud.atwSchedules.length + newInMelCloud.ervSchedules.length;
|
|
@@ -376,7 +391,7 @@
|
|
|
376
391
|
const removedDevicesCount = removedFromConfigAta.length + removedFromConfigAtw.length + removedFromConfigErv.length;
|
|
377
392
|
const removedPresetsCount = removedFromConfig.ataPresets.length + removedFromConfig.atwPresets.length + removedFromConfig.ervPresets.length;
|
|
378
393
|
const removedSchedulesCount = removedFromConfig.ataSchedules.length + removedFromConfig.atwSchedules.length + removedFromConfig.ervSchedules.length;
|
|
379
|
-
const removedScenesCount = removedFromConfig.scenes.length
|
|
394
|
+
const removedScenesCount = removedFromConfig.scenes.length;
|
|
380
395
|
|
|
381
396
|
if (!newDevicesCount && !newPresetsCount && !newSchedulesCount && !newScenesCount && !removedDevicesCount && !removedPresetsCount && !removedSchedulesCount && !removedScenesCount) {
|
|
382
397
|
updateInfo('info', 'No changes detected.', 'white');
|
|
@@ -390,9 +405,9 @@
|
|
|
390
405
|
if (removedDevicesCount)
|
|
391
406
|
updateInfo('info', `Removed devices: ${removedFromConfigAta.length ? `ATA: ${removedFromConfigAta.length},` : ''} ${removedFromConfigAtw.length ? `ATW: ${removedFromConfigAtw.length},` : ''} ${removedFromConfigErv.length ? `ERV: ${removedFromConfigErv.length}` : ''}.`, 'orange');
|
|
392
407
|
if (removedPresetsCount)
|
|
393
|
-
updateInfo('info1', `
|
|
408
|
+
updateInfo('info1', `Removed presets: ${removedFromConfig.ataPresets.length ? `ATA: ${removedFromConfig.ataPresets.length},` : ''} ${removedFromConfig.atwPresets.length ? `ATW: ${removedFromConfig.atwPresets.length},` : ''} ${removedFromConfig.ervPresets.length ? `ERV: ${removedFromConfig.ervPresets.length}` : ''}.`, 'orange');
|
|
394
409
|
if (removedSchedulesCount || removedScenesCount)
|
|
395
|
-
updateInfo('info1', `
|
|
410
|
+
updateInfo('info1', `Removed ${removedScenesCount ? `scenes:` : ''} ${removedFromConfig.ataSchedules.length ? `ATA: ${removedFromConfig.ataSchedules.length},` : ''} ${removedFromConfig.atwSchedules.length ? `ATW: ${removedFromConfig.atwSchedules.length},` : ''} ${removedFromConfig.ervSchedules.length ? `ERV: ${removedFromConfig.ervSchedules.length},` : ''} ${removedScenesCount ? `scenes: ${removedScenesCount}` : ''}.`, 'orange');
|
|
396
411
|
}
|
|
397
412
|
|
|
398
413
|
await homebridge.updatePluginConfig(pluginConfig);
|
|
@@ -407,5 +422,6 @@
|
|
|
407
422
|
});
|
|
408
423
|
|
|
409
424
|
|
|
425
|
+
|
|
410
426
|
})();
|
|
411
427
|
</script>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.4.1-beta.
|
|
4
|
+
"version": "4.4.1-beta.42",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|