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.
@@ -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, 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
+ this.logError = device.log?.error;
13
14
  this.logDebug = device.log?.debug;
14
15
  this.devicesFile = devicesFile;
15
- this.functions = new Functions();
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 data = await this.functions.readData(this.devicesFile);
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 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';
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 fanSpeed = device.FanSpeed;
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 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;
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
- //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;
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.logWarn) this.emit('warn', `Units are not configured in MELCloud service`);
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
- FanSpeed: fanSpeed,
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, modelIndoor, modelOutdoor, serialNumber, firmwareAppVersion);
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, displayMode) {
179
+ async send(accountType, displayType, deviceData, effectiveFlags) {
382
180
  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;
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
- case 2: //Thermostat
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
- 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
- }
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
- await this.axiosInstancePost(ApiUrls.SetAta, payload);
440
- this.updateData(deviceData);
441
- return true;
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
- throw new Error(`Send data error: ${error}`);
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;