diff --git a/Devices/MiAirPurifier.js b/Devices/MiAirPurifier.js index b540de2..c6510cf 100644 --- a/Devices/MiAirPurifier.js +++ b/Devices/MiAirPurifier.js @@ -75,6 +75,15 @@ MiAirPurifierAirPurifierAccessory.prototype.getServices = function() { var pm25DensityCharacteristic = airPurifierService.addCharacteristic(Characteristic.PM2_5Density); var airQualityCharacteristic = airPurifierService.addCharacteristic(Characteristic.AirQuality); services.push(airPurifierService); + + setInterval(function() { + activeCharacteristic.getValue(); + currentAirPurifierStateCharacteristic.getValue(); + targetAirPurifierStateCharacteristic.getValue(); + rotationSpeedCharacteristic.getValue(); + pm25DensityCharacteristic.getValue(); + airQualityCharacteristic.getValue(); + }, 5000); silentModeOnCharacteristic .on('get', function(callback) { @@ -313,7 +322,7 @@ MiAirPurifierAirPurifierAccessory.prototype.getServices = function() { pm25DensityCharacteristic .on('get', function(callback) { this.device.call("get_prop", ["aqi"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity: " + result); + that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density: " + result); callback(null, result[0]); var airQualityValue = Characteristic.AirQuality.UNKNOWN; @@ -332,7 +341,7 @@ MiAirPurifierAirPurifierAccessory.prototype.getServices = function() { } airQualityCharacteristic.updateValue(airQualityValue); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity Error: " + err); + that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density Error: " + err); callback(err); }); }.bind(this)); diff --git a/Devices/MiAirPurifier2.js b/Devices/MiAirPurifier2.js index 57fa1d7..9e2576f 100644 --- a/Devices/MiAirPurifier2.js +++ b/Devices/MiAirPurifier2.js @@ -83,6 +83,18 @@ MiAirPurifier2AirPurifierAccessory.prototype.getServices = function() { var pm25DensityCharacteristic = airPurifierService.addCharacteristic(Characteristic.PM2_5Density); var airQualityCharacteristic = airPurifierService.addCharacteristic(Characteristic.AirQuality); services.push(airPurifierService); + + setInterval(function() { + activeCharacteristic.getValue(); + currentAirPurifierStateCharacteristic.getValue(); + targetAirPurifierStateCharacteristic.getValue(); + lockPhysicalControlsCharacteristic.getValue(); + rotationSpeedCharacteristic.getValue(); + currentTemperatureCharacteristic.getValue(); + currentRelativeHumidityCharacteristic.getValue(); + pm25DensityCharacteristic.getValue(); + airQualityCharacteristic.getValue(); + }, 5000); silentModeOnCharacteristic .on('get', function(callback) { @@ -336,7 +348,7 @@ MiAirPurifier2AirPurifierAccessory.prototype.getServices = function() { pm25DensityCharacteristic .on('get', function(callback) { this.device.call("get_prop", ["aqi"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity: " + result); + that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density: " + result); callback(null, result[0]); var airQualityValue = Characteristic.AirQuality.UNKNOWN; @@ -355,7 +367,7 @@ MiAirPurifier2AirPurifierAccessory.prototype.getServices = function() { } airQualityCharacteristic.updateValue(airQualityValue); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity Error: " + err); + that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density Error: " + err); callback(err); }); }.bind(this)); diff --git a/Devices/MiAirPurifier2S.js b/Devices/MiAirPurifier2S.js index b432b20..20fed47 100644 --- a/Devices/MiAirPurifier2S.js +++ b/Devices/MiAirPurifier2S.js @@ -7,16 +7,91 @@ var Accessory, PlatformAccessory, Service, Characteristic, UUIDGen; MiAirPurifier2S = function(platform, config) { this.init(platform, config); + this.name = config['airPurifierName']; Accessory = platform.Accessory; PlatformAccessory = platform.PlatformAccessory; Service = platform.Service; Characteristic = platform.Characteristic; UUIDGen = platform.UUIDGen; + + var that = this; + + this.logDebug = function(message) { + platform.log.debug("[" + this.name + "] " + message); + }; + + this.logError = function(message) { + platform.log.error("[" + this.name + "] " + message); + }; + + this.device = { + getProps: async function(props) { + return Promise.reject(new Error("Cannot getProps(" + props.join(", ") + "): Not connected to device")); + }, + setCache: function(method) {}, + call: function() { + return Promise.reject(new Error("Cannot perform call " + method + ": Not connected to device")); + } + }; - this.device = new miio.Device({ + this.logDebug("Connecting to device " + this.config['ip']); + miio.device({ address: this.config['ip'], token: this.config['token'] + }).then(device => { + that.logDebug("Connected to air purifier at " + this.config['ip']); + that.device.cache = {}; + that.device.call = function(method, args) { + return device.call(method, args); + } + that.device.getProps = function(props, mustFetch) { + var values = {}; + + var makeResult = function() { + var result = []; + for (i = 0; i < props.length; i++) { + const prop = props[i]; + result.push(values[prop]); + } + return result; + } + + if (!mustFetch) { + for (i = 0; i < props.length; i++) { + const prop = props[i]; + var value = that.device.cache[prop]; + values[prop] = value; + } + } + + const propsToFetch = props.filter((prop) => !(values[prop] != null)); + + if (propsToFetch.length == 0) { + const result = makeResult(); + that.logDebug("Using cached values for " + props.join(", ") + ": " + JSON.stringify(values)); + return Promise.resolve(result); + } + + that.logDebug("Fetching device values for " + propsToFetch.join(", ")); + return new Promise((resolve, reject) => { + device.call('get_prop', propsToFetch).then(result => { + for (i = 0; i < propsToFetch.length; i++) { + const prop = propsToFetch[i]; + values[prop] = result[i]; + that.device.cache[prop] = values[prop]; + } + resolve(makeResult()); + }).catch(error => { + reject(error); + }); + }); + } + that.device.setCache = function(prop, value) { + that.device.cache[prop] = value; + } + }).catch(error => { + that.logError("Failed to connect: " + error); }); this.accessories = {}; @@ -40,7 +115,7 @@ MiAirPurifier2S = function(platform, config) { } var accessoriesArr = this.obj2array(this.accessories); - this.platform.log.debug("[MiAirPurifierPlatform][DEBUG]Initializing " + this.config["type"] + " device: " + this.config["ip"] + ", accessories size: " + accessoriesArr.length); + this.logDebug("Initializing " + this.config["type"] + " device: " + this.config["ip"] + ", accessories size: " + accessoriesArr.length); return accessoriesArr; } @@ -52,6 +127,8 @@ MiAirPurifier2SAirPurifierAccessory = function(dThis) { this.silentModeSwitchDisable = dThis.config['silentModeSwitchDisable']; this.silentModeSwitchName = dThis.config['silentModeSwitchName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; this.frm = [0,5,10,15,20,25,30,40,50,60,70,80,90,95,100]; } @@ -80,15 +157,31 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { var rotationSpeedCharacteristic = airPurifierService.addCharacteristic(Characteristic.RotationSpeed); var currentTemperatureCharacteristic = airPurifierService.addCharacteristic(Characteristic.CurrentTemperature); - var currentRelativeHumidityCharacteristic = airPurifierService.addCharacteristic(Characteristic.CurrentRelativeHumidity); + var currentRelativeHumidityCharacteristic = airPurifierService.addCharacteristic(Characteristic.CurrentRelativeHumidity); var pm25DensityCharacteristic = airPurifierService.addCharacteristic(Characteristic.PM2_5Density); var airQualityCharacteristic = airPurifierService.addCharacteristic(Characteristic.AirQuality); services.push(airPurifierService); + + setInterval(function() { + that.device.getProps(["mode", "power", "child_lock", "favorite_level", "temp_dec", "humidity", "aqi", "filter1_life", "volume", "led"], true).then(result => { + activeCharacteristic.getValue(); + currentAirPurifierStateCharacteristic.getValue(); + targetAirPurifierStateCharacteristic.getValue(); + lockPhysicalControlsCharacteristic.getValue(); + rotationSpeedCharacteristic.getValue(); + currentTemperatureCharacteristic.getValue(); + currentRelativeHumidityCharacteristic.getValue(); + pm25DensityCharacteristic.getValue(); + airQualityCharacteristic.getValue(); + }).catch(function(err) { + that.logError("Polling failed: " + err); + }); + }, 5000); silentModeOnCharacteristic .on('get', function(callback) { - that.device.call("get_prop", ["mode"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - getOn: " + result); + that.device.getProps(["mode"]).then(result => { + that.logDebug("SilentModeSwitch - getOn: " + result); if(result[0] === "silent") { callback(null, true); @@ -96,15 +189,16 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(null, false); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - getOn Error: " + err); + that.logError("SilentModeSwitch - getOn Error: " + err); callback(err); }); }.bind(this)) .on('set', function(value, callback) { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - setOn: " + value); + that.logDebug("SilentModeSwitch - setOn: " + value); if(value) { + that.device.setCache("mode", "silent"); that.device.call("set_mode", ["silent"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - setOn Result: " + result); + that.logDebug("SilentModeSwitch - setOn Result: " + result); if(result[0] === "ok") { targetAirPurifierStateCharacteristic.updateValue(Characteristic.TargetAirPurifierState.AUTO); callback(null); @@ -117,22 +211,24 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(new Error(result[0])); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - setOn Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - setOn Result: " + result); + const newMode = (Characteristic.TargetAirPurifierState.AUTO == targetAirPurifierStateCharacteristic.value ? "auto" : "favorite"); + that.device.setCache("mode", newMode); + that.device.call("set_mode", [newMode]).then(result => { + that.logDebug("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]MiAirPurifier2SAirPurifierAccessory - SilentModeSwitch - setOn Error: " + err); + that.logError("SilentModeSwitch - setOn Error: " + err); callback(err); }); } @@ -141,8 +237,8 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { activeCharacteristic .on('get', function(callback) { - that.device.call("get_prop", ["power"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - Active - getActive: " + result); + that.device.getProps(["power"]).then(result => { + that.logDebug("Active - getActive: " + result); if(result[0] === "off") { callback(null, Characteristic.Active.INACTIVE); @@ -150,27 +246,29 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(null, Characteristic.Active.ACTIVE); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - Active - getActive Error: " + err); + that.logError("Active - getActive Error: " + err); callback(err); }); }.bind(this)) .on('set', function(value, callback) { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - Active - setActive: " + value); - that.device.call("set_power", [value ? "on" : "off"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - Active - setActive Result: " + result); + const newPower = (value ? "on" : "off"); + that.device.setCache("power", newPower); + that.logDebug("Active - setActive: " + value); + that.device.call("set_power", [newPower]).then(result => { + that.logDebug("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 => { + that.device.getProps(["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); + that.logError("Active - setActive Error: " + err); callback(err); }); } else { @@ -181,15 +279,15 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(new Error(result[0])); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - Active - setActive Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState: " + result); + that.device.getProps(["power"]).then(result => { + that.logDebug("CurrentAirPurifierState - getCurrentAirPurifierState: " + result); if(result[0] === "off") { callback(null, Characteristic.CurrentAirPurifierState.INACTIVE); @@ -197,39 +295,41 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(null, Characteristic.CurrentAirPurifierState.PURIFYING_AIR); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - LockPhysicalControls - getLockPhysicalControls: " + result); + that.device.getProps(["child_lock"]).then(result => { + that.logDebug("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]MiAirPurifier2SAirPurifierAccessory - LockPhysicalControls - getLockPhysicalControls Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - LockPhysicalControls - setLockPhysicalControls Result: " + result); + const newValue = (value ? "on" : "off"); + that.device.setCache("child_lock", newValue); + that.device.call("set_child_lock", [newValue]).then(result => { + that.logDebug("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]MiAirPurifier2SAirPurifierAccessory - LockPhysicalControls - setLockPhysicalControls Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: " + result); + that.device.getProps(["mode"]).then(result => { + that.logDebug("TargetAirPurifierState - getTargetAirPurifierState: " + result); if(result[0] === "favorite") { callback(null, Characteristic.TargetAirPurifierState.MANUAL); @@ -237,20 +337,22 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(null, Characteristic.TargetAirPurifierState.AUTO); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: " + err); + that.logError("TargetAirPurifierState - getTargetAirPurifierState: " + err); callback(err); }); }.bind(this)) .on('set', function(value, callback) { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - 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]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - setTargetAirPurifierState Result: " + result); + const newMode = (Characteristic.TargetAirPurifierState.AUTO == value ? (silentModeOnCharacteristic.value ? "silent" : "auto") : "favorite"); + that.logDebug("TargetAirPurifierState - setTargetAirPurifierState: " + value); + that.device.setCache("mode", newMode); + that.device.call("set_mode", [newMode]).then(result => { + that.logDebug("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]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + result); + that.device.getProps(["favorite_level"]).then(result => { + that.logDebug("TargetAirPurifierState - getRotationSpeed: " + result); silentModeOnCharacteristic.updateValue(false); if(rotationSpeedCharacteristic.value <= result[0] * 10 && rotationSpeedCharacteristic.value > (result[0] - 1) * 10) { callback(null); @@ -259,7 +361,7 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(null); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + err); + that.logError("TargetAirPurifierState - getRotationSpeed: " + err); callback(err); }); } @@ -267,31 +369,33 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { callback(new Error(result[0])); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - setTargetAirPurifierState Error: " + err); + that.logError("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]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - getRotationSpeed: " + result); + that.device.getProps(["favorite_level"]).then(result => { + that.logDebug("RotationSpeed - getRotationSpeed: " + result); callback(null, that.getRotationSpeedByFavoriteLevel(parseInt(result[0]), rotationSpeedCharacteristic.value)); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - getRotationSpeed Error: " + err); + that.logError("RotationSpeed - getRotationSpeed Error: " + err); callback(err); }); }.bind(this)) .on('set', function(value, callback) { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - setRotationSpeed set: " + value); + that.logDebug("RotationSpeed - setRotationSpeed set: " + value); if(value == 0) { callback(null); } else { - that.device.call("set_level_favorite", [that.getFavoriteLevelByRotationSpeed(value)]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - setRotationSpeed Result: " + result); + const newValue = that.getFavoriteLevelByRotationSpeed(value); + that.device.setCache("favorite_level", newValue); + that.device.call("set_level_favorite", [newValue]).then(result => { + that.logDebug("RotationSpeed - setRotationSpeed Result: " + result); if(result[0] === "ok") { // that.device.call("set_mode", ["favorite"]).then(result => { -// that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - setTargetAirPurifierState Result: " + result); +// that.logDebug("RotationSpeed - setTargetAirPurifierState Result: " + result); // if(result[0] === "ok") { // targetAirPurifierStateCharacteristic.updateValue(Characteristic.TargetAirPurifierState.MANUAL); // silentModeOnCharacteristic.updateValue(false); @@ -300,44 +404,44 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { // callback(new Error(result[0])); // } // }).catch(function(err) { -// that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - RotationSpeed - setTargetAirPurifierState Error: " + err); +// that.logError("RotationSpeed - setTargetAirPurifierState Error: " + err); // callback(err); // }); } else { callback(new Error(result[0])); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirPurifierAccessory - TargetAirPurifierState - getRotationSpeed: " + err); + that.logError("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); + this.device.getProps(["temp_dec"]).then(result => { + that.logDebug("Temperature - getTemperature: " + result); callback(null, result[0] / 10); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - Temperature - getTemperature Error: " + err); + that.logError("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); + .on('get', function(callback) { + this.device.getProps(["humidity"]).then(result => { + that.logDebug("Humidity - getHumidity: " + result); callback(null, result[0]); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - Humidity - getHumidity Error: " + err); + that.logError("Humidity - getHumidity Error: " + err); callback(err); }); - }.bind(this)); + }.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); + .on('get', function(callback) { + this.device.getProps(["aqi"]).then(result => { + that.logDebug("aqi - getPM25Density: " + result); callback(null, result[0]); var airQualityValue = Characteristic.AirQuality.UNKNOWN; @@ -356,10 +460,10 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { } airQualityCharacteristic.updateValue(airQualityValue); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity Error: " + err); + that.logError("aqi - getPM25Density Error: " + err); callback(err); }); - }.bind(this)); + }.bind(this)); // var filterMaintenanceService = new Service.FilterMaintenance(this.name); var filterChangeIndicationCharacteristic = airPurifierService.getCharacteristic(Characteristic.FilterChangeIndication); @@ -367,21 +471,21 @@ MiAirPurifier2SAirPurifierAccessory.prototype.getServices = function() { filterChangeIndicationCharacteristic .on('get', function(callback) { - that.device.call("get_prop", ["filter1_life"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - FilterChangeIndication - getFilterChangeIndication: " + result); + that.device.getProps(["filter1_life"]).then(result => { + that.logDebug("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); + that.logError("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); + that.device.getProps(["filter1_life"]).then(result => { + that.logDebug("FilterLifeLevel - getFilterLifeLevel: " + result); callback(null, result[0]); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - FilterLifeLevel - getFilterLifeLevel Error: " + err); + that.logError("FilterLifeLevel - getFilterLifeLevel Error: " + err); callback(err); }); }.bind(this)); @@ -421,6 +525,8 @@ MiAirPurifier2STemperatureAccessory = function(dThis) { this.device = dThis.device; this.name = dThis.config['temperatureName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; } MiAirPurifier2STemperatureAccessory.prototype.getServices = function() { @@ -444,11 +550,11 @@ MiAirPurifier2STemperatureAccessory.prototype.getServices = function() { MiAirPurifier2STemperatureAccessory.prototype.getTemperature = function(callback) { var that = this; - this.device.call("get_prop", ["temp_dec"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2STemperatureAccessory - Temperature - getTemperature: " + result); + this.device.getProps(["temp_dec"]).then(result => { + that.logDebug("Temperature - getTemperature: " + result); callback(null, result[0] / 10); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2STemperatureAccessory - Temperature - getTemperature Error: " + err); + that.logError("Temperature - getTemperature Error: " + err); callback(err); }); } @@ -457,6 +563,8 @@ MiAirPurifier2SHumidityAccessory = function(dThis) { this.device = dThis.device; this.name = dThis.config['humidityName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; } MiAirPurifier2SHumidityAccessory.prototype.getServices = function() { @@ -480,11 +588,11 @@ MiAirPurifier2SHumidityAccessory.prototype.getServices = function() { MiAirPurifier2SHumidityAccessory.prototype.getHumidity = function(callback) { var that = this; - this.device.call("get_prop", ["humidity"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SHumidityAccessory - Humidity - getHumidity: " + result); + this.device.getProps(["humidity"]).then(result => { + that.logDebug("getHumidity: " + result); callback(null, result[0]); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SHumidityAccessory - Humidity - getHumidity Error: " + err); + that.logError("getHumidity Error: " + err); callback(err); }); } @@ -493,6 +601,8 @@ MiAirPurifier2SBuzzerSwitchAccessory = function(dThis) { this.device = dThis.device; this.name = dThis.config['buzzerSwitchName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; } MiAirPurifier2SBuzzerSwitchAccessory.prototype.getServices = function() { @@ -517,27 +627,27 @@ MiAirPurifier2SBuzzerSwitchAccessory.prototype.getServices = function() { MiAirPurifier2SBuzzerSwitchAccessory.prototype.getBuzzerState = function(callback) { var that = this; - this.device.call("get_prop", ["volume"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SBuzzerSwitchAccessory - Mute - getBuzzerState: " + result); + this.device.getProps(["volume"]).then(result => { + that.logDebug("getBuzzerState: " + result); callback(null, result[0] === "on" ? true : false); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SBuzzerSwitchAccessory - Mute - getBuzzerState Error: " + err); + that.logError("getBuzzerState Error: " + err); callback(err); }); } MiAirPurifier2SBuzzerSwitchAccessory.prototype.setBuzzerState = function(value, callback) { var that = this; - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SBuzzerSwitchAccessory - Mute - setBuzzerState: " + value); + that.logDebug("setBuzzerState: " + value); that.device.call("set_buzzer", [value ? "on" : "off"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SBuzzerSwitchAccessory - Mute - setBuzzerState Result: " + result); + that.logDebug("setBuzzerState Result: " + result); if(result[0] === "ok") { callback(null); } else { callback(new Error(result[0])); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SBuzzerSwitchAccessory - Mute - setBuzzerState Error: " + err); + that.logError("setBuzzerState Error: " + err); callback(err); }); } @@ -546,6 +656,8 @@ MiAirPurifier2SLEDBulbAccessory = function(dThis) { this.device = dThis.device; this.name = dThis.config['ledBulbName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; } MiAirPurifier2SLEDBulbAccessory.prototype.getServices = function() { @@ -564,25 +676,25 @@ MiAirPurifier2SLEDBulbAccessory.prototype.getServices = function() { onCharacteristic .on('get', function(callback) { - this.device.call("get_prop", ["led"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SLEDBulbAccessory - switchLED - getLEDPower: " + result); + this.device.getProps(["led"]).then(result => { + that.logDebug("switchLED - getLEDPower: " + result); callback(null, result[0] === "on" ? true : false); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SLEDBulbAccessory - switchLED - getLEDPower Error: " + err); + that.logError("getLEDPower Error: " + err); callback(err); }); }.bind(this)) .on('set', function(value, callback) { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SLEDBulbAccessory - switchLED - setLEDPower: " + value + ", nowValue: " + onCharacteristic.value); + that.logDebug("switchLED - setLEDPower: " + value + ", nowValue: " + onCharacteristic.value); this.device.call("set_led", [value ? "on" : "off"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SLEDBulbAccessory - switchLED - setLEDPower Result: " + result); + that.logDebug("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]MiAirPurifier2SLEDBulbAccessory - switchLED - setLEDPower Error: " + err); + that.logError("setLEDPower Error: " + err); callback(err); }); }.bind(this)); @@ -595,6 +707,8 @@ MiAirPurifier2SAirQualityAccessory = function(dThis) { this.device = dThis.device; this.name = dThis.config['airQualityName']; this.platform = dThis.platform; + this.logDebug = dThis.logDebug; + this.logError = dThis.logError; } MiAirPurifier2SAirQualityAccessory.prototype.getServices = function() { @@ -613,8 +727,8 @@ MiAirPurifier2SAirQualityAccessory.prototype.getServices = function() { pmService .getCharacteristic(Characteristic.AirQuality) .on('get', function(callback) { - that.device.call("get_prop", ["aqi"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2SAirQualityAccessory - AirQuality - getAirQuality: " + result); + that.device.getProps(["aqi"]).then(result => { + that.logDebug("getAirQuality: " + result); pm2_5Characteristic.updateValue(result[0]); @@ -632,11 +746,11 @@ MiAirPurifier2SAirQualityAccessory.prototype.getServices = function() { callback(null, Characteristic.AirQuality.UNKNOWN); } }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2SAirQualityAccessory - AirQuality - getAirQuality Error: " + err); + that.logError("getAirQuality Error: " + err); callback(err); }); }.bind(this)); services.push(pmService); return services; -} \ No newline at end of file +} diff --git a/Devices/MiAirPurifierPro.js b/Devices/MiAirPurifierPro.js index 6a8db62..b1757a1 100644 --- a/Devices/MiAirPurifierPro.js +++ b/Devices/MiAirPurifierPro.js @@ -84,6 +84,18 @@ MiAirPurifierProAirPurifierAccessory.prototype.getServices = function() { var pm25DensityCharacteristic = airPurifierService.addCharacteristic(Characteristic.PM2_5Density); var airQualityCharacteristic = airPurifierService.addCharacteristic(Characteristic.AirQuality); services.push(airPurifierService); + + setInterval(function() { + activeCharacteristic.getValue(); + currentAirPurifierStateCharacteristic.getValue(); + targetAirPurifierStateCharacteristic.getValue(); + lockPhysicalControlsCharacteristic.getValue(); + rotationSpeedCharacteristic.getValue(); + currentTemperatureCharacteristic.getValue(); + currentRelativeHumidityCharacteristic.getValue(); + pm25DensityCharacteristic.getValue(); + airQualityCharacteristic.getValue(); + }, 5000); silentModeOnCharacteristic .on('get', function(callback) { @@ -337,7 +349,7 @@ MiAirPurifierProAirPurifierAccessory.prototype.getServices = function() { pm25DensityCharacteristic .on('get', function(callback) { this.device.call("get_prop", ["aqi"]).then(result => { - that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity: " + result); + that.platform.log.debug("[MiAirPurifierPlatform][DEBUG]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density: " + result); callback(null, result[0]); var airQualityValue = Characteristic.AirQuality.UNKNOWN; @@ -356,7 +368,7 @@ MiAirPurifierProAirPurifierAccessory.prototype.getServices = function() { } airQualityCharacteristic.updateValue(airQualityValue); }).catch(function(err) { - that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getHumidity Error: " + err); + that.platform.log.error("[MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - aqi - getPM25Density Error: " + err); callback(err); }); }.bind(this)); diff --git a/index.js b/index.js index 7d9f604..a965610 100644 --- a/index.js +++ b/index.js @@ -61,12 +61,11 @@ function MiAirPurifierPlatform(log, config, api) { this.api = api; } - this.log.info("[MiAirPurifierPlatform][INFO]*******************************************************************"); - this.log.info("[MiAirPurifierPlatform][INFO] MiAirPurifierPlatform v%s By YinHang", packageFile.version); - this.log.info("[MiAirPurifierPlatform][INFO] GitHub: https://github.com/YinHangCode/homebridge-mi-airpurifier "); - this.log.info("[MiAirPurifierPlatform][INFO] QQ Group: 107927710 "); - this.log.info("[MiAirPurifierPlatform][INFO]*******************************************************************"); - this.log.info("[MiAirPurifierPlatform][INFO]start success..."); + this.log.info("*******************************************************************"); + this.log.info(" MiAirPurifierPlatform v%s By YinHang", packageFile.version); + this.log.info(" GitHub: https://github.com/YinHangCode/homebridge-mi-airpurifier "); + this.log.info(" QQ Group: 107927710 "); + this.log.info("*******************************************************************"); } MiAirPurifierPlatform.prototype = { @@ -103,9 +102,9 @@ MiAirPurifierPlatform.prototype = { } else { } } - this.log.info("[MiAirPurifierPlatform][INFO]device size: " + deviceCfgs.length + ", accessories size: " + myAccessories.length); + this.log.info("Initialized " + deviceCfgs.length + " devices as " + myAccessories.length + " accessories"); } callback(myAccessories); } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 9e478ee..c96795d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,6 @@ "homebridge": ">=0.4.1" }, "dependencies": { - "miio": "0.14.1" + "miio": "0.15.6" } } \ No newline at end of file