homebridge-melcloud-control 4.0.0-beta.52 → 4.0.0-beta.521
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 +9 -4
- package/README.md +10 -12
- package/config.schema.json +294 -336
- package/homebridge-ui/public/index.html +110 -64
- package/homebridge-ui/server.js +7 -9
- package/index.js +45 -28
- package/package.json +5 -4
- package/src/constants.js +15 -22
- package/src/deviceata.js +252 -243
- package/src/deviceatw.js +50 -40
- package/src/deviceerv.js +43 -35
- package/src/functions.js +155 -5
- package/src/melcloud.js +345 -180
- package/src/melcloudata.js +146 -306
- package/src/melcloudatw.js +145 -340
- package/src/melclouderv.js +144 -271
- package/src/restful.js +1 -1
package/src/melcloudatw.js
CHANGED
|
@@ -1,37 +1,27 @@
|
|
|
1
|
-
import { Agent } from 'https';
|
|
2
1
|
import axios from 'axios';
|
|
3
2
|
import EventEmitter from 'events';
|
|
4
3
|
import ImpulseGenerator from './impulsegenerator.js';
|
|
5
4
|
import Functions from './functions.js';
|
|
6
|
-
import { ApiUrls } from './constants.js';
|
|
5
|
+
import { ApiUrls, ApiUrlsHome, HeatPump } from './constants.js';
|
|
7
6
|
|
|
8
7
|
class MelCloudAtw extends EventEmitter {
|
|
9
|
-
constructor(device,
|
|
8
|
+
constructor(account, device, devicesFile, defaultTempsFile) {
|
|
10
9
|
super();
|
|
10
|
+
this.accountType = account.type;
|
|
11
11
|
this.deviceId = device.id;
|
|
12
12
|
this.logWarn = device.log?.warn;
|
|
13
|
+
this.logError = device.log?.error;
|
|
13
14
|
this.logDebug = device.log?.debug;
|
|
14
15
|
this.devicesFile = devicesFile;
|
|
15
|
-
this.
|
|
16
|
+
this.defaultTempsFile = defaultTempsFile;
|
|
17
|
+
this.functions = new Functions(this.logWarn, this.logError, this.logDebug)
|
|
18
|
+
.on('warn', warn => this.emit('warn', warn))
|
|
19
|
+
.on('error', error => this.emit('error', error))
|
|
20
|
+
.on('debug', debug => this.emit('debug', debug));
|
|
16
21
|
|
|
17
22
|
//set default values
|
|
18
23
|
this.deviceState = {};
|
|
19
24
|
|
|
20
|
-
this.axiosInstancePost = axios.create({
|
|
21
|
-
method: 'POST',
|
|
22
|
-
baseURL: ApiUrls.BaseURL,
|
|
23
|
-
timeout: 25000,
|
|
24
|
-
headers: {
|
|
25
|
-
'X-MitsContextKey': contextKey,
|
|
26
|
-
'content-type': 'application/json'
|
|
27
|
-
},
|
|
28
|
-
withCredentials: true,
|
|
29
|
-
httpsAgent: new Agent({
|
|
30
|
-
keepAlive: false,
|
|
31
|
-
rejectUnauthorized: false
|
|
32
|
-
})
|
|
33
|
-
});
|
|
34
|
-
|
|
35
25
|
//lock flags
|
|
36
26
|
this.locks = {
|
|
37
27
|
checkState: false,
|
|
@@ -41,7 +31,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
41
31
|
await this.checkState();
|
|
42
32
|
}))
|
|
43
33
|
.on('state', (state) => {
|
|
44
|
-
this.emit('success', `Impulse generator ${state ? 'started' : 'stopped'}
|
|
34
|
+
this.emit(state ? 'success' : 'warn', `Impulse generator ${state ? 'started' : 'stopped'}`);
|
|
45
35
|
});
|
|
46
36
|
}
|
|
47
37
|
|
|
@@ -61,121 +51,31 @@ class MelCloudAtw extends EventEmitter {
|
|
|
61
51
|
async checkState() {
|
|
62
52
|
try {
|
|
63
53
|
//read device info from file
|
|
64
|
-
const
|
|
65
|
-
const devicesData = JSON.parse(data);
|
|
54
|
+
const devicesData = await this.functions.readData(this.devicesFile, true);
|
|
66
55
|
|
|
67
56
|
if (!Array.isArray(devicesData)) {
|
|
68
57
|
if (this.logWarn) this.emit('warn', `Device data not found`);
|
|
69
58
|
return null;
|
|
70
59
|
}
|
|
71
60
|
const deviceData = devicesData.find(device => device.DeviceID === this.deviceId);
|
|
61
|
+
if (this.accountType === 'melcloudhome') {
|
|
62
|
+
deviceData.SerialNumber = deviceData.Device.DeviceID || '4.0.0';
|
|
63
|
+
deviceData.Device.FirmwareAppVersion = '4.0.0';
|
|
64
|
+
}
|
|
72
65
|
if (this.logDebug) this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`);
|
|
73
66
|
|
|
74
67
|
//device info
|
|
75
|
-
const
|
|
76
|
-
const deviceName = deviceData.DeviceName;
|
|
77
|
-
const buildingId = deviceData.BuildingID;
|
|
78
|
-
const buildingName = deviceData.BuildingName;
|
|
79
|
-
const floorId = deviceData.FloorID;
|
|
80
|
-
const floorName = deviceData.FloorName;
|
|
81
|
-
const areaId = deviceData.AreaID;
|
|
82
|
-
const areaName = deviceData.AreaName;
|
|
83
|
-
const imageId = deviceData.ImageID;
|
|
84
|
-
const installationDate = deviceData.InstallationDate;
|
|
85
|
-
const lastServiceDate = deviceData.LastServiceDate;
|
|
86
|
-
|
|
87
|
-
//presets
|
|
88
|
-
const presets = deviceData.Presets ?? [];
|
|
89
|
-
|
|
90
|
-
//device info
|
|
91
|
-
const ownerId = deviceData.OwnerID;
|
|
92
|
-
const ownerName = deviceData.OwnerName;
|
|
93
|
-
const ownerEmail = deviceData.OwnerEmail;
|
|
94
|
-
const accessLevel = deviceData.AccessLevel;
|
|
95
|
-
const directAccess = deviceData.DirectAccess;
|
|
96
|
-
const endDate = deviceData.EndDate;
|
|
97
|
-
const zone1Name = deviceData.Zone1Name;
|
|
98
|
-
const zone2Name = deviceData.Zone2Name;
|
|
99
|
-
const minTemperature = deviceData.MinTemperature;
|
|
100
|
-
const maxTemperature = deviceData.MaxTemperature;
|
|
101
|
-
const hideVaneControls = deviceData.HideVaneControls;
|
|
102
|
-
const hideDryModeControl = deviceData.HideDryModeControl;
|
|
103
|
-
const hideRoomTemperature = deviceData.HideRoomTemperature;
|
|
104
|
-
const hideSupplyTemperature = deviceData.HideSupplyTemperature;
|
|
105
|
-
const hideOutdoorTemperature = deviceData.HideOutdoorTemperature;
|
|
106
|
-
const buildingCountry = deviceData.BuildingCountry;
|
|
107
|
-
const ownerCountry = deviceData.OwnerCountry;
|
|
108
|
-
const adaptorType = deviceData.AdaptorType;
|
|
109
|
-
const linkedDevice = deviceData.LinkedDevice;
|
|
110
|
-
const type = deviceData.Type;
|
|
111
|
-
const macAddress = deviceData.MacAddress;
|
|
112
|
-
const serialNumber = deviceData.SerialNumber ?? 'Undefined';
|
|
68
|
+
const serialNumber = deviceData.SerialNumber;
|
|
113
69
|
|
|
114
70
|
//device
|
|
115
71
|
const device = deviceData.Device ?? {};
|
|
116
|
-
const listHistory24Formatters = Array.isArray(device.ListHistory24Formatters) ? device.ListHistory24Formatters : [];
|
|
117
|
-
const listHistory24FormattersCount = listHistory24Formatters.length;
|
|
118
|
-
const pCycleActual = device.PCycleActual;
|
|
119
|
-
const errorMessages = device.ErrorMessages;
|
|
120
|
-
const deviceType = device.DeviceType;
|
|
121
|
-
const canHeat = device.CanHeat;
|
|
122
|
-
const canCool = device.CanCool;
|
|
123
72
|
const hasHotWaterTank = device.HasHotWaterTank ?? false;
|
|
124
|
-
const fTCVersion = device.FTCVersion;
|
|
125
|
-
const fTCRevision = device.FTCRevision;
|
|
126
|
-
const lastFTCVersion = device.LastFTCVersion;
|
|
127
|
-
const lastFTCRevision = device.LastFTCRevision;
|
|
128
|
-
const fTCModel = device.FTCModel;
|
|
129
|
-
const refridgerentAddress = device.RefridgerentAddress; // TODO: Typo in MELCloud service?
|
|
130
|
-
const dipSwitch1 = device.DipSwitch1;
|
|
131
|
-
const dipSwitch2 = device.DipSwitch2;
|
|
132
|
-
const dipSwitch3 = device.DipSwitch3;
|
|
133
|
-
const minTempHeat = device.DipSwitch4;
|
|
134
|
-
const dipSwitch5 = device.DipSwitch5;
|
|
135
|
-
const dipSwitch6 = device.DipSwitch6;
|
|
136
|
-
const hasThermostatZone1 = device.HasThermostatZone1;
|
|
137
|
-
const hasThermostatZone2 = device.HasThermostatZone2;
|
|
138
73
|
const temperatureIncrement = device.TemperatureIncrement;
|
|
139
|
-
const defrostMode = device.DefrostMode;
|
|
140
|
-
const heatPumpFrequency = device.HeatPumpFrequency;
|
|
141
|
-
const maxSetTemperature = device.MaxSetTemperature;
|
|
142
|
-
const minSetTemperature = device.MinSetTemperature;
|
|
143
74
|
const roomTemperatureZone1 = device.RoomTemperatureZone1;
|
|
144
75
|
const roomTemperatureZone2 = device.RoomTemperatureZone2;
|
|
145
76
|
const outdoorTemperature = device.OutdoorTemperature;
|
|
146
|
-
const flowTemperature = device.FlowTemperature;
|
|
147
|
-
const flowTemperatureZone1 = device.FlowTemperatureZone1;
|
|
148
|
-
const flowTemperatureZone2 = device.FlowTemperatureZone2;
|
|
149
|
-
const flowTemperatureBoiler = device.FlowTemperatureBoiler;
|
|
150
|
-
const returnTemperature = device.ReturnTemperature;
|
|
151
|
-
const returnTemperatureZone1 = device.ReturnTemperatureZone1;
|
|
152
|
-
const returnTemperatureZone2 = device.ReturnTemperatureZone2;
|
|
153
|
-
const returnTemperatureBoiler = device.ReturnTemperatureBoiler;
|
|
154
|
-
const boilerStatus = device.BoilerStatus;
|
|
155
|
-
const boosterHeater1Status = device.BoosterHeater1Status;
|
|
156
|
-
const boosterHeater2Status = device.BoosterHeater2Status;
|
|
157
|
-
const boosterHeater2PlusStatus = device.BoosterHeater2PlusStatus;
|
|
158
|
-
const immersionHeaterStatus = device.ImmersionHeaterStatus;
|
|
159
|
-
const waterPump1Status = device.WaterPump1Status;
|
|
160
|
-
const waterPump2Status = device.WaterPump2Status;
|
|
161
|
-
const waterPump3Status = device.WaterPump3Status;
|
|
162
|
-
const valveStatus3Way = device.ValveStatus3Way;
|
|
163
|
-
const valveStatus2Way = device.ValveStatus2Way;
|
|
164
|
-
const waterPump4Status = device.WaterPump4Status;
|
|
165
|
-
const valveStatus2Way2a = device.ValveStatus2Way2a;
|
|
166
|
-
const valveStatus2Way2b = device.ValveStatus2Way2b;
|
|
167
77
|
const tankWaterTemperature = device.TankWaterTemperature;
|
|
168
78
|
const unitStatus = device.UnitStatus;
|
|
169
|
-
const heatingFunctionEnabled = device.HeatingFunctionEnabled;
|
|
170
|
-
const serverTimerEnabled = device.ServerTimerEnabled;
|
|
171
|
-
const thermostatStatusZone1 = device.ThermostatStatusZone1;
|
|
172
|
-
const thermostatStatusZone2 = device.ThermostatStatusZone2;
|
|
173
|
-
const thermostatTypeZone1 = device.ThermostatTypeZone1;
|
|
174
|
-
const thermostatTypeZone2 = device.ThermostatTypeZone2;
|
|
175
|
-
const mixingTankWaterTemperature = device.MixingTankWaterTemperature;
|
|
176
|
-
const condensingTemperature = device.CondensingTemperature;
|
|
177
|
-
const effectiveFlags = device.EffectiveFlags;
|
|
178
|
-
const lastEffectiveFlags = device.LastEffectiveFlags;
|
|
179
79
|
const power = device.Power;
|
|
180
80
|
const ecoHotWater = device.EcoHotWater;
|
|
181
81
|
const operationMode = device.OperationMode;
|
|
@@ -184,126 +84,18 @@ class MelCloudAtw extends EventEmitter {
|
|
|
184
84
|
const setTemperatureZone1 = device.SetTemperatureZone1;
|
|
185
85
|
const setTemperatureZone2 = device.SetTemperatureZone2;
|
|
186
86
|
const setTankWaterTemperature = device.SetTankWaterTemperature;
|
|
187
|
-
const targetHCTemperatureZone1 = device.TargetHCTemperatureZone1;
|
|
188
|
-
const targetHCTemperatureZone2 = device.TargetHCTemperatureZone2;
|
|
189
87
|
const forcedHotWaterMode = device.ForcedHotWaterMode;
|
|
190
88
|
const holidayMode = device.HolidayMode;
|
|
191
89
|
const prohibitHotWater = device.ProhibitHotWater;
|
|
192
90
|
const prohibitHeatingZone1 = device.ProhibitHeatingZone1;
|
|
193
91
|
const prohibitHeatingZone2 = device.ProhibitHeatingZone2;
|
|
194
|
-
const prohibitCoolingZone1 = device.ProhibitCoolingZone1;
|
|
195
|
-
const prohibitCoolingZone2 = device.ProhibitCoolingZone2;
|
|
196
|
-
const serverTimerDesired = device.ServerTimerDesired;
|
|
197
|
-
const secondaryZoneHeatCurve = device.SecondaryZoneHeatCurve;
|
|
198
92
|
const setHeatFlowTemperatureZone1 = device.SetHeatFlowTemperatureZone1;
|
|
199
93
|
const setHeatFlowTemperatureZone2 = device.SetHeatFlowTemperatureZone2;
|
|
200
94
|
const setCoolFlowTemperatureZone1 = device.SetCoolFlowTemperatureZone1;
|
|
201
95
|
const setCoolFlowTemperatureZone2 = device.SetCoolFlowTemperatureZone2;
|
|
202
|
-
const thermostatTemperatureZone1 = device.ThermostatTemperatureZone1;
|
|
203
|
-
const thermostatTemperatureZone2 = device.ThermostatTemperatureZone2;
|
|
204
|
-
const dECCReport = device.DECCReport;
|
|
205
|
-
const cSVReport1min = device.CSVReport1min;
|
|
206
|
-
const zone2Master = device.Zone2Master;
|
|
207
|
-
const dailyEnergyConsumedDate = device.DailyEnergyConsumedDate;
|
|
208
|
-
const dailyEnergyProducedDate = device.DailyEnergyProducedDate;
|
|
209
|
-
const currentEnergyConsumed = device.CurrentEnergyConsumed;
|
|
210
|
-
const currentEnergyProduced = device.CurrentEnergyProduced;
|
|
211
|
-
const currentEnergyMode = device.CurrentEnergyMode;
|
|
212
|
-
const heatingEnergyConsumedRate1 = device.HeatingEnergyConsumedRate1;
|
|
213
|
-
const heatingEnergyConsumedRate2 = device.HeatingEnergyConsumedRate2
|
|
214
|
-
const coolingEnergyConsumedRate1 = device.CoolingEnergyConsumedRate1;
|
|
215
|
-
const coolingEnergyConsumedRate2 = device.CoolingEnergyConsumedRate2;
|
|
216
|
-
const hotWaterEnergyConsumedRate1 = device.HotWaterEnergyConsumedRate1;
|
|
217
|
-
const hotWaterEnergyConsumedRate2 = device.HotWaterEnergyConsumedRate2;
|
|
218
|
-
const heatingEnergyProducedRate1 = device.HeatingEnergyProducedRate1;
|
|
219
|
-
const heatingEnergyProducedRate2 = device.HeatingEnergyProducedRate2;
|
|
220
|
-
const coolingEnergyProducedRate1 = device.CoolingEnergyProducedRate1;
|
|
221
|
-
const coolingEnergyProducedRate2 = device.CoolingEnergyProducedRate2;
|
|
222
|
-
const hotWaterEnergyProducedRate1 = device.HotWaterEnergyProducedRate1;
|
|
223
|
-
const hotWaterEnergyProducedRate2 = device.HotWaterEnergyProducedRate2;
|
|
224
|
-
const errorCode2Digit = device.ErrorCode2Digit;
|
|
225
|
-
const sendSpecialFunctions = device.SendSpecialFunctions;
|
|
226
|
-
const requestSpecialFunctions = device.RequestSpecialFunctions;
|
|
227
|
-
const specialFunctionsState = device.SpecialFunctionsState;
|
|
228
|
-
const pendingSendSpecialFunctions = device.PendingSendSpecialFunctions;
|
|
229
|
-
const pendingRequestSpecialFunctions = device.PendingRequestSpecialFunctions;
|
|
230
|
-
const hasSimplifiedZone2 = device.HasSimplifiedZone2;
|
|
231
|
-
const canSetTankTemperature = device.CanSetTankTemperature;
|
|
232
|
-
const canSetEcoHotWater = device.CanSetEcoHotWater;
|
|
233
|
-
const hasEnergyConsumedMeter = device.HasEnergyConsumedMeter;
|
|
234
|
-
const hasEnergyProducedMeter = device.HasEnergyProducedMeter;
|
|
235
|
-
const canMeasureEnergyProduced = device.CanMeasureEnergyProduced;
|
|
236
|
-
const canMeasureEnergyConsumed = device.CanMeasureEnergyConsumed;
|
|
237
|
-
const zone1InRoomMode = device.Zone1InRoomMode;
|
|
238
|
-
const zone2InRoomMode = device.Zone2InRoomMode;
|
|
239
|
-
const zone1InHeatMode = device.Zone1InHeatMode;
|
|
240
|
-
const zone2InHeatMode = device.Zone2InHeatMode;
|
|
241
|
-
const zone1InCoolMode = device.Zone1InCoolMode;
|
|
242
|
-
const zone2InCoolMode = device.Zone2InCoolMode;
|
|
243
|
-
const allowDualRoomTemperature = device.AllowDualRoomTemperature;
|
|
244
|
-
const isGeodan = device.IsGeodan;
|
|
245
|
-
const hasEcoCuteSettings = device.HasEcoCuteSettings;
|
|
246
|
-
const hasFTC45Settings = device.HasFTC45Settings;
|
|
247
|
-
const hasFTC6Settings = device.HasFTC6Settings;
|
|
248
|
-
const canEstimateEnergyUsage = device.CanEstimateEnergyUsage;
|
|
249
|
-
const canUseRoomTemperatureCooling = device.CanUseRoomTemperatureCooling;
|
|
250
|
-
const isFtcModelSupported = device.IsFtcModelSupported;
|
|
251
|
-
const maxTankTemperature = device.MaxTankTemperature;
|
|
252
96
|
const idleZone1 = device.IdleZone1 ?? false;
|
|
253
97
|
const idleZone2 = device.IdleZone2 ?? false;
|
|
254
|
-
const
|
|
255
|
-
const maxPcycle = device.MaxPcycle;
|
|
256
|
-
const maxOutdoorUnits = device.MaxOutdoorUnits;
|
|
257
|
-
const maxIndoorUnits = device.MaxIndoorUnits;
|
|
258
|
-
const maxTemperatureControlUnits = device.MaxTemperatureControlUnits;
|
|
259
|
-
//const deviceId = device.DeviceID;
|
|
260
|
-
//const macAddress = device.MacAddress;
|
|
261
|
-
//const serialNumber = device.SerialNumber;
|
|
262
|
-
const timeZoneId = device.TimeZoneID;
|
|
263
|
-
const diagnosticMode = device.DiagnosticMode;
|
|
264
|
-
const diagnosticEndDate = device.DiagnosticEndDate;
|
|
265
|
-
const expectedCommand = device.ExpectedCommand;
|
|
266
|
-
const owner = device.Owner;
|
|
267
|
-
const detectedCountry = device.DetectedCountry;
|
|
268
|
-
//const adaptorType = device.AdaptorType;
|
|
269
|
-
const firmwareDeployment = device.FirmwareDeployment;
|
|
270
|
-
const firmwareUpdateAborted = device.FirmwareUpdateAborted;
|
|
271
|
-
//const linkedDevice = device.LinkedDevice;
|
|
272
|
-
const wifiSignalStrength = device.WifiSignalStrength;
|
|
273
|
-
const wifiAdapterStatus = device.WifiAdapterStatus;
|
|
274
|
-
const position = device.Position;
|
|
275
|
-
const pCycle = device.PCycle;
|
|
276
|
-
const recordNumMax = device.RecordNumMax;
|
|
277
|
-
const lastTimeStamp = device.LastTimeStamp;
|
|
278
|
-
const errorCode = device.ErrorCode;
|
|
279
|
-
const hasError = device.HasError;
|
|
280
|
-
const lastReset = device.LastReset;
|
|
281
|
-
const flashWrites = device.FlashWrites;
|
|
282
|
-
const scene = device.Scene;
|
|
283
|
-
const sSLExpirationDate = device.SSLExpirationDate;
|
|
284
|
-
const sPTimeout = device.SPTimeout;
|
|
285
|
-
const passcode = device.Passcode;
|
|
286
|
-
const serverCommunicationDisabled = device.ServerCommunicationDisabled;
|
|
287
|
-
const consecutiveUploadErrors = device.ConsecutiveUploadErrors;
|
|
288
|
-
const doNotRespondAfter = device.DoNotRespondAfter;
|
|
289
|
-
const ownerRoleAccessLevel = device.OwnerRoleAccessLevel;
|
|
290
|
-
//const ownerCountry = device.OwnerCountry;
|
|
291
|
-
const hideEnergyReport = device.HideEnergyReport;
|
|
292
|
-
const exceptionHash = device.ExceptionHash;
|
|
293
|
-
const exceptionDate = device.ExceptionDate;
|
|
294
|
-
const exceptionCount = device.ExceptionCount;
|
|
295
|
-
const rate1StartTime = device.Rate1StartTime;
|
|
296
|
-
const rate2StartTime = device.Rate2StartTime;
|
|
297
|
-
const protocolVersion = device.ProtocolVersion;
|
|
298
|
-
const unitVersion = device.UnitVersion;
|
|
299
|
-
const firmwareAppVersion = device.FirmwareAppVersion?.toString() ?? 'Undefined';
|
|
300
|
-
const firmwareWebVersion = device.FirmwareWebVersion;
|
|
301
|
-
const firmwareWlanVersion = device.FirmwareWlanVersion;
|
|
302
|
-
const effectivePCycle = device.EffectivePCycle;
|
|
303
|
-
const mqttFlags = device.MqttFlags;
|
|
304
|
-
const hasErrorMessages = device.HasErrorMessages;
|
|
305
|
-
const offline = device.Offline ?? false;
|
|
306
|
-
const supportsHourlyEnergyReport = device.SupportsHourlyEnergyReport;
|
|
98
|
+
const firmwareAppVersion = device.FirmwareAppVersion;
|
|
307
99
|
const hasZone2 = device.HasZone2 ?? false;
|
|
308
100
|
|
|
309
101
|
//units
|
|
@@ -311,79 +103,22 @@ class MelCloudAtw extends EventEmitter {
|
|
|
311
103
|
const unitsCount = units.length;
|
|
312
104
|
const manufacturer = 'Mitsubishi';
|
|
313
105
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
let modelNumberOutdoor = 0;
|
|
327
|
-
let modelOutdoor = false;
|
|
328
|
-
let typeOutdoor = 0;
|
|
329
|
-
|
|
330
|
-
//units array
|
|
331
|
-
for (const unit of units) {
|
|
332
|
-
const unitId = unit.ID;
|
|
333
|
-
const unitDevice = unit.Device;
|
|
334
|
-
const unitSerialNumber = unit.SerialNumber ?? 'Undefined';
|
|
335
|
-
const unitModelNumber = unit.ModelNumber;
|
|
336
|
-
const unitModel = unit.Model ?? false;
|
|
337
|
-
const unitType = unit.UnitType;
|
|
338
|
-
const unitIsIndoor = unit.IsIndoor ?? false;
|
|
339
|
-
|
|
340
|
-
switch (unitIsIndoor) {
|
|
341
|
-
case true:
|
|
342
|
-
idIndoor = unitId;
|
|
343
|
-
deviceIndoor = unitDevice;
|
|
344
|
-
serialNumberIndoor = unitSerialNumber;
|
|
345
|
-
modelNumberIndoor = unitModelNumber;
|
|
346
|
-
modelIndoor = unitModel;
|
|
347
|
-
typeIndoor = unitType;
|
|
348
|
-
break;
|
|
349
|
-
case false:
|
|
350
|
-
idOutdoor = unitId;
|
|
351
|
-
deviceOutdoor = unitDevice;
|
|
352
|
-
serialNumberOutdoor = unitSerialNumber;
|
|
353
|
-
modelNumberOutdoor = unitModelNumber;
|
|
354
|
-
modelOutdoor = unitModel;
|
|
355
|
-
typeOutdoor = unitType;
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
//diagnostic
|
|
361
|
-
//const diagnosticMode = deviceData.DiagnosticMode;
|
|
362
|
-
//const diagnosticEndDate = deviceData.DiagnosticEndDate;
|
|
363
|
-
const location = deviceData.Location;
|
|
364
|
-
//const detectedCountry = deviceData.DetectedCountry;
|
|
365
|
-
const registrations = deviceData.Registrations;
|
|
366
|
-
const localIPAddress = deviceData.LocalIPAddress;
|
|
367
|
-
const timeZone = deviceData.TimeZone;
|
|
368
|
-
const registReason = deviceData.RegistReason;
|
|
369
|
-
//const expectedCommand = deviceData.ExpectedCommand;
|
|
370
|
-
const registRetry = deviceData.RegistRetry;
|
|
371
|
-
const dateCreated = deviceData.DateCreated;
|
|
372
|
-
//const firmwareDeployment = deviceData.FirmwareDeployment;
|
|
373
|
-
//const firmwareUpdateAborted = deviceData.FirmwareUpdateAborted;
|
|
374
|
-
|
|
375
|
-
//permissions
|
|
376
|
-
const permissionCanSetForcedHotWater = deviceData.Permissions.CanSetForcedHotWater;
|
|
377
|
-
const permissionCanSetOperationMode = deviceData.Permissions.CanSetOperationMode;
|
|
378
|
-
const permissionCanSetPower = deviceData.Permissions.CanSetPower;
|
|
379
|
-
const permissionCanSetTankWaterTemperature = deviceData.Permissions.CanSetTankWaterTemperature;
|
|
380
|
-
const permissionCanSetEcoHotWater = deviceData.Permissions.CanSetEcoHotWater;
|
|
381
|
-
const permissionCanSetFlowTemperature = deviceData.Permissions.CanSetFlowTemperature;
|
|
382
|
-
const permissionCanSetTemperatureIncrementOverride = deviceData.Permissions.CanSetTemperatureIncrementOverride;
|
|
106
|
+
const { indoor, outdoor } = units.reduce((acc, unit) => {
|
|
107
|
+
const target = unit.IsIndoor ? 'indoor' : 'outdoor';
|
|
108
|
+
acc[target] = {
|
|
109
|
+
id: unit.ID,
|
|
110
|
+
device: unit.Device,
|
|
111
|
+
serialNumber: unit.SerialNumber ?? 'Undefined',
|
|
112
|
+
modelNumber: unit.ModelNumber ?? 0,
|
|
113
|
+
model: unit.Model ?? false,
|
|
114
|
+
type: unit.UnitType ?? 0
|
|
115
|
+
};
|
|
116
|
+
return acc;
|
|
117
|
+
}, { indoor: {}, outdoor: {} });
|
|
383
118
|
|
|
384
119
|
//display info if units are not configured in MELCloud service
|
|
385
120
|
if (unitsCount === 0) {
|
|
386
|
-
this.emit('
|
|
121
|
+
if (this.logDebug) this.emit('debug', `Units are not configured in MELCloud service`);
|
|
387
122
|
};
|
|
388
123
|
|
|
389
124
|
const deviceState = {
|
|
@@ -431,7 +166,7 @@ class MelCloudAtw extends EventEmitter {
|
|
|
431
166
|
this.deviceState = deviceState;
|
|
432
167
|
|
|
433
168
|
//emit info
|
|
434
|
-
this.emit('deviceInfo', manufacturer,
|
|
169
|
+
this.emit('deviceInfo', manufacturer, indoor.model, outdoor.model, serialNumber, firmwareAppVersion, hasHotWaterTank, hasZone2);
|
|
435
170
|
|
|
436
171
|
//emit state
|
|
437
172
|
this.emit('deviceState', deviceData);
|
|
@@ -442,53 +177,123 @@ class MelCloudAtw extends EventEmitter {
|
|
|
442
177
|
};
|
|
443
178
|
};
|
|
444
179
|
|
|
445
|
-
async send(deviceData) {
|
|
180
|
+
async send(accountType, displayType, deviceData) {
|
|
446
181
|
try {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
182
|
+
switch (accountType) {
|
|
183
|
+
case "melcloud":
|
|
184
|
+
const axiosInstancePost = axios.create({
|
|
185
|
+
method: 'POST',
|
|
186
|
+
baseURL: ApiUrls.BaseURL,
|
|
187
|
+
timeout: 25000,
|
|
188
|
+
headers: {
|
|
189
|
+
'X-MitsContextKey': deviceData.ContextKey,
|
|
190
|
+
'Content-Type': 'application/json'
|
|
191
|
+
},
|
|
192
|
+
withCredentials: true
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
//prevent to set out of range temp
|
|
196
|
+
const minTempZones = 0;
|
|
197
|
+
const maxTempZones = 60;
|
|
198
|
+
const minTempWaterTank = 16;
|
|
199
|
+
const maxTempWaterTank = deviceData.Device.MaxTankTemperature ?? 70;
|
|
200
|
+
|
|
201
|
+
deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone1 < minTempZones ? minTempZones : deviceData.Device.SetTemperatureZone1;
|
|
202
|
+
deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone1 > maxTempZones ? maxTempZones : deviceData.Device.SetTemperatureZone1;
|
|
203
|
+
deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone2 < minTempZones ? minTempZones : deviceData.Device.SetTemperatureZone2;
|
|
204
|
+
deviceData.Device.SetTemperatureZone1 = deviceData.Device.SetTemperatureZone2 > maxTempZones ? maxTempZones : deviceData.Device.SetTemperatureZone2;
|
|
205
|
+
deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature < minTempWaterTank ? minTempWaterTank : deviceData.Device.SetTankWaterTemperature;
|
|
206
|
+
deviceData.Device.SetTankWaterTemperature = deviceData.Device.SetTankWaterTemperature > maxTempWaterTank ? maxTempWaterTank : deviceData.Device.SetTankWaterTemperature;
|
|
207
|
+
|
|
208
|
+
const payload = {
|
|
209
|
+
data: {
|
|
210
|
+
DeviceID: deviceData.Device.DeviceID,
|
|
211
|
+
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
212
|
+
Power: deviceData.Device.Power,
|
|
213
|
+
SetTemperatureZone1: deviceData.Device.SetTemperatureZone1,
|
|
214
|
+
SetTemperatureZone2: deviceData.Device.SetTemperatureZone2,
|
|
215
|
+
OperationMode: deviceData.Device.OperationMode,
|
|
216
|
+
OperationModeZone1: deviceData.Device.OperationModeZone1,
|
|
217
|
+
OperationModeZone2: deviceData.Device.OperationModeZone2,
|
|
218
|
+
SetHeatFlowTemperatureZone1: deviceData.Device.SetHeatFlowTemperatureZone1,
|
|
219
|
+
SetHeatFlowTemperatureZone2: deviceData.Device.SetHeatFlowTemperatureZone2,
|
|
220
|
+
SetCoolFlowTemperatureZone1: deviceData.Device.SetCoolFlowTemperatureZone1,
|
|
221
|
+
SetCoolFlowTemperatureZone2: deviceData.Device.SetCoolFlowTemperatureZone2,
|
|
222
|
+
SetTankWaterTemperature: deviceData.Device.SetTankWaterTemperature,
|
|
223
|
+
ForcedHotWaterMode: deviceData.Device.ForcedHotWaterMode,
|
|
224
|
+
EcoHotWater: deviceData.Device.EcoHotWater,
|
|
225
|
+
HolidayMode: deviceData.Device.HolidayMode,
|
|
226
|
+
ProhibitZone1: deviceData.Device.ProhibitHeatingZone1,
|
|
227
|
+
ProhibitZone2: deviceData.Device.ProhibitHeatingZone2,
|
|
228
|
+
ProhibitHotWater: deviceData.Device.ProhibitHotWater,
|
|
229
|
+
HasPendingCommand: true
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
await axiosInstancePost(ApiUrls.SetAtw, payload);
|
|
234
|
+
this.updateData(deviceData);
|
|
235
|
+
return true;
|
|
236
|
+
case "melcloudhome":
|
|
237
|
+
const axiosInstancePut = axios.create({
|
|
238
|
+
method: 'PUT',
|
|
239
|
+
baseURL: ApiUrlsHome.BaseURL,
|
|
240
|
+
timeout: 25000,
|
|
241
|
+
headers: {
|
|
242
|
+
'Accept': '*/*',
|
|
243
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
244
|
+
'Cookie': deviceData.ContextKey,
|
|
245
|
+
'User-Agent': 'homebridge-melcloud-control/4.0.0',
|
|
246
|
+
'DNT': '1',
|
|
247
|
+
'Origin': 'https://melcloudhome.com',
|
|
248
|
+
'Referer': 'https://melcloudhome.com/dashboard',
|
|
249
|
+
'Sec-Fetch-Dest': 'empty',
|
|
250
|
+
'Sec-Fetch-Mode': 'cors',
|
|
251
|
+
'Sec-Fetch-Site': 'same-origin',
|
|
252
|
+
'X-CSRF': '1'
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
257
|
+
deviceData.Device.SetTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
258
|
+
|
|
259
|
+
if (this.deviceState.DefaultCoolingSetTemperature !== deviceData.Device.DefaultCoolingSetTemperature || this.deviceState.DefaultHeatingSetTemperature !== deviceData.Device.DefaultHeatingSetTemperature) {
|
|
260
|
+
const temps = {
|
|
261
|
+
defaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
262
|
+
defaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature
|
|
263
|
+
};
|
|
264
|
+
await this.functions.saveData(this.defaultTempsFile, temps);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const settings = {
|
|
269
|
+
data: {
|
|
270
|
+
Power: deviceData.Device.Power,
|
|
271
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
272
|
+
SetFanSpeed: String(deviceData.Device.SetFanSpeed),
|
|
273
|
+
OperationMode: AirConditioner.OperationModeMapEnumToString[deviceData.Device.OperationMode],
|
|
274
|
+
VaneHorizontalDirection: AirConditioner.VaneHorizontalDirectionMapEnumToString[deviceData.Device.VaneHorizontalDirection],
|
|
275
|
+
VaneVerticalDirection: AirConditioner.VaneVerticalDirectionMapEnumToString[deviceData.Device.VaneVerticalDirection]
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(settings.data, null, 2)}`);
|
|
279
|
+
|
|
280
|
+
const path = ApiUrlsHome.SetAtw.replace('deviceid', deviceData.DeviceID);
|
|
281
|
+
await axiosInstancePut(path, settings);
|
|
282
|
+
this.updateData(deviceData);
|
|
283
|
+
return true;
|
|
284
|
+
default:
|
|
285
|
+
return;
|
|
483
286
|
}
|
|
484
|
-
|
|
485
|
-
await this.axiosInstancePost(ApiUrls.SetAtw, payload);
|
|
486
|
-
this.updateData(deviceData);
|
|
487
|
-
return true;
|
|
488
287
|
} catch (error) {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
288
|
+
if (error.response) {
|
|
289
|
+
throw new Error(`Send data error: HTTP ${error.response.status} - ${JSON.stringify(error.response.data)}`);
|
|
290
|
+
} else if (error.request) {
|
|
291
|
+
throw new Error(`Send data error: No response received - ${error.message}`);
|
|
292
|
+
} else {
|
|
293
|
+
throw new Error(`Send data error: ${error.message}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
492
297
|
|
|
493
298
|
updateData(deviceData) {
|
|
494
299
|
setTimeout(() => {
|