homebridge-melcloud-control 4.2.3-beta.47 → 4.2.3-beta.49

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.
@@ -246,7 +246,7 @@
246
246
  }
247
247
 
248
248
  // Initialize devices arrays
249
- const newDevices = { ata: [], ataPresets: [], atw: [], atwPresets: [], erv: [], ervPresets: [], scenes: [] };
249
+ const newDevices = { ata: [], ataPresets: [], ataSchedules: [], atw: [], atwPresets: [], atwSchedules: [], erv: [], ervPresets: [], ervSchedules: [], scenes: [] };
250
250
  const devicesByType = { ata: [], atw: [], erv: [] };
251
251
 
252
252
  response.Devices.forEach(d => {
@@ -264,7 +264,7 @@
264
264
  const removedAtw = removeStaleDevices(account.atwDevices, devicesByType.atw);
265
265
  const removedErv = removeStaleDevices(account.ervDevices, devicesByType.erv);
266
266
 
267
- const handleDevices = (devicesInMelCloud, devicesInConfig, typeString, newArr, newPresets, newScenes) => {
267
+ const handleDevices = (devicesInMelCloud, devicesInConfig, typeString, newArr, newPresets, newSchedules, newScenes) => {
268
268
  try {
269
269
  const configDevicesMap = new Map(devicesInConfig.map(dev => [String(dev.id), dev]));
270
270
  const isMelcloud = account.type === 'melcloud';
@@ -296,19 +296,18 @@
296
296
  }
297
297
 
298
298
  // === Process presets/schedules ===
299
- const presets = device[typeKey] || [];
300
- const presetsInConfig = deviceInConfig[typeKey1] || [];
299
+ const presets = device.Presets || [];
300
+ const presetsInConfig = deviceInConfig.presets || [];
301
301
  const presetIds = new Set(presetsInConfig.map(p => String(p.id)));
302
302
 
303
303
  let addedNewPreset = false;
304
-
305
304
  presets.forEach((preset, index) => {
306
- const presetId = String(preset[idKey]);
305
+ const presetId = String(preset.ID);
307
306
  if (!presetIds.has(presetId)) {
308
307
  const presetObj = {
309
308
  id: presetId,
310
309
  displayType: 0,
311
- name: preset.NumberDescription || `Schedule ${index}`,
310
+ name: preset.NumberDescription || `Preset ${index}`,
312
311
  namePrefix: false
313
312
  };
314
313
  presetsInConfig.push(presetObj);
@@ -321,11 +320,44 @@
321
320
  // === Remove placeholder presets/schedules (id === '0') if new ones were added ===
322
321
  if (addedNewPreset) {
323
322
  const beforeCount = presetsInConfig.length;
324
- deviceInConfig[typeKey1] = presetsInConfig.filter(p => String(p.id) !== '0');
325
- const removedCount = beforeCount - deviceInConfig[typeKey1].length;
323
+ deviceInConfig.presets = presetsInConfig.filter(p => String(p.id) !== '0');
324
+ const removedCount = beforeCount - deviceInConfig.presets.length;
325
+
326
+ if (removedCount > 0 && removedCount < beforeCount) {
327
+ updateInfo('info2', `Removed ${removedCount} placeholder preset from device ${device.DeviceID}`, 'yellow');
328
+ }
329
+ }
330
+
331
+ // === Process presets/schedules ===
332
+ const schedules = device.Schedules || [];
333
+ const schedulesInConfig = deviceInConfig.schedules || [];
334
+ const scheduleIds = new Set(schedulesInConfig.map(s => String(s.id)));
335
+
336
+ let addedNewSchedule = false;
337
+ schedules.forEach((schedule, index) => {
338
+ const scheduleId = String(schedule.Id);
339
+ if (!scheduleIds.has(scheduleId)) {
340
+ const presetObj = {
341
+ id: scheduleId,
342
+ displayType: 0,
343
+ name: `Schedule ${index}`,
344
+ namePrefix: false
345
+ };
346
+ schedulesInConfig.push(presetObj);
347
+ newPresets.push(presetObj);
348
+ scheduleIds.add(scheduleId);
349
+ addedNewSchedule = true;
350
+ }
351
+ });
352
+
353
+ // === Remove placeholder schedules (id === '0') if new ones were added ===
354
+ if (addedNewSchedule) {
355
+ const beforeCount = schedulesInConfig.length;
356
+ deviceInConfig.schedules = schedulesInConfig.filter(s => String(s.id) !== '0');
357
+ const removedCount = beforeCount - deviceInConfig.schedules.length;
326
358
 
327
359
  if (removedCount > 0 && removedCount < beforeCount) {
328
- updateInfo('info2', `Removed ${removedCount} placeholder ${typeKey1} from device ${device.DeviceID}`, 'yellow');
360
+ updateInfo('info2', `Removed ${removedCount} placeholder schedule from device ${device.DeviceID}`, 'yellow');
329
361
  }
330
362
  }
331
363
 
@@ -335,7 +367,6 @@
335
367
  const sceneIds = new Set(scenesInConfig.map(s => String(s.id)));
336
368
 
337
369
  let addedNewScenes = false;
338
-
339
370
  scenes.forEach((scene, index) => {
340
371
  const sceneId = String(scene.Id);
341
372
  if (!sceneIds.has(sceneId)) {
@@ -373,12 +404,13 @@
373
404
  }
374
405
  };
375
406
 
376
- account.ataDevices = handleDevices(devicesByType.ata, account.ataDevices, "Air Conditioner", newDevices.ata, newDevices.ataPresets, newDevices.scenes);
377
- account.atwDevices = handleDevices(devicesByType.atw, account.atwDevices, "Heat Pump", newDevices.atw, newDevices.atwPresets, newDevices.scenes);
378
- account.ervDevices = handleDevices(devicesByType.erv, account.ervDevices, "Energy Recovery Ventilation", newDevices.erv, newDevices.ervPresets, newDevices.scenes);
407
+ account.ataDevices = handleDevices(devicesByType.ata, account.ataDevices, "Air Conditioner", newDevices.ata, newDevices.ataPresets, newDevices.ataSchedules, newDevices.scenes);
408
+ account.atwDevices = handleDevices(devicesByType.atw, account.atwDevices, "Heat Pump", newDevices.atw, newDevices.atwPresets, newDevices.atwSchedules, newDevices.scenes);
409
+ account.ervDevices = handleDevices(devicesByType.erv, account.ervDevices, "Energy Recovery Ventilation", newDevices.erv, newDevices.ervPresets, newDevices.ervSchedules, newDevices.scenes);
379
410
 
380
411
  const newDevicesCount = newDevices.ata.length + newDevices.atw.length + newDevices.erv.length;
381
412
  const newPresetsCount = newDevices.ataPresets.length + newDevices.atwPresets.length + newDevices.ervPresets.length;
413
+ const newSchedulesCount = newDevices.ataSchedules.length + newDevices.atwSchedules.length + newDevices.ervSchedules.length;
382
414
  const newScenesCount = newDevices.scenes.length;
383
415
  const removedDevicesCount = removedAta.length + removedAtw.length + removedErv.length;
384
416
 
@@ -387,7 +419,7 @@
387
419
  } else {
388
420
  if (newDevicesCount)
389
421
  updateInfo('info', `Found new devices: ATA: ${newDevices.ata.length}, ATW: ${newDevices.atw.length}, ERV: ${newDevices.erv.length}.`, 'green');
390
- if (newPresetsCount || newScenesCount)
422
+ if (newPresetsCount || newScenesCount || newSchedulesCount)
391
423
  updateInfo('info1', `Found new ${account.type === 'melcloud' ? 'presets' : 'schedules'}: ATA: ${newDevices.ataPresets.length}, ATW: ${newDevices.atwPresets.length}, ERV: ${newDevices.ervPresets.length}, Scenes: ${newDevices.scenes.length}.`, 'green');
392
424
  if (removedDevicesCount)
393
425
  updateInfo('info2', `Removed devices: ATA: ${removedAta.length}, ATW: ${removedAtw.length}, ERV: ${removedErv.length}.`, 'orange');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "4.2.3-beta.47",
4
+ "version": "4.2.3-beta.49",
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
@@ -59,7 +59,7 @@ class DeviceAta extends EventEmitter {
59
59
 
60
60
  //presets configured
61
61
  for (const preset of this.presets) {
62
- preset.name = preset.name || 'Preset'
62
+ preset.name = preset.name;
63
63
  preset.serviceType = [null, Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][preset.displayType];
64
64
  preset.characteristicType = [null, Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][preset.displayType];
65
65
  preset.state = false;
@@ -68,7 +68,7 @@ class DeviceAta extends EventEmitter {
68
68
 
69
69
  //schedules configured
70
70
  for (const schedule of this.schedules) {
71
- schedule.name = schedule.name || 'Schedule'
71
+ schedule.name = schedule.name;
72
72
  schedule.serviceType = [null, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][schedule.displayType];
73
73
  schedule.characteristicType = [null, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][schedule.displayType];
74
74
  schedule.state = false;
@@ -76,7 +76,7 @@ class DeviceAta extends EventEmitter {
76
76
 
77
77
  //scenes configured
78
78
  for (const scene of this.scenes) {
79
- scene.name = schedule.name || 'Schedule'
79
+ scene.name = scene.name;
80
80
  scene.serviceType = [null, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][scene.displayType];
81
81
  scene.characteristicType = [null, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][scene.displayType];
82
82
  scene.state = false;