homebridge-melcloud-control 4.2.0 → 4.2.1-beta.1
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/README.md +6 -4
- package/config.schema.json +8 -8
- package/package.json +2 -2
- package/src/deviceata.js +1 -0
- package/src/melcloudata.js +10 -10
- package/src/melcloudatw.js +7 -7
- package/src/melclouderv.js +7 -7
package/README.md
CHANGED
|
@@ -27,14 +27,16 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
|
|
|
27
27
|
|
|
28
28
|
### About The Plugin
|
|
29
29
|
|
|
30
|
-
*
|
|
31
|
-
* Control devices over MELCloud and MELCloud Home.
|
|
30
|
+
* Support devices connected to MELCloud or MELCloud Home.
|
|
32
31
|
* Support multiple accounts, buildings, floors, areas.
|
|
33
32
|
* Support temperature display units `Celsius/Fahrenheit`.
|
|
34
33
|
* Support assing inividual operating mode for `Heat/Cool/Auto`.
|
|
35
|
-
* Support direct `Presets` control
|
|
34
|
+
* Support direct `Presets` control, only MELCloud.
|
|
35
|
+
* Support direct `Schedules` control, only MELCloud Home.
|
|
36
|
+
* Support direct `Frost protection` control, only MELCloud Home.
|
|
37
|
+
* Support direct `Overheat Protection` control, only MELCloud Home.
|
|
38
|
+
* Support direct `Holiday Mode` control.
|
|
36
39
|
* Support direct `Functions` control using extra `Buttons`, switch it to `OFF` restore previous device state.
|
|
37
|
-
* Support detect all device states using extra `Sensors`.
|
|
38
40
|
* Support automations, shortcuts and Siri.
|
|
39
41
|
* Support external integrations, [RESTFul](https://github.com/grzegorz914/homebridge-melcloud-control?tab=readme-ov-file#restful-integration), [MQTT](https://github.com/grzegorz914/homebridge-melcloud-control?tab=readme-ov-file#mqtt-integration).
|
|
40
42
|
* Control devices over local network You need use ESP module and [Tasmota Control](https://github.com/grzegorz914/homebridge-tasmota-control) plugin.
|
package/config.schema.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"fixArrays": true,
|
|
6
6
|
"strictValidation": true,
|
|
7
7
|
"customUi": true,
|
|
8
|
-
"headerDisplay": "This plugin works with Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation connected to MELCloud
|
|
8
|
+
"headerDisplay": "This plugin works with Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation connected to MELCloud and MELCloud Home. Devices are exposed to HomeKit as separate accessories and each needs to be manually [paired](https://github.com/grzegorz914/homebridge-melcloud-control/wiki#adding-to-homekit).",
|
|
9
9
|
"footerDisplay": "For documentation please see [GitHub repository](https://github.com/grzegorz914/homebridge-melcloud-control).",
|
|
10
10
|
"schema": {
|
|
11
11
|
"type": "object",
|
|
@@ -506,7 +506,7 @@
|
|
|
506
506
|
"title": "Prefix",
|
|
507
507
|
"type": "boolean",
|
|
508
508
|
"default": false,
|
|
509
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
509
|
+
"description": "Enable/disable the accessory name as a prefix for preset name.",
|
|
510
510
|
"condition": {
|
|
511
511
|
"functionBody": "return model.accounts[arrayIndices[0]].ataDevices[arrayIndices[1]].presets[arrayIndices[2]].displayType > 0;"
|
|
512
512
|
}
|
|
@@ -575,7 +575,7 @@
|
|
|
575
575
|
"title": "Prefix",
|
|
576
576
|
"type": "boolean",
|
|
577
577
|
"default": false,
|
|
578
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
578
|
+
"description": "Enable/disable the accessory name as a prefix for schedule name.",
|
|
579
579
|
"condition": {
|
|
580
580
|
"functionBody": "return model.accounts[arrayIndices[0]].ataDevices[arrayIndices[1]].schedules[arrayIndices[2]].displayType > 0;"
|
|
581
581
|
}
|
|
@@ -1200,7 +1200,7 @@
|
|
|
1200
1200
|
"title": "Prefix",
|
|
1201
1201
|
"type": "boolean",
|
|
1202
1202
|
"default": false,
|
|
1203
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
1203
|
+
"description": "Enable/disable the accessory name as a prefix for preset name.",
|
|
1204
1204
|
"condition": {
|
|
1205
1205
|
"functionBody": "return model.accounts[arrayIndices[0]].atwDevices[arrayIndices[1]].presets[arrayIndices[2]].displayType > 0;"
|
|
1206
1206
|
}
|
|
@@ -1269,7 +1269,7 @@
|
|
|
1269
1269
|
"title": "Prefix",
|
|
1270
1270
|
"type": "boolean",
|
|
1271
1271
|
"default": false,
|
|
1272
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
1272
|
+
"description": "Enable/disable the accessory name as a prefix for schedule name.",
|
|
1273
1273
|
"condition": {
|
|
1274
1274
|
"functionBody": "return model.accounts[arrayIndices[0]].atwDevices[arrayIndices[1]].schedules[arrayIndices[2]].displayType > 0;"
|
|
1275
1275
|
}
|
|
@@ -1676,7 +1676,7 @@
|
|
|
1676
1676
|
"title": "Prefix",
|
|
1677
1677
|
"type": "boolean",
|
|
1678
1678
|
"default": false,
|
|
1679
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
1679
|
+
"description": "Enable/disable the accessory name as a prefix for preset name.",
|
|
1680
1680
|
"condition": {
|
|
1681
1681
|
"functionBody": "return model.accounts[arrayIndices[0]].ervDevices[arrayIndices[1]].presets[arrayIndices[2]].displayType > 0;"
|
|
1682
1682
|
}
|
|
@@ -1745,7 +1745,7 @@
|
|
|
1745
1745
|
"title": "Prefix",
|
|
1746
1746
|
"type": "boolean",
|
|
1747
1747
|
"default": false,
|
|
1748
|
-
"description": "Enable/disable the accessory name as a prefix for
|
|
1748
|
+
"description": "Enable/disable the accessory name as a prefix for schedule name.",
|
|
1749
1749
|
"condition": {
|
|
1750
1750
|
"functionBody": "return model.accounts[arrayIndices[0]].ervDevices[arrayIndices[1]].schedules[arrayIndices[2]].displayType > 0;"
|
|
1751
1751
|
}
|
|
@@ -1953,7 +1953,7 @@
|
|
|
1953
1953
|
"title": "Device Info",
|
|
1954
1954
|
"type": "boolean",
|
|
1955
1955
|
"default": true,
|
|
1956
|
-
"description": "This enable logging device info
|
|
1956
|
+
"description": "This enable logging device info on plugin start."
|
|
1957
1957
|
},
|
|
1958
1958
|
"success": {
|
|
1959
1959
|
"title": "Log Success",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.2.
|
|
4
|
+
"version": "4.2.1-beta.1",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"async-mqtt": "^2.6.3",
|
|
40
40
|
"axios": "^1.13.2",
|
|
41
41
|
"express": "^5.1.0",
|
|
42
|
-
"puppeteer": "^24.
|
|
42
|
+
"puppeteer": "^24.30.0"
|
|
43
43
|
},
|
|
44
44
|
"keywords": [
|
|
45
45
|
"homebridge",
|
package/src/deviceata.js
CHANGED
|
@@ -192,6 +192,7 @@ class DeviceAta extends EventEmitter {
|
|
|
192
192
|
effectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
193
193
|
break;
|
|
194
194
|
case 'FanSpeed':
|
|
195
|
+
key = this.accountType === 'melcloud' ? key : 'SetFanSpeed';
|
|
195
196
|
deviceData.Device[key] = value;
|
|
196
197
|
effectiveFlags = AirConditioner.EffectiveFlags.SetFanSpeed;
|
|
197
198
|
break;
|
package/src/melcloudata.js
CHANGED
|
@@ -142,6 +142,9 @@ class MelCloudAta extends EventEmitter {
|
|
|
142
142
|
|
|
143
143
|
async send(accountType, displayType, deviceData, effectiveFlags) {
|
|
144
144
|
try {
|
|
145
|
+
let method = null
|
|
146
|
+
let payload = {};
|
|
147
|
+
let path = '';
|
|
145
148
|
switch (accountType) {
|
|
146
149
|
case "melcloud":
|
|
147
150
|
const axiosInstancePost = axios.create({
|
|
@@ -157,7 +160,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
157
160
|
}
|
|
158
161
|
|
|
159
162
|
deviceData.Device.EffectiveFlags = effectiveFlags;
|
|
160
|
-
|
|
163
|
+
payload = {
|
|
161
164
|
data: {
|
|
162
165
|
DeviceID: deviceData.Device.DeviceID,
|
|
163
166
|
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
@@ -195,12 +198,9 @@ class MelCloudAta extends EventEmitter {
|
|
|
195
198
|
}
|
|
196
199
|
}
|
|
197
200
|
|
|
198
|
-
let method = null
|
|
199
|
-
let settings = {};
|
|
200
|
-
let path = '';
|
|
201
201
|
switch (effectiveFlags) {
|
|
202
202
|
case 'frostprotection':
|
|
203
|
-
|
|
203
|
+
payload = {
|
|
204
204
|
data: {
|
|
205
205
|
enabled: deviceData.FrostProtection.Enabled,
|
|
206
206
|
min: deviceData.FrostProtection.Min,
|
|
@@ -212,7 +212,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
212
212
|
path = ApiUrlsHome.PostProtectionFrost;
|
|
213
213
|
break;
|
|
214
214
|
case 'overheatprotection':
|
|
215
|
-
|
|
215
|
+
payload = {
|
|
216
216
|
data: {
|
|
217
217
|
enabled: deviceData.OverheatProtection.Enabled,
|
|
218
218
|
min: deviceData.OverheatProtection.Min,
|
|
@@ -224,7 +224,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
224
224
|
path = ApiUrlsHome.PostProtectionOverheat;
|
|
225
225
|
break;
|
|
226
226
|
case 'holidaymode':
|
|
227
|
-
|
|
227
|
+
payload = {
|
|
228
228
|
data: {
|
|
229
229
|
enabled: deviceData.HolidayMode.Enabled,
|
|
230
230
|
startDate: deviceData.HolidayMode.StartDate,
|
|
@@ -236,7 +236,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
236
236
|
path = ApiUrlsHome.PostHolidayMode;
|
|
237
237
|
break;
|
|
238
238
|
case 'schedule':
|
|
239
|
-
|
|
239
|
+
payload = {
|
|
240
240
|
data: {
|
|
241
241
|
enabled: deviceData.ScheduleEnabled
|
|
242
242
|
}
|
|
@@ -245,7 +245,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
245
245
|
path = ApiUrlsHome.PutScheduleEnable.replace('deviceid', deviceData.DeviceID);
|
|
246
246
|
break;
|
|
247
247
|
default:
|
|
248
|
-
|
|
248
|
+
payload = {
|
|
249
249
|
data: {
|
|
250
250
|
Power: deviceData.Device.Power,
|
|
251
251
|
SetTemperature: deviceData.Device.SetTemperature,
|
|
@@ -269,7 +269,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(settings.data, null, 2)}`);
|
|
272
|
-
await axiosInstancePut(path,
|
|
272
|
+
await axiosInstancePut(path, payload);
|
|
273
273
|
this.updateData(deviceData);
|
|
274
274
|
return true;
|
|
275
275
|
default:
|
package/src/melcloudatw.js
CHANGED
|
@@ -147,6 +147,9 @@ class MelCloudAtw extends EventEmitter {
|
|
|
147
147
|
deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature < minTempWaterTank ? minTempWaterTank : deviceData.Device.SetTankWaterTemperature;
|
|
148
148
|
deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature > maxTempWaterTank ? maxTempWaterTank : deviceData.Device.SetTankWaterTemperature;
|
|
149
149
|
|
|
150
|
+
let method = null
|
|
151
|
+
let payload = {};
|
|
152
|
+
let path = '';
|
|
150
153
|
switch (accountType) {
|
|
151
154
|
case "melcloud":
|
|
152
155
|
const axiosInstancePost = axios.create({
|
|
@@ -158,7 +161,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
158
161
|
});
|
|
159
162
|
|
|
160
163
|
deviceData.Device.EffectiveFlags = effectiveFlags;
|
|
161
|
-
|
|
164
|
+
payload = {
|
|
162
165
|
data: {
|
|
163
166
|
DeviceID: deviceData.Device.DeviceID,
|
|
164
167
|
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
@@ -187,19 +190,16 @@ class MelCloudAtw extends EventEmitter {
|
|
|
187
190
|
this.updateData(deviceData);
|
|
188
191
|
return true;
|
|
189
192
|
case "melcloudhome":
|
|
190
|
-
let method = null
|
|
191
|
-
let settings = {};
|
|
192
|
-
let path = '';
|
|
193
193
|
switch (effectiveFlags) {
|
|
194
194
|
case 'holidaymode':
|
|
195
|
-
|
|
195
|
+
payload = {
|
|
196
196
|
data: { enabled: deviceData.HolidayMode.Enabled, startDate: deviceData.HolidayMode.StartDate, endDate: deviceData.HolidayMode.EndDate, units: { "ATW": [deviceData.DeviceID] } }
|
|
197
197
|
};
|
|
198
198
|
method = 'POST';
|
|
199
199
|
path = ApiUrlsHome.PostHolidayMode;
|
|
200
200
|
break;
|
|
201
201
|
case 'schedule':
|
|
202
|
-
|
|
202
|
+
payload = {
|
|
203
203
|
data: {
|
|
204
204
|
enabled: deviceData.ScheduleEnabled
|
|
205
205
|
}
|
|
@@ -208,7 +208,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
208
208
|
path = ApiUrlsHome.PutScheduleEnable.replace('deviceid', deviceData.DeviceID);
|
|
209
209
|
break;
|
|
210
210
|
default:
|
|
211
|
-
|
|
211
|
+
payload = {
|
|
212
212
|
data: {
|
|
213
213
|
Power: deviceData.Device.Power,
|
|
214
214
|
SetTemperatureZone1: deviceData.Device.SetTemperatureZone1,
|
package/src/melclouderv.js
CHANGED
|
@@ -136,6 +136,9 @@ class MelCloudErv extends EventEmitter {
|
|
|
136
136
|
|
|
137
137
|
async send(accountType, displayType, deviceData, effectiveFlags) {
|
|
138
138
|
try {
|
|
139
|
+
let method = null
|
|
140
|
+
let payload = {};
|
|
141
|
+
let path = '';
|
|
139
142
|
switch (accountType) {
|
|
140
143
|
case "melcloud":
|
|
141
144
|
const axiosInstancePost = axios.create({
|
|
@@ -168,7 +171,7 @@ class MelCloudErv extends EventEmitter {
|
|
|
168
171
|
|
|
169
172
|
//device state
|
|
170
173
|
deviceData.Device.EffectiveFlags = effectiveFlags;
|
|
171
|
-
|
|
174
|
+
payload = {
|
|
172
175
|
data: {
|
|
173
176
|
DeviceID: deviceData.Device.DeviceID,
|
|
174
177
|
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
@@ -203,19 +206,16 @@ class MelCloudErv extends EventEmitter {
|
|
|
203
206
|
}
|
|
204
207
|
}
|
|
205
208
|
|
|
206
|
-
let method = null;
|
|
207
|
-
let settings = {};
|
|
208
|
-
let path = '';
|
|
209
209
|
switch (effectiveFlags) {
|
|
210
210
|
case 'holidaymode':
|
|
211
|
-
|
|
211
|
+
payload = {
|
|
212
212
|
data: { enabled: deviceData.HolidayMode.Enabled, startDate: deviceData.HolidayMode.StartDate, endDate: deviceData.HolidayMode.EndDate, units: { "ERV": [deviceData.DeviceID] } }
|
|
213
213
|
};
|
|
214
214
|
method = 'POST';
|
|
215
215
|
path = ApiUrlsHome.PostHolidayMode;
|
|
216
216
|
break;
|
|
217
217
|
case 'schedule':
|
|
218
|
-
|
|
218
|
+
payload = {
|
|
219
219
|
data: {
|
|
220
220
|
enabled: deviceData.ScheduleEnabled
|
|
221
221
|
}
|
|
@@ -224,7 +224,7 @@ class MelCloudErv extends EventEmitter {
|
|
|
224
224
|
path = ApiUrlsHome.PutScheduleEnable.replace('deviceid', deviceData.DeviceID);
|
|
225
225
|
break;
|
|
226
226
|
default:
|
|
227
|
-
|
|
227
|
+
payload = {
|
|
228
228
|
data: {
|
|
229
229
|
Power: deviceData.Device.Power,
|
|
230
230
|
SetTemperature: deviceData.Device.SetTemperature,
|