Skip to content
This repository was archived by the owner on Oct 24, 2024. It is now read-only.

Commit 3a16b0d

Browse files
committed
Fixed errors when device initializing.
Added new configuration to show/hide temperature, humidity, and air quality sensors.
1 parent e35bfec commit 3a16b0d

File tree

4 files changed

+116
-47
lines changed

4 files changed

+116
-47
lines changed

README.md

+13-4
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ This is Xiaomi Mi Air Purifier plugin for [Homebridge](https://github.com/nfarin
2626
2727
2828
29-
* Display humidity within the **Fan** device.
29+
* Display temperature.
3030
31-
* Display air quality as a separated device **Air Quality Sensor**.
31+
* Display humidity.
32+
33+
* Display air quality.
34+
35+
3236
3337
3438
@@ -44,17 +48,22 @@ This is Xiaomi Mi Air Purifier plugin for [Homebridge](https://github.com/nfarin
4448
4549
4650
47-
2. Add your Accessory to the `config.json`.
51+
2. Add following accessory to the `config.json`.
4852
4953
```
5054
"accessories": [
5155
{
5256
"accessory": "MiAirPurifier",
53-
"name": "Air Purifier"
57+
"name": "Air Purifier",
58+
"showTemperature": true,
59+
"showHumidity": true,
60+
"showAirQuality": true
5461
}
5562
]
5663
```
5764
65+
​**Notes:** Set value for `showTemperature`, `showHumidity`, `showAirQuality` to **true** or **false** to show or hide these sensors in Home app.
66+
5867
5968
6069
3. Restart Homebridge, and your Mi air purifier will be discovered automatically.

example.config.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
"accessories": [
1010
{
1111
"accessory": "MiAirPurifier",
12-
"name": "Air Purifier"
12+
"name": "Air Purifier",
13+
"showTemperature": true,
14+
"showHumidity": true,
15+
"showAirQuality": true
1316
}
1417
]
1518
}

index.js

+98-41
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,81 @@
11
var miio = require('miio');
2-
var Accessory, Service, Characteristic, UUIDGen;
2+
var Accessory, Service, Characteristic;
33
var devices = [];
44

55
module.exports = function(homebridge) {
66
Accessory = homebridge.platformAccessory;
77
Service = homebridge.hap.Service;
88
Characteristic = homebridge.hap.Characteristic;
9-
UUIDGen = homebridge.hap.uuid;
109

1110
homebridge.registerAccessory('homebridge-mi-air-purifier', 'MiAirPurifier', MiAirPurifier);
1211
}
1312

1413
function MiAirPurifier(log, config) {
1514
this.log = log;
1615
this.name = config.name || 'Air Purifier';
16+
this.showAirQuality = config.showAirQuality || false;
17+
this.showTemperature = config.showTemperature || false;
18+
this.showHumidity = config.showTemperature || false;
1719

20+
this.services = [];
21+
22+
// Modes supported
1823
this.modes = [
1924
[0, 'idle'], [60, 'auto'], [80, 'silent'], [100, 'favorite']
2025
];
2126

22-
// Air purifier is not available in Homekit yet, use as fan for now
27+
// Air purifier is not available in Homekit yet, register as Fan
2328
this.fanService = new Service.Fan(this.name);
2429

25-
// Register another service as air quality sensor
26-
this.airQualitySensorService = new Service.AirQualitySensor('Air Quality Sensor');
30+
this.fanService
31+
.getCharacteristic(Characteristic.On)
32+
.on('get', this.getPowerState.bind(this))
33+
.on('set', this.setPowerState.bind(this));
34+
35+
this.fanService
36+
.getCharacteristic(Characteristic.RotationSpeed)
37+
.on('get', this.getRotationSpeed.bind(this))
38+
.on('set', this.setRotationSpeed.bind(this));
39+
40+
this.services.push(this.fanService);
2741

2842
this.serviceInfo = new Service.AccessoryInformation();
2943

3044
this.serviceInfo
3145
.setCharacteristic(Characteristic.Manufacturer, 'Xiaomi')
3246
.setCharacteristic(Characteristic.Model, 'Air Purifier');
47+
48+
this.services.push(this.serviceInfo);
3349

34-
this.fanService
35-
.getCharacteristic(Characteristic.On)
36-
.on('get', this.getOn.bind(this))
37-
.on('set', this.setOn.bind(this));
50+
if(this.showAirQuality){
51+
this.airQualitySensorService = new Service.AirQualitySensor('Air Quality Sensor');
3852

39-
this.fanService
40-
.getCharacteristic(Characteristic.RotationSpeed)
41-
.on('get', this.getRotationSpeed.bind(this))
42-
.on('set', this.setRotationSpeed.bind(this));
53+
this.airQualitySensorService
54+
.getCharacteristic(Characteristic.AirQuality)
55+
.on('get', this.getAirQuality.bind(this));
4356

44-
this.fanService
45-
.addCharacteristic(Characteristic.CurrentRelativeHumidity)
46-
.on('get', this.getCurrentRelativeHumidity.bind(this));
57+
this.services.push(this.airQualitySensorService);
58+
}
59+
60+
if(this.showTemperature){
61+
this.temperatureSensorService = new Service.TemperatureSensor('Temperature');
62+
63+
this.temperatureSensorService
64+
.getCharacteristic(Characteristic.CurrentTemperature)
65+
.on('get', this.getCurrentTemperature.bind(this));
66+
67+
this.services.push(this.temperatureSensorService);
68+
}
4769

48-
this.airQualitySensorService
49-
.getCharacteristic(Characteristic.AirQuality)
50-
.on('get', this.getAirQuality.bind(this));
70+
if(this.showHumidity){
71+
this.humiditySensorService = new Service.HumiditySensor('Humidity');
72+
73+
this.humiditySensorService
74+
.getCharacteristic(Characteristic.CurrentRelativeHumidity)
75+
.on('get', this.getCurrentRelativeHumidity.bind(this));
76+
77+
this.services.push(this.humiditySensorService);
78+
}
5179

5280
this.discover();
5381
}
@@ -93,39 +121,54 @@ MiAirPurifier.prototype = {
93121
});
94122
},
95123

96-
getOn: function(callback) {
124+
getPowerState: function(callback) {
125+
if(!this.device){
126+
callback(null, false);
127+
return;
128+
}
129+
97130
callback(null, this.device.power);
98131
},
99132

100-
setOn: function(powerOn, callback) {
133+
setPowerState: function(state, callback) {
101134
if(!this.device){
102135
callback(new Error('No air purifier is discovered.'));
103136
return;
104137
}
105138

106-
var accessory = this;
107-
108-
this.device.setPower(powerOn)
109-
.then(function(state){
110-
callback(null, state);
111-
});
112-
139+
this.device.setPower(state);
113140
callback();
114141
},
115142

116143
getCurrentRelativeHumidity: function(callback) {
144+
if(!this.device){
145+
callback(null, 0);
146+
return;
147+
}
148+
117149
callback(null, this.device.humidity);
118150
},
119151

120152
getRotationSpeed: function(callback) {
153+
if(!this.device){
154+
callback(null, 0);
155+
return;
156+
}
157+
121158
for(var item of this.modes){
122159
if(this.device.mode == item[1]){
123160
callback(null, item[0]);
161+
return;
124162
}
125163
}
126164
},
127165

128166
setRotationSpeed: function(speed, callback) {
167+
if(!this.device){
168+
callback(new Error('No air purifier is discovered.'));
169+
return;
170+
}
171+
129172
for(var item of this.modes){
130173
if(speed <= item[0]){
131174
this.log.debug('Set mode: ' + item[1]);
@@ -138,31 +181,45 @@ MiAirPurifier.prototype = {
138181
},
139182

140183
getAirQuality: function(callback) {
141-
var airQuality = Characteristic.AirQuality.UNKNOWN;
184+
if(!this.device){
185+
callback(null, Characteristic.AirQuality.UNKNOWN);
186+
return;
187+
}
142188

143-
if(this.device.aqi > 200)
144-
airQuality = Characteristic.AirQuality.POOR;
189+
var levels = [
190+
[200, Characteristic.AirQuality.POOR],
191+
[150, Characteristic.AirQuality.INFERIOR],
192+
[100, Characteristic.AirQuality.FAIR],
193+
[50, Characteristic.AirQuality.GOOD],
194+
[0, Characteristic.AirQuality.EXCELLENT],
195+
];
145196

146-
else if(this.device.aqi > 150)
147-
airQuality = Characteristic.AirQuality.INFERIOR;
197+
var quality = Characteristic.AirQuality.UNKNOWN;
148198

149-
else if(this.device.aqi > 100)
150-
airQuality = Characteristic.AirQuality.FAIR;
199+
for(var item of levels){
200+
if(this.device.aqi > item[0]){
201+
quality = item[1];
202+
break;
203+
}
204+
}
151205

152-
else if(this.device.aqi > 50)
153-
airQuality = Characteristic.AirQuality.GOOD;
206+
callback(null, quality);
207+
},
154208

155-
else
156-
airQuality = Characteristic.AirQuality.EXCELLENT;
209+
getCurrentTemperature: function(callback) {
210+
if(!this.device){
211+
callback(null, 0);
212+
return;
213+
}
157214

158-
callback(null, airQuality);
215+
callback(null, this.device.temperature);
159216
},
160217

161218
identify: function(callback) {
162219
callback();
163220
},
164221

165222
getServices: function() {
166-
return [this.serviceInfo, this.fanService, this.airQualitySensorService];
223+
return this.services;
167224
}
168225
};

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "homebridge-mi-air-purifier",
3-
"version": "1.0.2",
3+
"version": "1.1.0",
44
"description": "Xiaomi Mi air purifier plugin for Homebridge.",
55
"license": "MIT",
66
"keywords": [

0 commit comments

Comments
 (0)