homebridge-melcloud-control 4.1.2-beta.3 → 4.1.2-beta.5

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.
@@ -224,8 +224,6 @@
224
224
 
225
225
  document.getElementById('logIn').addEventListener('click', async () => {
226
226
  document.getElementById(`logIn`).className = "btn btn-primary";
227
-
228
- updateInfo('info', 'Connecting...', 'yellow');
229
227
  homebridge.showSpinner();
230
228
 
231
229
  try {
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.3",
4
+ "version": "4.1.2-beta.5",
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
@@ -683,8 +683,9 @@ class DeviceAta extends EventEmitter {
683
683
  if (this.presets.length > 0) {
684
684
  if (this.logDebug) this.emit('debug', `Prepare presets services`);
685
685
  this.presetsServices = [];
686
+ const presetsIdKey = this.accountType === 'melcloud' ? 'ID' : 'Id';
686
687
  this.presets.forEach((preset, i) => {
687
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
688
+ const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
688
689
 
689
690
  //get preset name
690
691
  const name = preset.name;
@@ -765,7 +766,7 @@ class DeviceAta extends EventEmitter {
765
766
  })
766
767
  .onSet(async (state) => {
767
768
  try {
768
- const key = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
769
+ const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
769
770
  let effectiveFlags = null;
770
771
  switch (mode) {
771
772
  case 0: //POWER ON,OFF
@@ -1017,7 +1018,7 @@ class DeviceAta extends EventEmitter {
1017
1018
 
1018
1019
  //keys
1019
1020
  const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
1020
- const presetsIdKey = account.type === 'melcloud' ? 'ID' : 'Id';
1021
+ const presetsIdKey = this.accountType === 'melcloud' ? 'ID' : 'Id';
1021
1022
  const setTempKey = this.accountType === 'melcloud' ? 'SetTemperature' : 'SetPoint';
1022
1023
  const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
1023
1024
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
package/src/deviceatw.js CHANGED
@@ -1055,8 +1055,9 @@ class DeviceAtw extends EventEmitter {
1055
1055
  if (this.presets.length > 0) {
1056
1056
  if (this.logDebug) this.emit('debug', `Prepare presets services`);
1057
1057
  this.presetsServices = [];
1058
+ const presetsIdKey = this.accountType === 'melcloud' ? 'ID' : 'Id';
1058
1059
  this.presets.forEach((preset, i) => {
1059
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
1060
+ const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
1060
1061
 
1061
1062
  //get preset name
1062
1063
  const name = preset.name;
@@ -1331,7 +1332,7 @@ class DeviceAtw extends EventEmitter {
1331
1332
 
1332
1333
  //keys
1333
1334
  const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
1334
- const presetsIdKey = account.type === 'melcloud' ? 'ID' : 'Id';
1335
+ const presetsIdKey = accountType === 'melcloud' ? 'ID' : 'Id';
1335
1336
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
1336
1337
  const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
1337
1338
 
package/src/deviceerv.js CHANGED
@@ -877,7 +877,7 @@ class DeviceErv extends EventEmitter {
877
877
 
878
878
  //keys
879
879
  const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
880
- const presetsIdKey = account.type === 'melcloud' ? 'ID' : 'Id';
880
+ const presetsIdKey = accountType === 'melcloud' ? 'ID' : 'Id';
881
881
  const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
882
882
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
883
883
  const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
package/src/melcloud.js CHANGED
@@ -235,17 +235,18 @@ class MelCloud extends EventEmitter {
235
235
  if (this.logDebug) this.emit('debug', `Buildings list saved`);
236
236
 
237
237
  const devices = buildingsList.flatMap(building => {
238
- // Funkcja kapitalizująca klucze obiektu
239
- // Rekurencyjna funkcja kapitalizująca klucze w całym obiekcie (łącznie z tablicami)
238
+ // Rekurencyjna funkcja kapitalizująca klucze w całym obiekcie (bezpieczna)
240
239
  const capitalizeKeysDeep = obj => {
241
240
  if (Array.isArray(obj)) {
242
241
  return obj.map(item => capitalizeKeysDeep(item));
243
242
  } else if (obj && typeof obj === 'object' && obj.constructor === Object) {
244
243
  return Object.fromEntries(
245
- Object.entries(obj).map(([key, value]) => [
246
- key.charAt(0).toUpperCase() + key.slice(1),
247
- capitalizeKeysDeep(value)
248
- ])
244
+ Object.entries(obj).map(([key, value]) => {
245
+ const safeKey = typeof key === 'string'
246
+ ? key.charAt(0).toUpperCase() + key.slice(1)
247
+ : key;
248
+ return [safeKey, capitalizeKeysDeep(value)];
249
+ })
249
250
  );
250
251
  }
251
252
  return obj;
@@ -253,18 +254,20 @@ class MelCloud extends EventEmitter {
253
254
 
254
255
  // Funkcja tworząca finalny obiekt Device
255
256
  const createDevice = (device, type, headers = {}) => {
256
- const settingsArray = device.Settings || [];
257
+ const settingsArray = Array.isArray(device.Settings) ? device.Settings : [];
257
258
 
258
259
  const settingsObject = Object.fromEntries(
259
- settingsArray.map(({ name, value }) => {
260
- let parsedValue = value;
261
- if (value === "True") parsedValue = true;
262
- else if (value === "False") parsedValue = false;
263
- else if (!isNaN(Number(value)) && value.trim() !== "") parsedValue = Number(value);
264
-
265
- const key = name.charAt(0).toUpperCase() + name.slice(1);
266
- return [key, parsedValue];
267
- })
260
+ settingsArray
261
+ .filter(item => item && typeof item.name === 'string') // 🔒 tylko poprawne wpisy
262
+ .map(({ name, value }) => {
263
+ let parsedValue = value;
264
+ if (value === "True") parsedValue = true;
265
+ else if (value === "False") parsedValue = false;
266
+ else if (typeof value === 'string' && !isNaN(Number(value)) && value.trim() !== "") parsedValue = Number(value);
267
+
268
+ const key = name.charAt(0).toUpperCase() + name.slice(1);
269
+ return [key, parsedValue];
270
+ })
268
271
  );
269
272
 
270
273
  const deviceObject = {
@@ -291,6 +294,7 @@ class MelCloud extends EventEmitter {
291
294
  ...(building.airToWaterUnits || []).map(d => createDevice(capitalizeKeysDeep(d), 1)),
292
295
  ...(building.airToVentilationUnits || []).map(d => createDevice(capitalizeKeysDeep(d), 3))
293
296
  ];
297
+
294
298
  });
295
299
 
296
300
  const devicesCount = devices.length;