homebridge-mi-airpurifier
Version:
XiaoMi air purifier plugins for HomeBridge(https://github.com/nfarina/homebridge).
691 lines (621 loc) • 37.1 kB
JavaScript
require('./Base');
const inherits = require('util').inherits;
const miio = require('miio');
var Accessory, PlatformAccessory, Service, Characteristic, UUIDGen;
MiAirPurifierPro = function(platform, config) {
this.init(platform, config);
Accessory = platform.Accessory;
PlatformAccessory = platform.PlatformAccessory;
Service = platform.Service;
Characteristic = platform.Characteristic;
UUIDGen = platform.UUIDGen;
this.device = new miio.Device({
address: this.config['ip'],
token: this.config['token']
});
this.accessories = {};
if(!this.config['airPurifierDisable'] && this.config['airPurifierName'] && this.config['airPurifierName'] != "" && this.config['silentModeSwitchName'] && this.config['silentModeSwitchName'] != "") {
this.accessories['airPurifierAccessory'] = new MiAirPurifierProAirPurifierAccessory(this);
}
if(!this.config['temperatureDisable'] && this.config['temperatureName'] && this.config['temperatureName'] != "") {
this.accessories['temperatureAccessory'] = new MiAirPurifierProTemperatureAccessory(this);
}
if(!this.config['humidityDisable'] && this.config['humidityName'] && this.config['humidityName'] != "") {
this.accessories['humidityAccessory'] = new MiAirPurifierProHumidityAccessory(this);
}
if(!this.config['buzzerSwitchDisable'] && this.config['buzzerSwitchName'] && this.config['buzzerSwitchName'] != "") {
// this.accessories['buzzerSpeakerAccessory'] = new MiAirPurifierProBuzzerSpeakerAccessory(this);
this.accessories['buzzerSwitchAccessory'] = new MiAirPurifierProBuzzerSwitchAccessory(this);
}
if(!this.config['ledBulbDisable'] && this.config['ledBulbName'] && this.config['ledBulbName'] != "") {
this.accessories['ledBulbAccessory'] = new MiAirPurifierProLEDBulbAccessory(this);
}
if(!this.config['airQualityDisable'] && this.config['airQualityName'] && this.config['airQualityName'] != "") {
this.accessories['airQualityAccessory'] = new MiAirPurifierProAirQualityAccessory(this);
}
var accessoriesArr = this.obj2array(this.accessories);
this.platform.log.debug("[MiAirPurifierPlatform][DEBUG]Initializing " + this.config["type"] + " device: " + this.config["ip"] + ", accessories size: " + accessoriesArr.length);
return accessoriesArr;
}
inherits(MiAirPurifierPro, Base);
MiAirPurifierProAirPurifierAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['airPurifierName'];
this.silentModeSwitchDisable = dThis.config['silentModeSwitchDisable'];
this.silentModeSwitchName = dThis.config['silentModeSwitchName'];
this.platform = dThis.platform;
}
MiAirPurifierProAirPurifierAccessory.prototype.getServices = function() {
var that = this;
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var silentModeSwitch = new Service.Switch(this.silentModeSwitchName);
var silentModeOnCharacteristic = silentModeSwitch.getCharacteristic(Characteristic.On);
if(!this.silentModeSwitchDisable) {
services.push(silentModeSwitch);
}
var airPurifierService = new Service.AirPurifier(this.name);
var activeCharacteristic = airPurifierService.getCharacteristic(Characteristic.Active);
var currentAirPurifierStateCharacteristic = airPurifierService.getCharacteristic(Characteristic.CurrentAirPurifierState);
var targetAirPurifierStateCharacteristic = airPurifierService.getCharacteristic(Characteristic.TargetAirPurifierState);
var lockPhysicalControlsCharacteristic = airPurifierService.addCharacteristic(Characteristic.LockPhysicalControls);
var rotationSpeedCharacteristic = airPurifierService.addCharacteristic(Characteristic.RotationSpeed);
var currentTemperatureCharacteristic = airPurifierService.addCharacteristic(Characteristic.CurrentTemperature);
var currentRelativeHumidityCharacteristic = airPurifierService.addCharacteristic(Characteristic.CurrentRelativeHumidity);
var pm25DensityCharacteristic = airPurifierService.addCharacteristic(Characteristic.PM2_5Density);
var airQualityCharacteristic = airPurifierService.addCharacteristic(Characteristic.AirQuality);
services.push(airPurifierService);
silentModeOnCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["mode"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - getOn: " + result);
if(result[0] === "silent") {
callback(null, true);
} else {
callback(null, false);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - getOn Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - setOn: " + value);
if(value) {
that.device.call("set_mode", ["silent"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - setOn Result: " + result);
if(result[0] === "ok") {
targetAirPurifierStateCharacteristic.updateValue(Characteristic.TargetAirPurifierState.AUTO);
callback(null);
if(Characteristic.Active.INACTIVE == activeCharacteristic.value) {
activeCharacteristic.updateValue(Characteristic.Active.ACTIVE);
currentAirPurifierStateCharacteristic.updateValue(Characteristic.CurrentAirPurifierState.PURIFYING_AIR);
}
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - setOn Error: " + err);
callback(err);
});
} else {
if(Characteristic.Active.INACTIVE == activeCharacteristic.value) {
callback(null);
} else {
that.device.call("set_mode", [Characteristic.TargetAirPurifierState.AUTO == targetAirPurifierStateCharacteristic.value ? "auto" : "favorite"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - setOn Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - SilentModeSwitch - setOn Error: " + err);
callback(err);
});
}
}
}.bind(this));
activeCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["power"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - Active - getActive: " + result);
if(result[0] === "off") {
callback(null, Characteristic.Active.INACTIVE);
} else {
callback(null, Characteristic.Active.ACTIVE);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - Active - getActive Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - Active - setActive: " + value);
that.device.call("set_power", [value ? "on" : "off"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - Active - setActive Result: " + result);
if(result[0] === "ok") {
currentAirPurifierStateCharacteristic.updateValue(Characteristic.CurrentAirPurifierState.IDLE);
callback(null);
if(value) {
currentAirPurifierStateCharacteristic.updateValue(Characteristic.CurrentAirPurifierState.PURIFYING_AIR);
that.device.call("get_prop", ["mode"]).then(result => {
if(result[0] === "silent") {
silentModeOnCharacteristic.updateValue(true);
} else {
silentModeOnCharacteristic.updateValue(false);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]AirPurifier2AirPurifierAccessory - Active - setActive Error: " + err);
callback(err);
});
} else {
currentAirPurifierStateCharacteristic.updateValue(Characteristic.CurrentAirPurifierState.INACTIVE);
silentModeOnCharacteristic.updateValue(false);
}
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - Active - setActive Error: " + err);
callback(err);
});
}.bind(this));
currentAirPurifierStateCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["power"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState: " + result);
if(result[0] === "off") {
callback(null, Characteristic.CurrentAirPurifierState.INACTIVE);
} else {
callback(null, Characteristic.CurrentAirPurifierState.PURIFYING_AIR);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState Error: " + err);
callback(err);
});
}.bind(this));
lockPhysicalControlsCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["child_lock"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - LockPhysicalControls - getLockPhysicalControls: " + result);
callback(null, result[0] === "on" ? Characteristic.LockPhysicalControls.CONTROL_LOCK_ENABLED : Characteristic.LockPhysicalControls.CONTROL_LOCK_DISABLED);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - LockPhysicalControls - getLockPhysicalControls Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.device.call("set_child_lock", [value ? "on" : "off"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - LockPhysicalControls - setLockPhysicalControls Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - LockPhysicalControls - setLockPhysicalControls Error: " + err);
callback(err);
});
}.bind(this));
targetAirPurifierStateCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["mode"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: " + result);
if(result[0] === "favorite") {
callback(null, Characteristic.TargetAirPurifierState.MANUAL);
} else {
callback(null, Characteristic.TargetAirPurifierState.AUTO);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - setTargetAirPurifierState: " + value);
that.device.call("set_mode", [Characteristic.TargetAirPurifierState.AUTO == value ? (silentModeOnCharacteristic.value ? "silent" : "auto") : "favorite"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - setTargetAirPurifierState Result: " + result);
if(result[0] === "ok") {
if(Characteristic.TargetAirPurifierState.AUTO == value) {
callback(null);
} else {
that.device.call("get_prop", ["favorite_level"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + result);
silentModeOnCharacteristic.updateValue(false);
if(rotationSpeedCharacteristic.value <= result[0] * 10 && rotationSpeedCharacteristic.value > (result[0] - 1) * 10) {
callback(null);
} else {
rotationSpeedCharacteristic.value = result[0] * 10;
callback(null);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + err);
callback(err);
});
}
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - setTargetAirPurifierState Error: " + err);
callback(err);
});
}.bind(this));
rotationSpeedCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["favorite_level"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - RotationSpeed - getRotationSpeed: " + result);
callback(null, result[0]);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - RotationSpeed - getRotationSpeed Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - RotationSpeed - setRotationSpeed set: " + value);
if(value == 0) {
callback(null);
} else {
that.device.call("set_level_favorite", [parseInt(value / 10) < 10 ? parseInt(value / 10) + 1 : 10]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - RotationSpeed - setRotationSpeed Result: " + result);
if(result[0] === "ok") {
// that.device.call("set_mode", ["favorite"]).then(result => {
// that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirPurifierAccessory - RotationSpeed - setTargetAirPurifierState Result: " + result);
// if(result[0] === "ok") {
// targetAirPurifierStateCharacteristic.updateValue(Characteristic.TargetAirPurifierState.MANUAL);
// silentModeOnCharacteristic.updateValue(false);
callback(null);
// } else {
// callback(new Error(result[0]));
// }
// }).catch(function(err) {
// that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - RotationSpeed - setTargetAirPurifierState Error: " + err);
// callback(err);
// });
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + err);
callback(err);
})
}
}.bind(this));
currentTemperatureCharacteristic.on('get', function(callback) {
this.device.call("get_prop", ["temp_dec"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - Temperature - getTemperature: " + result);
callback(null, result[0] / 10);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - Temperature - getTemperature Error: " + err);
callback(err);
});
}.bind(this));
currentRelativeHumidityCharacteristic
.on('get', function(callback) {
this.device.call("get_prop", ["humidity"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - Humidity - getHumidity: " + result);
callback(null, result[0]);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - Humidity - getHumidity Error: " + err);
callback(err);
});
}.bind(this));
pm25DensityCharacteristic
.on('get', function(callback) {
this.device.call("get_prop", ["aqi"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity: " + result);
callback(null, result[0]);
var airQualityValue = Characteristic.AirQuality.UNKNOWN;
if(result[0] <= 50) {
airQualityValue = Characteristic.AirQuality.EXCELLENT;
} else if(result[0] > 50 && result[0] <= 100) {
airQualityValue = Characteristic.AirQuality.GOOD;
} else if(result[0] > 100 && result[0] <= 200) {
airQualityValue = Characteristic.AirQuality.FAIR;
} else if(result[0] > 200 && result[0] <= 300) {
airQualityValue = Characteristic.AirQuality.INFERIOR;
} else if(result[0] > 300) {
airQualityValue = Characteristic.AirQuality.POOR;
} else {
airQualityValue = Characteristic.AirQuality.UNKNOWN;
}
airQualityCharacteristic.updateValue(airQualityValue);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity Error: " + err);
callback(err);
});
}.bind(this));
// var filterMaintenanceService = new Service.FilterMaintenance(this.name);
var filterChangeIndicationCharacteristic = airPurifierService.getCharacteristic(Characteristic.FilterChangeIndication);
var filterLifeLevelCharacteristic = airPurifierService.addCharacteristic(Characteristic.FilterLifeLevel);
filterChangeIndicationCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["filter1_life"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - FilterChangeIndication - getFilterChangeIndication: " + result);
callback(null, result[0] < 5 ? Characteristic.FilterChangeIndication.CHANGE_FILTER : Characteristic.FilterChangeIndication.FILTER_OK);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - FilterChangeIndication - getFilterChangeIndication Error: " + err);
callback(err);
});
}.bind(this));
filterLifeLevelCharacteristic
.on('get', function(callback) {
that.device.call("get_prop", ["filter1_life"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - FilterLifeLevel - getFilterLifeLevel: " + result);
callback(null, result[0]);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - FilterLifeLevel - getFilterLifeLevel Error: " + err);
callback(err);
});
}.bind(this));
// services.push(filterMaintenanceService);
return services;
}
MiAirPurifierProTemperatureAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['temperatureName'];
this.platform = dThis.platform;
}
MiAirPurifierProTemperatureAccessory.prototype.getServices = function() {
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var temperatureService = new Service.TemperatureSensor(this.name);
temperatureService
.getCharacteristic(Characteristic.CurrentTemperature)
.on('get', this.getTemperature.bind(this))
services.push(temperatureService);
return services;
}
MiAirPurifierProTemperatureAccessory.prototype.getTemperature = function(callback) {
var that = this;
this.device.call("get_prop", ["temp_dec"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProTemperatureAccessory - Temperature - getTemperature: " + result);
callback(null, result[0] / 10);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProTemperatureAccessory - Temperature - getTemperature Error: " + err);
callback(err);
});
}
MiAirPurifierProHumidityAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['humidityName'];
this.platform = dThis.platform;
}
MiAirPurifierProHumidityAccessory.prototype.getServices = function() {
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var humidityService = new Service.HumiditySensor(this.name);
humidityService
.getCharacteristic(Characteristic.CurrentRelativeHumidity)
.on('get', this.getHumidity.bind(this))
services.push(humidityService);
return services;
}
MiAirPurifierProHumidityAccessory.prototype.getHumidity = function(callback) {
var that = this;
this.device.call("get_prop", ["humidity"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProHumidityAccessory - Humidity - getHumidity: " + result);
callback(null, result[0]);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProHumidityAccessory - Humidity - getHumidity Error: " + err);
callback(err);
});
}
/*
MiAirPurifierProBuzzerSpeakerAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['buzzerSpeakerName'];
this.platform = dThis.platform;
}
MiAirPurifierProBuzzerSpeakerAccessory.prototype.getServices = function() {
var that = this;
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var speakerService = new Service.Speaker(this.name);
var muteCharacteristic = speakerService.getCharacteristic(Characteristic.Mute);
var volumeCharacteristic = speakerService.addCharacteristic(Characteristic.Volume);
muteCharacteristic
.on('get', function(callback) {
this.device.call("get_prop", ["volume"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - getBuzzerState: " + result);
callback(null, result[0] == 0 ? false : true);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Mute - getBuzzerState Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState: " + value);
that.device.call("set_volume", [value ? "on" : 0]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState Error: " + err);
callback(err);
});
}.bind(this));
volumeCharacteristic
.on('get', function(callback) {
this.device.call("get_prop", ["volume"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Volume - getVolume: " + result);
callback(null, result[0]);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Volume - getVolume Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Volume - setVolume: " + value);
that.device.call("set_volume", [value ? "on" : 0]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Volume - setVolume Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Volume - setVolume Error: " + err);
callback(err);
});
}.bind(this));
services.push(speakerService);
return services;
}
*/
MiAirPurifierProBuzzerSwitchAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['buzzerSwitchName'];
this.platform = dThis.platform;
}
MiAirPurifierProBuzzerSwitchAccessory.prototype.getServices = function() {
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifier2")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var switchService = new Service.Switch(this.name);
switchService
.getCharacteristic(Characteristic.On)
.on('get', this.getBuzzerState.bind(this))
.on('set', this.setBuzzerState.bind(this));
services.push(switchService);
return services;
}
MiAirPurifierProBuzzerSwitchAccessory.prototype.getBuzzerState = function(callback) {
var that = this;
this.device.call("get_prop", ["volume"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - getBuzzerState: " + result);
callback(null, result[0] == 0 ? false : true);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Mute - getBuzzerState Error: " + err);
callback(err);
});
}
MiAirPurifierProBuzzerSwitchAccessory.prototype.setBuzzerState = function(value, callback) {
var that = this;
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState: " + value);
that.device.call("set_volume", [value ? 100 : 0]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProBuzzerSpeakerAccessory - Mute - setBuzzerState Error: " + err);
callback(err);
});
}
MiAirPurifierProLEDBulbAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['ledBulbName'];
this.platform = dThis.platform;
}
MiAirPurifierProLEDBulbAccessory.prototype.getServices = function() {
var that = this;
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var switchLEDService = new Service.Lightbulb(this.name);
var onCharacteristic = switchLEDService.getCharacteristic(Characteristic.On);
onCharacteristic
.on('get', function(callback) {
this.device.call("get_prop", ["led"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProLEDBulbAccessory - switchLED - getLEDPower: " + result);
callback(null, result[0] === "on" ? true : false);
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProLEDBulbAccessory - switchLED - getLEDPower Error: " + err);
callback(err);
});
}.bind(this))
.on('set', function(value, callback) {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProLEDBulbAccessory - switchLED - setLEDPower: " + value + ", nowValue: " + onCharacteristic.value);
this.device.call("set_led", [value ? "on" : "off"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProLEDBulbAccessory - switchLED - setLEDPower Result: " + result);
if(result[0] === "ok") {
callback(null);
} else {
callback(new Error(result[0]));
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProLEDBulbAccessory - switchLED - setLEDPower Error: " + err);
callback(err);
});
}.bind(this));
services.push(switchLEDService);
return services;
}
MiAirPurifierProAirQualityAccessory = function(dThis) {
this.device = dThis.device;
this.name = dThis.config['airQualityName'];
this.platform = dThis.platform;
}
MiAirPurifierProAirQualityAccessory.prototype.getServices = function() {
var that = this;
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "XiaoMi")
.setCharacteristic(Characteristic.Model, "AirPurifierPro")
.setCharacteristic(Characteristic.SerialNumber, "Undefined");
services.push(infoService);
var pmService = new Service.AirQualitySensor(this.name);
var pm2_5Characteristic = pmService.addCharacteristic(Characteristic.PM2_5Density);
pmService
.getCharacteristic(Characteristic.AirQuality)
.on('get', function(callback) {
that.device.call("get_prop", ["aqi"]).then(result => {
that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifierProAirQualityAccessory - AirQuality - getAirQuality: " + result);
pm2_5Characteristic.updateValue(result[0]);
if(result[0] <= 50) {
callback(null, Characteristic.AirQuality.EXCELLENT);
} else if(result[0] > 50 && result[0] <= 100) {
callback(null, Characteristic.AirQuality.GOOD);
} else if(result[0] > 100 && result[0] <= 200) {
callback(null, Characteristic.AirQuality.FAIR);
} else if(result[0] > 200 && result[0] <= 300) {
callback(null, Characteristic.AirQuality.INFERIOR);
} else if(result[0] > 300) {
callback(null, Characteristic.AirQuality.POOR);
} else {
callback(null, Characteristic.AirQuality.UNKNOWN);
}
}).catch(function(err) {
that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifierProAirQualityAccessory - AirQuality - getAirQuality Error: " + err);
callback(err);
});
}.bind(this));
services.push(pmService);
return services;
}