homebridge-melcloud-control 3.7.7 → 3.8.0-beta.0
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/config.schema.json +61 -1
- package/homebridge-ui/public/index.html +1 -0
- package/package.json +2 -2
- package/src/deviceata.js +26 -28
- package/src/deviceatw.js +46 -40
- package/src/deviceerv.js +26 -28
package/config.schema.json
CHANGED
|
@@ -829,6 +829,65 @@
|
|
|
829
829
|
"description": "Select device control mode displayed in HomeKit app.",
|
|
830
830
|
"required": true
|
|
831
831
|
},
|
|
832
|
+
"hideZone": {
|
|
833
|
+
"title": "Hide zone",
|
|
834
|
+
"type": "integer",
|
|
835
|
+
"minimum": 0,
|
|
836
|
+
"maximum": 7,
|
|
837
|
+
"default": 0,
|
|
838
|
+
"oneOf": [
|
|
839
|
+
{
|
|
840
|
+
"title": "None/Disabled",
|
|
841
|
+
"enum": [
|
|
842
|
+
0
|
|
843
|
+
]
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
"title": "Zone 1",
|
|
847
|
+
"enum": [
|
|
848
|
+
1
|
|
849
|
+
]
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
"title": "Zone 2",
|
|
853
|
+
"enum": [
|
|
854
|
+
2
|
|
855
|
+
]
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
"title": "Zone 1/2",
|
|
859
|
+
"enum": [
|
|
860
|
+
3
|
|
861
|
+
]
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
"title": "Hot Water",
|
|
865
|
+
"enum": [
|
|
866
|
+
4
|
|
867
|
+
]
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
"title": "Zone 1/Hot Water",
|
|
871
|
+
"enum": [
|
|
872
|
+
5
|
|
873
|
+
]
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
"title": "Zone 2/Hot Water",
|
|
877
|
+
"enum": [
|
|
878
|
+
6
|
|
879
|
+
]
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
"title": "Zone 1/2/Hot Water",
|
|
883
|
+
"enum": [
|
|
884
|
+
7
|
|
885
|
+
]
|
|
886
|
+
}
|
|
887
|
+
],
|
|
888
|
+
"description": "Select which zone need to be hidden in HomeKit app, if present.",
|
|
889
|
+
"required": true
|
|
890
|
+
},
|
|
832
891
|
"temperatureSensor": {
|
|
833
892
|
"title": "Temperature Sensor Room",
|
|
834
893
|
"type": "boolean",
|
|
@@ -1836,7 +1895,8 @@
|
|
|
1836
1895
|
"expanded": false,
|
|
1837
1896
|
"items": [
|
|
1838
1897
|
"accounts[].atwDevices[].name",
|
|
1839
|
-
"accounts[].atwDevices[].refreshInterval"
|
|
1898
|
+
"accounts[].atwDevices[].refreshInterval",
|
|
1899
|
+
"accounts[].atwDevices[].hideZone"
|
|
1840
1900
|
]
|
|
1841
1901
|
},
|
|
1842
1902
|
{
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.8.0-beta.0",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@homebridge/plugin-ui-utils": "^2.0.2",
|
|
39
39
|
"async-mqtt": "^2.6.3",
|
|
40
|
-
"axios": "^1.
|
|
40
|
+
"axios": "^1.9.0",
|
|
41
41
|
"express": "^5.1.0"
|
|
42
42
|
},
|
|
43
43
|
"keywords": [
|
package/src/deviceata.js
CHANGED
|
@@ -50,43 +50,39 @@ class DeviceAta extends EventEmitter {
|
|
|
50
50
|
//presets configured
|
|
51
51
|
this.presetsConfigured = [];
|
|
52
52
|
for (const preset of this.presets) {
|
|
53
|
-
const presetName = preset.name ?? false;
|
|
54
53
|
const presetDisplayType = preset.displayType ?? 0;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
58
|
-
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
59
|
-
preset.namePrefix = presetNamePrefix;
|
|
60
|
-
preset.serviceType = presetyServiceType;
|
|
61
|
-
preset.characteristicType = presetCharacteristicType;
|
|
62
|
-
preset.state = false;
|
|
63
|
-
preset.previousSettings = {};
|
|
64
|
-
this.presetsConfigured.push(preset);
|
|
65
|
-
} else {
|
|
66
|
-
const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}`);
|
|
54
|
+
if (presetDisplayType === 0) {
|
|
55
|
+
continue;
|
|
67
56
|
};
|
|
57
|
+
|
|
58
|
+
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
59
|
+
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
60
|
+
preset.name = preset.name || 'Preset'
|
|
61
|
+
preset.serviceType = presetyServiceType;
|
|
62
|
+
preset.characteristicType = presetCharacteristicType;
|
|
63
|
+
preset.state = false;
|
|
64
|
+
preset.previousSettings = {};
|
|
65
|
+
this.presetsConfigured.push(preset);
|
|
68
66
|
}
|
|
69
67
|
this.presetsConfiguredCount = this.presetsConfigured.length || 0;
|
|
70
68
|
|
|
71
69
|
//buttons configured
|
|
72
70
|
this.buttonsConfigured = [];
|
|
73
71
|
for (const button of this.buttons) {
|
|
74
|
-
const buttonName = button.name ?? false;
|
|
75
|
-
const buttonMode = button.mode ?? -1;
|
|
76
72
|
const buttonDisplayType = button.displayType ?? 0;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
80
|
-
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
81
|
-
button.namePrefix = buttonNamePrefix;
|
|
82
|
-
button.serviceType = buttonServiceType;
|
|
83
|
-
button.characteristicType = buttonCharacteristicType;
|
|
84
|
-
button.state = false;
|
|
85
|
-
button.previousValue = null;
|
|
86
|
-
this.buttonsConfigured.push(button);
|
|
87
|
-
} else {
|
|
88
|
-
const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}`);
|
|
73
|
+
if (presetDisplayType === 0) {
|
|
74
|
+
continue;
|
|
89
75
|
};
|
|
76
|
+
|
|
77
|
+
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
78
|
+
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
79
|
+
button.name = button.name || 'Button'
|
|
80
|
+
button.namePrefix = buttonNamePrefix;
|
|
81
|
+
button.serviceType = buttonServiceType;
|
|
82
|
+
button.characteristicType = buttonCharacteristicType;
|
|
83
|
+
button.state = false;
|
|
84
|
+
button.previousValue = null;
|
|
85
|
+
this.buttonsConfigured.push(button);;
|
|
90
86
|
}
|
|
91
87
|
this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
|
|
92
88
|
|
|
@@ -281,7 +277,7 @@ class DeviceAta extends EventEmitter {
|
|
|
281
277
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare accessory`) : false;
|
|
282
278
|
const accessoryName = deviceName;
|
|
283
279
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
284
|
-
const accessoryCategory = Categories.
|
|
280
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.displayType];
|
|
285
281
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
286
282
|
|
|
287
283
|
//information service
|
|
@@ -299,6 +295,7 @@ class DeviceAta extends EventEmitter {
|
|
|
299
295
|
case 1: //Heater Cooler
|
|
300
296
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare heater/cooler service`) : false;
|
|
301
297
|
this.melCloudService = new Service.HeaterCooler(serviceName, `HeaterCooler ${deviceId}`);
|
|
298
|
+
this.melCloudService.setPrimaryService(true);
|
|
302
299
|
this.melCloudService.getCharacteristic(Characteristic.Active)
|
|
303
300
|
.onGet(async () => {
|
|
304
301
|
const state = this.accessory.power;
|
|
@@ -499,6 +496,7 @@ class DeviceAta extends EventEmitter {
|
|
|
499
496
|
case 2: //Thermostat
|
|
500
497
|
const debug1 = this.enableDebugMode ? this.emit('debug', `Prepare thermostat service`) : false;
|
|
501
498
|
this.melCloudService = new Service.Thermostat(serviceName, `Thermostat ${deviceId}`);
|
|
499
|
+
this.melCloudService.setPrimaryService(true);
|
|
502
500
|
this.melCloudService.getCharacteristic(Characteristic.CurrentHeatingCoolingState)
|
|
503
501
|
.onGet(async () => {
|
|
504
502
|
const value = this.accessory.currentOperationMode;
|
package/src/deviceatw.js
CHANGED
|
@@ -17,6 +17,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
17
17
|
|
|
18
18
|
//account config
|
|
19
19
|
this.displayMode = device.displayMode;
|
|
20
|
+
this.hideZone = device.hideZone;
|
|
20
21
|
this.temperatureSensor = device.temperatureSensor || false;
|
|
21
22
|
this.temperatureSensorFlow = device.temperatureSensorFlow || false;
|
|
22
23
|
this.temperatureSensorReturn = device.temperatureSensorReturn || false;
|
|
@@ -54,43 +55,39 @@ class DeviceAtw extends EventEmitter {
|
|
|
54
55
|
//presets configured
|
|
55
56
|
this.presetsConfigured = [];
|
|
56
57
|
for (const preset of this.presets) {
|
|
57
|
-
const presetName = preset.name ?? false;
|
|
58
58
|
const presetDisplayType = preset.displayType ?? 0;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
62
|
-
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
63
|
-
preset.namePrefix = presetNamePrefix;
|
|
64
|
-
preset.serviceType = presetyServiceType;
|
|
65
|
-
preset.characteristicType = presetCharacteristicType;
|
|
66
|
-
preset.state = false;
|
|
67
|
-
preset.previousSettings = {};
|
|
68
|
-
this.presetsConfigured.push(preset);
|
|
69
|
-
} else {
|
|
70
|
-
const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}`);
|
|
59
|
+
if (presetDisplayType === 0) {
|
|
60
|
+
continue;
|
|
71
61
|
};
|
|
62
|
+
|
|
63
|
+
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
64
|
+
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
65
|
+
preset.name = preset.name || 'Preset'
|
|
66
|
+
preset.serviceType = presetyServiceType;
|
|
67
|
+
preset.characteristicType = presetCharacteristicType;
|
|
68
|
+
preset.state = false;
|
|
69
|
+
preset.previousSettings = {};
|
|
70
|
+
this.presetsConfigured.push(preset);
|
|
72
71
|
}
|
|
73
72
|
this.presetsConfiguredCount = this.presetsConfigured.length || 0;
|
|
74
73
|
|
|
75
74
|
//buttons configured
|
|
76
75
|
this.buttonsConfigured = [];
|
|
77
76
|
for (const button of this.buttons) {
|
|
78
|
-
const buttonName = button.name ?? false;
|
|
79
|
-
const buttonMode = button.mode ?? -1;
|
|
80
77
|
const buttonDisplayType = button.displayType ?? 0;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
84
|
-
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
85
|
-
button.namePrefix = buttonNamePrefix;
|
|
86
|
-
button.serviceType = buttonServiceType;
|
|
87
|
-
button.characteristicType = buttonCharacteristicType;
|
|
88
|
-
button.state = false;
|
|
89
|
-
button.previousValue = null;
|
|
90
|
-
this.buttonsConfigured.push(button);
|
|
91
|
-
} else {
|
|
92
|
-
const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}`);
|
|
78
|
+
if (presetDisplayType === 0) {
|
|
79
|
+
continue;
|
|
93
80
|
};
|
|
81
|
+
|
|
82
|
+
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
83
|
+
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
84
|
+
button.name = button.name || 'Button'
|
|
85
|
+
button.namePrefix = buttonNamePrefix;
|
|
86
|
+
button.serviceType = buttonServiceType;
|
|
87
|
+
button.characteristicType = buttonCharacteristicType;
|
|
88
|
+
button.state = false;
|
|
89
|
+
button.previousValue = null;
|
|
90
|
+
this.buttonsConfigured.push(button);;
|
|
94
91
|
}
|
|
95
92
|
this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
|
|
96
93
|
|
|
@@ -290,6 +287,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
290
287
|
try {
|
|
291
288
|
const presetsOnServer = this.accessory.presets;
|
|
292
289
|
const zonesCount = this.accessory.zonesCount;
|
|
290
|
+
const caseZone1 = this.accessory.caseZone1;
|
|
293
291
|
const caseHotWater = this.accessory.caseHotWater;
|
|
294
292
|
const caseZone2 = this.accessory.caseZone2;
|
|
295
293
|
const heatCoolModes = this.accessory.heatCoolModes;
|
|
@@ -307,7 +305,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
307
305
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare accessory`) : false;
|
|
308
306
|
const accessoryName = deviceName;
|
|
309
307
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
310
|
-
const accessoryCategory = Categories.AIR_HEATER;
|
|
308
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.displayType];
|
|
311
309
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
312
310
|
|
|
313
311
|
//information service
|
|
@@ -328,6 +326,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
328
326
|
case 1: //Heater Cooler
|
|
329
327
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare heather/cooler ${zoneName} service`) : false;
|
|
330
328
|
const melCloudService = new Service.HeaterCooler(serviceName, `HeaterCooler ${deviceId} ${i}`);
|
|
329
|
+
melCloudService.setPrimaryService(true);
|
|
331
330
|
melCloudService.getCharacteristic(Characteristic.Active)
|
|
332
331
|
.onGet(async () => {
|
|
333
332
|
const state = this.accessory.power;
|
|
@@ -385,7 +384,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
385
384
|
};
|
|
386
385
|
operationModeText = [HeatPump.System[0], HeatPump.System[deviceData.Device.UnitStatus]][this.accessory.power];
|
|
387
386
|
break;
|
|
388
|
-
case
|
|
387
|
+
case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
|
|
389
388
|
switch (value) {
|
|
390
389
|
case 0: //AUTO - HEAT CURVE
|
|
391
390
|
deviceData.Device.OperationModeZone1 = 2;
|
|
@@ -473,7 +472,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
473
472
|
//deviceData.Device.SetTemperatureZone1 = value;
|
|
474
473
|
//deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.SetTemperatureZone1;
|
|
475
474
|
break;
|
|
476
|
-
case
|
|
475
|
+
case caseZone1: //Zone 1
|
|
477
476
|
switch (this.accessory.zones[i].operationMode) {
|
|
478
477
|
case 1: //HEAT FLOW
|
|
479
478
|
deviceData.Device.SetHeatFlowTemperatureZone1 = value;
|
|
@@ -537,7 +536,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
537
536
|
//deviceData.Device.SetTemperatureZone1 = value;
|
|
538
537
|
//deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.SetTemperatureZone1;
|
|
539
538
|
break;
|
|
540
|
-
case
|
|
539
|
+
case caseZone1: //Zone 1
|
|
541
540
|
switch (this.accessory.zones[i].operationMode) {
|
|
542
541
|
case 1: //HEAT FLOW
|
|
543
542
|
deviceData.Device.SetHeatFlowTemperatureZone1 = value;
|
|
@@ -597,7 +596,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
597
596
|
deviceData.Device.ProhibitZone2 = value;
|
|
598
597
|
HeatPump.EffectiveFlags.ProhibitHeatingZone1 + HeatPump.EffectiveFlags.ProhibitHotWater + HeatPump.EffectiveFlags.ProhibitHeatingZone2;
|
|
599
598
|
break;
|
|
600
|
-
case
|
|
599
|
+
case caseZone1: //Zone 1
|
|
601
600
|
deviceData.Device.ProhibitZone1 = value;
|
|
602
601
|
HeatPump.EffectiveFlags.ProhibitHeatingZone1;
|
|
603
602
|
break;
|
|
@@ -638,6 +637,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
638
637
|
case 2: //Thermostat
|
|
639
638
|
const debug3 = this.enableDebugMode ? this.emit('debug', `Prepare thermostat ${zoneName} service`) : false;
|
|
640
639
|
const melCloudServiceT = new Service.Thermostat(serviceName, `Thermostat ${deviceId} ${i}`);
|
|
640
|
+
melCloudServiceT.setPrimaryService(true);
|
|
641
641
|
melCloudServiceT.getCharacteristic(Characteristic.CurrentHeatingCoolingState)
|
|
642
642
|
.onGet(async () => {
|
|
643
643
|
const value = this.accessory.zones[i].currentOperationMode;
|
|
@@ -680,7 +680,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
680
680
|
};
|
|
681
681
|
operationModeText = [HeatPump.System[0], HeatPump.System[deviceData.Device.UnitStatus]][this.accessory.power];
|
|
682
682
|
break;
|
|
683
|
-
case
|
|
683
|
+
case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
|
|
684
684
|
switch (value) {
|
|
685
685
|
case 0: //OFF - HEAT CURVE
|
|
686
686
|
deviceData.Device.OperationModeZone1 = 2;
|
|
@@ -778,7 +778,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
778
778
|
//deviceData.Device.SetTemperatureZone1 = value;
|
|
779
779
|
//deviceData.Device.EffectiveFlags = CONSTANTS.HeatPump.EffectiveFlags.SetTemperatureZone1;
|
|
780
780
|
break;
|
|
781
|
-
case
|
|
781
|
+
case caseZone1: //Zone 1
|
|
782
782
|
deviceData.Device.SetTemperatureZone1 = value;
|
|
783
783
|
deviceData.Device.EffectiveFlags = HeatPump.EffectiveFlags.SetTemperatureZone1;
|
|
784
784
|
break;
|
|
@@ -875,7 +875,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
875
875
|
accessory.addService(this.returnTemperatureSensorService);
|
|
876
876
|
};
|
|
877
877
|
break;
|
|
878
|
-
case
|
|
878
|
+
case caseZone1: //Zone 1
|
|
879
879
|
if (temperatureSensor && this.accessory.zones[i].roomTemperature !== null) {
|
|
880
880
|
const debug = this.enableDebugMode ? this.emit('debug', `${zoneName}, Prepare temperature sensor service`) : false;
|
|
881
881
|
this.roomTemperatureZone1SensorService = new Service.TemperatureSensor(`${serviceName}`, `${zoneName} Temperature Sensor ${deviceId} ${i}`);
|
|
@@ -1338,8 +1338,9 @@ class DeviceAtw extends EventEmitter {
|
|
|
1338
1338
|
const presetsOnServer = deviceData.Presets ?? [];
|
|
1339
1339
|
|
|
1340
1340
|
//device info
|
|
1341
|
-
const
|
|
1342
|
-
const
|
|
1341
|
+
const hasZone1 = this.hideZone !== 1 || this.hideZone !== 5 || this.hideZone !== 7 ? true : false;
|
|
1342
|
+
const hasHotWaterTank = (this.hideZone !== 4 || this.hideZone !== 5 || this.hideZone !== 6 || this.hideZone !== 7) && deviceData.Device.HasHotWaterTank ? true : false;
|
|
1343
|
+
const hasZone2 = (this.hideZone !== 2 || this.hideZone !== 3 || this.hideZone !== 6 || this.hideZone !== 7) && deviceData.Device.HasZone2 ? true : false;
|
|
1343
1344
|
const canHeat = deviceData.Device.CanHeat ?? false;
|
|
1344
1345
|
const canCool = deviceData.Device.CanCool ?? false;
|
|
1345
1346
|
const heatCoolModes = canHeat && canCool ? 0 : canHeat ? 1 : canCool ? 2 : 3;
|
|
@@ -1349,9 +1350,13 @@ class DeviceAtw extends EventEmitter {
|
|
|
1349
1350
|
const maxTankTemperature = deviceData.Device.MaxTankTemperature ?? 70
|
|
1350
1351
|
|
|
1351
1352
|
//zones
|
|
1353
|
+
const zone1 = hasZone1 ? 1 : 0;
|
|
1352
1354
|
const hotWater = hasHotWaterTank ? 1 : 0;
|
|
1353
1355
|
const zone2 = hasZone2 ? 1 : 0;
|
|
1354
|
-
const zonesCount =
|
|
1356
|
+
const zonesCount = 1 + zone1 + hotWater + zone2;
|
|
1357
|
+
|
|
1358
|
+
//zone cases
|
|
1359
|
+
const caseZone1 = hasZone1 ? 1 : -1;
|
|
1355
1360
|
const caseHotWater = hasHotWaterTank ? 2 : -1;
|
|
1356
1361
|
const caseZone2 = hasZone2 ? hasHotWaterTank ? 3 : 2 : -1;
|
|
1357
1362
|
|
|
@@ -1410,6 +1415,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
1410
1415
|
this.accessory.hasZone2 = hasZone2;
|
|
1411
1416
|
this.accessory.zonesCount = zonesCount;
|
|
1412
1417
|
this.accessory.heatCoolModes = heatCoolModes;
|
|
1418
|
+
this.accessory.caseZone1 = caseZone1;
|
|
1413
1419
|
this.accessory.caseHotWater = caseHotWater;
|
|
1414
1420
|
this.accessory.caseZone2 = caseZone2;
|
|
1415
1421
|
|
|
@@ -1450,7 +1456,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
1450
1456
|
temperatureSetPropsMinValue = -35;
|
|
1451
1457
|
temperatureSetPropsMaxValue = 100;
|
|
1452
1458
|
break;
|
|
1453
|
-
case
|
|
1459
|
+
case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
|
|
1454
1460
|
name = zone1Name;
|
|
1455
1461
|
operationModeZone = operationMode;
|
|
1456
1462
|
currentOperationMode = !power ? 0 : idleZone1 ? 1 : [2, 2, 2, 3, 3, 2][operationModeZone1]; //INACTIVE, IDLE, HEATING, COOLING
|
|
@@ -1571,7 +1577,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
1571
1577
|
temperatureSetPropsMinValue = 10;
|
|
1572
1578
|
temperatureSetPropsMaxValue = 70;
|
|
1573
1579
|
break;
|
|
1574
|
-
case
|
|
1580
|
+
case caseZone1: //Zone 1 - HEAT THERMOSTAT, HEAT FLOW, HEAT CURVE, COOL THERMOSTAT, COOL FLOW, FLOOR DRY UP
|
|
1575
1581
|
name = zone1Name;
|
|
1576
1582
|
operationModeZone = operationMode;
|
|
1577
1583
|
currentOperationMode = !power ? 0 : idleZone1 ? 0 : [1, 1, 1, 2, 2, 1][operationModeZone1]; //OFF, HEAT, COOL
|
package/src/deviceerv.js
CHANGED
|
@@ -48,43 +48,39 @@ class DeviceErv extends EventEmitter {
|
|
|
48
48
|
//presets configured
|
|
49
49
|
this.presetsConfigured = [];
|
|
50
50
|
for (const preset of this.presets) {
|
|
51
|
-
const presetName = preset.name ?? false;
|
|
52
51
|
const presetDisplayType = preset.displayType ?? 0;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
56
|
-
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
57
|
-
preset.namePrefix = presetNamePrefix;
|
|
58
|
-
preset.serviceType = presetyServiceType;
|
|
59
|
-
preset.characteristicType = presetCharacteristicType;
|
|
60
|
-
preset.state = false;
|
|
61
|
-
preset.previousSettings = {};
|
|
62
|
-
this.presetsConfigured.push(preset);
|
|
63
|
-
} else {
|
|
64
|
-
const log = presetDisplayType === 0 ? false : this.emit('warn', `Preset Name: ${preset ? preset : 'Missing'}`);
|
|
52
|
+
if (presetDisplayType === 0) {
|
|
53
|
+
continue;
|
|
65
54
|
};
|
|
55
|
+
|
|
56
|
+
const presetyServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][presetDisplayType];
|
|
57
|
+
const presetCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][presetDisplayType];
|
|
58
|
+
preset.name = preset.name || 'Preset'
|
|
59
|
+
preset.serviceType = presetyServiceType;
|
|
60
|
+
preset.characteristicType = presetCharacteristicType;
|
|
61
|
+
preset.state = false;
|
|
62
|
+
preset.previousSettings = {};
|
|
63
|
+
this.presetsConfigured.push(preset);
|
|
66
64
|
}
|
|
67
65
|
this.presetsConfiguredCount = this.presetsConfigured.length || 0;
|
|
68
66
|
|
|
69
67
|
//buttons configured
|
|
70
68
|
this.buttonsConfigured = [];
|
|
71
69
|
for (const button of this.buttons) {
|
|
72
|
-
const buttonName = button.name ?? false;
|
|
73
|
-
const buttonMode = button.mode ?? -1;
|
|
74
70
|
const buttonDisplayType = button.displayType ?? 0;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
78
|
-
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
79
|
-
button.namePrefix = buttonNamePrefix;
|
|
80
|
-
button.serviceType = buttonServiceType;
|
|
81
|
-
button.characteristicType = buttonCharacteristicType;
|
|
82
|
-
button.state = false;
|
|
83
|
-
button.previousValue = null;
|
|
84
|
-
this.buttonsConfigured.push(button);
|
|
85
|
-
} else {
|
|
86
|
-
const log = buttonDisplayType === 0 ? false : this.emit('warn', `Button Name: ${buttonName ? buttonName : 'Missing'}, Mode: ${buttonMode ? buttonMode : 'Missing'}`);
|
|
71
|
+
if (presetDisplayType === 0) {
|
|
72
|
+
continue;
|
|
87
73
|
};
|
|
74
|
+
|
|
75
|
+
const buttonServiceType = ['', Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][buttonDisplayType];
|
|
76
|
+
const buttonCharacteristicType = ['', Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][buttonDisplayType];
|
|
77
|
+
button.name = button.name || 'Button'
|
|
78
|
+
button.namePrefix = buttonNamePrefix;
|
|
79
|
+
button.serviceType = buttonServiceType;
|
|
80
|
+
button.characteristicType = buttonCharacteristicType;
|
|
81
|
+
button.state = false;
|
|
82
|
+
button.previousValue = null;
|
|
83
|
+
this.buttonsConfigured.push(button);;
|
|
88
84
|
}
|
|
89
85
|
this.buttonsConfiguredCount = this.buttonsConfigured.length || 0;
|
|
90
86
|
|
|
@@ -268,7 +264,7 @@ class DeviceErv extends EventEmitter {
|
|
|
268
264
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare accessory`) : false;
|
|
269
265
|
const accessoryName = deviceName;
|
|
270
266
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
271
|
-
const accessoryCategory = Categories.AIR_PURIFIER;
|
|
267
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_PURIFIER, Categories.THERMOSTAT][this.displayType];
|
|
272
268
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
273
269
|
|
|
274
270
|
//information service
|
|
@@ -286,6 +282,7 @@ class DeviceErv extends EventEmitter {
|
|
|
286
282
|
case 1: //Heater Cooler
|
|
287
283
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare heather/cooler service`) : false;
|
|
288
284
|
this.melCloudService = new Service.HeaterCooler(serviceName, `HeaterCooler ${deviceId}`);
|
|
285
|
+
this.melCloudService.setPrimaryService(true);
|
|
289
286
|
this.melCloudService.getCharacteristic(Characteristic.Active)
|
|
290
287
|
.onGet(async () => {
|
|
291
288
|
const state = this.accessory.power;
|
|
@@ -464,6 +461,7 @@ class DeviceErv extends EventEmitter {
|
|
|
464
461
|
case 2: //Thermostat
|
|
465
462
|
const debug1 = this.enableDebugMode ? this.emit('debug', `Prepare thermostat service`) : false;
|
|
466
463
|
this.melCloudService = new Service.Thermostat(serviceName, `Thermostat ${deviceId}`);
|
|
464
|
+
this.melCloudService.setPrimaryService(true);
|
|
467
465
|
this.melCloudService.getCharacteristic(Characteristic.CurrentHeatingCoolingState)
|
|
468
466
|
.onGet(async () => {
|
|
469
467
|
const value = this.accessory.currentOperationMode;
|