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 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 realtime communication with MELCloud Home
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.49",
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
 
@@ -144,7 +144,7 @@ class MelCloudAta extends EventEmitter {
144
144
  const messageData = parsedMessage?.[0]?.Data;
145
145
  if (!messageData) return;
146
146
 
147
- let updateDeiceState = false;
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
- updateDeiceState = true;
162
+ updateDeviceState = true;
163
163
  break;
164
164
  case 'unitWifiSignalChanged':
165
165
  Object.assign(deviceData, messageData.rssi);
166
- updateDeiceState = true;
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 (updateDeiceState) this.emit('deviceState', deviceData);
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: this.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
- this.headers.Referer = ApiUrlsHome.Referers.PostProtectionFrost.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.PostProtectionOverheat.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
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
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
368
+ headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
368
369
  updateState = false;
369
370
  break;
370
371
  }
371
372
 
372
373
  //sens payload
373
- this.headers['Content-Type'] = 'application/json; charset=utf-8';
374
- this.headers.Origin = ApiUrlsHome.Origin;
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: this.headers,
381
+ headers: headers,
381
382
  data: payload
382
383
  });
383
384
 
@@ -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: this.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
- this.headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
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
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
235
+ headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
236
+ updateState = false;
234
237
  break
235
238
  }
236
239
 
237
- this.headers['Content-Type'] = 'application/json; charset=utf-8';
238
- this.headers.Origin = ApiUrlsHome.Origin;
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: this.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
@@ -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: this.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
- this.headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
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
- this.headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
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
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
242
+ headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
243
+ updateState = false;
241
244
  break
242
245
  }
243
246
 
244
- this.headers['Content-Type'] = 'application/json; charset=utf-8';
245
- this.headers.Origin = ApiUrlsHome.Origin;
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: this.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