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