homebridge-melcloud-control 4.1.2-beta.2 → 4.1.2-beta.20
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.
- package/homebridge-ui/public/index.html +0 -2
- package/package.json +1 -1
- package/src/deviceata.js +11 -9
- package/src/deviceatw.js +6 -3
- package/src/deviceerv.js +5 -3
- package/src/melcloud.js +31 -12
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.
|
|
4
|
+
"version": "4.1.2-beta.20",
|
|
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
|
|
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
|
|
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,6 +1018,7 @@ class DeviceAta extends EventEmitter {
|
|
|
1017
1018
|
|
|
1018
1019
|
//keys
|
|
1019
1020
|
const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
|
|
1021
|
+
const presetsIdKey = this.accountType === 'melcloud' ? 'ID' : 'Id';
|
|
1020
1022
|
const setTempKey = this.accountType === 'melcloud' ? 'SetTemperature' : 'SetPoint';
|
|
1021
1023
|
const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
|
|
1022
1024
|
const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
|
|
@@ -1033,12 +1035,12 @@ class DeviceAta extends EventEmitter {
|
|
|
1033
1035
|
const presetsOnServer = deviceData[presetsKey] ?? [];
|
|
1034
1036
|
|
|
1035
1037
|
//protection
|
|
1036
|
-
const frostProtectionEnabled = deviceData.FrostProtection?.
|
|
1037
|
-
const frostProtectionActive = deviceData.FrostProtection?.
|
|
1038
|
-
const overheatProtectionEnabled = deviceData.OverheatProtection?.
|
|
1039
|
-
const overheatProtectionActive = deviceData.OverheatProtection?.
|
|
1040
|
-
const holidayModeEnabled = deviceData.HolidayMode?.
|
|
1041
|
-
const holidayModeActive = deviceData.HolidayMode?.
|
|
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;
|
|
1042
1044
|
const scheduleEnabled = deviceData.ScheduleEnabled;
|
|
1043
1045
|
|
|
1044
1046
|
//device control
|
|
@@ -1283,7 +1285,7 @@ class DeviceAta extends EventEmitter {
|
|
|
1283
1285
|
//update presets state
|
|
1284
1286
|
if (this.presets.length > 0) {
|
|
1285
1287
|
this.presets.forEach((preset, i) => {
|
|
1286
|
-
const presetData = presetsOnServer.find(p => p
|
|
1288
|
+
const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
|
|
1287
1289
|
|
|
1288
1290
|
preset.state = presetData ? (presetData.Power === power
|
|
1289
1291
|
&& presetData[setTempKey] === setTemperature
|
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
|
|
1060
|
+
const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
|
|
1060
1061
|
|
|
1061
1062
|
//get preset name
|
|
1062
1063
|
const name = preset.name;
|
|
@@ -1330,11 +1331,13 @@ class DeviceAtw extends EventEmitter {
|
|
|
1330
1331
|
this.deviceData = deviceData;
|
|
1331
1332
|
|
|
1332
1333
|
//keys
|
|
1334
|
+
const presetsKey = this.accountType === 'melcloud' ? 'Presets' : 'Schedule';
|
|
1335
|
+
const presetsIdKey = accountType === 'melcloud' ? 'ID' : 'Id';
|
|
1333
1336
|
const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
|
|
1334
1337
|
const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
|
|
1335
1338
|
|
|
1336
1339
|
//presets
|
|
1337
|
-
const presetsOnServer = deviceData
|
|
1340
|
+
const presetsOnServer = deviceData[presetsKey] ?? [];
|
|
1338
1341
|
|
|
1339
1342
|
//device info
|
|
1340
1343
|
const hasHeatPump = ![1, 2, 3, 4, 5, 6, 7, 15].includes(this.hideZone);
|
|
@@ -1816,7 +1819,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
1816
1819
|
//update presets state
|
|
1817
1820
|
if (this.presets.length > 0) {
|
|
1818
1821
|
this.presets.forEach((preset, i) => {
|
|
1819
|
-
const presetData = presetsOnServer.find(p => p
|
|
1822
|
+
const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
|
|
1820
1823
|
|
|
1821
1824
|
preset.state = presetData ? (presetData.Power === power
|
|
1822
1825
|
&& 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.
|
|
678
|
+
const presetData = presetsOnServer.find(p => p.ID === preset.id);
|
|
679
679
|
|
|
680
680
|
//get preset name
|
|
681
681
|
const name = preset.name;
|
|
@@ -876,12 +876,14 @@ 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';
|
|
879
881
|
const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
|
|
880
882
|
const tempStepKey = this.accountType === 'melcloud' ? 'TemperatureIncrement' : 'HasHalfDegreeIncrements';
|
|
881
883
|
const errorKey = this.accountType === 'melcloud' ? 'HasError' : 'IsInError';
|
|
882
884
|
|
|
883
885
|
//presets
|
|
884
|
-
const presetsOnServer = deviceData
|
|
886
|
+
const presetsOnServer = deviceData[presetsKey] ?? [];
|
|
885
887
|
|
|
886
888
|
//device control
|
|
887
889
|
const hideRoomTemperature = deviceData.HideRoomTemperature;
|
|
@@ -1113,7 +1115,7 @@ class DeviceErv extends EventEmitter {
|
|
|
1113
1115
|
//update presets state
|
|
1114
1116
|
if (this.presets.length > 0) {
|
|
1115
1117
|
this.presets.forEach((preset, i) => {
|
|
1116
|
-
const presetData = presetsOnServer.find(p => p
|
|
1118
|
+
const presetData = presetsOnServer.find(p => p[presetsIdKey] === preset.id);
|
|
1117
1119
|
|
|
1118
1120
|
preset.state = presetData ? (presetData.Power === power
|
|
1119
1121
|
&& presetData.SetTemperature === setTemperature
|
package/src/melcloud.js
CHANGED
|
@@ -236,11 +236,18 @@ class MelCloud extends EventEmitter {
|
|
|
236
236
|
|
|
237
237
|
const devices = buildingsList.flatMap(building => {
|
|
238
238
|
// Funkcja kapitalizująca klucze obiektu
|
|
239
|
-
|
|
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
|
|
240
248
|
const capitalizeKeysDeep = obj => {
|
|
241
|
-
if (Array.isArray(obj))
|
|
242
|
-
|
|
243
|
-
} else if (obj && typeof obj === 'object' && obj.constructor === Object) {
|
|
249
|
+
if (Array.isArray(obj)) return obj.map(capitalizeKeysDeep);
|
|
250
|
+
if (obj && typeof obj === 'object') {
|
|
244
251
|
return Object.fromEntries(
|
|
245
252
|
Object.entries(obj).map(([key, value]) => [
|
|
246
253
|
key.charAt(0).toUpperCase() + key.slice(1),
|
|
@@ -252,7 +259,8 @@ class MelCloud extends EventEmitter {
|
|
|
252
259
|
};
|
|
253
260
|
|
|
254
261
|
// Funkcja tworząca finalny obiekt Device
|
|
255
|
-
const createDevice = (device, type
|
|
262
|
+
const createDevice = (device, type) => {
|
|
263
|
+
// Settings już kapitalizowane w nazwach
|
|
256
264
|
const settingsArray = device.Settings || [];
|
|
257
265
|
|
|
258
266
|
const settingsObject = Object.fromEntries(
|
|
@@ -260,23 +268,34 @@ class MelCloud extends EventEmitter {
|
|
|
260
268
|
let parsedValue = value;
|
|
261
269
|
if (value === "True") parsedValue = true;
|
|
262
270
|
else if (value === "False") parsedValue = false;
|
|
263
|
-
else if (!isNaN(
|
|
271
|
+
else if (!isNaN(value) && value !== "") parsedValue = Number(value);
|
|
264
272
|
|
|
265
273
|
const key = name.charAt(0).toUpperCase() + name.slice(1);
|
|
266
274
|
return [key, parsedValue];
|
|
267
275
|
})
|
|
268
276
|
);
|
|
269
277
|
|
|
278
|
+
// Scal Capabilities + Settings + DeviceType w Device
|
|
270
279
|
const deviceObject = {
|
|
271
|
-
...
|
|
280
|
+
...capitalizeKeys(device.Capabilities || {}),
|
|
272
281
|
...settingsObject,
|
|
273
282
|
DeviceType: type
|
|
274
283
|
};
|
|
275
284
|
|
|
285
|
+
// Kapitalizacja brakujących obiektów/tablic
|
|
286
|
+
if (device.FrostProtection) device.FrostProtection = { ...capitalizeKeys(device.FrostProtection || {}) };
|
|
287
|
+
if (device.OverheatProtection) device.OverheatProtection = { ...capitalizeKeys(device.OverheatProtection || {}) };
|
|
288
|
+
if (device.HolidayMode) device.HolidayMode = { ...capitalizeKeys(device.HolidayMode || {}) };
|
|
289
|
+
|
|
290
|
+
if (Array.isArray(device.Schedule)) {
|
|
291
|
+
device.Schedule = device.Schedule.map(capitalizeKeysDeep);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Usuń stare pola Settings i Capabilities
|
|
276
295
|
const { Settings, Capabilities, Id, GivenDisplayName, ...rest } = device;
|
|
277
296
|
|
|
278
297
|
return {
|
|
279
|
-
...
|
|
298
|
+
...rest,
|
|
280
299
|
Type: type,
|
|
281
300
|
DeviceID: Id,
|
|
282
301
|
DeviceName: GivenDisplayName,
|
|
@@ -285,14 +304,14 @@ class MelCloud extends EventEmitter {
|
|
|
285
304
|
};
|
|
286
305
|
};
|
|
287
306
|
|
|
288
|
-
// Mapowanie urządzeń
|
|
289
307
|
return [
|
|
290
|
-
...(building.airToAirUnits || []).map(d => createDevice(
|
|
291
|
-
...(building.airToWaterUnits || []).map(d => createDevice(
|
|
292
|
-
...(building.airToVentilationUnits || []).map(d => createDevice(
|
|
308
|
+
...(building.airToAirUnits || []).map(d => createDevice(capitalizeKeys(d), 0)),
|
|
309
|
+
...(building.airToWaterUnits || []).map(d => createDevice(capitalizeKeys(d), 1)),
|
|
310
|
+
...(building.airToVentilationUnits || []).map(d => createDevice(capitalizeKeys(d), 3))
|
|
293
311
|
];
|
|
294
312
|
});
|
|
295
313
|
|
|
314
|
+
|
|
296
315
|
const devicesCount = devices.length;
|
|
297
316
|
if (devicesCount === 0) {
|
|
298
317
|
devicesList.Info = 'No devices found'
|