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.
- package/README.md +8 -8
- package/package.json +2 -2
- package/src/deviceata.js +346 -350
- package/src/deviceatw.js +342 -337
- package/src/deviceerv.js +197 -199
- package/src/melcloudata.js +70 -60
- package/src/melcloudatw.js +66 -47
- package/src/melclouderv.js +44 -36
package/src/melcloudata.js
CHANGED
|
@@ -15,8 +15,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
15
15
|
this.debugLog = config.debugLog;
|
|
16
16
|
|
|
17
17
|
//set default values
|
|
18
|
-
this.
|
|
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
|
-
|
|
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
|
|
136
|
-
const prohibitOperationMode = device.ProhibitOperationMode
|
|
137
|
-
const prohibitPower = device.ProhibitPower
|
|
138
|
-
const power = device.Power
|
|
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
|
|
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
|
|
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
|
|
156
|
-
const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature
|
|
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
|
-
|
|
313
|
+
FanSpeed: fanSpeed,
|
|
323
314
|
OperationMode: operationMode,
|
|
324
|
-
|
|
325
|
-
|
|
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
|
|
343
|
-
if (
|
|
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.
|
|
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(
|
|
359
|
+
async send(deviceData) {
|
|
371
360
|
try {
|
|
372
361
|
//prevent to set out of range temp
|
|
373
|
-
const minTempHeat =
|
|
374
|
-
const maxTempHeat =
|
|
375
|
-
const minTempCoolDry =
|
|
376
|
-
const maxTempCoolDry =
|
|
377
|
-
const minTempAutomatic =
|
|
378
|
-
const maxTempAutomatic =
|
|
379
|
-
|
|
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
|
-
|
|
382
|
-
|
|
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
|
-
|
|
386
|
-
|
|
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
|
-
|
|
390
|
-
|
|
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
|
-
|
|
394
|
-
|
|
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
|
-
|
|
398
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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,
|
|
408
|
-
this.emit('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);
|
package/src/melcloudatw.js
CHANGED
|
@@ -15,8 +15,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
15
15
|
this.debugLog = config.debugLog;
|
|
16
16
|
|
|
17
17
|
//set default values
|
|
18
|
-
this.
|
|
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
|
-
|
|
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
|
|
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
|
|
165
|
-
const ecoHotWater = device.EcoHotWater
|
|
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
|
|
175
|
-
const holidayMode = device.HolidayMode
|
|
176
|
-
const prohibitHotWater = device.ProhibitHotWater
|
|
177
|
-
const prohibitHeatingZone1 = device.ProhibitHeatingZone1
|
|
178
|
-
const prohibitHeatingZone2 = device.ProhibitHeatingZone2
|
|
179
|
-
const prohibitCoolingZone1 = device.ProhibitCoolingZone1
|
|
180
|
-
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;
|
|
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
|
|
414
|
-
if (
|
|
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.
|
|
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(
|
|
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 =
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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,
|
|
460
|
-
this.emit('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);
|
package/src/melclouderv.js
CHANGED
|
@@ -15,8 +15,7 @@ class MelCloudErv extends EventEmitter {
|
|
|
15
15
|
this.debugLog = config.debugLog;
|
|
16
16
|
|
|
17
17
|
//set default values
|
|
18
|
-
this.
|
|
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
|
-
|
|
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
|
|
331
|
-
if (
|
|
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.
|
|
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(
|
|
346
|
+
async send(deviceData) {
|
|
358
347
|
try {
|
|
359
348
|
//prevent to set out of range temp
|
|
360
|
-
const minTemp =
|
|
361
|
-
const maxTemp =
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
366
|
-
const
|
|
367
|
-
data:
|
|
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,
|
|
371
|
-
this.emit('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);
|