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.
@@ -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
- response.Devices.forEach(device => {
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
- // Handle Devices
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); // Make sure this matches MelCloud data
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
- //ONLY MELCLOUD - PRESETS
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
- //ONLY MELCLOUD HOME - SCHEDULES & SCENES
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
- // Usuwanie nieaktualnych scen
339
- removedFromConfig.scenes.push(...removeStaleEntities(deviceInConfig.scenes, scenesInMelCloud, s => s.id, s => s.Id));
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
- if (appliesToDevice && !sceneIds.has(sceneId)) {
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', `Rempved presets: ${removedFromConfig.ataPresets.length ? `ATA: ${removedFromConfig.ataPresets.length},` : ''} ${removedFromConfig.atwPresets.length ? `ATW: ${removedFromConfig.atwPresets.length},` : ''} ${removedFromConfig.ervPresets.length ? `ERV: ${removedFromConfig.ervPresets.length}` : ''}.`, 'orange');
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', `Rempved ${removedScenesCount ? `schedules:` : ''} ${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');
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.40",
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",