homebridge-melcloud-control 4.0.0-beta.100 → 4.0.0-beta.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/package.json +1 -1
- package/src/constants.js +0 -1
- package/src/deviceata.js +25 -25
- package/src/deviceatw.js +2 -1
- package/src/deviceerv.js +2 -1
- package/src/melcloudata.js +158 -71
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://github.com/grzegorz914/homebridge-melcloud-control/pulls)
|
|
14
14
|
[](https://github.com/grzegorz914/homebridge-melcloud-control/issues)
|
|
15
15
|
|
|
16
|
-
Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation Lossnay, manufactured by Mistsubishi and connected to MELCloud.
|
|
16
|
+
Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation Lossnay, manufactured by Mistsubishi and connected to MELCloud or MELCloud Home.
|
|
17
17
|
|
|
18
18
|
</span>
|
|
19
19
|
|
|
@@ -21,14 +21,14 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
|
|
|
21
21
|
|
|
22
22
|
| Package | Installation | Role | Required |
|
|
23
23
|
| --- | --- | --- | --- |
|
|
24
|
-
| [Homebridge
|
|
25
|
-
| [
|
|
24
|
+
| [Homebridge](https://github.com/homebridge/homebridge) | [Homebridge Wiki](https://github.com/homebridge/homebridge/wiki) | HomeKit Bridge | Required |
|
|
25
|
+
| [Homebridge UI](https://github.com/homebridge/homebridge-config-ui-x) | [Config UI X Wiki](https://github.com/homebridge/homebridge-config-ui-x/wiki) | Homebridge Web User Interface | Required |
|
|
26
26
|
| [MELCloud](https://github.com/grzegorz914/homebridge-melcloud-control) | [Plug-In Wiki](https://github.com/grzegorz914/homebridge-melcloud-control/wiki) | Homebridge Plug-In | Required |
|
|
27
27
|
|
|
28
28
|
### About The Plugin
|
|
29
29
|
|
|
30
30
|
* All devices are detected automatically.
|
|
31
|
-
* Control devices over MELCloud
|
|
31
|
+
* Control devices over MELCloud and MELCloud Home.
|
|
32
32
|
* Support multiple accounts, buildings, floors, areas.
|
|
33
33
|
* Support temperature display units `Celsius/Fahrenheit`.
|
|
34
34
|
* Support assing inividual operating mode for `Heat/Cool/Auto`.
|
|
@@ -187,7 +187,7 @@ Homebridge plugin for Air Conditioner, Heat Pump and Energy Recovery Ventilation
|
|
|
187
187
|
### Configuration
|
|
188
188
|
|
|
189
189
|
* Run this plugin as a [Child Bridge](https://github.com/homebridge/homebridge/wiki/Child-Bridges) (Highly Recommended), this prevent crash Homebridge if plugin crashes.
|
|
190
|
-
* Install and use [Homebridge
|
|
190
|
+
* Install and use [Homebridge UI](https://github.com/homebridge/homebridge-config-ui-x/wiki) to configure this plugin, required for version v3 and above.
|
|
191
191
|
* The `sample-config.json` can be edited and used as an alternative.
|
|
192
192
|
|
|
193
193
|
<p align="center">
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.0.0-beta.
|
|
4
|
+
"version": "4.0.0-beta.102",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
package/src/constants.js
CHANGED
|
@@ -18,7 +18,6 @@ export const ApiUrls = {
|
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
export const ApiUrlsHome = {
|
|
21
|
-
LoginUrl: "https://live-melcloudhome.auth.eu-west-1.amazoncognito.com/login?client_id=3g4d5l5kivuqi7oia68gib7uso&redirect_uri=https%3A%2F%2Fauth.melcloudhome.com%2Fsignin-oidc-meu&response_type=code&scope=openid%20profile&response_mode=form_post",
|
|
22
21
|
BaseURL: 'https://melcloudhome.com',
|
|
23
22
|
GetUserContext: "/api/user/context",
|
|
24
23
|
SetAta: "/api/ataunit/deviceid",
|
package/src/deviceata.js
CHANGED
|
@@ -155,67 +155,67 @@ class DeviceAta extends EventEmitter {
|
|
|
155
155
|
case 'Power':
|
|
156
156
|
deviceData.Device[key] = value;
|
|
157
157
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Power;
|
|
158
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
158
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
159
159
|
break;
|
|
160
160
|
case 'OperationMode':
|
|
161
161
|
deviceData.Device[key] = value;
|
|
162
162
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.OperationModeSetTemperature;
|
|
163
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
163
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
164
164
|
break;
|
|
165
165
|
case 'SetTemperature':
|
|
166
166
|
deviceData.Device[key] = value;
|
|
167
167
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
168
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
168
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
169
169
|
break;
|
|
170
170
|
case 'DefaultCoolingSetTemperature':
|
|
171
171
|
deviceData.Device[key] = value;
|
|
172
172
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
173
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
173
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
174
174
|
break;
|
|
175
175
|
case 'DefaultHeatingSetTemperature':
|
|
176
176
|
deviceData.Device[key] = value;
|
|
177
177
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
178
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
178
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
179
179
|
break;
|
|
180
180
|
case 'FanSpeed':
|
|
181
181
|
deviceData.Device[key] = value;
|
|
182
182
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetFanSpeed;
|
|
183
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
183
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
184
184
|
break;
|
|
185
185
|
case 'VaneHorizontalDirection':
|
|
186
186
|
deviceData.Device[key] = value;
|
|
187
187
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.VaneHorizontal;
|
|
188
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
188
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
189
189
|
break;
|
|
190
190
|
case 'VaneVerticalDirection':
|
|
191
191
|
deviceData.Device[key] = value;
|
|
192
192
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.VaneVertical;
|
|
193
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
193
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
194
194
|
break;
|
|
195
195
|
case 'HideVaneControls':
|
|
196
196
|
deviceData[key] = value;
|
|
197
197
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
198
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
198
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
199
199
|
break;
|
|
200
200
|
case 'HideDryModeControl':
|
|
201
201
|
deviceData[key] = value;
|
|
202
202
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
203
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
203
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
204
204
|
break;
|
|
205
205
|
case 'ProhibitSetTemperature':
|
|
206
206
|
deviceData.Device[key] = value;
|
|
207
207
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
208
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
208
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
209
209
|
break;
|
|
210
210
|
case 'ProhibitOperationMode':
|
|
211
211
|
deviceData.Device[key] = value;
|
|
212
212
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
213
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
213
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
214
214
|
break;
|
|
215
215
|
case 'ProhibitPower':
|
|
216
216
|
deviceData.Device[key] = value;
|
|
217
217
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
218
|
-
set = await this.melCloudAta.send(deviceData, this.displayMode);
|
|
218
|
+
set = await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
219
219
|
break;
|
|
220
220
|
default:
|
|
221
221
|
this.emit('warn', `${integration}, received key: ${key}, value: ${value}`);
|
|
@@ -263,7 +263,7 @@ class DeviceAta extends EventEmitter {
|
|
|
263
263
|
if (this.logDebug) this.emit('debug', `Prepare accessory`);
|
|
264
264
|
const accessoryName = deviceName;
|
|
265
265
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
266
|
-
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.
|
|
266
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.displayMode];
|
|
267
267
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
268
268
|
|
|
269
269
|
//information service
|
|
@@ -291,7 +291,7 @@ class DeviceAta extends EventEmitter {
|
|
|
291
291
|
try {
|
|
292
292
|
deviceData.Device.Power = [false, true][state];
|
|
293
293
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Power;
|
|
294
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
294
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
295
295
|
if (this.logInfo) this.emit('info', `Set power: ${state ? 'ON' : 'OFF'}`);
|
|
296
296
|
} catch (error) {
|
|
297
297
|
if (this.logWarn) this.emit('warn', `Set power error: ${error}`);
|
|
@@ -327,7 +327,7 @@ class DeviceAta extends EventEmitter {
|
|
|
327
327
|
};
|
|
328
328
|
|
|
329
329
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.OperationModeSetTemperature;
|
|
330
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
330
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
331
331
|
const operationModeText = AirConditioner.OperationMode[deviceData.Device.OperationMode];
|
|
332
332
|
if (this.logInfo) this.emit('info', `Set operation mode: ${operationModeText}`);
|
|
333
333
|
} catch (error) {
|
|
@@ -376,7 +376,7 @@ class DeviceAta extends EventEmitter {
|
|
|
376
376
|
break;
|
|
377
377
|
};
|
|
378
378
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetFanSpeed;
|
|
379
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
379
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
380
380
|
if (this.logInfo) this.emit('info', `Set fan speed mode: ${AirConditioner.FanSpeed[fanSpeedModeText]}`);
|
|
381
381
|
} catch (error) {
|
|
382
382
|
if (this.logWarn) this.emit('warn', `Set fan speed mode error: ${error}`);
|
|
@@ -395,7 +395,7 @@ class DeviceAta extends EventEmitter {
|
|
|
395
395
|
deviceData.Device.VaneHorizontal = value ? 12 : 0;
|
|
396
396
|
deviceData.Device.VaneVertical = value ? 7 : 0;
|
|
397
397
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.VaneVerticalVaneHorizontal;
|
|
398
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
398
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
399
399
|
if (this.logInfo) this.emit('info', `Set air direction mode: ${AirConditioner.AirDirection[value]}`);
|
|
400
400
|
} catch (error) {
|
|
401
401
|
if (this.logWarn) this.emit('warn', `Set vane swing mode error: ${error}`);
|
|
@@ -416,7 +416,7 @@ class DeviceAta extends EventEmitter {
|
|
|
416
416
|
try {
|
|
417
417
|
deviceData.Device.DefaultCoolingSetTemperature = value;
|
|
418
418
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
419
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
419
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
420
420
|
if (this.logInfo) this.emit('info', `Set cooling threshold temperature: ${value}${this.accessory.temperatureUnit}`);
|
|
421
421
|
} catch (error) {
|
|
422
422
|
if (this.logWarn) this.emit('warn', `Set cooling threshold temperature error: ${error}`);
|
|
@@ -437,7 +437,7 @@ class DeviceAta extends EventEmitter {
|
|
|
437
437
|
try {
|
|
438
438
|
deviceData.Device.DefaultHeatingSetTemperature = value;
|
|
439
439
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
440
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
440
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
441
441
|
if (this.logInfo) this.emit('info', `Set heating threshold temperature: ${value}${this.accessory.temperatureUnit}`);
|
|
442
442
|
} catch (error) {
|
|
443
443
|
if (this.logWarn) this.emit('warn', `Set heating threshold temperature error: ${error}`);
|
|
@@ -456,7 +456,7 @@ class DeviceAta extends EventEmitter {
|
|
|
456
456
|
deviceData.Device.ProhibitOperationMode = value;
|
|
457
457
|
deviceData.Device.ProhibitPower = value;
|
|
458
458
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.Prohibit;
|
|
459
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
459
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
460
460
|
if (this.logInfo) this.emit('info', `Set local physical controls: ${value ? 'LOCK' : 'UNLOCK'}`);
|
|
461
461
|
} catch (error) {
|
|
462
462
|
if (this.logWarn) this.emit('warn', `Set lock physical controls error: ${error}`);
|
|
@@ -522,7 +522,7 @@ class DeviceAta extends EventEmitter {
|
|
|
522
522
|
break;
|
|
523
523
|
};
|
|
524
524
|
|
|
525
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
525
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
526
526
|
const operationModeText = AirConditioner.OperationMode[deviceData.Device.OperationMode];
|
|
527
527
|
if (this.logInfo) this.emit('info', `Set operation mode: ${operationModeText}`);
|
|
528
528
|
} catch (error) {
|
|
@@ -548,7 +548,7 @@ class DeviceAta extends EventEmitter {
|
|
|
548
548
|
try {
|
|
549
549
|
deviceData.Device.SetTemperature = value;
|
|
550
550
|
deviceData.Device.EffectiveFlags = AirConditioner.EffectiveFlags.SetTemperature;
|
|
551
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
551
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
552
552
|
if (this.logInfo) this.emit('info', `Set temperature: ${value}${this.accessory.temperatureUnit}`);
|
|
553
553
|
} catch (error) {
|
|
554
554
|
if (this.logWarn) this.emit('warn', `Set temperature error: ${error}`);
|
|
@@ -658,7 +658,7 @@ class DeviceAta extends EventEmitter {
|
|
|
658
658
|
break;
|
|
659
659
|
};
|
|
660
660
|
|
|
661
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
661
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
662
662
|
if (this.logInfo) this.emit('info', `${state ? 'Set:' : 'Unset:'} ${name}`);
|
|
663
663
|
} catch (error) {
|
|
664
664
|
if (this.logWarn) this.emit('warn', `Set preset error: ${error}`);
|
|
@@ -898,7 +898,7 @@ class DeviceAta extends EventEmitter {
|
|
|
898
898
|
break;
|
|
899
899
|
};
|
|
900
900
|
|
|
901
|
-
await this.melCloudAta.send(deviceData, this.displayMode);
|
|
901
|
+
await this.melCloudAta.send(this.displayType, deviceData, this.displayMode);
|
|
902
902
|
if (this.logInfo) this.emit('info', `${state ? `Set: ${name}` : `Unset: ${name}, Set: ${button.previousValue}`}`);
|
|
903
903
|
} catch (error) {
|
|
904
904
|
if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
|
package/src/deviceatw.js
CHANGED
|
@@ -16,6 +16,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
16
16
|
AccessoryUUID = api.hap.uuid;
|
|
17
17
|
|
|
18
18
|
//account config
|
|
19
|
+
this.accountMelcloud = account.displayType === 'melcloud' ? true : false;
|
|
19
20
|
this.device = device;
|
|
20
21
|
this.displayMode = device.displayMode;
|
|
21
22
|
this.hideZone = device.hideZone;
|
|
@@ -287,7 +288,7 @@ class DeviceAtw extends EventEmitter {
|
|
|
287
288
|
if (this.logDebug) this.emit('debug', `Prepare accessory`);
|
|
288
289
|
const accessoryName = deviceName;
|
|
289
290
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
290
|
-
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.
|
|
291
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_HEATER, Categories.THERMOSTAT][this.displayMode];
|
|
291
292
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
292
293
|
|
|
293
294
|
//information service
|
package/src/deviceerv.js
CHANGED
|
@@ -16,6 +16,7 @@ class DeviceErv extends EventEmitter {
|
|
|
16
16
|
AccessoryUUID = api.hap.uuid;
|
|
17
17
|
|
|
18
18
|
//account config
|
|
19
|
+
this.accountMelcloud = account.displayType === 'melcloud' ? true : false;
|
|
19
20
|
this.device = device;
|
|
20
21
|
this.displayMode = device.displayMode;
|
|
21
22
|
this.temperatureSensor = device.temperatureSensor || false;
|
|
@@ -249,7 +250,7 @@ class DeviceErv extends EventEmitter {
|
|
|
249
250
|
if (this.logDebug) this.emit('debug', `Prepare accessory`);
|
|
250
251
|
const accessoryName = deviceName;
|
|
251
252
|
const accessoryUUID = AccessoryUUID.generate(accountName + deviceId.toString());
|
|
252
|
-
const accessoryCategory = [Categories.OTHER, Categories.AIR_PURIFIER, Categories.THERMOSTAT][this.
|
|
253
|
+
const accessoryCategory = [Categories.OTHER, Categories.AIR_PURIFIER, Categories.THERMOSTAT][this.displayMode];
|
|
253
254
|
const accessory = new Accessory(accessoryName, accessoryUUID, accessoryCategory);
|
|
254
255
|
|
|
255
256
|
//information service
|
package/src/melcloudata.js
CHANGED
|
@@ -3,7 +3,7 @@ import axios from 'axios';
|
|
|
3
3
|
import EventEmitter from 'events';
|
|
4
4
|
import ImpulseGenerator from './impulsegenerator.js';
|
|
5
5
|
import Functions from './functions.js';
|
|
6
|
-
import { ApiUrls } from './constants.js';
|
|
6
|
+
import { ApiUrls, ApiUrlsHome } from './constants.js';
|
|
7
7
|
|
|
8
8
|
class MelCloudAta extends EventEmitter {
|
|
9
9
|
constructor(device, contextKey, devicesFile) {
|
|
@@ -18,19 +18,44 @@ class MelCloudAta extends EventEmitter {
|
|
|
18
18
|
//set default values
|
|
19
19
|
this.deviceState = {};
|
|
20
20
|
|
|
21
|
+
this.axiosDefaults = {
|
|
22
|
+
timeout: 25000,
|
|
23
|
+
maxContentLength: 100000000,
|
|
24
|
+
maxBodyLength: 1000000000,
|
|
25
|
+
httpsAgent: new Agent({
|
|
26
|
+
keepAlive: false,
|
|
27
|
+
rejectUnauthorized: false
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
|
|
21
31
|
this.axiosInstancePost = axios.create({
|
|
22
32
|
method: 'POST',
|
|
23
33
|
baseURL: ApiUrls.BaseURL,
|
|
24
|
-
timeout: 25000,
|
|
25
34
|
headers: {
|
|
26
35
|
'X-MitsContextKey': contextKey,
|
|
27
36
|
'content-type': 'application/json'
|
|
28
37
|
},
|
|
29
38
|
withCredentials: true,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
...this.axiosDefaults
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
this.axiosInstancePut = axios.create({
|
|
43
|
+
method: 'PUT',
|
|
44
|
+
baseURL: ApiUrlsHome.BaseURL,
|
|
45
|
+
headers: {
|
|
46
|
+
'Accept': '*/*',
|
|
47
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
48
|
+
'Cookie': contextKey,
|
|
49
|
+
'User-Agent': 'homebridge-melcloud-control/4.0.0',
|
|
50
|
+
'DNT': '1',
|
|
51
|
+
'Origin': 'https://melcloudhome.com',
|
|
52
|
+
'Referer': 'https://melcloudhome.com/dashboard',
|
|
53
|
+
'Sec-Fetch-Dest': 'empty',
|
|
54
|
+
'Sec-Fetch-Mode': 'cors',
|
|
55
|
+
'Sec-Fetch-Site': 'same-origin',
|
|
56
|
+
'X-CSRF': '1'
|
|
57
|
+
},
|
|
58
|
+
...this.axiosDefaults
|
|
34
59
|
});
|
|
35
60
|
|
|
36
61
|
//lock flags
|
|
@@ -97,7 +122,7 @@ class MelCloudAta extends EventEmitter {
|
|
|
97
122
|
const inStandbyMode = device.InStandbyMode;
|
|
98
123
|
const defaultCoolingSetTemperature = device.DefaultCoolingSetTemperature;
|
|
99
124
|
const defaultHeatingSetTemperature = device.DefaultHeatingSetTemperature;
|
|
100
|
-
const firmwareAppVersion = device.FirmwareAppVersion
|
|
125
|
+
const firmwareAppVersion = device.FirmwareAppVersion || '4.0.0';
|
|
101
126
|
|
|
102
127
|
//units
|
|
103
128
|
const units = Array.isArray(device.Units) ? device.Units : [];
|
|
@@ -206,76 +231,138 @@ class MelCloudAta extends EventEmitter {
|
|
|
206
231
|
};
|
|
207
232
|
};
|
|
208
233
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
case
|
|
222
|
-
deviceData.Device.
|
|
223
|
-
|
|
224
|
-
|
|
234
|
+
updateData(deviceData) {
|
|
235
|
+
setTimeout(() => {
|
|
236
|
+
this.emit('deviceState', deviceData);
|
|
237
|
+
}, 500);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async send(displayType, deviceData, displayMode) {
|
|
241
|
+
switch (displayType) {
|
|
242
|
+
case "melcloud":
|
|
243
|
+
try {
|
|
244
|
+
//set target temp based on display mode and operation mode
|
|
245
|
+
switch (displayMode) {
|
|
246
|
+
case 1: //Heather/Cooler
|
|
247
|
+
switch (deviceData.Device.OperationMode) {
|
|
248
|
+
case 1: //HEAT
|
|
249
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultHeatingSetTemperature;
|
|
250
|
+
break;
|
|
251
|
+
case 2: //DRY
|
|
252
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
253
|
+
break;
|
|
254
|
+
case 3: //COOL
|
|
255
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
256
|
+
break;
|
|
257
|
+
case 7: //FAN
|
|
258
|
+
deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
|
|
259
|
+
break;
|
|
260
|
+
case 8: //AUTO
|
|
261
|
+
const setTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
262
|
+
deviceData.Device.SetTemperature = setTemperature;
|
|
263
|
+
break;
|
|
264
|
+
case 9: //HISEE HEAT
|
|
265
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultHeatingSetTemperature;
|
|
266
|
+
break;
|
|
267
|
+
case 10: //ISEE DRY
|
|
268
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
269
|
+
break;
|
|
270
|
+
case 11: //ISEE COOL
|
|
271
|
+
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
272
|
+
break;
|
|
273
|
+
};
|
|
274
|
+
case 2: //Thermostat
|
|
225
275
|
deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
|
|
226
276
|
break;
|
|
227
|
-
case 8: //AUTO
|
|
228
|
-
const setTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
229
|
-
deviceData.Device.SetTemperature = setTemperature;
|
|
230
|
-
break;
|
|
231
|
-
case 9: //HISEE HEAT
|
|
232
|
-
deviceData.Device.SetTemperature = deviceData.Device.DefaultHeatingSetTemperature;
|
|
233
|
-
break;
|
|
234
|
-
case 10: //ISEE DRY
|
|
235
|
-
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
236
|
-
break;
|
|
237
|
-
case 11: //ISEE COOL
|
|
238
|
-
deviceData.Device.SetTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
239
|
-
break;
|
|
240
277
|
};
|
|
241
|
-
case 2: //Thermostat
|
|
242
|
-
deviceData.Device.SetTemperature = deviceData.Device.SetTemperature;
|
|
243
|
-
break;
|
|
244
|
-
};
|
|
245
278
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
279
|
+
const payload = {
|
|
280
|
+
data: {
|
|
281
|
+
DeviceID: deviceData.Device.DeviceID,
|
|
282
|
+
EffectiveFlags: deviceData.Device.EffectiveFlags,
|
|
283
|
+
Power: deviceData.Device.Power,
|
|
284
|
+
SetTemperature: deviceData.Device.SetTemperature,
|
|
285
|
+
SetFanSpeed: deviceData.Device.FanSpeed,
|
|
286
|
+
OperationMode: deviceData.Device.OperationMode,
|
|
287
|
+
VaneHorizontal: deviceData.Device.VaneHorizontalDirection,
|
|
288
|
+
VaneVertical: deviceData.Device.VaneVerticalDirection,
|
|
289
|
+
DefaultHeatingSetTemperature: deviceData.Device.DefaultHeatingSetTemperature,
|
|
290
|
+
DefaultCoolingSetTemperature: deviceData.Device.DefaultCoolingSetTemperature,
|
|
291
|
+
ProhibitSetTemperature: deviceData.Device.ProhibitSetTemperature,
|
|
292
|
+
ProhibitOperationMode: deviceData.Device.ProhibitOperationMode,
|
|
293
|
+
ProhibitPower: deviceData.Device.ProhibitPower,
|
|
294
|
+
HideVaneControls: deviceData.HideVaneControls,
|
|
295
|
+
HideDryModeControl: deviceData.HideDryModeControl,
|
|
296
|
+
HasPendingCommand: true
|
|
297
|
+
}
|
|
298
|
+
}
|
|
266
299
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
300
|
+
await this.axiosInstancePost(ApiUrls.SetAta, payload);
|
|
301
|
+
this.updateData(deviceData);
|
|
302
|
+
return true;
|
|
303
|
+
} catch (error) {
|
|
304
|
+
throw new Error(`Send data error: ${error}`);
|
|
305
|
+
};
|
|
306
|
+
case "melcloudhome":
|
|
307
|
+
try {
|
|
308
|
+
//set target temp based on display mode and operation mode
|
|
309
|
+
switch (displayMode) {
|
|
310
|
+
case 1: //Heather/Cooler
|
|
311
|
+
switch (deviceData.Device.OperationMode) {
|
|
312
|
+
case 1: //HEAT
|
|
313
|
+
setTemperature = deviceData.Device.DefaultHeatingSetTemperature;
|
|
314
|
+
break;
|
|
315
|
+
case 2: //DRY
|
|
316
|
+
setTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
317
|
+
break;
|
|
318
|
+
case 3: //COOL
|
|
319
|
+
setTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
320
|
+
break;
|
|
321
|
+
case 7: //FAN
|
|
322
|
+
setTemperature = deviceData.Device.SetTemperature;
|
|
323
|
+
break;
|
|
324
|
+
case 8: //AUTO
|
|
325
|
+
const setTemperature = (deviceData.Device.DefaultCoolingSetTemperature + deviceData.Device.DefaultHeatingSetTemperature) / 2;
|
|
326
|
+
setTemperature = setTemperature;
|
|
327
|
+
break;
|
|
328
|
+
case 9: //HISEE HEAT
|
|
329
|
+
setTemperature = deviceData.Device.DefaultHeatingSetTemperature;
|
|
330
|
+
break;
|
|
331
|
+
case 10: //ISEE DRY
|
|
332
|
+
setTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
333
|
+
break;
|
|
334
|
+
case 11: //ISEE COOL
|
|
335
|
+
setTemperature = deviceData.Device.DefaultCoolingSetTemperature;
|
|
336
|
+
break;
|
|
337
|
+
};
|
|
338
|
+
case 2: //Thermostat
|
|
339
|
+
setTemperature = deviceData.Device.SetTemperature;
|
|
340
|
+
break;
|
|
341
|
+
};
|
|
274
342
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
343
|
+
const payload = {
|
|
344
|
+
data: {
|
|
345
|
+
power: deviceData.Device.Power,
|
|
346
|
+
setTemperature: deviceData.Device.SetTemperature,
|
|
347
|
+
setFanSpeed: deviceData.Device.FanSpeed,
|
|
348
|
+
operationMode: deviceData.Device.OperationMode,
|
|
349
|
+
vaneHorizontalDirection: deviceData.Device.VaneHorizontalDirection,
|
|
350
|
+
vaneVerticalDirection: deviceData.Device.VaneVerticalDirection,
|
|
351
|
+
temperatureIncrementOverride: null,
|
|
352
|
+
inStandbyMode: null,
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const path = ApiUrlsHome.SetAta.replace('deviceid', deviceData.DeviceID);
|
|
357
|
+
await this.axiosInstancePut(path, payload);
|
|
358
|
+
this.updateData(deviceData);
|
|
359
|
+
return true;
|
|
360
|
+
} catch (error) {
|
|
361
|
+
throw new Error(`Send data error: ${error}`);
|
|
362
|
+
};
|
|
363
|
+
default:
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
279
366
|
}
|
|
280
367
|
};
|
|
281
368
|
export default MelCloudAta;
|