homebridge-melcloud-control 4.0.0-beta.43 → 4.0.0-beta.430
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 +12 -11
- package/config.schema.json +272 -314
- package/homebridge-ui/public/index.html +104 -64
- package/homebridge-ui/server.js +5 -9
- package/index.js +38 -20
- package/package.json +6 -3
- package/src/constants.js +15 -22
- package/src/deviceata.js +199 -188
- package/src/deviceatw.js +7 -5
- package/src/deviceerv.js +28 -26
- package/src/functions.js +124 -3
- package/src/melcloud.js +312 -131
- package/src/melcloudata.js +139 -308
- package/src/melcloudatw.js +3 -228
- package/src/melclouderv.js +5 -162
- package/src/melcloudhometoken.js +231 -0
- package/src/restful.js +1 -1
package/src/melcloudata.js
CHANGED
|
@@ -1,37 +1,23 @@
|
|
|
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
13
|
this.logDebug = device.log?.debug;
|
|
14
14
|
this.devicesFile = devicesFile;
|
|
15
|
+
this.defaultTempsFile = defaultTempsFile;
|
|
15
16
|
this.functions = new Functions();
|
|
16
17
|
|
|
17
18
|
//set default values
|
|
18
19
|
this.deviceState = {};
|
|
19
20
|
|
|
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
21
|
//lock flags
|
|
36
22
|
this.locks = {
|
|
37
23
|
checkState: false,
|
|
@@ -60,94 +46,39 @@ class MelCloudAta extends EventEmitter {
|
|
|
60
46
|
|
|
61
47
|
async checkState() {
|
|
62
48
|
try {
|
|
49
|
+
|
|
63
50
|
//read device info from file
|
|
64
|
-
const
|
|
65
|
-
const devicesData = JSON.parse(data);
|
|
51
|
+
const devicesData = await this.functions.readData(this.devicesFile, true);
|
|
66
52
|
|
|
67
53
|
if (!Array.isArray(devicesData)) {
|
|
68
54
|
if (this.logWarn) this.emit('warn', `Device data not found`);
|
|
69
55
|
return null;
|
|
70
56
|
}
|
|
71
57
|
const deviceData = devicesData.find(device => device.DeviceID === this.deviceId);
|
|
58
|
+
if (this.accountType === 'melcloudhome') {
|
|
59
|
+
deviceData.SerialNumber = deviceData.Device.DeviceID || '4.0.0';
|
|
60
|
+
deviceData.Device.FirmwareAppVersion = '4.0.0';
|
|
61
|
+
deviceData.Device.OperationMode = AirConditioner.OperationModeMapStringToEnum[deviceData.Device.OperationMode] ?? deviceData.Device.OperationMode;
|
|
62
|
+
deviceData.Device.ActualFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.ActualFanSpeed] ?? deviceData.Device.ActualFanSpeed;
|
|
63
|
+
deviceData.Device.SetFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.SetFanSpeed] ?? deviceData.Device.SetFanSpeed;
|
|
64
|
+
deviceData.Device.VaneVerticalDirection = AirConditioner.VaneVerticalDirectionMapStringToEnum[deviceData.Device.VaneVerticalDirection] ?? deviceData.Device.VaneVerticalDirection;
|
|
65
|
+
deviceData.Device.VaneHorizontalDirection = AirConditioner.VaneHorizontalDirectionMapStringToEnum[deviceData.Device.VaneHorizontalDirection] ?? deviceData.Device.VaneHorizontalDirection;
|
|
66
|
+
|
|
67
|
+
//read default temps
|
|
68
|
+
const temps = await this.functions.readData(this.defaultTempsFile, true);
|
|
69
|
+
deviceData.Device.DefaultHeatingSetTemperature = temps?.defaultHeatingSetTemperature ?? 20;
|
|
70
|
+
deviceData.Device.DefaultCoolingSetTemperature = temps?.defaultCoolingSetTemperature ?? 24;
|
|
71
|
+
}
|
|
72
72
|
if (this.logDebug) this.emit('debug', `Device Data: ${JSON.stringify(deviceData, null, 2)}`);
|
|
73
73
|
|
|
74
74
|
//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
75
|
const hideVaneControls = deviceData.HideVaneControls ?? false;
|
|
101
76
|
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';
|
|
77
|
+
const serialNumber = deviceData.SerialNumber;
|
|
112
78
|
|
|
113
79
|
//device
|
|
80
|
+
const fanKey = this.accountType === 'melcloud' ? 'FanSpeed' : 'SetFanSpeed';
|
|
114
81
|
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
82
|
const prohibitSetTemperature = device.ProhibitSetTemperature;
|
|
152
83
|
const prohibitOperationMode = device.ProhibitOperationMode;
|
|
153
84
|
const prohibitPower = device.ProhibitPower;
|
|
@@ -156,175 +87,40 @@ class MelCloudAta extends EventEmitter {
|
|
|
156
87
|
const outdoorTemperature = device.OutdoorTemperature;
|
|
157
88
|
const setTemperature = device.SetTemperature;
|
|
158
89
|
const actualFanSpeed = device.ActualFanSpeed;
|
|
159
|
-
const
|
|
90
|
+
const setFanSpeed = device[fanKey];
|
|
160
91
|
const automaticFanSpeed = device.AutomaticFanSpeed;
|
|
161
92
|
const vaneVerticalDirection = device.VaneVerticalDirection;
|
|
162
93
|
const vaneVerticalSwing = device.VaneVerticalSwing;
|
|
163
94
|
const vaneHorizontalDirection = device.VaneHorizontalDirection;
|
|
164
95
|
const vaneHorizontalSwing = device.VaneHorizontalSwing;
|
|
165
96
|
const operationMode = device.OperationMode;
|
|
166
|
-
const effectiveFlags = device.EffectiveFlags;
|
|
167
97
|
const inStandbyMode = device.InStandbyMode;
|
|
168
|
-
const demandPercentage = device.DemandPercentage;
|
|
169
|
-
const configuredDemandPercentage = device.ConfiguredDemandPercentage;
|
|
170
|
-
const hasDemandSideControl = device.HasDemandSideControl;
|
|
171
98
|
const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature;
|
|
172
99
|
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;
|
|
100
|
+
const firmwareAppVersion = device.FirmwareAppVersion;
|
|
250
101
|
|
|
251
102
|
//units
|
|
252
103
|
const units = Array.isArray(device.Units) ? device.Units : [];
|
|
253
104
|
const unitsCount = units.length;
|
|
254
105
|
const manufacturer = 'Mitsubishi';
|
|
255
106
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
let modelNumberOutdoor = 0;
|
|
269
|
-
let modelOutdoor = false;
|
|
270
|
-
let typeOutdoor = 0;
|
|
107
|
+
const { indoor, outdoor } = units.reduce((acc, unit) => {
|
|
108
|
+
const target = unit.IsIndoor ? 'indoor' : 'outdoor';
|
|
109
|
+
acc[target] = {
|
|
110
|
+
id: unit.ID,
|
|
111
|
+
device: unit.Device,
|
|
112
|
+
serialNumber: unit.SerialNumber ?? 'Undefined',
|
|
113
|
+
modelNumber: unit.ModelNumber ?? 0,
|
|
114
|
+
model: unit.Model ?? false,
|
|
115
|
+
type: unit.UnitType ?? 0
|
|
116
|
+
};
|
|
117
|
+
return acc;
|
|
118
|
+
}, { indoor: {}, outdoor: {} });
|
|
271
119
|
|
|
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;
|
|
324
120
|
|
|
325
121
|
//display info if units are not configured in MELCloud service
|
|
326
122
|
if (unitsCount === 0) {
|
|
327
|
-
if (this.
|
|
123
|
+
if (this.logDebug) this.emit('debug', `Units are not configured in MELCloud service`);
|
|
328
124
|
};
|
|
329
125
|
|
|
330
126
|
const deviceState = {
|
|
@@ -334,7 +130,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
334
130
|
OutdoorTemperature: outdoorTemperature,
|
|
335
131
|
SetTemperature: setTemperature,
|
|
336
132
|
ActualFanSpeed: actualFanSpeed,
|
|
337
|
-
|
|
133
|
+
SetFanSpeed: setFanSpeed,
|
|
338
134
|
AutomaticFanSpeed: automaticFanSpeed,
|
|
339
135
|
OperationMode: operationMode,
|
|
340
136
|
VaneVerticalDirection: vaneVerticalDirection,
|
|
@@ -367,7 +163,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
367
163
|
this.deviceState = deviceState;
|
|
368
164
|
|
|
369
165
|
//emit info
|
|
370
|
-
this.emit('deviceInfo', manufacturer,
|
|
166
|
+
this.emit('deviceInfo', manufacturer, indoor.model, outdoor.model, serialNumber, firmwareAppVersion);
|
|
371
167
|
|
|
372
168
|
//emit state
|
|
373
169
|
this.emit('deviceState', deviceData);
|
|
@@ -378,76 +174,111 @@ class MelCloudAta extends EventEmitter {
|
|
|
378
174
|
};
|
|
379
175
|
};
|
|
380
176
|
|
|
381
|
-
async send(
|
|
177
|
+
async send(accountType, displayType, deviceData) {
|
|
382
178
|
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
|
-
|
|
179
|
+
switch (accountType) {
|
|
180
|
+
case "melcloud":
|
|
181
|
+
const axiosInstancePost = axios.create({
|
|
182
|
+
method: 'POST',
|
|
183
|
+
baseURL: ApiUrls.BaseURL,
|
|
184
|
+
timeout: 25000,
|
|
185
|
+
headers: {
|
|
186
|
+
'X-MitsContextKey': deviceData.ContextKey,
|
|
187
|
+
'Content-Type': 'application/json'
|
|
188
|
+
},
|
|
189
|
+
withCredentials: true
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
193
|
+
deviceData.Device.SetTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const payload = {
|
|
197
|
+
data: {
|
|
198
|
+
DeviceID: deviceData.Device.DeviceID,
|
|
199
|
+
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
200
|
+
Power: deviceData.Device.Power,
|
|
201
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
202
|
+
SetFanSpeed: deviceData.Device.FanSpeed,
|
|
203
|
+
OperationMode: deviceData.Device.OperationMode,
|
|
204
|
+
VaneHorizontal: deviceData.Device.VaneHorizontalDirection,
|
|
205
|
+
VaneVertical: deviceData.Device.VaneVerticalDirection,
|
|
206
|
+
DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature,
|
|
207
|
+
DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
208
|
+
ProhibitSetTemperature: deviceData.Device.ProhibitSetTemperature,
|
|
209
|
+
ProhibitOperationMode: deviceData.Device.ProhibitOperationMode,
|
|
210
|
+
ProhibitPower: deviceData.Device.ProhibitPower,
|
|
211
|
+
HideVaneControls: deviceData.HideVaneControls,
|
|
212
|
+
HideDryModeControl: deviceData.HideDryModeControl,
|
|
213
|
+
HasPendingCommand: true
|
|
214
|
+
}
|
|
412
215
|
};
|
|
413
|
-
|
|
414
|
-
deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
|
|
415
|
-
break;
|
|
416
|
-
};
|
|
216
|
+
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload.data, null, 2)}`);
|
|
417
217
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
218
|
+
await axiosInstancePost(ApiUrls.SetAta, payload);
|
|
219
|
+
this.emit('deviceState', deviceData);
|
|
220
|
+
return true;
|
|
221
|
+
case "melcloudhome":
|
|
222
|
+
const axiosInstancePut = axios.create({
|
|
223
|
+
method: 'PUT',
|
|
224
|
+
baseURL: ApiUrlsHome.BaseURL,
|
|
225
|
+
timeout: 25000,
|
|
226
|
+
headers: {
|
|
227
|
+
'Accept': '*/*',
|
|
228
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
229
|
+
'Cookie': deviceData.ContextKey,
|
|
230
|
+
'User-Agent': 'homebridge-melcloud-control/4.0.0',
|
|
231
|
+
'DNT': '1',
|
|
232
|
+
'Origin': 'https://melcloudhome.com',
|
|
233
|
+
'Referer': 'https://melcloudhome.com/dashboard',
|
|
234
|
+
'Sec-Fetch-Dest': 'empty',
|
|
235
|
+
'Sec-Fetch-Mode': 'cors',
|
|
236
|
+
'Sec-Fetch-Site': 'same-origin',
|
|
237
|
+
'X-CSRF': '1'
|
|
238
|
+
}
|
|
239
|
+
});
|
|
438
240
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
return true;
|
|
442
|
-
} catch (error) {
|
|
443
|
-
throw new Error(`Send data error: ${error}`);
|
|
444
|
-
};
|
|
445
|
-
};
|
|
241
|
+
if (displayType === 1 && deviceData.Device.OperationMode === 8) {
|
|
242
|
+
deviceData.Device.SetTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
446
243
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
244
|
+
if (this.deviceState.DefaultCoolingSetTemperature !== deviceData.Device.DefaultCoolingSetTemperature || this.deviceState.DefaultHeatingSetTemperature !== deviceData.Device.DefaultHeatingSetTemperature) {
|
|
245
|
+
const temps = {
|
|
246
|
+
defaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
247
|
+
defaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature
|
|
248
|
+
};
|
|
249
|
+
await this.functions.saveData(this.defaultTempsFile, temps);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const settings = {
|
|
254
|
+
data: {
|
|
255
|
+
Power: deviceData.Device.Power,
|
|
256
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
257
|
+
SetFanSpeed: String(deviceData.Device.SetFanSpeed),
|
|
258
|
+
OperationMode: AirConditioner.OperationModeMapEnumToString[deviceData.Device.OperationMode],
|
|
259
|
+
VaneHorizontalDirection: AirConditioner.VaneHorizontalDirectionMapEnumToString[deviceData.Device.VaneHorizontalDirection],
|
|
260
|
+
VaneVerticalDirection: AirConditioner.VaneVerticalDirectionMapEnumToString[deviceData.Device.VaneVerticalDirection]
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(settings.data, null, 2)}`);
|
|
264
|
+
|
|
265
|
+
const path = ApiUrlsHome.SetAta.replace('deviceid', deviceData.DeviceID);
|
|
266
|
+
await axiosInstancePut(path, settings);
|
|
267
|
+
this.emit('deviceState', deviceData);
|
|
268
|
+
return true;
|
|
269
|
+
default:
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
if (error.response) {
|
|
274
|
+
throw new Error(`Send data error: HTTP ${error.response.status} - ${JSON.stringify(error.response.data)}`);
|
|
275
|
+
} else if (error.request) {
|
|
276
|
+
throw new Error(`Send data error: No response received - ${error.message}`);
|
|
277
|
+
} else {
|
|
278
|
+
throw new Error(`Send data error: ${error.message}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
451
281
|
}
|
|
282
|
+
|
|
452
283
|
};
|
|
453
284
|
export default MelCloudAta;
|