homebridge-melcloud-control 4.3.0-beta.49 → 4.3.0-beta.50
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/CHANGELOG.md +1 -1
- package/package.json +1 -1
- package/src/deviceata.js +6 -0
- package/src/deviceatw.js +6 -0
- package/src/deviceerv.js +6 -0
- package/src/melcloudata.js +14 -13
- package/src/melcloudatw.js +14 -11
- package/src/melclouderv.js +14 -11
package/CHANGELOG.md
CHANGED
|
@@ -26,7 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
26
26
|
|
|
27
27
|
## Changes
|
|
28
28
|
|
|
29
|
-
- use web socket for
|
|
29
|
+
- use web socket for Real Time communication with MELCloud Home
|
|
30
30
|
- readme updated
|
|
31
31
|
- cleanup
|
|
32
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.3.0-beta.
|
|
4
|
+
"version": "4.3.0-beta.50",
|
|
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
|
@@ -1673,6 +1673,8 @@ class DeviceAta extends EventEmitter {
|
|
|
1673
1673
|
if (this.presets.length > 0) {
|
|
1674
1674
|
this.presets.forEach((preset, i) => {
|
|
1675
1675
|
const presetData = presetsOnServer.find(p => p.ID === preset.id);
|
|
1676
|
+
if (!presetData) return;
|
|
1677
|
+
|
|
1676
1678
|
const characteristicType = preset.characteristicType;
|
|
1677
1679
|
|
|
1678
1680
|
preset.state = presetData ? (presetData.Power === power
|
|
@@ -1694,6 +1696,8 @@ class DeviceAta extends EventEmitter {
|
|
|
1694
1696
|
if (this.schedules.length > 0 && scheduleEnabled !== null) {
|
|
1695
1697
|
this.schedules.forEach((schedule, i) => {
|
|
1696
1698
|
const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
|
|
1699
|
+
if (!scheduleData) return;
|
|
1700
|
+
|
|
1697
1701
|
const characteristicType = schedule.characteristicType;
|
|
1698
1702
|
schedule.state = scheduleEnabled ? (scheduleData.Enabled ?? false) : false;
|
|
1699
1703
|
|
|
@@ -1712,6 +1716,8 @@ class DeviceAta extends EventEmitter {
|
|
|
1712
1716
|
if (this.scenes.length > 0) {
|
|
1713
1717
|
this.scenes.forEach((scene, i) => {
|
|
1714
1718
|
const sceneData = scenesOnServer.find(s => s.Id === scene.id);
|
|
1719
|
+
if (!sceneData) return;
|
|
1720
|
+
|
|
1715
1721
|
const characteristicType = scene.characteristicType;
|
|
1716
1722
|
scene.state = sceneData.Enabled;
|
|
1717
1723
|
|
package/src/deviceatw.js
CHANGED
|
@@ -2089,6 +2089,8 @@ class DeviceAtw extends EventEmitter {
|
|
|
2089
2089
|
if (this.presets.length > 0) {
|
|
2090
2090
|
this.presets.forEach((preset, i) => {
|
|
2091
2091
|
const presetData = presetsOnServer.find(p => p.ID === preset.id);
|
|
2092
|
+
if (!presetData) return;
|
|
2093
|
+
|
|
2092
2094
|
const characteristicType = preset.characteristicType;
|
|
2093
2095
|
|
|
2094
2096
|
preset.state = presetData ? (presetData.Power === power
|
|
@@ -2116,6 +2118,8 @@ class DeviceAtw extends EventEmitter {
|
|
|
2116
2118
|
if (this.schedules.length > 0 && scheduleEnabled !== null) {
|
|
2117
2119
|
this.schedules.forEach((schedule, i) => {
|
|
2118
2120
|
const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
|
|
2121
|
+
if (!scheduleData) return;
|
|
2122
|
+
|
|
2119
2123
|
const characteristicType = schedule.characteristicType;
|
|
2120
2124
|
schedule.state = scheduleEnabled ? (scheduleData.Enabled ?? false) : false;
|
|
2121
2125
|
|
|
@@ -2134,6 +2138,8 @@ class DeviceAtw extends EventEmitter {
|
|
|
2134
2138
|
if (this.scenes.length > 0) {
|
|
2135
2139
|
this.scenes.forEach((scene, i) => {
|
|
2136
2140
|
const sceneData = scenesOnServer.find(s => s.Id === scene.id);
|
|
2141
|
+
if (!sceneData) return;
|
|
2142
|
+
|
|
2137
2143
|
const characteristicType = scene.characteristicType;
|
|
2138
2144
|
scene.state = sceneData.Enabled;
|
|
2139
2145
|
|
package/src/deviceerv.js
CHANGED
|
@@ -1438,6 +1438,8 @@ class DeviceErv extends EventEmitter {
|
|
|
1438
1438
|
if (this.presets.length > 0) {
|
|
1439
1439
|
this.presets.forEach((preset, i) => {
|
|
1440
1440
|
const presetData = presetsOnServer.find(p => p.ID === preset.id);
|
|
1441
|
+
if (!presetData) return;
|
|
1442
|
+
|
|
1441
1443
|
const characteristicType = preset.characteristicType;
|
|
1442
1444
|
|
|
1443
1445
|
preset.state = presetData ? (presetData.Power === power
|
|
@@ -1458,6 +1460,8 @@ class DeviceErv extends EventEmitter {
|
|
|
1458
1460
|
if (this.schedules.length > 0 && scheduleEnabled !== null) {
|
|
1459
1461
|
this.schedules.forEach((schedule, i) => {
|
|
1460
1462
|
const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
|
|
1463
|
+
if (!scheduleData) return;
|
|
1464
|
+
|
|
1461
1465
|
const characteristicType = schedule.characteristicType;
|
|
1462
1466
|
schedule.state = scheduleEnabled ? (scheduleData.Enabled ?? false) : false;
|
|
1463
1467
|
|
|
@@ -1476,6 +1480,8 @@ class DeviceErv extends EventEmitter {
|
|
|
1476
1480
|
if (this.scenes.length > 0) {
|
|
1477
1481
|
this.scenes.forEach((scene, i) => {
|
|
1478
1482
|
const sceneData = scenesOnServer.find(s => s.Id === scene.id);
|
|
1483
|
+
if (!sceneData) return;
|
|
1484
|
+
|
|
1479
1485
|
const characteristicType = scene.characteristicType;
|
|
1480
1486
|
scene.state = sceneData.Enabled;
|
|
1481
1487
|
|
package/src/melcloudata.js
CHANGED
|
@@ -144,7 +144,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
144
144
|
const messageData = parsedMessage?.[0]?.Data;
|
|
145
145
|
if (!messageData) return;
|
|
146
146
|
|
|
147
|
-
let
|
|
147
|
+
let updateDeviceState = false;
|
|
148
148
|
const unitId = messageData?.id;
|
|
149
149
|
switch (unitId) {
|
|
150
150
|
case this.deviceId:
|
|
@@ -159,11 +159,11 @@ class MelCloudAta extends EventEmitter {
|
|
|
159
159
|
return [name, parsedValue];
|
|
160
160
|
}));
|
|
161
161
|
Object.assign(deviceData.Device, settings);
|
|
162
|
-
|
|
162
|
+
updateDeviceState = true;
|
|
163
163
|
break;
|
|
164
164
|
case 'unitWifiSignalChanged':
|
|
165
165
|
Object.assign(deviceData, messageData.rssi);
|
|
166
|
-
|
|
166
|
+
updateDeviceState = true;
|
|
167
167
|
break;
|
|
168
168
|
default:
|
|
169
169
|
if (this.logWarn) this.emit('warn', `Unit ${unitId}, received unknown message type: ${stringifyMessage}`);
|
|
@@ -175,7 +175,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
175
175
|
return;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
if (
|
|
178
|
+
if (updateDeviceState) this.emit('deviceState', deviceData);
|
|
179
179
|
});
|
|
180
180
|
} catch (error) {
|
|
181
181
|
if (this.logError) this.emit('error', `Socket connection failed: ${error}`);
|
|
@@ -246,6 +246,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
246
246
|
let method = null
|
|
247
247
|
let payload = {};
|
|
248
248
|
let path = '';
|
|
249
|
+
let headers = this.headers;
|
|
249
250
|
let updateState = true;
|
|
250
251
|
switch (accountType) {
|
|
251
252
|
case "melcloud":
|
|
@@ -288,7 +289,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
288
289
|
method: 'POST',
|
|
289
290
|
baseURL: ApiUrls.BaseURL,
|
|
290
291
|
timeout: 30000,
|
|
291
|
-
headers:
|
|
292
|
+
headers: headers,
|
|
292
293
|
data: payload
|
|
293
294
|
});
|
|
294
295
|
this.updateData(deviceData, updateState);
|
|
@@ -304,7 +305,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
304
305
|
};
|
|
305
306
|
method = 'POST';
|
|
306
307
|
path = ApiUrlsHome.PostProtectionFrost;
|
|
307
|
-
|
|
308
|
+
headers.Referer = ApiUrlsHome.Referers.PostProtectionFrost.replace('deviceid', deviceData.DeviceID);
|
|
308
309
|
break;
|
|
309
310
|
case 'overheatprotection':
|
|
310
311
|
payload = {
|
|
@@ -315,7 +316,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
315
316
|
};
|
|
316
317
|
method = 'POST';
|
|
317
318
|
path = ApiUrlsHome.PostProtectionOverheat;
|
|
318
|
-
|
|
319
|
+
headers.Referer = ApiUrlsHome.Referers.PostProtectionOverheat.replace('deviceid', deviceData.DeviceID);
|
|
319
320
|
break;
|
|
320
321
|
case 'holidaymode':
|
|
321
322
|
payload = {
|
|
@@ -326,7 +327,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
326
327
|
};
|
|
327
328
|
method = 'POST';
|
|
328
329
|
path = ApiUrlsHome.PostHolidayMode;
|
|
329
|
-
|
|
330
|
+
headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
|
|
330
331
|
break;
|
|
331
332
|
case 'schedule':
|
|
332
333
|
payload = { enabled: deviceData.ScheduleEnabled };
|
|
@@ -337,7 +338,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
337
338
|
case 'scene':
|
|
338
339
|
method = 'PUT';
|
|
339
340
|
path = ApiUrlsHome.PutScene[flagData.Enabled ? 'Enable' : 'Disable'].replace('sceneid', flagData.Id);
|
|
340
|
-
|
|
341
|
+
headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
|
|
341
342
|
break;
|
|
342
343
|
default:
|
|
343
344
|
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
@@ -364,20 +365,20 @@ class MelCloudAta extends EventEmitter {
|
|
|
364
365
|
};
|
|
365
366
|
method = 'PUT';
|
|
366
367
|
path = ApiUrlsHome.PutAta.replace('deviceid', deviceData.DeviceID);
|
|
367
|
-
|
|
368
|
+
headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
|
|
368
369
|
updateState = false;
|
|
369
370
|
break;
|
|
370
371
|
}
|
|
371
372
|
|
|
372
373
|
//sens payload
|
|
373
|
-
|
|
374
|
-
|
|
374
|
+
headers['Content-Type'] = 'application/json; charset=utf-8';
|
|
375
|
+
headers.Origin = ApiUrlsHome.Origin;
|
|
375
376
|
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
|
|
376
377
|
await axios(path, {
|
|
377
378
|
method: method,
|
|
378
379
|
baseURL: ApiUrlsHome.BaseURL,
|
|
379
380
|
timeout: 30000,
|
|
380
|
-
headers:
|
|
381
|
+
headers: headers,
|
|
381
382
|
data: payload
|
|
382
383
|
});
|
|
383
384
|
|
package/src/melcloudatw.js
CHANGED
|
@@ -141,6 +141,8 @@ class MelCloudAtw extends EventEmitter {
|
|
|
141
141
|
let method = null
|
|
142
142
|
let payload = {};
|
|
143
143
|
let path = '';
|
|
144
|
+
let headers = this.headers;
|
|
145
|
+
let updateState = true;
|
|
144
146
|
switch (accountType) {
|
|
145
147
|
case "melcloud":
|
|
146
148
|
switch (flag) {
|
|
@@ -183,7 +185,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
183
185
|
method: 'POST',
|
|
184
186
|
baseURL: ApiUrls.BaseURL,
|
|
185
187
|
timeout: 30000,
|
|
186
|
-
headers:
|
|
188
|
+
headers: headers,
|
|
187
189
|
data: payload
|
|
188
190
|
});
|
|
189
191
|
this.updateData(deviceData);
|
|
@@ -199,18 +201,18 @@ class MelCloudAtw extends EventEmitter {
|
|
|
199
201
|
};
|
|
200
202
|
method = 'POST';
|
|
201
203
|
path = ApiUrlsHome.PostHolidayMode;
|
|
202
|
-
|
|
204
|
+
headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
|
|
203
205
|
break;
|
|
204
206
|
case 'schedule':
|
|
205
207
|
payload = { enabled: deviceData.ScheduleEnabled };
|
|
206
208
|
method = 'PUT';
|
|
207
209
|
path = ApiUrlsHome.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
|
|
208
|
-
|
|
210
|
+
headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
|
|
209
211
|
break;
|
|
210
212
|
case 'scene':
|
|
211
213
|
method = 'PUT';
|
|
212
214
|
path = ApiUrlsHome.PutScene[flagData.Enabled ? 'Enable' : 'Disable'].replace('sceneid', flagData.Id);
|
|
213
|
-
|
|
215
|
+
headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
|
|
214
216
|
break;
|
|
215
217
|
default:
|
|
216
218
|
payload = {
|
|
@@ -230,21 +232,22 @@ class MelCloudAtw extends EventEmitter {
|
|
|
230
232
|
};
|
|
231
233
|
method = 'PUT';
|
|
232
234
|
path = ApiUrlsHome.PutAtw.replace('deviceid', deviceData.DeviceID);
|
|
233
|
-
|
|
235
|
+
headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
|
|
236
|
+
updateState = false;
|
|
234
237
|
break
|
|
235
238
|
}
|
|
236
239
|
|
|
237
|
-
|
|
238
|
-
|
|
240
|
+
headers['Content-Type'] = 'application/json; charset=utf-8';
|
|
241
|
+
headers.Origin = ApiUrlsHome.Origin;
|
|
239
242
|
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
|
|
240
243
|
await axios(path, {
|
|
241
244
|
method: method,
|
|
242
245
|
baseURL: ApiUrlsHome.BaseURL,
|
|
243
246
|
timeout: 30000,
|
|
244
|
-
headers:
|
|
247
|
+
headers: headers,
|
|
245
248
|
data: payload
|
|
246
249
|
});
|
|
247
|
-
this.updateData(deviceData);
|
|
250
|
+
this.updateData(deviceData, updateState);
|
|
248
251
|
return true;
|
|
249
252
|
default:
|
|
250
253
|
return;
|
|
@@ -255,9 +258,9 @@ class MelCloudAtw extends EventEmitter {
|
|
|
255
258
|
}
|
|
256
259
|
}
|
|
257
260
|
|
|
258
|
-
updateData(deviceData) {
|
|
261
|
+
updateData(deviceData, updateState = true) {
|
|
259
262
|
this.locks = true;
|
|
260
|
-
this.emit('deviceState', deviceData);
|
|
263
|
+
if (updateState) this.emit('deviceState', deviceData);
|
|
261
264
|
|
|
262
265
|
setTimeout(() => {
|
|
263
266
|
this.locks = false
|
package/src/melclouderv.js
CHANGED
|
@@ -129,6 +129,8 @@ class MelCloudErv extends EventEmitter {
|
|
|
129
129
|
let method = null
|
|
130
130
|
let payload = {};
|
|
131
131
|
let path = '';
|
|
132
|
+
let headers = this.headers;
|
|
133
|
+
let updateState = true;
|
|
132
134
|
switch (accountType) {
|
|
133
135
|
case "melcloud":
|
|
134
136
|
switch (flag) {
|
|
@@ -186,7 +188,7 @@ class MelCloudErv extends EventEmitter {
|
|
|
186
188
|
method: 'POST',
|
|
187
189
|
baseURL: ApiUrls.BaseURL,
|
|
188
190
|
timeout: 30000,
|
|
189
|
-
headers:
|
|
191
|
+
headers: headers,
|
|
190
192
|
data: payload
|
|
191
193
|
});
|
|
192
194
|
this.updateData(deviceData);
|
|
@@ -202,18 +204,18 @@ class MelCloudErv extends EventEmitter {
|
|
|
202
204
|
};
|
|
203
205
|
method = 'POST';
|
|
204
206
|
path = ApiUrlsHome.PostHolidayMode;
|
|
205
|
-
|
|
207
|
+
headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
|
|
206
208
|
break;
|
|
207
209
|
case 'schedule':
|
|
208
210
|
payload = { enabled: deviceData.ScheduleEnabled };
|
|
209
211
|
method = 'PUT';
|
|
210
212
|
path = ApiUrlsHome.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
|
|
211
|
-
|
|
213
|
+
headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
|
|
212
214
|
break;
|
|
213
215
|
case 'scene':
|
|
214
216
|
method = 'PUT';
|
|
215
217
|
path = ApiUrlsHome.PutScene[flagData.Enabled ? 'Enable' : 'Disable'].replace('sceneid', flagData.Id);
|
|
216
|
-
|
|
218
|
+
headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
|
|
217
219
|
break;
|
|
218
220
|
default:
|
|
219
221
|
if (displayType === 1 && deviceData.Device.VentilationMode === 2) {
|
|
@@ -237,21 +239,22 @@ class MelCloudErv extends EventEmitter {
|
|
|
237
239
|
};
|
|
238
240
|
method = 'PUT';
|
|
239
241
|
path = ApiUrlsHome.PutErv.replace('deviceid', deviceData.DeviceID);
|
|
240
|
-
|
|
242
|
+
headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
|
|
243
|
+
updateState = false;
|
|
241
244
|
break
|
|
242
245
|
}
|
|
243
246
|
|
|
244
|
-
|
|
245
|
-
|
|
247
|
+
headers['Content-Type'] = 'application/json; charset=utf-8';
|
|
248
|
+
headers.Origin = ApiUrlsHome.Origin;
|
|
246
249
|
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
|
|
247
250
|
await axios(path, {
|
|
248
251
|
method: method,
|
|
249
252
|
baseURL: ApiUrlsHome.BaseURL,
|
|
250
253
|
timeout: 30000,
|
|
251
|
-
headers:
|
|
254
|
+
headers: headers,
|
|
252
255
|
data: payload
|
|
253
256
|
});
|
|
254
|
-
this.updateData(deviceData);
|
|
257
|
+
this.updateData(deviceData, updateState);
|
|
255
258
|
return true;
|
|
256
259
|
default:
|
|
257
260
|
return;
|
|
@@ -262,9 +265,9 @@ class MelCloudErv extends EventEmitter {
|
|
|
262
265
|
}
|
|
263
266
|
}
|
|
264
267
|
|
|
265
|
-
updateData(deviceData) {
|
|
268
|
+
updateData(deviceData, updateState = true) {
|
|
266
269
|
this.locks = true;
|
|
267
|
-
this.emit('deviceState', deviceData);
|
|
270
|
+
if (updateState) this.emit('deviceState', deviceData);
|
|
268
271
|
|
|
269
272
|
setTimeout(() => {
|
|
270
273
|
this.locks = false
|