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/melcloudata.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, AirConditioner } from './constants.js';
|
|
7
6
|
|
|
8
7
|
class MelCloudAta 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 MelCloudAta 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,93 +51,37 @@ class MelCloudAta 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
|
+
deviceData.Device.OperationMode = AirConditioner.OperationModeMapStringToEnum[deviceData.Device.OperationMode] ?? deviceData.Device.OperationMode;
|
|
65
|
+
deviceData.Device.ActualFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.ActualFanSpeed] ?? deviceData.Device.ActualFanSpeed;
|
|
66
|
+
deviceData.Device.SetFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.SetFanSpeed] ?? deviceData.Device.SetFanSpeed;
|
|
67
|
+
deviceData.Device.VaneVerticalDirection = AirConditioner.VaneVerticalDirectionMapStringToEnum[deviceData.Device.VaneVerticalDirection] ?? deviceData.Device.VaneVerticalDirection;
|
|
68
|
+
deviceData.Device.VaneHorizontalDirection = AirConditioner.VaneHorizontalDirectionMapStringToEnum[deviceData.Device.VaneHorizontalDirection] ?? deviceData.Device.VaneHorizontalDirection;
|
|
69
|
+
|
|
70
|
+
//read default temps
|
|
71
|
+
const temps = await this.functions.readData(this.defaultTempsFile, true);
|
|
72
|
+
deviceData.Device.DefaultHeatingSetTemperature = temps?.defaultHeatingSetTemperature ?? 20;
|
|
73
|
+
deviceData.Device.DefaultCoolingSetTemperature = temps?.defaultCoolingSetTemperature ?? 24;
|
|
74
|
+
}
|
|
72
75
|
if (this.logDebug) this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`);
|
|
73
76
|
|
|
74
77
|
//device info
|
|
75
|
-
const deviceId = deviceData.DeviceID;
|
|
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
|
-
const ownerId = deviceData.OwnerID;
|
|
91
|
-
const ownerName = deviceData.OwnerName;
|
|
92
|
-
const ownerEmail = deviceData.OwnerEmail;
|
|
93
|
-
const accessLevel = deviceData.AccessLevel;
|
|
94
|
-
const directAccess = deviceData.DirectAccess;
|
|
95
|
-
const endDate = deviceData.EndDate;
|
|
96
|
-
const zone1Name = deviceData.Zone1Name;
|
|
97
|
-
const zone2Name = deviceData.Zone2Name;
|
|
98
|
-
const minTemperature = deviceData.MinTemperature;
|
|
99
|
-
const maxTemperature = deviceData.MaxTemperature;
|
|
100
78
|
const hideVaneControls = deviceData.HideVaneControls ?? false;
|
|
101
79
|
const hideDryModeControl = deviceData.HideDryModeControl ?? false;
|
|
102
|
-
const
|
|
103
|
-
const hideSupplyTemperature = deviceData.HideSupplyTemperature;
|
|
104
|
-
const hideOutdoorTemperature = deviceData.HideOutdoorTemperature;
|
|
105
|
-
const buildingCountry = deviceData.BuildingCountry;
|
|
106
|
-
const ownerCountry = deviceData.OwnerCountry;
|
|
107
|
-
const adaptorType = deviceData.AdaptorType;
|
|
108
|
-
const linkedDevice = deviceData.LinkedDevice;
|
|
109
|
-
const type = deviceData.Type;
|
|
110
|
-
const macAddress = deviceData.MacAddress;
|
|
111
|
-
const serialNumber = deviceData.SerialNumber ?? 'Undefined';
|
|
80
|
+
const serialNumber = deviceData.SerialNumber;
|
|
112
81
|
|
|
113
82
|
//device
|
|
83
|
+
const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
|
|
114
84
|
const device = deviceData.Device ?? {};
|
|
115
|
-
const pCycleActual = device.PCycleActual;
|
|
116
|
-
const errorMessages = device.ErrorMessages;
|
|
117
|
-
const deviceType = device.DeviceType;
|
|
118
|
-
const canCool = device.CanCool;
|
|
119
|
-
const canHeat = device.CanHeat;
|
|
120
|
-
const canDry = device.CanDry;
|
|
121
|
-
const canAuto = device.CanAuto;
|
|
122
|
-
const hasAutomaticFanSpeed = device.HasAutomaticFanSpeed;
|
|
123
|
-
const airDirectionFunction = device.AirDirectionFunction;
|
|
124
|
-
const swingFunction = device.SwingFunction;
|
|
125
|
-
const numberOfFanSpeeds = device.NumberOfFanSpeeds;
|
|
126
|
-
const useTemperatureA = device.UseTemperatureA;
|
|
127
|
-
const temperatureIncrementOverride = device.TemperatureIncrementOverride; //Auto, 1, 0.5
|
|
128
|
-
const temperatureIncrement = device.TemperatureIncrement; //1, 0.5
|
|
129
|
-
const minTempCoolDry = device.MinTempCoolDry;
|
|
130
|
-
const maxTempCoolDry = device.MaxTempCoolDry;
|
|
131
|
-
const minTempHeat = device.MinTempHeat;
|
|
132
|
-
const maxTempHeat = device.MaxTempHeat;
|
|
133
|
-
const minTempAutomatic = device.MinTempAutomatic;
|
|
134
|
-
const maxTempAutomatic = device.MaxTempAutomatic;
|
|
135
|
-
const legacyDevice = device.LegacyDevice;
|
|
136
|
-
const unitSupportsStandbyMode = device.UnitSupportsStandbyMode;
|
|
137
|
-
const isSplitSystem = device.IsSplitSystem;
|
|
138
|
-
const hasHalfDegreeIncrements = device.HasHalfDegreeIncrements;
|
|
139
|
-
const hasOutdoorTemperature = device.HasOutdoorTemperature;
|
|
140
|
-
const modelIsAirCurtain = device.ModelIsAirCurtain;
|
|
141
|
-
const modelSupportsFanSpeed = device.ModelSupportsFanSpeed;
|
|
142
|
-
const modelSupportsAuto = device.ModelSupportsAuto;
|
|
143
|
-
const modelSupportsHeat = device.ModelSupportsHeat;
|
|
144
|
-
const modelSupportsDry = device.ModelSupportsDry;
|
|
145
|
-
const modelSupportsVaneVertical = device.ModelSupportsVaneVertical;
|
|
146
|
-
const modelSupportsVaneHorizontal = device.ModelSupportsVaneHorizontal;
|
|
147
|
-
const modelSupportsWideVane = device.ModelSupportsWideVane;
|
|
148
|
-
const modelDisableEnergyReport = device.ModelDisableEnergyReport;
|
|
149
|
-
const modelSupportsStandbyMode = device.ModelSupportsStandbyMode;
|
|
150
|
-
const modelSupportsEnergyReporting = device.ModelSupportsEnergyReporting;
|
|
151
85
|
const prohibitSetTemperature = device.ProhibitSetTemperature;
|
|
152
86
|
const prohibitOperationMode = device.ProhibitOperationMode;
|
|
153
87
|
const prohibitPower = device.ProhibitPower;
|
|
@@ -156,175 +90,39 @@ class MelCloudAta extends EventEmitter {
|
|
|
156
90
|
const outdoorTemperature = device.OutdoorTemperature;
|
|
157
91
|
const setTemperature = device.SetTemperature;
|
|
158
92
|
const actualFanSpeed = device.ActualFanSpeed;
|
|
159
|
-
const
|
|
93
|
+
const setFanSpeed = device[fanKey];
|
|
160
94
|
const automaticFanSpeed = device.AutomaticFanSpeed;
|
|
161
95
|
const vaneVerticalDirection = device.VaneVerticalDirection;
|
|
162
96
|
const vaneVerticalSwing = device.VaneVerticalSwing;
|
|
163
97
|
const vaneHorizontalDirection = device.VaneHorizontalDirection;
|
|
164
98
|
const vaneHorizontalSwing = device.VaneHorizontalSwing;
|
|
165
99
|
const operationMode = device.OperationMode;
|
|
166
|
-
const effectiveFlags = device.EffectiveFlags;
|
|
167
100
|
const inStandbyMode = device.InStandbyMode;
|
|
168
|
-
const demandPercentage = device.DemandPercentage;
|
|
169
|
-
const configuredDemandPercentage = device.ConfiguredDemandPercentage;
|
|
170
|
-
const hasDemandSideControl = device.HasDemandSideControl;
|
|
171
101
|
const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature;
|
|
172
102
|
const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature;
|
|
173
|
-
const
|
|
174
|
-
const heatingEnergyConsumedRate1 = device.HeatingEnergyConsumedRate1;
|
|
175
|
-
const heatingEnergyConsumedRate2 = device.HeatingEnergyConsumedRate2;
|
|
176
|
-
const coolingEnergyConsumedRate1 = device.CoolingEnergyConsumedRate1;
|
|
177
|
-
const coolingEnergyConsumedRate2 = device.CoolingEnergyConsumedRate2;
|
|
178
|
-
const autoEnergyConsumedRate1 = device.AutoEnergyConsumedRate1;
|
|
179
|
-
const autoEnergyConsumedRate2 = device.AutoEnergyConsumedRate2;
|
|
180
|
-
const dryEnergyConsumedRate1 = device.DryEnergyConsumedRate1;
|
|
181
|
-
const dryEnergyConsumedRate2 = device.DryEnergyConsumedRate2;
|
|
182
|
-
const fanEnergyConsumedRate1 = device.FanEnergyConsumedRate1;
|
|
183
|
-
const fanEnergyConsumedRate2 = device.FanEnergyConsumedRate2;
|
|
184
|
-
const otherEnergyConsumedRate1 = device.OtherEnergyConsumedRate1;
|
|
185
|
-
const otherEnergyConsumedRate2 = device.OtherEnergyConsumedRate2;
|
|
186
|
-
const hasEnergyConsumedMeter = device.HasEnergyConsumedMeter;
|
|
187
|
-
const currentEnergyConsumed = device.CurrentEnergyConsumed;
|
|
188
|
-
const currentEnergyMode = device.CurrentEnergyMode;
|
|
189
|
-
const coolingDisabled = device.CoolingDisabled
|
|
190
|
-
const energyCorrectionModel = device.EnergyCorrectionModel;
|
|
191
|
-
const energyCorrectionActive = device.EnergyCorrectionActive;
|
|
192
|
-
const minPcycle = device.MinPcycle;
|
|
193
|
-
const maxPcycle = device.MaxPcycle;
|
|
194
|
-
const effectivePCycle = device.EffectivePCycle;
|
|
195
|
-
const maxOutdoorUnits = device.MaxOutdoorUnits;
|
|
196
|
-
const maxIndoorUnits = device.MaxIndoorUnits;
|
|
197
|
-
const maxTemperatureControlUnits = device.MaxTemperatureControlUnits;
|
|
198
|
-
const modelCode = device.ModelCode;
|
|
199
|
-
//const deviceId = device.DeviceID;
|
|
200
|
-
//const macAddress = device.MacAddress;
|
|
201
|
-
//const serialNumber = device.SerialNumber;
|
|
202
|
-
const timeZoneID = device.TimeZoneID;
|
|
203
|
-
const diagnosticMode = device.DiagnosticMode;
|
|
204
|
-
const diagnosticEndDate = device.DiagnosticEndDate;
|
|
205
|
-
const expectedCommand = device.ExpectedCommand;
|
|
206
|
-
const owner = device.Owner;
|
|
207
|
-
const detectedCountry = device.DetectedCountry;
|
|
208
|
-
//const adaptorType = device.AdaptorType;
|
|
209
|
-
const firmwareDeployment = device.FirmwareDeployment;
|
|
210
|
-
const firmwareUpdateAborted = device.FirmwareUpdateAborted;
|
|
211
|
-
//const linkedDevice = device.LinkedDevice;
|
|
212
|
-
const wifiSignalStrength = device.WifiSignalStrength;
|
|
213
|
-
const wifiAdapterStatus = device.WifiAdapterStatus;
|
|
214
|
-
const position = device.Position;
|
|
215
|
-
const pCycle = device.PCycle;
|
|
216
|
-
const pCycleConfigured = device.PCycleConfigured;
|
|
217
|
-
const recordNumMax = device.RecordNumMax;
|
|
218
|
-
const lastTimeStamp = device.LastTimeStamp;
|
|
219
|
-
const errorCode = device.ErrorCode;
|
|
220
|
-
const hasError = device.HasError;
|
|
221
|
-
const lastReset = device.LastReset;
|
|
222
|
-
const flashWrites = device.FlashWrites;
|
|
223
|
-
const scene = device.Scene;
|
|
224
|
-
const sSLExpirationDate = device.SSLExpirationDate;
|
|
225
|
-
const sPTimeout = device.SPTimeout;
|
|
226
|
-
const passcode = device.Passcode;
|
|
227
|
-
const serverCommunicationDisabled = device.ServerCommunicationDisabled;
|
|
228
|
-
const consecutiveUploadErrors = device.ConsecutiveUploadErrors;
|
|
229
|
-
const doNotRespondAfter = device.DoNotRespondAfter;
|
|
230
|
-
const ownerRoleAccessLevel = device.OwnerRoleAccessLevel;
|
|
231
|
-
//const ownerCountry = device.OwnerCountry;
|
|
232
|
-
const hideEnergyReport = device.HideEnergyReport;
|
|
233
|
-
const exceptionHash = device.ExceptionHash;
|
|
234
|
-
const exceptionDate = device.ExceptionDate;
|
|
235
|
-
const exceptionCount = device.ExceptionCount;
|
|
236
|
-
const rate1StartTime = device.Rate1StartTime;
|
|
237
|
-
const rate2StartTime = device.Rate2StartTime;
|
|
238
|
-
const protocolVersion = device.ProtocolVersion;
|
|
239
|
-
const unitVersion = device.UnitVersion;
|
|
240
|
-
const firmwareAppVersion = device.FirmwareAppVersion?.toString() ?? 'Undefined';
|
|
241
|
-
const firmwareWebVersion = device.FirmwareWebVersion;
|
|
242
|
-
const firmwareWlanVersion = device.FirmwareWlanVersion;
|
|
243
|
-
const linkToMELCloudHome = device.LinkToMELCloudHome;
|
|
244
|
-
const linkedByUserFromMELCloudHome = device.LinkedByUserFromMELCloudHome;
|
|
245
|
-
const mqttFlags = device.MqttFlags;
|
|
246
|
-
const hasErrorMessages = device.HasErrorMessages;
|
|
247
|
-
const hasZone2 = device.HasZone2;
|
|
248
|
-
const offline = device.Offline ?? false;
|
|
249
|
-
const supportsHourlyEnergyReport = device.SupportsHourlyEnergyReport;
|
|
103
|
+
const firmwareAppVersion = device.FirmwareAppVersion;
|
|
250
104
|
|
|
251
105
|
//units
|
|
252
106
|
const units = Array.isArray(device.Units) ? device.Units : [];
|
|
253
107
|
const unitsCount = units.length;
|
|
254
108
|
const manufacturer = 'Mitsubishi';
|
|
255
109
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
let modelNumberOutdoor = 0;
|
|
269
|
-
let modelOutdoor = false;
|
|
270
|
-
let typeOutdoor = 0;
|
|
271
|
-
|
|
272
|
-
//units array
|
|
273
|
-
for (const unit of units) {
|
|
274
|
-
const unitId = unit.ID;
|
|
275
|
-
const unitDevice = unit.Device;
|
|
276
|
-
const unitSerialNumber = unit.SerialNumber ?? 'Undefined';
|
|
277
|
-
const unitModelNumber = unit.ModelNumber;
|
|
278
|
-
const unitModel = unit.Model ?? false;
|
|
279
|
-
const unitType = unit.UnitType;
|
|
280
|
-
const unitIsIndoor = unit.IsIndoor ?? false;
|
|
281
|
-
|
|
282
|
-
switch (unitIsIndoor) {
|
|
283
|
-
case true:
|
|
284
|
-
idIndoor = unitId;
|
|
285
|
-
deviceIndoor = unitDevice;
|
|
286
|
-
serialNumberIndoor = unitSerialNumber;
|
|
287
|
-
modelNumberIndoor = unitModelNumber;
|
|
288
|
-
modelIndoor = unitModel;
|
|
289
|
-
typeIndoor = unitType;
|
|
290
|
-
break;
|
|
291
|
-
case false:
|
|
292
|
-
idOutdoor = unitId;
|
|
293
|
-
deviceOutdoor = unitDevice;
|
|
294
|
-
serialNumberOutdoor = unitSerialNumber;
|
|
295
|
-
modelNumberOutdoor = unitModelNumber;
|
|
296
|
-
modelOutdoor = unitModel;
|
|
297
|
-
typeOutdoor = unitType;
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
//diagnostic
|
|
303
|
-
//const diagnosticMode = deviceData.DiagnosticMode;
|
|
304
|
-
//const diagnosticEndDate = deviceData.DiagnosticEndDate;
|
|
305
|
-
const location = deviceData.Location;
|
|
306
|
-
//const detectedCountry = deviceData.DetectedCountry;
|
|
307
|
-
const registrations = deviceData.Registrations;
|
|
308
|
-
const localIPAddress = deviceData.LocalIPAddress;
|
|
309
|
-
const timeZone = deviceData.TimeZone;
|
|
310
|
-
const registReason = deviceData.RegistReason;
|
|
311
|
-
//const expectedCommand = deviceData.ExpectedCommand;
|
|
312
|
-
const registRetry = deviceData.RegistRetry;
|
|
313
|
-
const dateCreated = deviceData.DateCreated;
|
|
314
|
-
//const firmwareDeployment = deviceData.FirmwareDeployment;
|
|
315
|
-
//const firmwareUpdateAborted = deviceData.FirmwareUpdateAborted;
|
|
316
|
-
|
|
317
|
-
//permissions
|
|
318
|
-
const permissionCanSetOperationMode = deviceData.Permissions.CanSetOperationMode;
|
|
319
|
-
const permissionCanSetFanSpeed = deviceData.Permissions.CanSetFanSpeed;
|
|
320
|
-
const permissionCanSetVaneDirection = deviceData.Permissions.CanSetVaneDirection;
|
|
321
|
-
const permissionCanSetPower = deviceData.Permissions.CanSetPower;
|
|
322
|
-
const permissionCanSetTemperatureIncrementOverride = deviceData.Permissions.CanSetTemperatureIncrementOverride;
|
|
323
|
-
const permissionCanDisableLocalController = deviceData.Permissions.CanDisableLocalController;
|
|
110
|
+
const { indoor, outdoor } = units.reduce((acc, unit) => {
|
|
111
|
+
const target = unit.IsIndoor ? 'indoor' : 'outdoor';
|
|
112
|
+
acc[target] = {
|
|
113
|
+
id: unit.ID,
|
|
114
|
+
device: unit.Device,
|
|
115
|
+
serialNumber: unit.SerialNumber ?? 'Undefined',
|
|
116
|
+
modelNumber: unit.ModelNumber ?? 0,
|
|
117
|
+
model: unit.Model ?? false,
|
|
118
|
+
type: unit.UnitType ?? 0
|
|
119
|
+
};
|
|
120
|
+
return acc;
|
|
121
|
+
}, { indoor: {}, outdoor: {} });
|
|
324
122
|
|
|
325
123
|
//display info if units are not configured in MELCloud service
|
|
326
124
|
if (unitsCount === 0) {
|
|
327
|
-
if (this.
|
|
125
|
+
if (this.logDebug) this.emit('debug', `Units are not configured in MELCloud service`);
|
|
328
126
|
};
|
|
329
127
|
|
|
330
128
|
const deviceState = {
|
|
@@ -334,7 +132,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
334
132
|
OutdoorTemperature: outdoorTemperature,
|
|
335
133
|
SetTemperature: setTemperature,
|
|
336
134
|
ActualFanSpeed: actualFanSpeed,
|
|
337
|
-
|
|
135
|
+
SetFanSpeed: setFanSpeed,
|
|
338
136
|
AutomaticFanSpeed: automaticFanSpeed,
|
|
339
137
|
OperationMode: operationMode,
|
|
340
138
|
VaneVerticalDirection: vaneVerticalDirection,
|
|
@@ -367,7 +165,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
367
165
|
this.deviceState = deviceState;
|
|
368
166
|
|
|
369
167
|
//emit info
|
|
370
|
-
this.emit('deviceInfo', manufacturer,
|
|
168
|
+
this.emit('deviceInfo', manufacturer, indoor.model, outdoor.model, serialNumber, firmwareAppVersion);
|
|
371
169
|
|
|
372
170
|
//emit state
|
|
373
171
|
this.emit('deviceState', deviceData);
|
|
@@ -378,76 +176,118 @@ class MelCloudAta extends EventEmitter {
|
|
|
378
176
|
};
|
|
379
177
|
};
|
|
380
178
|
|
|
381
|
-
async send(deviceData,
|
|
179
|
+
async send(accountType, displayType, deviceData, effectiveFlags) {
|
|
382
180
|
try {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
181
|
+
switch (accountType) {
|
|
182
|
+
case "melcloud":
|
|
183
|
+
const axiosInstancePost = axios.create({
|
|
184
|
+
method: 'POST',
|
|
185
|
+
baseURL: ApiUrls.BaseURL,
|
|
186
|
+
timeout: 25000,
|
|
187
|
+
headers: {
|
|
188
|
+
'X-MitsContextKey': deviceData.ContextKey,
|
|
189
|
+
'Content-Type': 'application/json'
|
|
190
|
+
},
|
|
191
|
+
withCredentials: true
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
195
|
+
deviceData.Device.SetTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
deviceData.Device.EffectiveFlags = effectiveFlags;
|
|
199
|
+
const payload = {
|
|
200
|
+
data: {
|
|
201
|
+
DeviceID: deviceData.Device.DeviceID,
|
|
202
|
+
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
203
|
+
Power: deviceData.Device.Power,
|
|
204
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
205
|
+
SetFanSpeed: deviceData.Device.FanSpeed,
|
|
206
|
+
OperationMode: deviceData.Device.OperationMode,
|
|
207
|
+
VaneHorizontal: deviceData.Device.VaneHorizontalDirection,
|
|
208
|
+
VaneVertical: deviceData.Device.VaneVerticalDirection,
|
|
209
|
+
DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature,
|
|
210
|
+
DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
211
|
+
ProhibitSetTemperature: deviceData.Device.ProhibitSetTemperature,
|
|
212
|
+
ProhibitOperationMode: deviceData.Device.ProhibitOperationMode,
|
|
213
|
+
ProhibitPower: deviceData.Device.ProhibitPower,
|
|
214
|
+
HideVaneControls: deviceData.HideVaneControls,
|
|
215
|
+
HideDryModeControl: deviceData.HideDryModeControl,
|
|
216
|
+
HasPendingCommand: true
|
|
217
|
+
}
|
|
412
218
|
};
|
|
413
|
-
|
|
414
|
-
deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
|
|
415
|
-
break;
|
|
416
|
-
};
|
|
219
|
+
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload.data, null, 2)}`);
|
|
417
220
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
221
|
+
await axiosInstancePost(ApiUrls.SetAta, payload);
|
|
222
|
+
this.updateData(deviceData);
|
|
223
|
+
return true;
|
|
224
|
+
case "melcloudhome":
|
|
225
|
+
const axiosInstancePut = axios.create({
|
|
226
|
+
method: 'PUT',
|
|
227
|
+
baseURL: ApiUrlsHome.BaseURL,
|
|
228
|
+
timeout: 25000,
|
|
229
|
+
headers: {
|
|
230
|
+
'Accept': '*/*',
|
|
231
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
232
|
+
'Cookie': deviceData.ContextKey,
|
|
233
|
+
'User-Agent': 'homebridge-melcloud-control/4.0.0',
|
|
234
|
+
'DNT': '1',
|
|
235
|
+
'Origin': 'https://melcloudhome.com',
|
|
236
|
+
'Referer': 'https://melcloudhome.com/dashboard',
|
|
237
|
+
'Sec-Fetch-Dest': 'empty',
|
|
238
|
+
'Sec-Fetch-Mode': 'cors',
|
|
239
|
+
'Sec-Fetch-Site': 'same-origin',
|
|
240
|
+
'X-CSRF': '1'
|
|
241
|
+
}
|
|
242
|
+
});
|
|
438
243
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
244
|
+
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
245
|
+
deviceData.Device.SetTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
246
|
+
|
|
247
|
+
if (this.deviceState.DefaultCoolingSetTemperature !== deviceData.Device.DefaultCoolingSetTemperature || this.deviceState.DefaultHeatingSetTemperature !== deviceData.Device.DefaultHeatingSetTemperature) {
|
|
248
|
+
const temps = {
|
|
249
|
+
defaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
250
|
+
defaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature
|
|
251
|
+
};
|
|
252
|
+
await this.functions.saveData(this.defaultTempsFile, temps);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const settings = {
|
|
257
|
+
data: {
|
|
258
|
+
Power: deviceData.Device.Power,
|
|
259
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
260
|
+
SetFanSpeed: String(deviceData.Device.SetFanSpeed),
|
|
261
|
+
OperationMode: AirConditioner.OperationModeMapEnumToString[deviceData.Device.OperationMode],
|
|
262
|
+
VaneHorizontalDirection: AirConditioner.VaneHorizontalDirectionMapEnumToString[deviceData.Device.VaneHorizontalDirection],
|
|
263
|
+
VaneVerticalDirection: AirConditioner.VaneVerticalDirectionMapEnumToString[deviceData.Device.VaneVerticalDirection]
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(settings.data, null, 2)}`);
|
|
267
|
+
|
|
268
|
+
const path = ApiUrlsHome.SetAta.replace('deviceid', deviceData.DeviceID);
|
|
269
|
+
await axiosInstancePut(path, settings);
|
|
270
|
+
this.updateData(deviceData);
|
|
271
|
+
return true;
|
|
272
|
+
default:
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
442
275
|
} catch (error) {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
276
|
+
if (error.response) {
|
|
277
|
+
throw new Error(`Send data error: HTTP ${error.response.status} - ${JSON.stringify(error.response.data)}`);
|
|
278
|
+
} else if (error.request) {
|
|
279
|
+
throw new Error(`Send data error: No response received - ${error.message}`);
|
|
280
|
+
} else {
|
|
281
|
+
throw new Error(`Send data error: ${error.message}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
446
285
|
|
|
447
286
|
updateData(deviceData) {
|
|
448
287
|
setTimeout(() => {
|
|
449
288
|
this.emit('deviceState', deviceData);
|
|
450
289
|
}, 500);
|
|
451
290
|
}
|
|
291
|
+
|
|
452
292
|
};
|
|
453
293
|
export default MelCloudAta;
|