UNPKG

homebridge-mi-airpurifier

Version:

XiaoMi air purifier plugins for HomeBridge(https://github.com/nfarina/homebridge).

691 lines (621 loc) 37.1 kB
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; }