homebridge-melcloud-control 4.1.2-beta.19 → 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.
- package/homebridge-ui/public/index.html +2 -0
- package/package.json +1 -1
- package/src/deviceata.js +9 -11
- package/src/deviceatw.js +3 -6
- package/src/deviceerv.js +3 -5
- package/src/melcloud.js +13 -32
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.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
|
|
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
|
|
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?.
|
|
1039
|
-
const frostProtectionActive = deviceData.FrostProtection?.
|
|
1040
|
-
const overheatProtectionEnabled = deviceData.OverheatProtection?.
|
|
1041
|
-
const overheatProtectionActive = deviceData.OverheatProtection?.
|
|
1042
|
-
const holidayModeEnabled = deviceData.HolidayMode?.
|
|
1043
|
-
const holidayModeActive = deviceData.HolidayMode?.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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))
|
|
250
|
-
|
|
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,34 +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
|
-
...
|
|
271
|
+
...capitalizeKeysDeep(device.Capabilities || {}),
|
|
281
272
|
...settingsObject,
|
|
282
273
|
DeviceType: type
|
|
283
274
|
};
|
|
284
275
|
|
|
285
|
-
|
|
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
|
|
295
|
-
const { Settings, Capabilities, Id, GivenDisplayName, FrostProtection, OverheatProtection, HolidayMode, Schedule, ...rest } = device;
|
|
276
|
+
const { Settings, Capabilities, Id, GivenDisplayName, ...rest } = device;
|
|
296
277
|
|
|
297
278
|
return {
|
|
298
|
-
...rest,
|
|
279
|
+
...capitalizeKeysDeep(rest),
|
|
299
280
|
Type: type,
|
|
300
281
|
DeviceID: Id,
|
|
301
282
|
DeviceName: GivenDisplayName,
|
|
@@ -304,14 +285,14 @@ class MelCloud extends EventEmitter {
|
|
|
304
285
|
};
|
|
305
286
|
};
|
|
306
287
|
|
|
288
|
+
// Mapowanie urządzeń
|
|
307
289
|
return [
|
|
308
|
-
...(building.airToAirUnits || []).map(d => createDevice(
|
|
309
|
-
...(building.airToWaterUnits || []).map(d => createDevice(
|
|
310
|
-
...(building.airToVentilationUnits || []).map(d => createDevice(
|
|
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))
|
|
311
293
|
];
|
|
312
294
|
});
|
|
313
295
|
|
|
314
|
-
|
|
315
296
|
const devicesCount = devices.length;
|
|
316
297
|
if (devicesCount === 0) {
|
|
317
298
|
devicesList.Info = 'No devices found'
|