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/CHANGELOG.md +7 -2
- package/README.md +8 -8
- package/homebridge-ui/server.js +1 -3
- package/index.js +4 -3
- package/package.json +2 -2
- package/src/deviceata.js +353 -358
- package/src/deviceatw.js +349 -345
- package/src/deviceerv.js +205 -208
- package/src/melcloud.js +25 -25
- package/src/melcloudata.js +71 -80
- package/src/melcloudatw.js +67 -67
- package/src/melclouderv.js +45 -56
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:
|
|
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
|
-
|
|
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:
|
|
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) {
|
package/src/melcloudata.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
155
|
-
const prohibitOperationMode = device.ProhibitOperationMode
|
|
156
|
-
const prohibitPower = device.ProhibitPower
|
|
157
|
-
const power = device.Power
|
|
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
|
|
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
|
|
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
|
|
175
|
-
const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature
|
|
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
|
-
|
|
313
|
+
FanSpeed: fanSpeed,
|
|
342
314
|
OperationMode: operationMode,
|
|
343
|
-
|
|
344
|
-
|
|
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
|
|
362
|
-
if (
|
|
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.
|
|
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(
|
|
359
|
+
async send(deviceData) {
|
|
390
360
|
try {
|
|
391
361
|
//prevent to set out of range temp
|
|
392
|
-
const minTempHeat =
|
|
393
|
-
const maxTempHeat =
|
|
394
|
-
const minTempCoolDry =
|
|
395
|
-
const maxTempCoolDry =
|
|
396
|
-
const minTempAutomatic =
|
|
397
|
-
const maxTempAutomatic =
|
|
398
|
-
|
|
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
|
-
|
|
401
|
-
|
|
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
|
-
|
|
405
|
-
|
|
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
|
-
|
|
409
|
-
|
|
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
|
-
|
|
413
|
-
|
|
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
|
-
|
|
417
|
-
|
|
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
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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,
|
|
427
|
-
this.emit('deviceState',
|
|
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);
|
package/src/melcloudatw.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
184
|
-
const ecoHotWater = device.EcoHotWater
|
|
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
|
|
194
|
-
const holidayMode = device.HolidayMode
|
|
195
|
-
const prohibitHotWater = device.ProhibitHotWater
|
|
196
|
-
const prohibitHeatingZone1 = device.ProhibitHeatingZone1
|
|
197
|
-
const prohibitHeatingZone2 = device.ProhibitHeatingZone2
|
|
198
|
-
const prohibitCoolingZone1 = device.ProhibitCoolingZone1
|
|
199
|
-
const prohibitCoolingZone2 = device.ProhibitCoolingZone2
|
|
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
|
|
433
|
-
if (
|
|
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.
|
|
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(
|
|
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 =
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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,
|
|
479
|
-
this.emit('deviceState',
|
|
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);
|