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.
@@ -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, contextKey, devicesFile) {
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 data = await this.functions.readData(this.devicesFile);
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 hideRoomTemperature = deviceData.HideRoomTemperature;
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 fanSpeed = device.FanSpeed;
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 roomTemperatureLabel = device.RoomTemperatureLabel;
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
- //indoor
257
- let idIndoor = 0;
258
- let deviceIndoor = 0;
259
- let serialNumberIndoor = 'Undefined';
260
- let modelNumberIndoor = 0;
261
- let modelIndoor = false;
262
- let typeIndoor = 0;
263
-
264
- //outdoor
265
- let idOutdoor = 0;
266
- let deviceOutdoor = 0;
267
- let serialNumberOutdoor = 'Undefined';
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.logWarn) this.emit('warn', `Units are not configured in MELCloud service`);
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
- FanSpeed: fanSpeed,
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, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion);
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(deviceData, displayMode) {
177
+ async send(accountType, displayType, deviceData) {
382
178
  try {
383
- //set target temp based on display mode and operation mode
384
- switch (displayMode) {
385
- case 1: //Heather/Cooler
386
- switch (deviceData.Device.OperationMode) {
387
- case 1: //HEAT
388
- deviceData.Device.SetTemperature = deviceData.Device.DefaultHeatingSetTemperature;
389
- break;
390
- case 2: //DRY
391
- deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
392
- break;
393
- case 3: //COOL
394
- deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
395
- break;
396
- case 7: //FAN
397
- deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
398
- break;
399
- case 8: //AUTO
400
- const setTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
401
- deviceData.Device.SetTemperature = setTemperature;
402
- break;
403
- case 9: //HISEE HEAT
404
- deviceData.Device.SetTemperature = deviceData.Device.DefaultHeatingSetTemperature;
405
- break;
406
- case 10: //ISEE DRY
407
- deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
408
- break;
409
- case 11: //ISEE COOL
410
- deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
411
- break;
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
- case 2: //Thermostat
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
- const payload = {
419
- data: {
420
- DeviceID: deviceData.Device.DeviceID,
421
- EffectiveFlags: deviceData.Device.EffectiveFlags,
422
- Power: deviceData.Device.Power,
423
- SetTemperature: deviceData.Device.SetTemperature,
424
- SetFanSpeed: deviceData.Device.FanSpeed,
425
- OperationMode: deviceData.Device.OperationMode,
426
- VaneHorizontal: deviceData.Device.VaneHorizontalDirection,
427
- VaneVertical: deviceData.Device.VaneVerticalDirection,
428
- DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature,
429
- DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
430
- ProhibitSetTemperature: deviceData.Device.ProhibitSetTemperature,
431
- ProhibitOperationMode: deviceData.Device.ProhibitOperationMode,
432
- ProhibitPower: deviceData.Device.ProhibitPower,
433
- HideVaneControls: deviceData.HideVaneControls,
434
- HideDryModeControl: deviceData.HideDryModeControl,
435
- HasPendingCommand: true
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
- await this.axiosInstancePost(ApiUrls.SetAta, payload);
440
- this.updateData(deviceData);
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
- updateData(deviceData) {
448
- setTimeout(() => {
449
- this.emit('deviceState', deviceData);
450
- }, 500);
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;