homebridge-melcloud-control 4.1.2-beta.43 → 4.1.2-beta.45

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.
@@ -254,47 +254,75 @@
254
254
  const removedErv = removeStaleDevices(account.ervDevices, devicesByType.erv);
255
255
 
256
256
  const handleDevices = (devicesInMelCloud, devicesInConfig, typeString, newArr, newPresets) => {
257
- devicesInMelCloud.forEach(device => {
258
- const deviceObj = {
259
- id: device.DeviceID,
260
- type: device.Type,
261
- typeString,
262
- displayType: 0,
263
- name: device.DeviceName,
264
- presets: [],
265
- schedules: [],
266
- buttonsSensors: []
267
- };
268
-
269
- if (!devicesInConfig.some(dev => String(dev.id) === device.DeviceID)) {
270
- devicesInConfig.push(deviceObj);
271
- newArr.push(deviceObj);
272
- }
273
-
274
- const deviceInConfig = devicesInConfig.find(dev => String(dev.id) === device.DeviceID);
275
- if (deviceInConfig) {
276
- const idKey = account.type === 'melcloud' ? 'ID' : 'Id';
277
- const typeKey = account.type === 'melcloud' ? 'Presets' : 'Schedule';
278
- const typeKey1 = account.type === 'melcloud' ? 'presets' : 'schedules';
279
- const presets = device[typeKey] || [];
280
- presets.forEach((preset, index) => {
281
- const presetObj = {
282
- id: preset[idKey],
257
+ try {
258
+ const configDevicesMap = new Map(devicesInConfig.map(dev => [String(dev.id), dev]));
259
+ const isMelcloud = account.type === 'melcloud';
260
+
261
+ const idKey = isMelcloud ? 'ID' : 'Id';
262
+ const typeKey = isMelcloud ? 'Presets' : 'Schedule';
263
+ const typeKey1 = isMelcloud ? 'presets' : 'schedules';
264
+
265
+ devicesInMelCloud.forEach(device => {
266
+ const deviceId = String(device.DeviceID);
267
+ let deviceInConfig = configDevicesMap.get(deviceId);
268
+
269
+ // === Create device if missing ===
270
+ if (!deviceInConfig) {
271
+ deviceInConfig = {
272
+ id: device.DeviceID,
273
+ type: device.Type,
274
+ typeString,
283
275
  displayType: 0,
284
- name: preset.NumberDescription || `Schedule ${index}`,
285
- namePrefix: false
276
+ name: device.DeviceName,
277
+ presets: [],
278
+ schedules: [],
279
+ buttonsSensors: []
286
280
  };
281
+ devicesInConfig.push(deviceInConfig);
282
+ newArr.push(deviceInConfig);
283
+ configDevicesMap.set(deviceId, deviceInConfig);
284
+ }
285
+
286
+ // === Process presets/schedules ===
287
+ const presets = device[typeKey] || [];
288
+ const presetsInConfig = deviceInConfig[typeKey1] || [];
289
+ const presetIds = new Set(presetsInConfig.map(p => String(p.id)));
290
+
291
+ let addedNewPreset = false;
287
292
 
288
- const presetsInConfig = deviceInConfig[typeKey1] || [];
289
- if (!presetsInConfig.some(pres => String(pres.id) === preset[idKey])) {
293
+ presets.forEach((preset, index) => {
294
+ const presetId = String(preset[idKey]);
295
+ if (!presetIds.has(presetId)) {
296
+ const presetObj = {
297
+ id: presetId,
298
+ displayType: 0,
299
+ name: preset.NumberDescription || `Schedule ${index}`,
300
+ namePrefix: false
301
+ };
290
302
  presetsInConfig.push(presetObj);
291
303
  newPresets.push(presetObj);
304
+ presetIds.add(presetId);
305
+ addedNewPreset = true;
292
306
  }
293
307
  });
294
- }
295
- });
308
+
309
+ // === Remove placeholder presets/schedules (id === '0') if new ones were added ===
310
+ if (addedNewPreset) {
311
+ const beforeCount = presetsInConfig.length;
312
+ deviceInConfig[typeKey1] = presetsInConfig.filter(p => String(p.id) !== '0');
313
+ const removedCount = beforeCount - deviceInConfig[typeKey1].length;
314
+
315
+ if (removedCount > 0 && removedCount < beforeCount) {
316
+ updateInfo('info', `Removed ${removedCount} placeholder ${typeKey1} from device ${device.DeviceID}`, 'yellow');
317
+ }
318
+ }
319
+ });
320
+ } catch (error) {
321
+ updateInfo('info', `Error while processing device: ${error.message || error}`, 'red');
322
+ }
296
323
  };
297
324
 
325
+
298
326
  handleDevices(devicesByType.ata, account.ataDevices, "Air Conditioner", newDevices.ata, newDevices.ataPresets);
299
327
  handleDevices(devicesByType.atw, account.atwDevices, "Heat Pump", newDevices.atw, newDevices.atwPresets);
300
328
  handleDevices(devicesByType.erv, account.ervDevices, "Energy Recovery Ventilation", newDevices.erv, newDevices.ervPresets);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "4.1.2-beta.43",
4
+ "version": "4.1.2-beta.45",
5
5
  "description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
6
6
  "license": "MIT",
7
7
  "author": "grzegorz914",