homebridge-melcloud-control 4.1.2-beta.18 → 4.1.2-beta.2

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,6 +224,8 @@
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');
227
229
  homebridge.showSpinner();
228
230
 
229
231
  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.18",
4
+ "version": "4.1.2-beta.2",
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,9 +683,8 @@ 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';
687
686
  this.presets.forEach((preset, i) => {
688
- const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
687
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
689
688
 
690
689
  //get preset name
691
690
  const name = preset.name;
@@ -766,7 +765,7 @@ class DeviceAta extends EventEmitter {
766
765
  })
767
766
  .onSet(async (state) => {
768
767
  try {
769
- const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
768
+ const key = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
770
769
  let effectiveFlags = null;
771
770
  switch (mode) {
772
771
  case 0: //POWER ON,OFF
@@ -1018,7 +1017,6 @@ class DeviceAta extends EventEmitter {
1018
1017
 
1019
1018
  //keys
1020
1019
  const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
1021
- const presetsIdKey = this.accountType === 'melcloud' ? 'ID' : 'Id';
1022
1020
  const setTempKey = this.accountType === 'melcloud' ? 'SetTemperature' : 'SetPoint';
1023
1021
  const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
1024
1022
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
@@ -1035,12 +1033,12 @@ class DeviceAta extends EventEmitter {
1035
1033
  const presetsOnServer = deviceData[presetsKey] ?? [];
1036
1034
 
1037
1035
  //protection
1038
- const frostProtectionEnabled = deviceData.FrostProtection?.Enabled;
1039
- const frostProtectionActive = deviceData.FrostProtection?.Active;
1040
- const overheatProtectionEnabled = deviceData.OverheatProtection?.Enabled;
1041
- const overheatProtectionActive = deviceData.OverheatProtection?.Active;
1042
- const holidayModeEnabled = deviceData.HolidayMode?.Enabled;
1043
- const holidayModeActive = deviceData.HolidayMode?.Active;
1036
+ const frostProtectionEnabled = deviceData.FrostProtection?.enabled;
1037
+ const frostProtectionActive = deviceData.FrostProtection?.active;
1038
+ const overheatProtectionEnabled = deviceData.OverheatProtection?.enabled;
1039
+ const overheatProtectionActive = deviceData.OverheatProtection?.active;
1040
+ const holidayModeEnabled = deviceData.HolidayMode?.enabled;
1041
+ const holidayModeActive = deviceData.HolidayMode?.active;
1044
1042
  const scheduleEnabled = deviceData.ScheduleEnabled;
1045
1043
 
1046
1044
  //device control
@@ -1285,7 +1283,7 @@ class DeviceAta extends EventEmitter {
1285
1283
  //update presets state
1286
1284
  if (this.presets.length > 0) {
1287
1285
  this.presets.forEach((preset, i) => {
1288
- const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
1286
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
1289
1287
 
1290
1288
  preset.state = presetData ? (presetData.Power === power
1291
1289
  && presetData[setTempKey] === setTemperature
package/src/deviceatw.js CHANGED
@@ -1055,9 +1055,8 @@ 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';
1059
1058
  this.presets.forEach((preset, i) => {
1060
- const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
1059
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
1061
1060
 
1062
1061
  //get preset name
1063
1062
  const name = preset.name;
@@ -1331,13 +1330,11 @@ class DeviceAtw extends EventEmitter {
1331
1330
  this.deviceData = deviceData;
1332
1331
 
1333
1332
  //keys
1334
- const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
1335
- const presetsIdKey = accountType === 'melcloud' ? 'ID' : 'Id';
1336
1333
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
1337
1334
  const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
1338
1335
 
1339
1336
  //presets
1340
- const presetsOnServer = deviceData[presetsKey] ?? [];
1337
+ const presetsOnServer = deviceData.Presets ?? [];
1341
1338
 
1342
1339
  //device info
1343
1340
  const hasHeatPump = ![1, 2, 3, 4, 5, 6, 7, 15].includes(this.hideZone);
@@ -1819,7 +1816,7 @@ class DeviceAtw extends EventEmitter {
1819
1816
  //update presets state
1820
1817
  if (this.presets.length > 0) {
1821
1818
  this.presets.forEach((preset, i) => {
1822
- const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
1819
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
1823
1820
 
1824
1821
  preset.state = presetData ? (presetData.Power === power
1825
1822
  && presetData.EcoHotWater === ecoHotWater
package/src/deviceerv.js CHANGED
@@ -675,7 +675,7 @@ class DeviceErv extends EventEmitter {
675
675
  if (this.logDebug) this.emit('debug', `Prepare presets services`);
676
676
  this.presetsServices = [];
677
677
  this.presets.forEach((preset, i) => {
678
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
678
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
679
679
 
680
680
  //get preset name
681
681
  const name = preset.name;
@@ -876,14 +876,12 @@ class DeviceErv extends EventEmitter {
876
876
  this.deviceData = deviceData;
877
877
 
878
878
  //keys
879
- const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
880
- const presetsIdKey = accountType === 'melcloud' ? 'ID' : 'Id';
881
879
  const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
882
880
  const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
883
881
  const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
884
882
 
885
883
  //presets
886
- const presetsOnServer = deviceData[presetsKey] ?? [];
884
+ const presetsOnServer = deviceData.Presets ?? [];
887
885
 
888
886
  //device control
889
887
  const hideRoomTemperature = deviceData.HideRoomTemperature;
@@ -1115,7 +1113,7 @@ class DeviceErv extends EventEmitter {
1115
1113
  //update presets state
1116
1114
  if (this.presets.length > 0) {
1117
1115
  this.presets.forEach((preset, i) => {
1118
- const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
1116
+ const presetData = presetsOnServer.find(p => p.ID === preset.Id);
1119
1117
 
1120
1118
  preset.state = presetData ? (presetData.Power === power
1121
1119
  && presetData.SetTemperature === setTemperature
package/src/melcloud.js CHANGED
@@ -236,18 +236,11 @@ class MelCloud extends EventEmitter {
236
236
 
237
237
  const devices = buildingsList.flatMap(building => {
238
238
  // Funkcja kapitalizująca klucze obiektu
239
- const capitalizeKeys = obj =>
240
- Object.fromEntries(
241
- Object.entries(obj).map(([key, value]) => [
242
- key.charAt(0).toUpperCase() + key.slice(1),
243
- value
244
- ])
245
- );
246
-
247
- // Rekurencyjna kapitalizacja kluczy w obiekcie lub tablicy
239
+ // Rekurencyjna funkcja kapitalizująca klucze w całym obiekcie (łącznie z tablicami)
248
240
  const capitalizeKeysDeep = obj => {
249
- if (Array.isArray(obj)) return obj.map(capitalizeKeysDeep);
250
- if (obj && typeof obj === 'object') {
241
+ if (Array.isArray(obj)) {
242
+ return obj.map(item => capitalizeKeysDeep(item));
243
+ } else if (obj && typeof obj === 'object' && obj.constructor === Object) {
251
244
  return Object.fromEntries(
252
245
  Object.entries(obj).map(([key, value]) => [
253
246
  key.charAt(0).toUpperCase() + key.slice(1),
@@ -259,8 +252,7 @@ class MelCloud extends EventEmitter {
259
252
  };
260
253
 
261
254
  // Funkcja tworząca finalny obiekt Device
262
- const createDevice = (device, type) => {
263
- // Settings już kapitalizowane w nazwach
255
+ const createDevice = (device, type, headers = {}) => {
264
256
  const settingsArray = device.Settings || [];
265
257
 
266
258
  const settingsObject = Object.fromEntries(
@@ -268,48 +260,23 @@ class MelCloud extends EventEmitter {
268
260
  let parsedValue = value;
269
261
  if (value === "True") parsedValue = true;
270
262
  else if (value === "False") parsedValue = false;
271
- else if (!isNaN(value) && value !== "") parsedValue = Number(value);
263
+ else if (!isNaN(Number(value)) && value.trim() !== "") parsedValue = Number(value);
272
264
 
273
265
  const key = name.charAt(0).toUpperCase() + name.slice(1);
274
266
  return [key, parsedValue];
275
267
  })
276
268
  );
277
269
 
278
- // Scal Capabilities + Settings + DeviceType w Device
279
270
  const deviceObject = {
280
- ...capitalizeKeys(device.Capabilities || {}),
271
+ ...capitalizeKeysDeep(device.Capabilities || {}),
281
272
  ...settingsObject,
282
273
  DeviceType: type
283
274
  };
284
275
 
285
- // Usuń stare pola Settings i Capabilities
286
276
  const { Settings, Capabilities, Id, GivenDisplayName, ...rest } = device;
287
277
 
288
- // Kapitalizacja brakujących obiektów/tablic
289
- const capitalizedRest = { ...rest };
290
-
291
- if (capitalizedRest.frostProtection) {
292
- capitalizedRest.FrostProtection = { ...capitalizeKeys(device.frostProtection || {}) };
293
- delete capitalizedRest.frostProtection;
294
- }
295
-
296
- if (capitalizedRest.overheatProtection) {
297
- capitalizedRest.OverheatProtection = { ...capitalizeKeys(device.overheatProtection || {}) };
298
- delete capitalizedRest.overheatProtection;
299
- }
300
-
301
- if (capitalizedRest.holidayMode) {
302
- capitalizedRest.HolidayMode = { ...capitalizeKeys(device.HolidayMode || {}) };
303
- delete capitalizedRest.holidayMode;
304
- }
305
-
306
- if (Array.isArray(capitalizedRest.schedule)) {
307
- capitalizedRest.Schedule = capitalizedRest.schedule.map(capitalizeKeysDeep);
308
- delete capitalizedRest.schedule;
309
- }
310
-
311
278
  return {
312
- ...capitalizedRest,
279
+ ...capitalizeKeysDeep(rest),
313
280
  Type: type,
314
281
  DeviceID: Id,
315
282
  DeviceName: GivenDisplayName,
@@ -318,14 +285,14 @@ class MelCloud extends EventEmitter {
318
285
  };
319
286
  };
320
287
 
288
+ // Mapowanie urządzeń
321
289
  return [
322
- ...(building.airToAirUnits || []).map(d => createDevice(capitalizeKeys(d), 0)),
323
- ...(building.airToWaterUnits || []).map(d => createDevice(capitalizeKeys(d), 1)),
324
- ...(building.airToVentilationUnits || []).map(d => createDevice(capitalizeKeys(d), 3))
290
+ ...(building.airToAirUnits || []).map(d => createDevice(capitalizeKeysDeep(d), 0)),
291
+ ...(building.airToWaterUnits || []).map(d => createDevice(capitalizeKeysDeep(d), 1)),
292
+ ...(building.airToVentilationUnits || []).map(d => createDevice(capitalizeKeysDeep(d), 3))
325
293
  ];
326
294
  });
327
295
 
328
-
329
296
  const devicesCount = devices.length;
330
297
  if (devicesCount === 0) {
331
298
  devicesList.Info = 'No devices found'