homebridge-midea-platform 1.2.0-beta.8 → 1.2.2
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/CHANGELOG.md +5 -2
- package/README.md +2 -2
- package/dist/accessory/AccessoryFactory.d.ts +14 -15
- package/dist/accessory/AccessoryFactory.js +34 -40
- package/dist/accessory/AccessoryFactory.js.map +1 -1
- package/dist/accessory/AirConditionerAccessory.d.ts +98 -99
- package/dist/accessory/AirConditionerAccessory.js +666 -662
- package/dist/accessory/AirConditionerAccessory.js.map +1 -1
- package/dist/accessory/BaseAccessory.d.ts +11 -12
- package/dist/accessory/BaseAccessory.js +21 -21
- package/dist/accessory/BaseAccessory.js.map +1 -1
- package/dist/accessory/DehumidifierAccessory.d.ts +45 -46
- package/dist/accessory/DehumidifierAccessory.js +343 -344
- package/dist/accessory/DehumidifierAccessory.js.map +1 -1
- package/dist/accessory/DishwasherAccessory.d.ts +30 -31
- package/dist/accessory/DishwasherAccessory.js +59 -63
- package/dist/accessory/DishwasherAccessory.js.map +1 -1
- package/dist/accessory/ElectricWaterHeaterAccessory.d.ts +44 -45
- package/dist/accessory/ElectricWaterHeaterAccessory.js +172 -176
- package/dist/accessory/ElectricWaterHeaterAccessory.js.map +1 -1
- package/dist/accessory/FanAccessory.d.ts +39 -40
- package/dist/accessory/FanAccessory.js +120 -123
- package/dist/accessory/FanAccessory.js.map +1 -1
- package/dist/accessory/FrontLoadWasherAccessory.d.ts +30 -31
- package/dist/accessory/FrontLoadWasherAccessory.js +63 -66
- package/dist/accessory/FrontLoadWasherAccessory.js.map +1 -1
- package/dist/accessory/GasWaterHeaterAccessory.d.ts +51 -52
- package/dist/accessory/GasWaterHeaterAccessory.js +217 -216
- package/dist/accessory/GasWaterHeaterAccessory.js.map +1 -1
- package/dist/accessory/{HeatPumpWifiControllerAccessory.d.ts → HeatPumpWiFiControllerAccessory.d.ts} +34 -35
- package/dist/accessory/{HeatPumpWifiControllerAccessory.js → HeatPumpWiFiControllerAccessory.js} +55 -36
- package/dist/accessory/HeatPumpWiFiControllerAccessory.js.map +1 -0
- package/dist/core/MideaCloud.d.ts +34 -36
- package/dist/core/MideaCloud.js +349 -350
- package/dist/core/MideaCloud.js.map +1 -1
- package/dist/core/MideaConstants.d.ts +51 -52
- package/dist/core/MideaConstants.js +56 -59
- package/dist/core/MideaConstants.js.map +1 -1
- package/dist/core/MideaDevice.d.ts +75 -78
- package/dist/core/MideaDevice.js +430 -420
- package/dist/core/MideaDevice.js.map +1 -1
- package/dist/core/MideaDiscover.d.ts +34 -36
- package/dist/core/MideaDiscover.js +208 -212
- package/dist/core/MideaDiscover.js.map +1 -1
- package/dist/core/MideaMessage.d.ts +75 -76
- package/dist/core/MideaMessage.js +185 -184
- package/dist/core/MideaMessage.js.map +1 -1
- package/dist/core/MideaPacketBuilder.d.ts +9 -11
- package/dist/core/MideaPacketBuilder.js +60 -60
- package/dist/core/MideaPacketBuilder.js.map +1 -1
- package/dist/core/MideaSecurity.d.ts +62 -64
- package/dist/core/MideaSecurity.js +241 -251
- package/dist/core/MideaSecurity.js.map +1 -1
- package/dist/core/MideaUtils.d.ts +31 -33
- package/dist/core/MideaUtils.js +178 -181
- package/dist/core/MideaUtils.js.map +1 -1
- package/dist/devices/DeviceFactory.d.ts +14 -15
- package/dist/devices/DeviceFactory.js +34 -40
- package/dist/devices/DeviceFactory.js.map +1 -1
- package/dist/devices/a1/MideaA1Device.d.ts +75 -77
- package/dist/devices/a1/MideaA1Device.js +142 -145
- package/dist/devices/a1/MideaA1Device.js.map +1 -1
- package/dist/devices/a1/MideaA1Message.d.ts +39 -41
- package/dist/devices/a1/MideaA1Message.js +219 -198
- package/dist/devices/a1/MideaA1Message.js.map +1 -1
- package/dist/devices/ac/MideaACDevice.d.ts +105 -107
- package/dist/devices/ac/MideaACDevice.js +417 -400
- package/dist/devices/ac/MideaACDevice.js.map +1 -1
- package/dist/devices/ac/MideaACMessage.d.ts +97 -96
- package/dist/devices/ac/MideaACMessage.js +724 -621
- package/dist/devices/ac/MideaACMessage.js.map +1 -1
- package/dist/devices/c3/MideaC3Device.d.ts +73 -75
- package/dist/devices/c3/MideaC3Device.js +249 -255
- package/dist/devices/c3/MideaC3Device.js.map +1 -1
- package/dist/devices/c3/MideaC3Message.d.ts +81 -80
- package/dist/devices/c3/MideaC3Message.js +190 -152
- package/dist/devices/c3/MideaC3Message.js.map +1 -1
- package/dist/devices/db/MideaDBDevice.d.ts +28 -30
- package/dist/devices/db/MideaDBDevice.js +94 -100
- package/dist/devices/db/MideaDBDevice.js.map +1 -1
- package/dist/devices/db/MideaDBMessage.d.ts +31 -33
- package/dist/devices/db/MideaDBMessage.js +101 -101
- package/dist/devices/db/MideaDBMessage.js.map +1 -1
- package/dist/devices/e1/MideaE1Device.d.ts +55 -57
- package/dist/devices/e1/MideaE1Device.js +122 -128
- package/dist/devices/e1/MideaE1Device.js.map +1 -1
- package/dist/devices/e1/MideaE1Message.d.ts +27 -29
- package/dist/devices/e1/MideaE1Message.js +128 -107
- package/dist/devices/e1/MideaE1Message.js.map +1 -1
- package/dist/devices/e2/MideaE2Device.d.ts +43 -45
- package/dist/devices/e2/MideaE2Device.js +124 -129
- package/dist/devices/e2/MideaE2Device.js.map +1 -1
- package/dist/devices/e2/MideaE2Message.d.ts +34 -34
- package/dist/devices/e2/MideaE2Message.js +143 -132
- package/dist/devices/e2/MideaE2Message.js.map +1 -1
- package/dist/devices/e3/MideaE3Device.d.ts +42 -44
- package/dist/devices/e3/MideaE3Device.js +132 -137
- package/dist/devices/e3/MideaE3Device.js.map +1 -1
- package/dist/devices/e3/MideaE3Message.d.ts +51 -52
- package/dist/devices/e3/MideaE3Message.js +144 -136
- package/dist/devices/e3/MideaE3Message.js.map +1 -1
- package/dist/devices/fa/MideaFADevice.d.ts +35 -37
- package/dist/devices/fa/MideaFADevice.js +102 -106
- package/dist/devices/fa/MideaFADevice.js.map +1 -1
- package/dist/devices/fa/MideaFAMessage.d.ts +38 -39
- package/dist/devices/fa/MideaFAMessage.js +108 -98
- package/dist/devices/fa/MideaFAMessage.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +61 -61
- package/dist/platform.js +232 -212
- package/dist/platform.js.map +1 -1
- package/dist/platformUtils.d.ts +116 -117
- package/dist/platformUtils.js +107 -110
- package/dist/platformUtils.js.map +1 -1
- package/dist/settings.d.ts +8 -9
- package/dist/settings.js +8 -11
- package/dist/settings.js.map +1 -1
- package/docs/download_lua.md +9 -0
- package/eslint.config.js +43 -0
- package/homebridge-ui/public/js/bootstrap.min.js +1179 -1
- package/homebridge-ui/server.js +157 -84
- package/package.json +21 -31
- package/.eslintignore +0 -3
- package/.husky/pre-commit +0 -5
- package/.prettierrc +0 -19
- package/dist/accessory/AccessoryFactory.d.ts.map +0 -1
- package/dist/accessory/AirConditionerAccessory.d.ts.map +0 -1
- package/dist/accessory/BaseAccessory.d.ts.map +0 -1
- package/dist/accessory/DehumidifierAccessory.d.ts.map +0 -1
- package/dist/accessory/DishwasherAccessory.d.ts.map +0 -1
- package/dist/accessory/ElectricWaterHeaterAccessory.d.ts.map +0 -1
- package/dist/accessory/FanAccessory.d.ts.map +0 -1
- package/dist/accessory/FrontLoadWasherAccessory.d.ts.map +0 -1
- package/dist/accessory/GasWaterHeaterAccessory.d.ts.map +0 -1
- package/dist/accessory/HeatPumpWifiControllerAccessory.d.ts.map +0 -1
- package/dist/accessory/HeatPumpWifiControllerAccessory.js.map +0 -1
- package/dist/core/MideaCloud.d.ts.map +0 -1
- package/dist/core/MideaConstants.d.ts.map +0 -1
- package/dist/core/MideaDevice.d.ts.map +0 -1
- package/dist/core/MideaDiscover.d.ts.map +0 -1
- package/dist/core/MideaMessage.d.ts.map +0 -1
- package/dist/core/MideaPacketBuilder.d.ts.map +0 -1
- package/dist/core/MideaSecurity.d.ts.map +0 -1
- package/dist/core/MideaUtils.d.ts.map +0 -1
- package/dist/devices/DeviceFactory.d.ts.map +0 -1
- package/dist/devices/a1/MideaA1Device.d.ts.map +0 -1
- package/dist/devices/a1/MideaA1Message.d.ts.map +0 -1
- package/dist/devices/ac/MideaACDevice.d.ts.map +0 -1
- package/dist/devices/ac/MideaACMessage.d.ts.map +0 -1
- package/dist/devices/c3/MideaC3Device.d.ts.map +0 -1
- package/dist/devices/c3/MideaC3Message.d.ts.map +0 -1
- package/dist/devices/db/MideaDBDevice.d.ts.map +0 -1
- package/dist/devices/db/MideaDBMessage.d.ts.map +0 -1
- package/dist/devices/e1/MideaE1Device.d.ts.map +0 -1
- package/dist/devices/e1/MideaE1Message.d.ts.map +0 -1
- package/dist/devices/e2/MideaE2Device.d.ts.map +0 -1
- package/dist/devices/e2/MideaE2Message.d.ts.map +0 -1
- package/dist/devices/e3/MideaE3Device.d.ts.map +0 -1
- package/dist/devices/e3/MideaE3Message.d.ts.map +0 -1
- package/dist/devices/fa/MideaFADevice.d.ts.map +0 -1
- package/dist/devices/fa/MideaFAMessage.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/platform.d.ts.map +0 -1
- package/dist/platformUtils.d.ts.map +0 -1
- package/dist/settings.d.ts.map +0 -1
package/dist/platform.js
CHANGED
|
@@ -1,214 +1,234 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
this.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
//
|
|
44
|
-
this.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
this.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
// token/key
|
|
175
|
-
this.log.info(`[${device_info.name}]
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
//
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
1
|
+
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
2
|
+
import Discover from './core/MideaDiscover.js';
|
|
3
|
+
import { ProtocolVersion } from './core/MideaConstants.js';
|
|
4
|
+
import AccessoryFactory from './accessory/AccessoryFactory.js';
|
|
5
|
+
import DeviceFactory from './devices/DeviceFactory.js';
|
|
6
|
+
import { defaultConfig, defaultDeviceConfig } from './platformUtils.js';
|
|
7
|
+
import lodash from 'lodash';
|
|
8
|
+
const { defaultsDeep } = lodash;
|
|
9
|
+
// export interface MideaAccessory extends PlatformAccessory {
|
|
10
|
+
// context: {
|
|
11
|
+
// token: string;
|
|
12
|
+
// key: string;
|
|
13
|
+
// id: string;
|
|
14
|
+
// type: string;
|
|
15
|
+
// sn: string;
|
|
16
|
+
// model: string;
|
|
17
|
+
// serviceVersion: number;
|
|
18
|
+
// };
|
|
19
|
+
// }
|
|
20
|
+
export class MideaPlatform {
|
|
21
|
+
log;
|
|
22
|
+
config;
|
|
23
|
+
api;
|
|
24
|
+
Service;
|
|
25
|
+
Characteristic;
|
|
26
|
+
accessories = new Map();
|
|
27
|
+
discoveredCacheUUIDs = [];
|
|
28
|
+
// Keep track of all devices discovered by broadcast
|
|
29
|
+
discoveredDevices = new Map();
|
|
30
|
+
discoveryInterval = 60; // seconds
|
|
31
|
+
discover;
|
|
32
|
+
// Need seperate variable because the DynamicPlatformPlugin constructor won't accept anything but the PlatformConfig type
|
|
33
|
+
platformConfig;
|
|
34
|
+
constructor(log, config, api) {
|
|
35
|
+
this.log = log;
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.api = api;
|
|
38
|
+
this.Service = api.hap.Service;
|
|
39
|
+
this.Characteristic = api.hap.Characteristic;
|
|
40
|
+
Error.stackTraceLimit = 100;
|
|
41
|
+
// Add default config values
|
|
42
|
+
this.platformConfig = defaultsDeep(config, defaultConfig);
|
|
43
|
+
// Enforce min/max values
|
|
44
|
+
this.platformConfig.refreshInterval = Math.max(0, Math.min(this.platformConfig.refreshInterval, 86400));
|
|
45
|
+
this.platformConfig.heartbeatInterval = Math.max(10, Math.min(this.platformConfig.heartbeatInterval, 120));
|
|
46
|
+
// debug log configuration
|
|
47
|
+
this.log.debug(`Configuration:\n${JSON.stringify(this.platformConfig, null, 2)}`);
|
|
48
|
+
this.discover = new Discover(log);
|
|
49
|
+
// Register callback with Discover class that is called for each device as
|
|
50
|
+
// they are discovered on the network.
|
|
51
|
+
this.discover.on('device', this.deviceDiscovered.bind(this));
|
|
52
|
+
// Register callback with Discover class that is called when we have exhausted
|
|
53
|
+
// all retries to discover devices. We can now check what was found.
|
|
54
|
+
this.discover.on('complete', this.discoveryComplete.bind(this));
|
|
55
|
+
// When this event is fired it means Homebridge has restored all cached accessories from disk.
|
|
56
|
+
// Dynamic Platform plugins should only register new accessories after this event was fired,
|
|
57
|
+
// in order to ensure they weren't added to homebridge already. This event can also be used
|
|
58
|
+
// to start discovery of new accessories.
|
|
59
|
+
this.api.on('didFinishLaunching', this.finishedLaunching.bind(this));
|
|
60
|
+
}
|
|
61
|
+
/*********************************************************************
|
|
62
|
+
* finishedLaunching
|
|
63
|
+
* Function called when Homebridge has finished loading the plugin.
|
|
64
|
+
*/
|
|
65
|
+
finishedLaunching() {
|
|
66
|
+
this.log.info('Start device discovery...');
|
|
67
|
+
// If IP address is in config then probe them directly
|
|
68
|
+
this.platformConfig.devices.forEach((device) => {
|
|
69
|
+
// for some reason, assigning the regex has to be inside the loop, else fails after first pass.
|
|
70
|
+
const regexIPv4 = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gi;
|
|
71
|
+
// Pull in defaults
|
|
72
|
+
device = defaultsDeep(device, defaultDeviceConfig);
|
|
73
|
+
const ip = device.advanced_options.ip.toString().trim();
|
|
74
|
+
if (regexIPv4.test(ip)) {
|
|
75
|
+
this.discover.discoverDeviceByIP(ip);
|
|
76
|
+
}
|
|
77
|
+
else if (ip) {
|
|
78
|
+
// IP is non-empty, non-null, but not valid IP address
|
|
79
|
+
this.log.warn(`[${device.name}] Invalid IP address in configuration: ${ip}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// And then send broadcast to network(s)
|
|
83
|
+
this.discover.startDiscover();
|
|
84
|
+
}
|
|
85
|
+
/*********************************************************************
|
|
86
|
+
* deviceDiscovered
|
|
87
|
+
* Function called by the 'device' on handler.
|
|
88
|
+
*/
|
|
89
|
+
deviceDiscovered(device_info) {
|
|
90
|
+
// Find device specific configuration from within the homebridge config file.
|
|
91
|
+
// If we have configuration indexed by ID use that, if not use IP address.
|
|
92
|
+
const deviceConfig = this.platformConfig.devices.find((device) => device.id === device_info.id);
|
|
93
|
+
if (deviceConfig) {
|
|
94
|
+
// keep track of discovered devices
|
|
95
|
+
this.discoveredDevices.set(device_info.id, true);
|
|
96
|
+
// Override name with that provided in the config.json settings
|
|
97
|
+
device_info.name = deviceConfig.name ?? device_info.name;
|
|
98
|
+
this.addDevice(device_info, deviceConfig);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.log.warn(`[${device_info.name} | ${device_info.ip}}] New device discovered, you must add it to the config.json settings.`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/*********************************************************************
|
|
105
|
+
* discoveryComplete
|
|
106
|
+
* Function called by the 'complete' on handler.
|
|
107
|
+
*/
|
|
108
|
+
discoveryComplete() {
|
|
109
|
+
this.log.debug('Discovery complete, check for missing devices');
|
|
110
|
+
// Check if network broadcasting found all devices that user configured. If not then
|
|
111
|
+
// we have to handle those.
|
|
112
|
+
let missingDevices = 0;
|
|
113
|
+
this.platformConfig.devices.forEach((device) => {
|
|
114
|
+
if (!this.discoveredDevices.get(device.id)) {
|
|
115
|
+
// This device was not found by network discovery.
|
|
116
|
+
missingDevices++;
|
|
117
|
+
if (this.discoveredDevices.get(device.id) === undefined) {
|
|
118
|
+
this.discoveredDevices.set(device.id, false);
|
|
119
|
+
this.log.warn(`[${device.name}] Device not found (id: ${device.id}), will retry every ${this.discoveryInterval} seconds`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.log.debug(`[${device.name}] Device not found (id: ${device.id}), will retry in ${this.discoveryInterval} seconds`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
if (missingDevices > 0) {
|
|
127
|
+
// Some devices not found. Keep retrying periodically until all are found.
|
|
128
|
+
setTimeout(() => {
|
|
129
|
+
missingDevices = 0;
|
|
130
|
+
// on repeat attempts only retry once (so two broadcasts sent), 3000 miliseconds apart.
|
|
131
|
+
this.discover.startDiscover(1, 3000);
|
|
132
|
+
}, this.discoveryInterval * 1000);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.log.info('All configured devices added to Homebridge');
|
|
136
|
+
}
|
|
137
|
+
// Delete not existing, but cached accessories
|
|
138
|
+
// for (const [uuid, accessory] of this.accessories) {
|
|
139
|
+
// if (!this.discoveredCacheUUIDs.includes(uuid)) {
|
|
140
|
+
// this.log.info('Removing existing accessory from cache:', accessory.displayName);
|
|
141
|
+
// this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
|
142
|
+
// }
|
|
143
|
+
// }
|
|
144
|
+
}
|
|
145
|
+
/*********************************************************************
|
|
146
|
+
* addDevice
|
|
147
|
+
* Called for each device as discovered on the network. Creates the
|
|
148
|
+
* Midea device handler and the associated Homebridge accessory.
|
|
149
|
+
*/
|
|
150
|
+
async addDevice(device_info, deviceConfig) {
|
|
151
|
+
const uuid = this.api.hap.uuid.generate(device_info.id.toString());
|
|
152
|
+
const existingAccessory = this.accessories.get(uuid);
|
|
153
|
+
// Add default config values
|
|
154
|
+
defaultsDeep(deviceConfig, defaultDeviceConfig);
|
|
155
|
+
const device = DeviceFactory.createDevice(this.log, device_info, this.platformConfig, deviceConfig);
|
|
156
|
+
if (device === null) {
|
|
157
|
+
this.log.error(`Device type is unsupported by the plugin: ${device_info.type}`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
if (existingAccessory) {
|
|
161
|
+
// the accessory already exists, restore from Homebridge cache
|
|
162
|
+
this.log.info(`[${device_info.name}] Restoring existing accessory from cache: ${existingAccessory.displayName}`);
|
|
163
|
+
try {
|
|
164
|
+
// Token/key is only required for V3 devices
|
|
165
|
+
if (device_info.version === ProtocolVersion.V3) {
|
|
166
|
+
if (deviceConfig.advanced_options.token && deviceConfig.advanced_options.key) {
|
|
167
|
+
// token/key provided in config file, use those... replacing values in cached context
|
|
168
|
+
this.log.info(`[${device_info.name}] Cached device, using token/key from config file`);
|
|
169
|
+
existingAccessory.context.token = deviceConfig.advanced_options.token;
|
|
170
|
+
existingAccessory.context.key = deviceConfig.advanced_options.key;
|
|
171
|
+
device.setCredentials(Buffer.from(existingAccessory.context.token, 'hex'), Buffer.from(existingAccessory.context.key, 'hex'));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// use token/key values from the accessory cached context
|
|
175
|
+
this.log.info(`[${device_info.name}] Cached device, using saved credentials`);
|
|
176
|
+
device.setCredentials(Buffer.from(existingAccessory.context.token, 'hex'), Buffer.from(existingAccessory.context.key, 'hex'));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
await device.connect(true);
|
|
180
|
+
AccessoryFactory.createAccessory(this, existingAccessory, device, deviceConfig);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
const msg = err instanceof Error ? err.stack : err;
|
|
184
|
+
this.log.error(`Cannot connect to device from cache ${device_info.ip}:${device_info.port}, error:\n${msg}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
try {
|
|
189
|
+
this.log.info('Adding new accessory:', device_info.name);
|
|
190
|
+
const accessory = new this.api.platformAccessory(device_info.name, uuid);
|
|
191
|
+
// Token/key is only required for V3 devices
|
|
192
|
+
if (device_info.version === ProtocolVersion.V3) {
|
|
193
|
+
if (deviceConfig.advanced_options.token && deviceConfig.advanced_options.key) {
|
|
194
|
+
// token/key provided in config file, use those... set values in cached context
|
|
195
|
+
this.log.info(`[${device_info.name}] New device at ${device_info.ip}:${device_info.port}, using token/key from config file`);
|
|
196
|
+
accessory.context.token = deviceConfig.advanced_options.token;
|
|
197
|
+
accessory.context.key = deviceConfig.advanced_options.key;
|
|
198
|
+
accessory.context.id = device_info.id.toString();
|
|
199
|
+
device.setCredentials(Buffer.from(accessory.context.token, 'hex'), Buffer.from(accessory.context.key, 'hex'));
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
throw new Error('Token/key not provided in config file, cannot add new device');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
await device.connect(false);
|
|
206
|
+
await device.refresh_status();
|
|
207
|
+
// Set serial number and model into the context if they are provided.
|
|
208
|
+
accessory.context.sn = device_info.sn ?? 'unknown';
|
|
209
|
+
accessory.context.model = device_info.model ?? 'unknown';
|
|
210
|
+
// create the accessory handler for the newly create accessory
|
|
211
|
+
// this is imported from `platformAccessory.ts`
|
|
212
|
+
AccessoryFactory.createAccessory(this, accessory, device, deviceConfig);
|
|
213
|
+
// link the accessory to your platform
|
|
214
|
+
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
197
217
|
this.log.error(`[${device_info.name} | ${device_info.ip}:${device_info.port}}]
|
|
198
|
-
Cannot add new device ${device_info.ip}:${device_info.port}, error:\n${err}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
*
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
|
|
218
|
+
Cannot add new device ${device_info.ip}:${device_info.port}, error:\n${err}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
this.discoveredCacheUUIDs.push(uuid);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* This function is invoked when homebridge restores cached accessories from disk at startup.
|
|
226
|
+
* It should be used to setup event handlers for characteristics and update respective values.
|
|
227
|
+
*/
|
|
228
|
+
configureAccessory(accessory) {
|
|
229
|
+
this.log.info('Loading accessory from cache:', accessory.displayName);
|
|
230
|
+
// add the restored accessory to the accessories cache so we can track if it has already been registered
|
|
231
|
+
this.accessories.set(accessory.UUID, accessory);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
214
234
|
//# sourceMappingURL=platform.js.map
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|