homebridge-melcloud-control 3.1.10 → 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.
package/src/melcloud.js CHANGED
@@ -15,9 +15,8 @@ class MelCloud extends EventEmitter {
15
15
  this.devicesFile = devicesFile;
16
16
  this.enableDebugMode = enableDebugMode;
17
17
  this.requestConfig = requestConfig;
18
- this.contextKey = '';
19
- this.useFahrenheit = 0;
20
18
  this.devicesId = [];
19
+ this.contextKey = '';
21
20
 
22
21
  this.options = {
23
22
  data: {
@@ -50,7 +49,7 @@ class MelCloud extends EventEmitter {
50
49
  const axiosInstanceLogin = axios.create({
51
50
  method: 'POST',
52
51
  baseURL: CONSTANTS.ApiUrls.BaseURL,
53
- timeout: 5000,
52
+ timeout: 10000,
54
53
  withCredentials: true,
55
54
  maxContentLength: 100000000,
56
55
  maxBodyLength: 1000000000,
@@ -63,7 +62,7 @@ class MelCloud extends EventEmitter {
63
62
  const account = accountData.data;
64
63
  const accountInfo = account.LoginData;
65
64
  const contextKey = accountInfo.ContextKey;
66
- this.useFahrenheit = accountInfo.UseFahrenheit
65
+ const useFahrenheit = accountInfo.UseFahrenheit ? 1 : 0;
67
66
  this.contextKey = contextKey;
68
67
 
69
68
  //remove sensitive data
@@ -83,6 +82,24 @@ class MelCloud extends EventEmitter {
83
82
  return;
84
83
  };
85
84
 
85
+ //create axios instance post
86
+ this.axiosInstancePost = axios.create({
87
+ method: 'POST',
88
+ baseURL: CONSTANTS.ApiUrls.BaseURL,
89
+ timeout: 10000,
90
+ headers: {
91
+ 'X-MitsContextKey': contextKey,
92
+ 'content-type': 'application/json'
93
+ },
94
+ maxContentLength: 100000000,
95
+ maxBodyLength: 1000000000,
96
+ withCredentials: true,
97
+ httpsAgent: new https.Agent({
98
+ keepAlive: false,
99
+ rejectUnauthorized: false
100
+ })
101
+ });
102
+
86
103
  //save melcloud info to the file
87
104
  await this.saveData(this.accountFile, accountInfo);
88
105
 
@@ -91,7 +108,8 @@ class MelCloud extends EventEmitter {
91
108
 
92
109
  const obj = {
93
110
  accountInfo: accountInfo,
94
- contextKey: contextKey
111
+ contextKey: contextKey,
112
+ useFahrenheit: useFahrenheit
95
113
  }
96
114
 
97
115
  return obj;
@@ -106,7 +124,7 @@ class MelCloud extends EventEmitter {
106
124
  const axiosInstanceGet = axios.create({
107
125
  method: 'GET',
108
126
  baseURL: CONSTANTS.ApiUrls.BaseURL,
109
- timeout: 5000,
127
+ timeout: 10000,
110
128
  headers: {
111
129
  'X-MitsContextKey': contextKey
112
130
  },
@@ -177,29 +195,11 @@ class MelCloud extends EventEmitter {
177
195
 
178
196
  async send(accountInfo) {
179
197
  try {
180
- //create axios instance post
181
- const axiosInstancePost = axios.create({
182
- method: 'POST',
183
- baseURL: CONSTANTS.ApiUrls.BaseURL,
184
- timeout: 5000,
185
- headers: {
186
- 'X-MitsContextKey': this.contextKey,
187
- 'content-type': 'application/json'
188
- },
189
- maxContentLength: 100000000,
190
- maxBodyLength: 1000000000,
191
- withCredentials: true,
192
- httpsAgent: new https.Agent({
193
- keepAlive: false,
194
- rejectUnauthorized: false
195
- })
196
- });
197
-
198
198
  const options = {
199
199
  data: accountInfo
200
200
  };
201
201
 
202
- await axiosInstancePost(CONSTANTS.ApiUrls.UpdateApplicationOptions, options);
202
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.UpdateApplicationOptions, options);
203
203
  await this.saveData(this.accountInfoFile, accountInfo);
204
204
  return true;
205
205
  } catch (error) {
@@ -10,14 +10,12 @@ const CONSTANTS = require('./constants.json');
10
10
  class MelCloudAta extends EventEmitter {
11
11
  constructor(config) {
12
12
  super();
13
- this.accountFile = config.accountFile;
14
13
  this.devicesFile = config.devicesFile;
15
14
  this.deviceId = config.deviceId;
16
15
  this.debugLog = config.debugLog;
17
16
 
18
17
  //set default values
19
- this.deviceData = {};
20
- this.displayDeviceInfo = true;
18
+ this.deviceState = {};
21
19
 
22
20
  this.axiosInstancePost = axios.create({
23
21
  method: 'POST',
@@ -39,41 +37,22 @@ class MelCloudAta extends EventEmitter {
39
37
  try {
40
38
  await this.checkState();
41
39
  } catch (error) {
42
- await this.impulseGenerator.stop();
43
- 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}.`);
44
41
  };
45
42
  }).on('state', (state) => { });
46
43
  };
47
44
 
48
45
  async checkState() {
49
46
  try {
50
- //read account info from file
51
- const accountInfo = await this.readData(this.accountFile);
52
-
53
- //remove sensitive data
54
- const debugData = {
55
- ...accountInfo,
56
- ContextKey: 'removed',
57
- ClientId: 'removed',
58
- Client: 'removed',
59
- Name: 'removed',
60
- MapLongitude: 'removed',
61
- MapLatitude: 'removed'
62
- };
63
- const debug = this.debugLog ? this.emit('debug', `Account Info: ${JSON.stringify(debugData, null, 2)}`) : false;
64
- const useFahrenheit = accountInfo.UseFahrenheit ? 1 : 0;
65
- this.useFahrenheit = useFahrenheit;
66
-
67
47
  //read device info from file
68
48
  const devicesData = await this.readData(this.devicesFile);
69
- const debug1 = this.debugLog ? this.emit('debug', `Device Info: ${JSON.stringify(devicesData, null, 2)}`) : false;
70
49
  const deviceData = devicesData.find((device) => device.DeviceID === this.deviceId);
71
50
 
72
51
  if (!deviceData) {
73
- await this.impulseGenerator.stop();
74
- this.emit('error', `Device data not found, check again in 15s.`);
52
+ this.emit('warn', `Device data not found.`);
75
53
  return;
76
54
  }
55
+ const debug = this.debugLog ? this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`) : false;
77
56
 
78
57
  //device info
79
58
  const deviceId = deviceData.DeviceID;
@@ -151,15 +130,15 @@ class MelCloudAta extends EventEmitter {
151
130
  const modelDisableEnergyReport = device.ModelDisableEnergyReport;
152
131
  const modelSupportsStandbyMode = device.ModelSupportsStandbyMode;
153
132
  const modelSupportsEnergyReporting = device.ModelSupportsEnergyReporting;
154
- const prohibitSetTemperature = device.ProhibitSetTemperature ?? false;
155
- const prohibitOperationMode = device.ProhibitOperationMode ?? false;
156
- const prohibitPower = device.ProhibitPower ?? false;
157
- 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;
158
137
  const roomTemperature = device.RoomTemperature;
159
138
  const outdoorTemperature = device.OutdoorTemperature;
160
139
  const setTemperature = device.SetTemperature;
161
140
  const actualFanSpeed = device.ActualFanSpeed;
162
- const fanSpeed = device.FanSpeed ?? 0;
141
+ const fanSpeed = device.FanSpeed;
163
142
  const automaticFanSpeed = device.AutomaticFanSpeed;
164
143
  const vaneVerticalDirection = device.VaneVerticalDirection;
165
144
  const vaneVerticalSwing = device.VaneVerticalSwing;
@@ -167,12 +146,12 @@ class MelCloudAta extends EventEmitter {
167
146
  const vaneHorizontalSwing = device.VaneHorizontalSwing;
168
147
  const operationMode = device.OperationMode;
169
148
  const effectiveFlags = device.EffectiveFlags;
170
- const inStandbyMode = device.InStandbyMode ?? false;
149
+ const inStandbyMode = device.InStandbyMode;
171
150
  const demandPercentage = device.DemandPercentage;
172
151
  const configuredDemandPercentage = device.ConfiguredDemandPercentage;
173
152
  const hasDemandSideControl = device.HasDemandSideControl;
174
- const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature ?? 23;
175
- const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature ?? 21;
153
+ const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature;
154
+ const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature;
176
155
  const roomTemperatureLabel = device.RoomTemperatureLabel;
177
156
  const heatingEnergyConsumedRate1 = device.HeatingEnergyConsumedRate1;
178
157
  const heatingEnergyConsumedRate2 = device.HeatingEnergyConsumedRate2;
@@ -328,49 +307,40 @@ class MelCloudAta extends EventEmitter {
328
307
  this.emit('warn', `Units are not configured in MELCloud service.`);
329
308
  };
330
309
 
331
- //emit info
332
- const emitInfo = this.displayDeviceInfo ? this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion) : false;
333
- this.displayDeviceInfo = false;
334
-
335
- //device state
336
310
  const deviceState = {
337
- DeviceId: deviceId,
338
- EffectiveFlags: effectiveFlags,
339
311
  RoomTemperature: roomTemperature,
340
312
  SetTemperature: setTemperature,
341
- SetFanSpeed: fanSpeed,
313
+ FanSpeed: fanSpeed,
342
314
  OperationMode: operationMode,
343
- VaneHorizontal: vaneHorizontalDirection,
344
- VaneVertical: vaneVerticalDirection,
315
+ VaneHorizontalDirection: vaneHorizontalDirection,
316
+ VaneVerticalDirection: vaneVerticalDirection,
345
317
  HideVaneControls: hideVaneControls,
346
318
  HideDryModeControl: hideDryModeControl,
347
- DefaultCoolingSetTemperature: defaultCoolingSetTemperature,
348
- DefaultHeatingSetTemperature: defaultHeatingSetTemperature,
349
319
  InStandbyMode: inStandbyMode,
350
320
  ProhibitSetTemperature: prohibitSetTemperature,
351
321
  ProhibitOperationMode: prohibitOperationMode,
352
322
  ProhibitPower: prohibitPower,
353
- Power: power,
354
- Offline: offline
323
+ Power: power
355
324
  }
356
325
 
357
- //external integrations
358
- this.emit('externalIntegrations', deviceData, deviceState);
359
-
360
326
  //check state changes
361
- const stateHasNotChanged = JSON.stringify(deviceData) === JSON.stringify(this.deviceData);
362
- if (stateHasNotChanged) {
327
+ const deviceDataHasNotChanged = JSON.stringify(deviceState) === JSON.stringify(this.deviceState);
328
+ if (deviceDataHasNotChanged) {
363
329
  return;
364
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);
365
338
 
366
339
  //emit state
367
- this.deviceData = deviceData;
368
- const debug2 = this.debugLog ? this.emit('debug', `Device State: ${JSON.stringify(deviceState, null, 2)}`) : false;
369
- this.emit('deviceState', deviceData, deviceState, useFahrenheit);
340
+ this.emit('deviceState', deviceData);
370
341
 
371
342
  return true;
372
343
  } catch (error) {
373
- await this.impulseGenerator.stop();
374
344
  throw new Error(`Check state error: ${error.message || error}.`);
375
345
  };
376
346
  };
@@ -386,45 +356,66 @@ class MelCloudAta extends EventEmitter {
386
356
  }
387
357
  }
388
358
 
389
- async send(deviceState) {
359
+ async send(deviceData) {
390
360
  try {
391
361
  //prevent to set out of range temp
392
- const minTempHeat = this.deviceData.Device.MinTempHeat ?? 10;
393
- const maxTempHeat = this.deviceData.Device.MaxTempHeat ?? 31;
394
- const minTempCoolDry = this.deviceData.Device.MinTempCoolDry ?? 16;
395
- const maxTempCoolDry = this.deviceData.Device.MaxTempCoolDry ?? 31;
396
- const minTempAutomatic = this.deviceData.Device.MinTempAutomatic ?? 16;
397
- const maxTempAutomatic = this.deviceData.Device.MaxTempAutomatic ?? 31;
398
- 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
399
371
  case 1:
400
- deviceState.SetTemperature = deviceState.SetTemperature < minTempHeat ? minTempHeat : deviceState.SetTemperature;
401
- 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;
402
374
  break;
403
375
  case 2:
404
- deviceState.SetTemperature = deviceState.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceState.SetTemperature;
405
- 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;
406
378
  break;
407
379
  case 3:
408
- deviceState.SetTemperature = deviceState.SetTemperature < minTempCoolDry ? minTempCoolDry : deviceState.SetTemperature;
409
- 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;
410
382
  break;
411
383
  case 8:
412
- deviceState.SetTemperature = deviceState.SetTemperature < minTempAutomatic ? minTempAutomatic : deviceState.SetTemperature;
413
- 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;
414
386
  break;
415
387
  default:
416
- deviceState.SetTemperature = deviceState.SetTemperature < 10 ? 10 : deviceState.SetTemperature;
417
- 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;
418
390
  break;
419
391
  };
420
392
 
421
- deviceState.HasPendingCommand = true;
422
- const options = {
423
- data: deviceState
424
- };
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
+ }
425
416
 
426
- await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAta, options);
427
- this.emit('deviceState', this.deviceData, deviceState, this.useFahrenheit);
417
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAta, payload);
418
+ this.emit('deviceState', deviceData);
428
419
  return true;
429
420
  } catch (error) {
430
421
  throw new Error(error.message ?? error);
@@ -10,14 +10,12 @@ const CONSTANTS = require('./constants.json');
10
10
  class MelCloudAtw extends EventEmitter {
11
11
  constructor(config) {
12
12
  super();
13
- this.accountFile = config.accountFile;
14
13
  this.devicesFile = config.devicesFile;
15
14
  this.deviceId = config.deviceId;
16
15
  this.debugLog = config.debugLog;
17
16
 
18
17
  //set default values
19
- this.deviceData = {};
20
- this.displayDeviceInfo = true;
18
+ this.deviceState = {};
21
19
 
22
20
  this.axiosInstancePost = axios.create({
23
21
  method: 'POST',
@@ -39,41 +37,22 @@ class MelCloudAtw extends EventEmitter {
39
37
  try {
40
38
  await this.checkState();
41
39
  } catch (error) {
42
- await this.impulseGenerator.stop();
43
- 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}.`);
44
41
  };
45
42
  }).on('state', (state) => { });
46
43
  };
47
44
 
48
45
  async checkState() {
49
46
  try {
50
- //read account info from file
51
- const accountInfo = await this.readData(this.accountFile);
52
-
53
- //remove sensitive data
54
- const debugData = {
55
- ...accountInfo,
56
- ContextKey: 'removed',
57
- ClientId: 'removed',
58
- Client: 'removed',
59
- Name: 'removed',
60
- MapLongitude: 'removed',
61
- MapLatitude: 'removed'
62
- };
63
- const debug = this.debugLog ? this.emit('debug', `Account Info: ${JSON.stringify(debugData, null, 2)}`) : false;
64
- const useFahrenheit = accountInfo.UseFahrenheit ? 1 : 0;
65
- this.useFahrenheit = useFahrenheit;
66
-
67
47
  //read device info from file
68
48
  const devicesData = await this.readData(this.devicesFile);
69
- const debug1 = this.debugLog ? this.emit('debug', `Device Info: ${JSON.stringify(devicesData, null, 2)}`) : false;
70
49
  const deviceData = devicesData.find((device) => device.DeviceID === this.deviceId);
71
50
 
72
51
  if (!deviceData) {
73
- await this.impulseGenerator.stop();
74
- this.emit('error', `Device data not found, check again in 15s.`);
52
+ this.emit('warn', `Device data not found.`);
75
53
  return;
76
54
  }
55
+ const debug = this.debugLog ? this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`) : false;
77
56
 
78
57
  //device info
79
58
  const deviceId = deviceData.DeviceID;
@@ -169,7 +148,7 @@ class MelCloudAtw extends EventEmitter {
169
148
  const valveStatus2Way2a = device.ValveStatus2Way2a;
170
149
  const valveStatus2Way2b = device.ValveStatus2Way2b;
171
150
  const tankWaterTemperature = device.TankWaterTemperature;
172
- const unitStatus = device.UnitStatus ?? 0;
151
+ const unitStatus = device.UnitStatus;
173
152
  const heatingFunctionEnabled = device.HeatingFunctionEnabled;
174
153
  const serverTimerEnabled = device.ServerTimerEnabled;
175
154
  const thermostatStatusZone1 = device.ThermostatStatusZone1;
@@ -180,8 +159,8 @@ class MelCloudAtw extends EventEmitter {
180
159
  const condensingTemperature = device.CondensingTemperature;
181
160
  const effectiveFlags = device.EffectiveFlags;
182
161
  const lastEffectiveFlags = device.LastEffectiveFlags;
183
- const power = device.Power ?? false;
184
- const ecoHotWater = device.EcoHotWater ?? false;
162
+ const power = device.Power;
163
+ const ecoHotWater = device.EcoHotWater;
185
164
  const operationMode = device.OperationMode;
186
165
  const operationModeZone1 = device.OperationModeZone1;
187
166
  const operationModeZone2 = device.OperationModeZone2;
@@ -190,13 +169,13 @@ class MelCloudAtw extends EventEmitter {
190
169
  const setTankWaterTemperature = device.SetTankWaterTemperature;
191
170
  const targetHCTemperatureZone1 = device.TargetHCTemperatureZone1;
192
171
  const targetHCTemperatureZone2 = device.TargetHCTemperatureZone2;
193
- const forcedHotWaterMode = device.ForcedHotWaterMode ? 1 : 0 ?? 0;
194
- const holidayMode = device.HolidayMode ?? false;
195
- const prohibitHotWater = device.ProhibitHotWater ?? false;
196
- const prohibitHeatingZone1 = device.ProhibitHeatingZone1 ?? false;
197
- const prohibitHeatingZone2 = device.ProhibitHeatingZone2 ?? false;
198
- const prohibitCoolingZone1 = device.ProhibitCoolingZone1 ?? false;
199
- 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;
200
179
  const serverTimerDesired = device.ServerTimerDesired;
201
180
  const secondaryZoneHeatCurve = device.SecondaryZoneHeatCurve;
202
181
  const setHeatFlowTemperatureZone1 = device.SetHeatFlowTemperatureZone1;
@@ -390,14 +369,7 @@ class MelCloudAtw extends EventEmitter {
390
369
  this.emit('message', `Units are not configured in MELCloud service.`);
391
370
  };
392
371
 
393
- //emit info
394
- const emitInfo = this.displayDeviceInfo ? this.emit('deviceInfo', manufacturer, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion, hasHotWaterTank, hasZone2) : false;
395
- this.displayDeviceInfo = false;
396
-
397
- //device state
398
372
  const deviceState = {
399
- DeviceId: deviceId,
400
- EffectiveFlags: effectiveFlags,
401
373
  SetTemperatureZone1: setTemperatureZone1,
402
374
  SetTemperatureZone2: setTemperatureZone2,
403
375
  RoomTemperatureZone1: roomTemperatureZone1,
@@ -421,27 +393,27 @@ class MelCloudAtw extends EventEmitter {
421
393
  IdleZone1: idleZone1,
422
394
  IdleZone2: idleZone2,
423
395
  UnitStatus: unitStatus,
424
- Power: power,
425
- Offline: offline
396
+ Power: power
426
397
  }
427
398
 
428
- //external integrations
429
- this.emit('externalIntegrations', deviceData, deviceState, deviceId);
430
-
431
399
  //check state changes
432
- const stateHasNotChanged = JSON.stringify(deviceData) === JSON.stringify(this.deviceData);
433
- if (stateHasNotChanged) {
400
+ const deviceDataHasNotChanged = JSON.stringify(deviceState) === JSON.stringify(this.deviceState);
401
+ if (deviceDataHasNotChanged) {
434
402
  return;
435
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);
436
411
 
437
412
  //emit state
438
- this.deviceData = deviceData;
439
- const debug2 = this.debugLog ? this.emit('debug', `Device State: ${JSON.stringify(deviceState, null, 2)}`) : false;
440
- this.emit('deviceState', deviceData, deviceState, useFahrenheit);
413
+ this.emit('deviceState', deviceData);
441
414
 
442
415
  return true;
443
416
  } catch (error) {
444
- await this.impulseGenerator.stop();
445
417
  throw new Error(`Check state error: ${error.message || error}.`);
446
418
  };
447
419
  };
@@ -456,27 +428,55 @@ class MelCloudAtw extends EventEmitter {
456
428
  }
457
429
  }
458
430
 
459
- async send(deviceState) {
431
+ async send(deviceData) {
460
432
  try {
461
433
  //prevent to set out of range temp
462
434
  const minTempZones = 10;
463
435
  const maxTempZones = 31;
464
436
  const minTempWaterTank = 16;
465
- const maxTempWaterTank = this.deviceData.Device.MaxTankTemperature ?? 70;
466
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone1 < minTempZones ? minTempZones : deviceState.SetTemperatureZone1;
467
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone1 > maxTempZones ? maxTempZones : deviceState.SetTemperatureZone1;
468
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone2 < minTempZones ? minTempZones : deviceState.SetTemperatureZone2;
469
- deviceState.SetTemperatureZone1 = deviceState.SetTemperatureZone2 > maxTempZones ? maxTempZones : deviceState.SetTemperatureZone2;
470
- deviceState.SetTankWaterTemperature = deviceState.SetTankWaterTemperature < minTempWaterTank ? minTempWaterTank : deviceState.SetTankWaterTemperature;
471
- 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;
472
444
 
473
- deviceState.HasPendingCommand = true;
474
- const options = {
475
- data: deviceState
476
- };
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
+ }
477
477
 
478
- await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAtw, options);
479
- this.emit('deviceState', this.deviceData, deviceState, this.useFahrenheit);
478
+ await this.axiosInstancePost(CONSTANTS.ApiUrls.SetAtw, payload);
479
+ this.emit('deviceState', deviceData);
480
480
  return true;
481
481
  } catch (error) {
482
482
  throw new Error(error.message ?? error);