homebridge-melcloud-control 3.1.11 → 3.1.16

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.
@@ -15,8 +15,7 @@ class MelCloudAta extends EventEmitter {
15
15
  this.debugLog = config.debugLog;
16
16
 
17
17
  //set default values
18
- this.deviceData = {};
19
- this.displayDeviceInfo = true;
18
+ this.deviceState = {};
20
19
 
21
20
  this.axiosInstancePost = axios.create({
22
21
  method: 'POST',
@@ -38,8 +37,7 @@ class MelCloudAta extends EventEmitter {
38
37
  try {
39
38
  await this.checkState();
40
39
  } catch (error) {
41
- await this.impulseGenerator.stop();
42
- this.emit('error', `Impulse generator check state error: ${error.message || error}, check again in 15s.`);
40
+ this.emit('error', `Impulse generator check state error: ${error.message || error}.`);
43
41
  };
44
42
  }).on('state', (state) => { });
45
43
  };
@@ -48,13 +46,13 @@ class MelCloudAta extends EventEmitter {
48
46
  try {
49
47
  //read device info from file
50
48
  const devicesData = await this.readData(this.devicesFile);
51
- const debug1 = this.debugLog ? this.emit('debug', `Device Info: ${JSON.stringify(devicesData, null, 2)}`) : false;
52
49
  const deviceData = devicesData.find((device) => device.DeviceID === this.deviceId);
53
50
 
54
51
  if (!deviceData) {
55
52
  this.emit('warn', `Device data not found.`);
56
53
  return;
57
54
  }
55
+ const debug = this.debugLog ? this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`) : false;
58
56
 
59
57
  //device info
60
58
  const deviceId = deviceData.DeviceID;
@@ -132,15 +130,15 @@ class MelCloudAta extends EventEmitter {
132
130
  const modelDisableEnergyReport = device.ModelDisableEnergyReport;
133
131
  const modelSupportsStandbyMode = device.ModelSupportsStandbyMode;
134
132
  const modelSupportsEnergyReporting = device.ModelSupportsEnergyReporting;
135
- const prohibitSetTemperature = device.ProhibitSetTemperature ?? false;
136
- const prohibitOperationMode = device.ProhibitOperationMode ?? false;
137
- const prohibitPower = device.ProhibitPower ?? false;
138
- const power = device.Power ?? false;
133
+ const prohibitSetTemperature = device.ProhibitSetTemperature;
134
+ const prohibitOperationMode = device.ProhibitOperationMode;
135
+ const prohibitPower = device.ProhibitPower;
136
+ const power = device.Power;
139
137
  const roomTemperature = device.RoomTemperature;
140
138
  const outdoorTemperature = device.OutdoorTemperature;
141
139
  const setTemperature = device.SetTemperature;
142
140
  const actualFanSpeed = device.ActualFanSpeed;
143
- const fanSpeed = device.FanSpeed ?? 0;
141
+ const fanSpeed = device.FanSpeed;
144
142
  const automaticFanSpeed = device.AutomaticFanSpeed;
145
143
  const vaneVerticalDirection = device.VaneVerticalDirection;
146
144
  const vaneVerticalSwing = device.VaneVerticalSwing;
@@ -148,12 +146,12 @@ class MelCloudAta extends EventEmitter {
148
146
  const vaneHorizontalSwing = device.VaneHorizontalSwing;
149
147
  const operationMode = device.OperationMode;
150
148
  const effectiveFlags = device.EffectiveFlags;
151
- const inStandbyMode = device.InStandbyMode ?? false;
149
+ const inStandbyMode = device.InStandbyMode;
152
150
  const demandPercentage = device.DemandPercentage;
153
151
  const configuredDemandPercentage = device.ConfiguredDemandPercentage;
154
152
  const hasDemandSideControl = device.HasDemandSideControl;
155
- const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature ?? 23;
156
- const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature ?? 21;
153
+ const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature;
154
+ const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature;
157
155
  const roomTemperatureLabel = device.RoomTemperatureLabel;
158
156
  const heatingEnergyConsumedRate1 = device.HeatingEnergyConsumedRate1;
159
157
  const heatingEnergyConsumedRate2 = device.HeatingEnergyConsumedRate2;
@@ -309,49 +307,40 @@ class MelCloudAta extends EventEmitter {
309
307
  this.emit('warn', `Units are not configured in MELCloud service.`);
310
308
  };
311
309
 
312
- //emit info
313
- const emitInfo = this.displayDeviceInfo ? this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion) : false;
314
- this.displayDeviceInfo = false;
315
-
316
- //device state
317
310
  const deviceState = {
318
- DeviceId: deviceId,
319
- EffectiveFlags: effectiveFlags,
320
311
  RoomTemperature: roomTemperature,
321
312
  SetTemperature: setTemperature,
322
- SetFanSpeed: fanSpeed,
313
+ FanSpeed: fanSpeed,
323
314
  OperationMode: operationMode,
324
- VaneHorizontal: vaneHorizontalDirection,
325
- VaneVertical: vaneVerticalDirection,
315
+ VaneHorizontalDirection: vaneHorizontalDirection,
316
+ VaneVerticalDirection: vaneVerticalDirection,
326
317
  HideVaneControls: hideVaneControls,
327
318
  HideDryModeControl: hideDryModeControl,
328
- DefaultCoolingSetTemperature: defaultCoolingSetTemperature,
329
- DefaultHeatingSetTemperature: defaultHeatingSetTemperature,
330
319
  InStandbyMode: inStandbyMode,
331
320
  ProhibitSetTemperature: prohibitSetTemperature,
332
321
  ProhibitOperationMode: prohibitOperationMode,
333
322
  ProhibitPower: prohibitPower,
334
- Power: power,
335
- Offline: offline
323
+ Power: power
336
324
  }
337
325
 
338
- //external integrations
339
- this.emit('externalIntegrations', deviceData, deviceState);
340
-
341
326
  //check state changes
342
- const stateHasNotChanged = JSON.stringify(deviceData) === JSON.stringify(this.deviceData);
343
- if (stateHasNotChanged) {
327
+ const deviceDataHasNotChanged = JSON.stringify(deviceState) === JSON.stringify(this.deviceState);
328
+ if (deviceDataHasNotChanged) {
344
329
  return;
345
330
  }
331
+ this.deviceState = deviceState;
332
+
333
+ //external integrations
334
+ this.emit('externalIntegrations', deviceData);
335
+
336
+ //emit info
337
+ this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion);
346
338
 
347
339
  //emit state
348
- this.deviceData = deviceData;
349
- const debug2 = this.debugLog ? this.emit('debug', `Device State: ${JSON.stringify(deviceState, null, 2)}`) : false;
350
- this.emit('deviceState', deviceData, deviceState);
340
+ this.emit('deviceState', deviceData);
351
341
 
352
342
  return true;
353
343
  } catch (error) {
354
- await this.impulseGenerator.stop();
355
344
  throw new Error(`Check state error: ${error.message || error}.`);
356
345
  };
357
346
  };
@@ -367,45 +356,66 @@ class MelCloudAta extends EventEmitter {
367
356
  }
368
357
  }
369
358
 
370
- async send(deviceState) {
359
+ async send(deviceData) {
371
360
  try {
372
361
  //prevent to set out of range temp
373
- const minTempHeat = this.deviceData.Device.MinTempHeat ?? 10;
374
- const maxTempHeat = this.deviceData.Device.MaxTempHeat ?? 31;
375
- const minTempCoolDry = this.deviceData.Device.MinTempCoolDry ?? 16;
376
- const maxTempCoolDry = this.deviceData.Device.MaxTempCoolDry ?? 31;
377
- const minTempAutomatic = this.deviceData.Device.MinTempAutomatic ?? 16;
378
- const maxTempAutomatic = this.deviceData.Device.MaxTempAutomatic ?? 31;
379
- switch (deviceState.OperationMode) {//operating mode 0, HEAT, DRY, COOL, 4, 5, 6, FAN, AUTO, ISEE HEAT, ISEE DRY, ISEE COOL
362
+ const minTempHeat = deviceData.Device.MinTempHeat ?? 10;
363
+ const maxTempHeat = deviceData.Device.MaxTempHeat ?? 31;
364
+ const minTempCoolDry = deviceData.Device.MinTempCoolDry ?? 16;
365
+ const maxTempCoolDry = deviceData.Device.MaxTempCoolDry ?? 31;
366
+ const minTempAutomatic = deviceData.Device.MinTempAutomatic ?? 16;
367
+ const maxTempAutomatic = deviceData.Device.MaxTempAutomatic ?? 31;
368
+
369
+
370
+ switch (deviceData.Device.OperationMode) {//operating mode 0, HEAT, DRY, COOL, 4, 5, 6, FAN, AUTO, ISEE HEAT, ISEE DRY, ISEE COOL
380
371
  case 1:
381
- deviceState.SetTemperature = deviceState.SetTemperature < minTempHeat ? minTempHeat : deviceState.SetTemperature;
382
- deviceState.SetTemperature = deviceState.SetTemperature > maxTempHeat ? maxTempHeat : deviceState.SetTemperature;
372
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < minTempHeat ? minTempHeat : deviceData.Device.SetTemperature;
373
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > maxTempHeat ? maxTempHeat : deviceData.Device.SetTemperature;
383
374
  break;
384
375
  case 2:
385
- deviceState.SetTemperature = deviceState.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceState.SetTemperature;
386
- deviceState.SetTemperature = deviceState.SetTemperature > maxTempCoolDry ? maxTempCoolDry : deviceState.SetTemperature;
376
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceData.Device.SetTemperature;
377
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > maxTempCoolDry ? maxTempCoolDry : deviceData.Device.SetTemperature;
387
378
  break;
388
379
  case 3:
389
- deviceState.SetTemperature = deviceState.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceState.SetTemperature;
390
- deviceState.SetTemperature = deviceState.SetTemperature > maxTempCoolDry ? maxTempCoolDry : deviceState.SetTemperature;
380
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceData.Device.SetTemperature;
381
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > maxTempCoolDry ? maxTempCoolDry : deviceData.Device.SetTemperature;
391
382
  break;
392
383
  case 8:
393
- deviceState.SetTemperature = deviceState.SetTemperature < minTempAutomatic ? minTempAutomatic : deviceState.SetTemperature;
394
- deviceState.SetTemperature = deviceState.SetTemperature > maxTempAutomatic ? maxTempAutomatic : deviceState.SetTemperature;
384
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < minTempAutomatic ? minTempAutomatic : deviceData.Device.SetTemperature;
385
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > maxTempAutomatic ? maxTempAutomatic : deviceData.Device.SetTemperature;
395
386
  break;
396
387
  default:
397
- deviceState.SetTemperature = deviceState.SetTemperature < 10 ? 10 : deviceState.SetTemperature;
398
- deviceState.SetTemperature = deviceState.SetTemperature > 31 ? 31 : deviceState.SetTemperature;
388
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < 10 ? 10 : deviceData.Device.SetTemperature;
389
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > 31 ? 31 : deviceData.Device.SetTemperature;
399
390
  break;
400
391
  };
401
392
 
402
- deviceState.HasPendingCommand = true;
403
- const options = {
404
- data: deviceState
405
- };
393
+ const payload = {
394
+ data: {
395
+ DeviceID: deviceData.Device.DeviceID,
396
+ EffectiveFlags: deviceData.Device.EffectiveFlags,
397
+ RoomTemperature: deviceData.Device.RoomTemperature,
398
+ SetTemperature: deviceData.Device.SetTemperature,
399
+ SetFanSpeed: deviceData.Device.FanSpeed,
400
+ OperationMode: deviceData.Device.OperationMode,
401
+ VaneHorizontal: deviceData.Device.VaneHorizontalDirection,
402
+ VaneVertical: deviceData.Device.VaneVerticalDirection,
403
+ HideVaneControls: deviceData.Device.HideVaneControls,
404
+ HideDryModeControl: deviceData.Device.HideDryModeControl,
405
+ DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature ?? 23,
406
+ DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature ?? 21,
407
+ InStandbyMode: deviceData.Device.InStandbyMode,
408
+ ProhibitSetTemperature: deviceData.Device.ProhibitSetTemperature,
409
+ ProhibitOperationMode: deviceData.Device.ProhibitOperationMode,
410
+ ProhibitPower: deviceData.Device.ProhibitPower,
411
+ Power: deviceData.Device.Power,
412
+ Offline: deviceData.Device.Offline,
413
+ HasPendingCommand: true
414
+ }
415
+ }
406
416
 
407
- await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAta, options);
408
- this.emit('deviceState', this.deviceData, deviceState);
417
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAta, payload);
418
+ this.emit('deviceState', deviceData);
409
419
  return true;
410
420
  } catch (error) {
411
421
  throw new Error(error.message ?? error);
@@ -15,8 +15,7 @@ class MelCloudAtw extends EventEmitter {
15
15
  this.debugLog = config.debugLog;
16
16
 
17
17
  //set default values
18
- this.deviceData = {};
19
- this.displayDeviceInfo = true;
18
+ this.deviceState = {};
20
19
 
21
20
  this.axiosInstancePost = axios.create({
22
21
  method: 'POST',
@@ -38,8 +37,7 @@ class MelCloudAtw extends EventEmitter {
38
37
  try {
39
38
  await this.checkState();
40
39
  } catch (error) {
41
- await this.impulseGenerator.stop();
42
- this.emit('error', `Impulse generator check state error: ${error.message || error}, check again in 15s.`);
40
+ this.emit('error', `Impulse generator check state error: ${error.message || error}.`);
43
41
  };
44
42
  }).on('state', (state) => { });
45
43
  };
@@ -48,13 +46,13 @@ class MelCloudAtw extends EventEmitter {
48
46
  try {
49
47
  //read device info from file
50
48
  const devicesData = await this.readData(this.devicesFile);
51
- const debug1 = this.debugLog ? this.emit('debug', `Device Info: ${JSON.stringify(devicesData, null, 2)}`) : false;
52
49
  const deviceData = devicesData.find((device) => device.DeviceID === this.deviceId);
53
50
 
54
51
  if (!deviceData) {
55
52
  this.emit('warn', `Device data not found.`);
56
53
  return;
57
54
  }
55
+ const debug = this.debugLog ? this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`) : false;
58
56
 
59
57
  //device info
60
58
  const deviceId = deviceData.DeviceID;
@@ -150,7 +148,7 @@ class MelCloudAtw extends EventEmitter {
150
148
  const valveStatus2Way2a = device.ValveStatus2Way2a;
151
149
  const valveStatus2Way2b = device.ValveStatus2Way2b;
152
150
  const tankWaterTemperature = device.TankWaterTemperature;
153
- const unitStatus = device.UnitStatus ?? 0;
151
+ const unitStatus = device.UnitStatus;
154
152
  const heatingFunctionEnabled = device.HeatingFunctionEnabled;
155
153
  const serverTimerEnabled = device.ServerTimerEnabled;
156
154
  const thermostatStatusZone1 = device.ThermostatStatusZone1;
@@ -161,8 +159,8 @@ class MelCloudAtw extends EventEmitter {
161
159
  const condensingTemperature = device.CondensingTemperature;
162
160
  const effectiveFlags = device.EffectiveFlags;
163
161
  const lastEffectiveFlags = device.LastEffectiveFlags;
164
- const power = device.Power ?? false;
165
- const ecoHotWater = device.EcoHotWater ?? false;
162
+ const power = device.Power;
163
+ const ecoHotWater = device.EcoHotWater;
166
164
  const operationMode = device.OperationMode;
167
165
  const operationModeZone1 = device.OperationModeZone1;
168
166
  const operationModeZone2 = device.OperationModeZone2;
@@ -171,13 +169,13 @@ class MelCloudAtw extends EventEmitter {
171
169
  const setTankWaterTemperature = device.SetTankWaterTemperature;
172
170
  const targetHCTemperatureZone1 = device.TargetHCTemperatureZone1;
173
171
  const targetHCTemperatureZone2 = device.TargetHCTemperatureZone2;
174
- const forcedHotWaterMode = device.ForcedHotWaterMode ? 1 : 0 ?? 0;
175
- const holidayMode = device.HolidayMode ?? false;
176
- const prohibitHotWater = device.ProhibitHotWater ?? false;
177
- const prohibitHeatingZone1 = device.ProhibitHeatingZone1 ?? false;
178
- const prohibitHeatingZone2 = device.ProhibitHeatingZone2 ?? false;
179
- const prohibitCoolingZone1 = device.ProhibitCoolingZone1 ?? false;
180
- const prohibitCoolingZone2 = device.ProhibitCoolingZone2 ?? false;
172
+ const forcedHotWaterMode = device.ForcedHotWaterMode;
173
+ const holidayMode = device.HolidayMode;
174
+ const prohibitHotWater = device.ProhibitHotWater;
175
+ const prohibitHeatingZone1 = device.ProhibitHeatingZone1;
176
+ const prohibitHeatingZone2 = device.ProhibitHeatingZone2;
177
+ const prohibitCoolingZone1 = device.ProhibitCoolingZone1;
178
+ const prohibitCoolingZone2 = device.ProhibitCoolingZone2;
181
179
  const serverTimerDesired = device.ServerTimerDesired;
182
180
  const secondaryZoneHeatCurve = device.SecondaryZoneHeatCurve;
183
181
  const setHeatFlowTemperatureZone1 = device.SetHeatFlowTemperatureZone1;
@@ -371,14 +369,7 @@ class MelCloudAtw extends EventEmitter {
371
369
  this.emit('message', `Units are not configured in MELCloud service.`);
372
370
  };
373
371
 
374
- //emit info
375
- const emitInfo = this.displayDeviceInfo ? this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion, hasHotWaterTank, hasZone2) : false;
376
- this.displayDeviceInfo = false;
377
-
378
- //device state
379
372
  const deviceState = {
380
- DeviceId: deviceId,
381
- EffectiveFlags: effectiveFlags,
382
373
  SetTemperatureZone1: setTemperatureZone1,
383
374
  SetTemperatureZone2: setTemperatureZone2,
384
375
  RoomTemperatureZone1: roomTemperatureZone1,
@@ -402,27 +393,27 @@ class MelCloudAtw extends EventEmitter {
402
393
  IdleZone1: idleZone1,
403
394
  IdleZone2: idleZone2,
404
395
  UnitStatus: unitStatus,
405
- Power: power,
406
- Offline: offline
396
+ Power: power
407
397
  }
408
398
 
409
- //external integrations
410
- this.emit('externalIntegrations', deviceData, deviceState, deviceId);
411
-
412
399
  //check state changes
413
- const stateHasNotChanged = JSON.stringify(deviceData) === JSON.stringify(this.deviceData);
414
- if (stateHasNotChanged) {
400
+ const deviceDataHasNotChanged = JSON.stringify(deviceState) === JSON.stringify(this.deviceState);
401
+ if (deviceDataHasNotChanged) {
415
402
  return;
416
403
  }
404
+ this.deviceState = deviceState;
405
+
406
+ //external integrations
407
+ this.emit('externalIntegrations', deviceData);
408
+
409
+ //emit info
410
+ this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion, hasHotWaterTank, hasZone2);
417
411
 
418
412
  //emit state
419
- this.deviceData = deviceData;
420
- const debug2 = this.debugLog ? this.emit('debug', `Device State: ${JSON.stringify(deviceState, null, 2)}`) : false;
421
- this.emit('deviceState', deviceData, deviceState);
413
+ this.emit('deviceState', deviceData);
422
414
 
423
415
  return true;
424
416
  } catch (error) {
425
- await this.impulseGenerator.stop();
426
417
  throw new Error(`Check state error: ${error.message || error}.`);
427
418
  };
428
419
  };
@@ -437,27 +428,55 @@ class MelCloudAtw extends EventEmitter {
437
428
  }
438
429
  }
439
430
 
440
- async send(deviceState) {
431
+ async send(deviceData) {
441
432
  try {
442
433
  //prevent to set out of range temp
443
434
  const minTempZones = 10;
444
435
  const maxTempZones = 31;
445
436
  const minTempWaterTank = 16;
446
- const maxTempWaterTank = this.deviceData.Device.MaxTankTemperature ?? 70;
447
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone1 < minTempZones ? minTempZones : deviceState.SetTemperatureZone1;
448
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone1 > maxTempZones ? maxTempZones : deviceState.SetTemperatureZone1;
449
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone2 < minTempZones ? minTempZones : deviceState.SetTemperatureZone2;
450
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone2 > maxTempZones ? maxTempZones : deviceState.SetTemperatureZone2;
451
- deviceState.SetTankWaterTemperature = deviceState.SetTankWaterTemperature < minTempWaterTank ? minTempWaterTank : deviceState.SetTankWaterTemperature;
452
- deviceState.SetTankWaterTemperature = deviceState.SetTankWaterTemperature > maxTempWaterTank ? maxTempWaterTank : deviceState.SetTankWaterTemperature;
437
+ const maxTempWaterTank = deviceData.Device.MaxTankTemperature ?? 70;
438
+ deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone1 < minTempZones ? minTempZones : deviceData.Device.SetTemperatureZone1;
439
+ deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone1 > maxTempZones ? maxTempZones : deviceData.Device.SetTemperatureZone1;
440
+ deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone2 < minTempZones ? minTempZones : deviceData.Device.SetTemperatureZone2;
441
+ deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone2 > maxTempZones ? maxTempZones : deviceData.Device.SetTemperatureZone2;
442
+ deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature < minTempWaterTank ? minTempWaterTank : deviceData.Device.SetTankWaterTemperature;
443
+ deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature > maxTempWaterTank ? maxTempWaterTank : deviceData.Device.SetTankWaterTemperature;
453
444
 
454
- deviceState.HasPendingCommand = true;
455
- const options = {
456
- data: deviceState
457
- };
445
+ const payload = {
446
+ data: {
447
+ DeviceID: deviceData.Device.DeviceID,
448
+ EffectiveFlags: deviceData.Device.EffectiveFlags,
449
+ SetTemperatureZone1: deviceData.Device.SetTemperatureZone1,
450
+ SetTemperatureZone2: deviceData.Device.SetTemperatureZone2,
451
+ RoomTemperatureZone1: deviceData.Device.RoomTemperatureZone1,
452
+ RoomTemperatureZone2: deviceData.Device.RoomTemperatureZone2,
453
+ OperationMode: deviceData.Device.OperationMode,
454
+ OperationModeZone1: deviceData.Device.OperationModeZone1,
455
+ OperationModeZone2: deviceData.Device.OperationModeZone2,
456
+ SetHeatFlowTemperatureZone1: deviceData.Device.SetHeatFlowTemperatureZone1,
457
+ SetHeatFlowTemperatureZone2: deviceData.Device.SetHeatFlowTemperatureZone2,
458
+ SetCoolFlowTemperatureZone1: deviceData.Device.SetCoolFlowTemperatureZone1,
459
+ SetCoolFlowTemperatureZone2: deviceData.Device.SetCoolFlowTemperatureZone2,
460
+ TankWaterTemperature: deviceData.Device.TankWaterTemperature,
461
+ SetTankWaterTemperature: deviceData.Device.SetTankWaterTemperature,
462
+ ForcedHotWaterMode: deviceData.Device.ForcedHotWaterMode,
463
+ OutdoorTemperature: deviceData.Device.OutdoorTemperature,
464
+ EcoHotWater: deviceData.Device.EcoHotWater,
465
+ HolidayMode: deviceData.Device.HolidayMode,
466
+ ProhibitZone1: deviceData.Device.ProhibitHeatingZone1,
467
+ ProhibitZone2: deviceData.Device.ProhibitHeatingZone2,
468
+ ProhibitHotWater: deviceData.Device.ProhibitHotWater,
469
+ IdleZone1: deviceData.Device.IdleZone1,
470
+ IdleZone2: deviceData.Device.IdleZone2,
471
+ UnitStatus: deviceData.Device.UnitStatus,
472
+ Power: deviceData.Device.Power,
473
+ Offline: deviceData.Device.Offline,
474
+ HasPendingCommand: true
475
+ }
476
+ }
458
477
 
459
- await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAtw, options);
460
- this.emit('deviceState', this.deviceData, deviceState);
478
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAtw, payload);
479
+ this.emit('deviceState', deviceData);
461
480
  return true;
462
481
  } catch (error) {
463
482
  throw new Error(error.message ?? error);
@@ -15,8 +15,7 @@ class MelCloudErv extends EventEmitter {
15
15
  this.debugLog = config.debugLog;
16
16
 
17
17
  //set default values
18
- this.deviceData = {};
19
- this.displayDeviceInfo = true;
18
+ this.deviceState = {};
20
19
 
21
20
  this.axiosInstancePost = axios.create({
22
21
  method: 'POST',
@@ -38,8 +37,7 @@ class MelCloudErv extends EventEmitter {
38
37
  try {
39
38
  await this.checkState();
40
39
  } catch (error) {
41
- await this.impulseGenerator.stop();
42
- this.emit('error', `Impulse generator check state error: ${error.message || error}, check again in 15s.`);
40
+ this.emit('error', `Impulse generator check state error: ${error.message || error}.`);
43
41
  };
44
42
  }).on('state', (state) => { });
45
43
  };
@@ -48,13 +46,13 @@ class MelCloudErv extends EventEmitter {
48
46
  try {
49
47
  //read device info from file
50
48
  const devicesData = await this.readData(this.devicesFile);
51
- const debug1 = this.debugLog ? this.emit('debug', `Device Info: ${JSON.stringify(devicesData, null, 2)}`) : false;
52
49
  const deviceData = devicesData.find((device) => device.DeviceID === this.deviceId);
53
50
 
54
51
  if (!deviceData) {
55
52
  this.emit('warn', `Device data not found.`);
56
53
  return;
57
54
  }
55
+ const debug = this.debugLog ? this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`) : false;
58
56
 
59
57
  //deviceData
60
58
  const deviceId = deviceData.DeviceID;
@@ -298,14 +296,7 @@ class MelCloudErv extends EventEmitter {
298
296
  this.emit('message', `Units are not configured in MELCloud service.`);
299
297
  };
300
298
 
301
- //emit info
302
- const emitInfo = this.displayDeviceInfo ? this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion) : false;
303
- this.displayDeviceInfo = false;
304
-
305
- //device state
306
299
  const deviceState = {
307
- DeviceId: deviceId,
308
- EffectiveFlags: effectiveFlags,
309
300
  RoomTemperature: roomTemperature,
310
301
  SupplyTemperature: supplyTemperature,
311
302
  OutdoorTemperature: outdoorTemperature,
@@ -314,32 +305,30 @@ class MelCloudErv extends EventEmitter {
314
305
  SetFanSpeed: setFanSpeed,
315
306
  OperationMode: operationMode,
316
307
  VentilationMode: ventilationMode,
317
- DefaultCoolingSetTemperature: defaultCoolingSetTemperature,
318
- DefaultHeatingSetTemperature: defaultHeatingSetTemperature,
319
308
  HideRoomTemperature: hideRoomTemperature,
320
309
  HideSupplyTemperature: hideSupplyTemperature,
321
310
  HideOutdoorTemperature: hideOutdoorTemperature,
322
- Power: power,
323
- Offline: offline,
311
+ Power: power
324
312
  }
325
313
 
326
- //external integrations
327
- this.emit('externalIntegrations', deviceData, deviceState, deviceId);
328
-
329
314
  //check state changes
330
- const stateHasNotChanged = JSON.stringify(deviceData) === JSON.stringify(this.deviceData);
331
- if (stateHasNotChanged) {
315
+ const deviceDataHasNotChanged = JSON.stringify(deviceState) === JSON.stringify(this.deviceState);
316
+ if (deviceDataHasNotChanged) {
332
317
  return;
333
318
  }
319
+ this.deviceState = deviceState;
320
+
321
+ //external integrations
322
+ this.emit('externalIntegrations', deviceData);
323
+
324
+ //emit info
325
+ this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion);
334
326
 
335
327
  //emit state
336
- this.deviceData = deviceData;
337
- const debug2 = this.debugLog ? this.emit('debug', `Device State: ${JSON.stringify(deviceState, null, 2)}`) : false;
338
- this.emit('deviceState', deviceData, deviceState);
328
+ this.emit('deviceState', deviceData);
339
329
 
340
330
  return true;
341
331
  } catch (error) {
342
- await this.impulseGenerator.stop();
343
332
  throw new Error(`Check state error: ${error.message || error}.`);
344
333
  };
345
334
  };
@@ -354,21 +343,40 @@ class MelCloudErv extends EventEmitter {
354
343
  }
355
344
  }
356
345
 
357
- async send(deviceState) {
346
+ async send(deviceData) {
358
347
  try {
359
348
  //prevent to set out of range temp
360
- const minTemp = this.deviceData.Device.MinTempHeat ?? 10;
361
- const maxTemp = this.deviceData.Device.MaxTempHeat ?? 31;
362
- deviceState.SetTemperature = deviceState.SetTemperature < minTemp ? minTemp : deviceState.SetTemperature;
363
- deviceState.SetTemperature = deviceState.SetTemperature > maxTemp ? maxTemp : deviceState.SetTemperature;
349
+ const minTemp = deviceData.Device.MinTempHeat ?? 10;
350
+ const maxTemp = deviceData.Device.MaxTempHeat ?? 31;
351
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature < minTemp ? minTemp : deviceData.Device.SetTemperature;
352
+ deviceData.Device.SetTemperature = deviceData.Device.SetTemperature > maxTemp ? maxTemp : deviceData.Device.SetTemperature;
364
353
 
365
- deviceState.HasPendingCommand = true;
366
- const options = {
367
- data: deviceState
368
- };
354
+ //device state
355
+ const payload = {
356
+ data: {
357
+ DeviceID: deviceData.Device.DeviceID,
358
+ EffectiveFlags: deviceData.Device.EffectiveFlags,
359
+ RoomTemperature: deviceData.Device.RoomTemperature,
360
+ SupplyTemperature: deviceData.Device.SupplyTemperature,
361
+ OutdoorTemperature: deviceData.Device.OutdoorTemperature,
362
+ NightPurgeMode: deviceData.Device.NightPurgeMode,
363
+ SetTemperature: deviceData.Device.SetTemperature,
364
+ SetFanSpeed: deviceData.Device.SetFanSpeed,
365
+ OperationMode: deviceData.Device.OperationMode,
366
+ VentilationMode: deviceData.Device.VentilationMode,
367
+ DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature ?? 23,
368
+ DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature ?? 21,
369
+ HideRoomTemperature: deviceData.Device.HideRoomTemperature,
370
+ HideSupplyTemperature: deviceData.Device.HideSupplyTemperature,
371
+ HideOutdoorTemperature: deviceData.Device.HideOutdoorTemperature,
372
+ Power: deviceData.Device.Power,
373
+ Offline: deviceData.Device.Offline,
374
+ HasPendingCommand: true
375
+ }
376
+ }
369
377
 
370
- await this.axiosInstancePost(CONSTANTS.ApiUrls.SetErv, options);
371
- this.emit('deviceState', this.deviceData, deviceState);
378
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.SetErv, payload);
379
+ this.emit('deviceState', deviceData);
372
380
  return true;
373
381
  } catch (error) {
374
382
  throw new Error(error.message ?? error);