homebridge-melcloud-control 4.2.5-beta.2 → 4.2.5-beta.21

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/src/deviceerv.js CHANGED
@@ -82,8 +82,8 @@ class DeviceErv extends EventEmitter {
82
82
  //buttons configured
83
83
  for (const button of this.buttons) {
84
84
  button.name = button.name || 'Button'
85
- button.serviceType = [null, Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][button.displayType];
86
- button.characteristicType = [null, Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][button.displayType];
85
+ button.serviceType = serviceType[button.displayType];
86
+ button.characteristicType = characteristicType[button.displayType];
87
87
  button.state = false;
88
88
  button.previousValue = null;
89
89
  }
@@ -741,7 +741,7 @@ class DeviceErv extends EventEmitter {
741
741
  .onSet(async (state) => {
742
742
  try {
743
743
  deviceData.HolidayMode.Enabled = state;
744
- if (this.logInfo) this.emit('info', `Holiday mode: ${state ? 'Enable' : 'Disable'}`);
744
+ if (this.logInfo) this.emit('info', `Holiday mode: ${state ? 'Enabled' : 'Disabled'}`);
745
745
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, 'holidaymode');
746
746
  } catch (error) {
747
747
  if (this.logWarn) this.emit('warn', `Set holiday mode error: ${error}`);
@@ -823,7 +823,7 @@ class DeviceErv extends EventEmitter {
823
823
  break;
824
824
  };
825
825
 
826
- if (this.logInfo) this.emit('info', `Preset ${name}: ${state ? 'Set:' : 'Unset:'}`);
826
+ if (this.logInfo) this.emit('info', `Preset ${name}: ${state ? 'Set' : 'Unset'}`);
827
827
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, AirConditioner.EffectiveFlags.Presets);
828
828
  } catch (error) {
829
829
  if (this.logWarn) this.emit('warn', `Set preset error: ${error}`);
@@ -880,7 +880,7 @@ class DeviceErv extends EventEmitter {
880
880
  .onSet(async (state) => {
881
881
  try {
882
882
  deviceData.ScheduleEnabled = state;
883
- if (this.logInfo) this.emit('info', `Schedules: ${state ? 'Enable' : 'Disable'}`);
883
+ if (this.logInfo) this.emit('info', `Schedules: ${state ? 'Enabled' : 'Disabled'}`);
884
884
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, 'schedule');
885
885
  } catch (error) {
886
886
  if (this.logWarn) this.emit('warn', `Set schedule serror: ${error}`);
@@ -949,7 +949,7 @@ class DeviceErv extends EventEmitter {
949
949
  .onSet(async (state) => {
950
950
  try {
951
951
  sceneData.Enabled = state;
952
- if (this.logInfo) this.emit('info', `Scene ${name}: ${state ? 'Enable' : 'Disable'}`);
952
+ if (this.logInfo) this.emit('info', `Scene ${name}: ${state ? 'Set' : 'Unset'}`);
953
953
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, 'scene', sceneData);
954
954
  } catch (error) {
955
955
  if (this.logWarn) this.emit('warn', `Set scene error: ${error}`);
@@ -975,116 +975,135 @@ class DeviceErv extends EventEmitter {
975
975
 
976
976
  //buttons services
977
977
  if (this.buttons.length > 0) {
978
- if (this.logDebug) this.emit('debug', `Prepare buttons services`);
979
- this.buttonsServices = [];
978
+ if (this.logDebug) this.emit('debug', `Prepare buttons / sensors services`);
979
+ this.buttonControlServices = [];
980
+ this.buttonControlSensorServices = [];
980
981
  this.buttons.forEach((button, i) => {
981
982
  //get button mode
982
983
  const mode = button.mode;
983
984
 
984
985
  //get button name
985
- const buttonName = button.name;
986
+ const name = button.name;
986
987
 
987
988
  //get button name prefix
988
989
  const namePrefix = button.namePrefix;
989
990
 
990
- const serviceName1 = namePrefix ? `${accessoryName} ${buttonName}` : buttonName;
991
+ const serviceName1 = namePrefix ? `${accessoryName} ${name}` : name;
991
992
  const serviceType = button.serviceType;
992
993
  const characteristicType = button.characteristicType;
993
- const buttonService = new serviceType(serviceName1, `Button ${deviceId} ${i}`);
994
- buttonService.addOptionalCharacteristic(Characteristic.ConfiguredName);
995
- buttonService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
996
- buttonService.getCharacteristic(characteristicType)
994
+
995
+ //control
996
+ if (button.displayType > 3) {
997
+ if (this.logDebug) this.emit('debug', `Prepare button control ${name} service`);
998
+ const buttonControlService = new serviceType(serviceName1, `buttonControlService${deviceId} ${i}`);
999
+ buttonControlService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1000
+ buttonControlService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
1001
+ buttonControlService.getCharacteristic(Characteristic.On)
1002
+ .onGet(async () => {
1003
+ const state = button.state;
1004
+ return state;
1005
+ })
1006
+ .onSet(async (state) => {
1007
+ try {
1008
+ let flag = null;
1009
+ switch (mode) {
1010
+ case 0: //POWER ON,OFF
1011
+ deviceData.Device.Power = state;
1012
+ flag = Ventilation.EffectiveFlags.Power;
1013
+ break;
1014
+ case 1: //OPERATING MODE RECOVERY
1015
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1016
+ deviceData.Device.Power = true;
1017
+ deviceData.Device.VentilationMode = state ? 0 : button.previousValue;
1018
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1019
+ break;
1020
+ case 2: //OPERATING MODE BYPASS
1021
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1022
+ deviceData.Device.Power = true;
1023
+ deviceData.Device.VentilationMode = state ? 1 : button.previousValue;
1024
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1025
+ break
1026
+ case 3: //OPERATING MODE AUTO
1027
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1028
+ deviceData.Device.Power = true;
1029
+ deviceData.Device.VentilationMode = state ? 2 : button.previousValue;
1030
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1031
+ break;
1032
+ case 4: //NIGHT PURGE MODE
1033
+ deviceData.Device.Power = true;
1034
+ deviceData.Device.NightPurgeMode = state;
1035
+ flag = Ventilation.EffectiveFlags.Power
1036
+ break;
1037
+ case 10: //FAN SPEED MODE AUTO
1038
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1039
+ deviceData.Device.Power = true;
1040
+ deviceData.Device.SetFanSpeed = state ? 0 : button.previousValue;
1041
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1042
+ break;
1043
+ case 11: //FAN SPEED MODE 1
1044
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1045
+ deviceData.Device.Power = true;
1046
+ deviceData.Device.SetFanSpeed = state ? 1 : button.previousValue;
1047
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1048
+ break;
1049
+ case 12: //FAN SPEED MODE 2
1050
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1051
+ deviceData.Device.Power = true;
1052
+ deviceData.Device.SetFanSpeed = state ? 2 : button.previousValue;
1053
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1054
+ break;
1055
+ case 13: //FAN SPEED MODE 3
1056
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1057
+ deviceData.Device.Power = true;
1058
+ deviceData.Device.SetFanSpeed = state ? 3 : button.previousValue;
1059
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1060
+ break;
1061
+ case 14: //FAN MODE 4
1062
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1063
+ deviceData.Device.Power = true;
1064
+ deviceData.Device.SetFanSpeed = state ? 4 : button.previousValue;
1065
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1066
+ break;
1067
+ case 15: //PHYSICAL LOCK CONTROLS
1068
+ deviceData.Device = deviceData.Device;
1069
+ flag = Ventilation.EffectiveFlags.Prohibit;
1070
+ break;
1071
+ case 16: //ROOM TEMP HIDE
1072
+ deviceData.HideRoomTemperature = state;
1073
+ break;
1074
+ case 17: //SUPPLY TEMP HIDE
1075
+ deviceData.HideSupplyTemperature = state;
1076
+ break;
1077
+ case 18: //OUTDOOR EMP HIDE
1078
+ deviceData.hideOutdoorTemperature = state;
1079
+ break;
1080
+ default:
1081
+ if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1082
+ break;
1083
+ };
1084
+
1085
+ if (this.logInfo) this.emit('info', `Button ${name}: ${state ? `Enabled` : `Disabled`}`);
1086
+ await this.melCloudErv.send(this.accountType, this.displayType, deviceData, flag);
1087
+ } catch (error) {
1088
+ if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1089
+ };
1090
+ });
1091
+ this.buttonControlServices.push(buttonControlService);
1092
+ accessory.addService(buttonControlService);
1093
+ }
1094
+
1095
+ //sensor
1096
+ if (this.logDebug) this.emit('debug', `Prepare button control sensor ${name} service`);
1097
+ const buttonControlSensorService = new serviceType(serviceName1, `buttonControlSensorService${deviceId} ${i}`);
1098
+ buttonControlSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1099
+ buttonControlSensorService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
1100
+ buttonControlSensorService.getCharacteristic(characteristicType)
997
1101
  .onGet(async () => {
998
1102
  const state = button.state;
999
1103
  return state;
1000
1104
  })
1001
- .onSet(async (state) => {
1002
- try {
1003
- let flag = null;
1004
- switch (mode) {
1005
- case 0: //POWER ON,OFF
1006
- deviceData.Device.Power = state;
1007
- flag = Ventilation.EffectiveFlags.Power;
1008
- break;
1009
- case 1: //OPERATING MODE RECOVERY
1010
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1011
- deviceData.Device.Power = true;
1012
- deviceData.Device.VentilationMode = state ? 0 : button.previousValue;
1013
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1014
- break;
1015
- case 2: //OPERATING MODE BYPASS
1016
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1017
- deviceData.Device.Power = true;
1018
- deviceData.Device.VentilationMode = state ? 1 : button.previousValue;
1019
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1020
- break
1021
- case 3: //OPERATING MODE AUTO
1022
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1023
- deviceData.Device.Power = true;
1024
- deviceData.Device.VentilationMode = state ? 2 : button.previousValue;
1025
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1026
- break;
1027
- case 4: //NIGHT PURGE MODE
1028
- deviceData.Device.Power = true;
1029
- deviceData.Device.NightPurgeMode = state;
1030
- flag = Ventilation.EffectiveFlags.Power
1031
- break;
1032
- case 10: //FAN SPEED MODE AUTO
1033
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1034
- deviceData.Device.Power = true;
1035
- deviceData.Device.SetFanSpeed = state ? 0 : button.previousValue;
1036
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1037
- break;
1038
- case 11: //FAN SPEED MODE 1
1039
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1040
- deviceData.Device.Power = true;
1041
- deviceData.Device.SetFanSpeed = state ? 1 : button.previousValue;
1042
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1043
- break;
1044
- case 12: //FAN SPEED MODE 2
1045
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1046
- deviceData.Device.Power = true;
1047
- deviceData.Device.SetFanSpeed = state ? 2 : button.previousValue;
1048
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1049
- break;
1050
- case 13: //FAN SPEED MODE 3
1051
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1052
- deviceData.Device.Power = true;
1053
- deviceData.Device.SetFanSpeed = state ? 3 : button.previousValue;
1054
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1055
- break;
1056
- case 14: //FAN MODE 4
1057
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1058
- deviceData.Device.Power = true;
1059
- deviceData.Device.SetFanSpeed = state ? 4 : button.previousValue;
1060
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1061
- break;
1062
- case 15: //PHYSICAL LOCK CONTROLS
1063
- deviceData.Device = deviceData.Device;
1064
- flag = Ventilation.EffectiveFlags.Prohibit;
1065
- break;
1066
- case 16: //ROOM TEMP HIDE
1067
- deviceData.HideRoomTemperature = state;
1068
- break;
1069
- case 17: //SUPPLY TEMP HIDE
1070
- deviceData.HideSupplyTemperature = state;
1071
- break;
1072
- case 18: //OUTDOOR EMP HIDE
1073
- deviceData.hideOutdoorTemperature = state;
1074
- break;
1075
- default:
1076
- if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1077
- break;
1078
- };
1079
-
1080
- if (this.logInfo) this.emit('info', `${state ? `Set: ${buttonName}` : `Unset: ${buttonName}, Set: ${button.previousValue}`}`);
1081
- await this.melCloudErv.send(this.accountType, this.displayType, deviceData, flag);
1082
- } catch (error) {
1083
- if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1084
- };
1085
- });
1086
- this.buttonsServices.push(buttonService);
1087
- accessory.addService(buttonService);
1105
+ this.buttonControlSensorServices.push(buttonControlSensorService);
1106
+ accessory.addService(buttonControlSensorService);
1088
1107
  });
1089
1108
  };
1090
1109
 
@@ -1500,9 +1519,14 @@ class DeviceErv extends EventEmitter {
1500
1519
  break;
1501
1520
  };
1502
1521
 
1503
- //update services
1504
- const characteristicType = button.characteristicType;
1505
- this.buttonsServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1522
+ //control
1523
+ if (button.displayType > 3) {
1524
+ this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
1525
+ }
1526
+
1527
+ //sensor
1528
+ const characteristicType = scene.characteristicType;
1529
+ this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1506
1530
  });
1507
1531
  };
1508
1532
 
package/src/melcloud.js CHANGED
@@ -52,17 +52,11 @@ class MelCloud extends EventEmitter {
52
52
  }
53
53
  }
54
54
 
55
- // MELCloud
56
55
  async checkDevicesList() {
57
56
  try {
58
57
  const devicesList = { State: false, Info: null, Devices: [], Scenes: [] }
59
58
  if (this.logDebug) this.emit('debug', `Scanning for devices...`);
60
- const listDevicesData = await axios(ApiUrls.ListDevices, {
61
- method: 'GET',
62
- baseURL: ApiUrls.BaseURL,
63
- timeout: 15000,
64
- headers: this.headers
65
- });
59
+ const listDevicesData = await this.axiosInstance(ApiUrls.ListDevices, { method: 'GET', });
66
60
 
67
61
  if (!listDevicesData || !listDevicesData.data) {
68
62
  devicesList.Info = 'Invalid or empty response from MELCloud API'
@@ -131,7 +125,7 @@ class MelCloud extends EventEmitter {
131
125
  if (this.logDebug) this.emit('debug', `Connecting to MELCloud`);
132
126
 
133
127
  try {
134
- const accountInfo = { State: false, Info: '', LoginData: null, Headers: {}, UseFahrenheit: false }
128
+ const accountInfo = { State: false, Info: '', LoginData: null, UseFahrenheit: false }
135
129
 
136
130
  const payload = {
137
131
  Email: this.user,
@@ -168,15 +162,20 @@ class MelCloud extends EventEmitter {
168
162
  return accountInfo;
169
163
  }
170
164
 
171
- this.headers = {
165
+ const headers = {
172
166
  'X-MitsContextKey': contextKey,
173
167
  'Content-Type': 'application/json'
174
168
  };
169
+ this.headers = headers;
170
+ this.axiosInstance = axios.create({
171
+ baseURL: ApiUrls.BaseURL,
172
+ timeout: 30000,
173
+ headers: headers
174
+ });
175
175
 
176
176
  accountInfo.State = true;
177
177
  accountInfo.Info = 'Connect to MELCloud Success';
178
178
  accountInfo.LoginData = loginData;
179
- accountInfo.Headers = this.headers;
180
179
  await this.functions.saveData(this.accountFile, accountInfo);
181
180
 
182
181
  return accountInfo
@@ -188,13 +187,7 @@ class MelCloud extends EventEmitter {
188
187
  async send(accountInfo) {
189
188
  try {
190
189
  const payload = { data: accountInfo.LoginData };
191
- await axios(ApiUrls.UpdateApplicationOptions, {
192
- method: 'POST',
193
- baseURL: ApiUrls.BaseURL,
194
- timeout: 15000,
195
- headers: accountInfo.Headers,
196
- data: payload
197
- });
190
+ await this.axiosInstance(ApiUrls.UpdateApplicationOptions, { method: 'POST', data: payload });
198
191
  await this.functions.saveData(this.accountFile, accountInfo);
199
192
  return true;
200
193
  } catch (error) {
@@ -23,7 +23,7 @@ class MelCloudAta extends EventEmitter {
23
23
 
24
24
  //set default values
25
25
  this.deviceData = {};
26
- this.headers = {};
26
+ this.baseURL = this.accountType === 'melcloud' ? ApiUrls.BaseURL : ApiUrlsHome.BaseURL;
27
27
 
28
28
  //lock flag
29
29
  this.locks = true;
@@ -53,12 +53,16 @@ class MelCloudAta extends EventEmitter {
53
53
  try {
54
54
  //read device info from file
55
55
  const devicesData = await this.functions.readData(this.devicesFile, true);
56
- this.headers = devicesData.Headers;
57
- const scenes = devicesData.Scenes ?? [];
58
- const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
56
+ if (!this.logDebug) this.emit('warn', `Device Data: ${JSON.stringify(devicesData, null, 2)}`);
57
+ this.axiosInstance = axios.create({
58
+ baseURL: this.baseURL,
59
+ timeout: 30000,
60
+ headers: devicesData.Headers
61
+ });
59
62
 
63
+ const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
60
64
  if (this.accountType === 'melcloudhome') {
61
- deviceData.Scenes = scenes;
65
+ deviceData.Scenes = devicesData.Scenes ?? [];
62
66
  deviceData.Device.OperationMode = AirConditioner.OperationModeMapStringToEnum[deviceData.Device.OperationMode] ?? deviceData.Device.OperationMode;
63
67
  deviceData.Device.ActualFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.ActualFanSpeed] ?? deviceData.Device.ActualFanSpeed;
64
68
  deviceData.Device.SetFanSpeed = AirConditioner.FanSpeedMapStringToEnum[deviceData.Device.SetFanSpeed] ?? deviceData.Device.SetFanSpeed;
@@ -163,13 +167,7 @@ class MelCloudAta extends EventEmitter {
163
167
  };
164
168
 
165
169
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
166
- await axios(ApiUrls.SetAta, {
167
- method: 'POST',
168
- baseURL: ApiUrls.BaseURL,
169
- timeout: 10000,
170
- headers: this.headers,
171
- data: payload
172
- });
170
+ await this.axiosInstance(path, { method: 'POST', data: payload });
173
171
  this.updateData(deviceData);
174
172
  return true;
175
173
  case "melcloudhome":
@@ -195,7 +193,7 @@ class MelCloudAta extends EventEmitter {
195
193
  };
196
194
  method = 'POST';
197
195
  path = ApiUrlsHome.PostProtectionFrost;
198
- this.headers.Referer = ApiUrlsHome.Referers.PostProtectionFrost.replace('deviceid', deviceData.DeviceID);
196
+ //this.headers.Referer = ApiUrlsHome.Referers.PostProtectionFrost.replace('deviceid', deviceData.DeviceID);
199
197
  break;
200
198
  case 'overheatprotection':
201
199
  payload = {
@@ -206,7 +204,7 @@ class MelCloudAta extends EventEmitter {
206
204
  };
207
205
  method = 'POST';
208
206
  path = ApiUrlsHome.PostProtectionOverheat;
209
- this.headers.Referer = ApiUrlsHome.Referers.PostProtectionOverheat.replace('deviceid', deviceData.DeviceID);
207
+ //this.headers.Referer = ApiUrlsHome.Referers.PostProtectionOverheat.replace('deviceid', deviceData.DeviceID);
210
208
  break;
211
209
  case 'holidaymode':
212
210
  payload = {
@@ -217,19 +215,19 @@ class MelCloudAta extends EventEmitter {
217
215
  };
218
216
  method = 'POST';
219
217
  path = ApiUrlsHome.PostHolidayMode;
220
- this.headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
218
+ //this.headers.Referer = ApiUrlsHome.Referers.PostHolidayMode.replace('deviceid', deviceData.DeviceID);
221
219
  break;
222
220
  case 'schedule':
223
221
  payload = { enabled: deviceData.ScheduleEnabled };
224
222
  method = 'PUT';
225
223
  path = ApiUrlsHome.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
226
- this.headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
224
+ //this.headers.Referer = ApiUrlsHome.Referers.PutScheduleEnabled.replace('deviceid', deviceData.DeviceID);
227
225
  break;
228
226
  case 'scene':
229
227
  method = 'PUT';
230
228
  const state = flagData.Enabled ? 'Enable' : 'Disable';
231
229
  path = ApiUrlsHome.PutScene[state].replace('sceneid', flagData.Id);
232
- this.headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
230
+ //this.headers.Referer = ApiUrlsHome.Referers.GetPutScenes;
233
231
  break;
234
232
  default:
235
233
  payload = {
@@ -244,20 +242,14 @@ class MelCloudAta extends EventEmitter {
244
242
  };
245
243
  method = 'PUT';
246
244
  path = ApiUrlsHome.PutAta.replace('deviceid', deviceData.DeviceID);
247
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings
245
+ //this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
248
246
  break
249
247
  }
250
248
 
251
- this.headers['Content-Type'] = 'application/json; charset=utf-8';
252
- this.headers.Origin = ApiUrlsHome.Origin;
249
+ //this.headers['Content-Type'] = 'application/json; charset=utf-8';
250
+ //this.headers.Origin = ApiUrlsHome.Origin;
253
251
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}, Headers: ${JSON.stringify(this.headers, null, 2)}`);
254
- await axios(path, {
255
- method: method,
256
- baseURL: ApiUrlsHome.BaseURL,
257
- timeout: 10000,
258
- headers: this.headers,
259
- data: payload
260
- });
252
+ await this.axiosInstance(path, { method: method, data: payload });
261
253
  this.updateData(deviceData);
262
254
  return true;
263
255
  default:
@@ -23,7 +23,6 @@ class MelCloudAtw extends EventEmitter {
23
23
 
24
24
  //set default values
25
25
  this.devicesData = {};
26
- this.headers = {};
27
26
 
28
27
  //lock flags
29
28
  this.locks = true;
@@ -53,12 +52,15 @@ class MelCloudAtw extends EventEmitter {
53
52
  try {
54
53
  //read device info from file
55
54
  const devicesData = await this.functions.readData(this.devicesFile, true);
56
- this.headers = devicesData.Headers;
57
- const scenes = devicesData.Scenes ?? [];
58
- const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
55
+ this.axiosInstance = axios.create({
56
+ baseURL: this.baseURL,
57
+ timeout: 30000,
58
+ headers: devicesData.Headers
59
+ });
59
60
 
61
+ const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
60
62
  if (this.accountType === 'melcloudhome') {
61
- deviceData.Scenes = scenes;
63
+ deviceData.Scenes = devicesData.Scenes ?? [];
62
64
  }
63
65
 
64
66
  const safeConfig = {
@@ -169,13 +171,7 @@ class MelCloudAtw extends EventEmitter {
169
171
  }
170
172
 
171
173
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
172
- await axios(ApiUrls.SetAtw, {
173
- method: 'POST',
174
- baseURL: ApiUrls.BaseURL,
175
- timeout: 10000,
176
- headers: this.headers,
177
- data: payload
178
- });
174
+ await this.axiosInstance(path, { method: 'POST', data: payload });
179
175
  this.updateData(deviceData);
180
176
  return true;
181
177
  case "melcloudhome":
@@ -221,20 +217,14 @@ class MelCloudAtw extends EventEmitter {
221
217
  };
222
218
  method = 'PUT';
223
219
  path = ApiUrlsHome.PutAtw.replace('deviceid', deviceData.DeviceID);
224
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings
220
+ this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
225
221
  break
226
222
  }
227
223
 
228
224
  this.headers['Content-Type'] = 'application/json; charset=utf-8';
229
225
  this.headers.Origin = ApiUrlsHome.Origin;
230
226
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}, Headers: ${JSON.stringify(this.headers, null, 2)}`);
231
- await axios(path, {
232
- method: method,
233
- baseURL: ApiUrlsHome.BaseURL,
234
- timeout: 10000,
235
- headers: this.headers,
236
- data: payload
237
- });
227
+ await this.axiosInstance(path, { method: method, data: payload });
238
228
  this.updateData(deviceData);
239
229
  return true;
240
230
  default:
@@ -23,7 +23,6 @@ class MelCloudErv extends EventEmitter {
23
23
 
24
24
  //set default values
25
25
  this.devicesData = {};
26
- this.headers = {};
27
26
 
28
27
  //lock flags
29
28
  this.locks = true;
@@ -53,12 +52,15 @@ class MelCloudErv extends EventEmitter {
53
52
  try {
54
53
  //read device info from file
55
54
  const devicesData = await this.functions.readData(this.devicesFile, true);
56
- this.headers = devicesData.Headers;
57
- const scenes = devicesData.Scenes ?? [];
58
- const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
55
+ this.axiosInstance = axios.create({
56
+ baseURL: this.baseURL,
57
+ timeout: 30000,
58
+ headers: devicesData.Headers
59
+ });
59
60
 
61
+ const deviceData = devicesData.Devices.find(device => device.DeviceID === this.deviceId);
60
62
  if (this.accountType === 'melcloudhome') {
61
- deviceData.Scenes = scenes;
63
+ deviceData.Scenes = devicesData.Scenes ?? [];
62
64
 
63
65
  //read default temps
64
66
  const temps = await this.functions.readData(this.defaultTempsFile, true);
@@ -172,13 +174,7 @@ class MelCloudErv extends EventEmitter {
172
174
  }
173
175
 
174
176
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}`);
175
- await axios(ApiUrls.SetErv, {
176
- method: 'POST',
177
- baseURL: ApiUrls.BaseURL,
178
- timeout: 10000,
179
- headers: this.headers,
180
- data: payload
181
- });
177
+ await this.axiosInstance(path, { method: 'POST', data: payload });
182
178
  this.updateData(deviceData);
183
179
  return true;
184
180
  case "melcloudhome":
@@ -228,20 +224,14 @@ class MelCloudErv extends EventEmitter {
228
224
  };
229
225
  method = 'PUT';
230
226
  path = ApiUrlsHome.PutErv.replace('deviceid', deviceData.DeviceID);
231
- this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings
227
+ this.headers.Referer = ApiUrlsHome.Referers.PutDeviceSettings;
232
228
  break
233
229
  }
234
230
 
235
231
  this.headers['Content-Type'] = 'application/json; charset=utf-8';
236
232
  this.headers.Origin = ApiUrlsHome.Origin;
237
233
  if (this.logDebug) this.emit('debug', `Send Data: ${JSON.stringify(payload, null, 2)}, Headers: ${JSON.stringify(this.headers, null, 2)}`);
238
- await axios(path, {
239
- method: method,
240
- baseURL: ApiUrlsHome.BaseURL,
241
- timeout: 10000,
242
- headers: this.headers,
243
- data: payload
244
- });
234
+ await this.axiosInstance(path, { method: method, data: payload });
245
235
  this.updateData(deviceData);
246
236
  return true;
247
237
  default: