Git Product home page Git Product logo

homebridge-mi-airpurifier's Introduction

homebridge-mi-airpurifier

npm version

XiaoMi air purifier plugins for HomeBridge.
Thanks for nfarina(the author of homebridge), OpenMiHome, aholstenson(the author of miio), licuhui, superszy, all other developer and testers.

Note: I have only a part of these devices, so some devices don't have tested. If you find bugs, please submit them to issues or QQ Group: 107927710.

Supported Devices

1.MiAirPurifier(小米空气净化器)
2.MiAirPurifier2(小米空气净化器2)
3.MiAirPurifierPro(小米空气净化器Pro)
4.MiAirPurifier2S(小米空气净化器2S)
5.MiAirPurifierMAX(米家空气净化器MAX) ---- coming soon

Pre-Requirements

1.Make sure your IOS version is ios11 or later.

Installation

  1. Install HomeBridge, please follow it's README.
    If you are using Raspberry Pi, please read Running-HomeBridge-on-a-Raspberry-Pi.
  2. Make sure you can see HomeBridge in your iOS devices, if not, please go back to step 1.
  3. Install packages.
npm install -g homebridge-mi-airpurifier

Configuration

"platforms": [{
    "platform": "MiAirPurifierPlatform",
    "deviceCfgs": [{
        "type": "MiAirPurifier",
        "ip": "192.168.88.xx",
        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "airPurifierDisable": false,
        "airPurifierName": "MiAirPurifier",
        "silentModeSwitchDisable": false,
        "silentModeSwitchName": "MiAirPurifier Silent Mode Switch",
        "buzzerSwitchDisable": true,
        "buzzerSwitchName": "MiAirPurifier Buzzer Switch",
        "ledBulbDisable": true,
        "ledBulbName": "MiAirPurifier LED Switch",
        "airQualityDisable": false,
        "airQualityName": "MiAirPurifier AirQuality"
    }, {
        "type": "MiAirPurifier2",
        "ip": "192.168.88.xx",
        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "airPurifierDisable": false,
        "airPurifierName": "MiAirPurifier2",
        "silentModeSwitchDisable": false,
        "silentModeSwitchName": "MiAirPurifier2 Silent Mode Switch",
        "temperatureDisable": false,
        "temperatureName": "MiAirPurifier2 Temperature",
        "humidityDisable": false,
        "humidityName": "MiAirPurifier2 Humidity",
        "buzzerSwitchDisable": true,
        "buzzerSwitchName": "MiAirPurifier2 Buzzer Switch",
        "ledBulbDisable": true,
        "ledBulbName": "MiAirPurifier2 LED Switch",
        "airQualityDisable": false,
        "airQualityName": "MiAirPurifier2 AirQuality"
    }, {
        "type": "MiAirPurifierPro",
        "ip": "192.168.88.xx",
        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "airPurifierDisable": false,
        "airPurifierName": "MiAirPurifierPro",
        "silentModeSwitchDisable": false,
        "silentModeSwitchName": "MiAirPurifierPro Silent Mode Switch",
        "temperatureDisable": false,
        "temperatureName": "MiAirPurifierPro Temperature",
        "humidityDisable": false,
        "humidityName": "MiAirPurifierPro Humidity",
        "buzzerSwitchDisable": true,
        "buzzerSwitchName": "MiAirPurifierPro Buzzer Switch",
        "ledBulbDisable": true,
        "ledBulbName": "MiAirPurifierPro LED Switch",
        "airQualityDisable": false,
        "airQualityName": "MiAirPurifierPro AirQuality"
    }, {
        "type": "MiAirPurifier2S",
        "ip": "192.168.88.xx",
        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "airPurifierDisable": false,
        "airPurifierName": "MiAirPurifier2S",
        "silentModeSwitchDisable": false,
        "silentModeSwitchName": "MiAirPurifier2S Silent Mode Switch",
        "temperatureDisable": false,
        "temperatureName": "MiAirPurifier2S Temperature",
        "humidityDisable": false,
        "humidityName": "MiAirPurifier2S Humidity",
        "buzzerSwitchDisable": true,
        "buzzerSwitchName": "MiAirPurifier2S Buzzer Switch",
        "ledBulbDisable": true,
        "ledBulbName": "MiAirPurifier2S LED Switch",
        "airQualityDisable": false,
        "airQualityName": "MiAirPurifier2S AirQuality"
    }]
}]

Get token

Get token by miio2.db

setup MiJia(MiHome) app in your android device or android virtual machine.
open MiJia(MiHome) app and login your account.
refresh device list and make sure device display in the device list.
get miio2.db(path: /data/data/com.xiaomi.smarthome/databases/miio2.db) file from your android device or android virtual machine.
open website [Get MiIo Tokens By DataBase File], upload miio2.db file and submit.

Get token by network

Open command prompt or terminal. Run following command:

miio --discover

Wait until you get output similar to this:

Device ID: xxxxxxxx   
Model info: Unknown   
Address: 192.168.88.xx   
Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx via auto-token   
Support: Unknown   

"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" is token.
If token is "???", then reset device and connect device created Wi-Fi hotspot.
Run following command:

miio --discover --sync

Wait until you get output.
For more information about token, please refer to OpenMiHome and miio.

Version Logs

0.1.3 (2018-07-11)

1.add MiAirPurifier, MiAirPurifier2, MiAirPurifier2S, MiAirPurifierPro FilterLife feature.

0.1.2 (2018-02-10)

1.update 'package.json'.

0.1.1 (2018-01-21)

1.remove feature of turn to manual mode when set rotation speed, because of it will affect HomeKit automation.

0.1.0 (2017-11-16)

1.support for XiaoMi AirPurifier2S.
2.modify class name, reduce the probability of conflicts due to the same class name and other plugins.

0.0.9 (2017-10-28)

1.fixed bug that XiaoMi AirPurifierPro power status display inaccurate.

0.0.8 (2017-10-12)

1.fixed bug that XiaoMi AirPurifier can not work.

0.0.7 (2017-10-01)

1.fixed bug that linkage issues between silent mode switch accessory and air purifier accessory.

0.0.6 (2017-09-22)

1.fixed bug that silent mode switch accessory don't display.
2.fixed bug that XiaoMi AirPurifierPro led light accessory display brightness.

0.0.5 (2017-09-21)

1.fixed bug that XiaoMi AirPurifier and XiaoMi AirPurifierPro air purifier accessory don't display.

0.0.4 (2017-09-11)

1.optimized code.

0.0.3 (2017-09-10)

1.fixed bug that air purifier accessory disable when set "silentModeSwitchDisable" value is true.

0.0.2 (2017-09-09)

1.fixed bug that can not startup.
2.add setting silent mode switch disable feature.
3.optimized code.

0.0.1 (2017-09-09)

1.support for XiaoMi AirPurifier.
2.support for XiaoMi AirPurifier2.
3.support for XiaoMi AirPurifierPro.

homebridge-mi-airpurifier's People

Contributors

hassbian-abc avatar yinhangcode avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

homebridge-mi-airpurifier's Issues

Error with X Air2

[2018-10-25 08:35:11] ====================
[2018-10-25 08:35:11] ERROR LOADING PLUGIN homebridge-xiaomi-air-purifier:
[2018-10-25 08:35:11] /usr/local/lib/node_modules/homebridge-xiaomi-air-purifier/index.js:107
init: async function() {
^^^^^^^^
SyntaxError: Unexpected token function
at Object.exports.runInThisContext (vm.js:76:16)
at Module._compile (module.js:542:28)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Plugin.load (/usr/local/lib/node_modules/homebridge/lib/plugin.js:65:22)
at Server. (/usr/local/lib/node_modules/homebridge/lib/server.js:132:14)
[2018-10-25 08:35:11] ====================
[2018-10-25 08:35:11] Loaded config.json with 38 accessories and 1 platforms.
[2018-10-25 08:35:11] ---
[2018-10-25 08:35:11] Loading 1 platforms...

config json

{
"bridge": {
"name": "HomeBridge",
"username": "8A:42:43:16:81:23",
"port": 51826,
"pin": "031-61-150"
},

    "description": "HomeKit Bridge",

    "platforms": [{
            "platform": "Orvibo"
    }],


    "platform": "MiAirPurifierPlatform",
    "deviceCfgs": [{
            "type": "MiAirPurifier2",
            "ip": "192.168.xx.xx",
            "token": "xxxxxxxxxxxx",
            "airPurifierDisable": false,
            "airPurifierName": "MiAirPurifier2",
            "silentModeSwitchDisable": false,
            "silentModeSwitchName": "MiAirPurifier2 Silent Mode Switch",
            "temperatureDisable": false,
            "temperatureName": "MiAirPurifier2 Temperature",
            "humidityDisable": false,
            "humidityName": "MiAirPurifier2 Humidity",
            "buzzerSwitchDisable": true,
            "buzzerSwitchName": "MiAirPurifier2 Buzzer Switch",
            "ledBulbDisable": true,
            "ledBulbName": "MiAirPurifier2 LED Switch",
            "airQualityDisable": false,
            "airQualityName": "MiAirPurifier2 AirQuality"

    }],

"accessories": [{
"accessory": "mqtt-temperature-log-tasmota",

                    "name": "Temperatura_lazienka",

                    "url": "mqtt://192.168.xx.xx",
                    "username": "XXXXX",
                    "password": "XXXXXX",

                    "topic": "tele/sonoff_laz/SENSOR",

                    "activityTopic": "tele/sonoff_laz/LWT",
                    "activityParameter": "Online",

                    "startCmd": "cmnd/sonoff_laz/TelePeriod",
                    "startParameter": "120",

                    "patchToSave": "/home/pi/Public/log/",

etc

Switches

Is it possible to group accesories in better way in single tile view? Like - first on/off button and then night mode and fan speed? Thanks

Device is not a constructor

Hi, can you help me please?

[2018-2-6 10:43:25] [HomeBridgeControllerLink] Initializing HomeBridgeControllerLink platform...
[2018-2-6 10:43:25] [Config] Initializing config platform...
[2018-2-6 10:43:26] [MiAirPurifierPlatform] Initializing MiAirPurifierPlatform platform...
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO] MiAirPurifierPlatform v0.1.1 By YinHang
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO] GitHub: https://github.com/YinHangCode/homebridge-mi-airpurifier
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO] QQ Group: 107927710
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
[2018-2-6 10:43:26] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]start success...
/usr/local/lib/node_modules/homebridge-mi-airpurifier/Devices/MiAirPurifier2.js:17
this.device = new miio.Device({
^

TypeError: miio.Device is not a constructor
at new MiAirPurifier2 (/usr/local/lib/node_modules/homebridge-mi-airpurifier/Devices/MiAirPurifier2.js:17:19)
at MiAirPurifierPlatform.accessories (/usr/local/lib/node_modules/homebridge-mi-airpurifier/index.js:92:21)
at Server._loadPlatformAccessories (/usr/local/lib/node_modules/homebridge/lib/server.js:364:20)
at Server._loadPlatforms (/usr/local/lib/node_modules/homebridge/lib/server.js:308:16)
at Server.run (/usr/local/lib/node_modules/homebridge/lib/server.js:85:36)
at module.exports (/usr/local/lib/node_modules/homebridge/lib/cli.js:40:10)
at Object. (/usr/local/lib/node_modules/homebridge/bin/homebridge:17:22)
at Module._compile (module.js:643:30)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
at Function.Module._load (module.js:491:3)
at Function.Module.runMain (module.js:684:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3

Not working with Air Purifier Pro

[1/21/2020, 1:26:56 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - SilentModeSwitch - getOn Error: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - SilentModeSwitch - getOn Error: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - RotationSpeed - getRotationSpeed Error: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState Error: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - Active - getActive Error: Error: Call to device timed out
[1/21/2020, 1:27:06 AM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - FilterChangeIndication - getFilterChangeIndication Error: Error: Call to device timed out

Air quality and humidity update.

some reason not updated the air quality and humidity. To update the data you need to close homekit and open it again. status of the inclusion is updated normally.

Grouping in Home App

hey,

whats wrong on my settings that the devices (purifier, temp, quality and humidity) are not shown as a group instead of showing each device as seperate tile ?

    {
        "platform": "MiAirPurifierPlatform",
        "deviceCfgs": [{
            "type": "MiAirPurifier2S",
            "ip": "192.168.178.12",
            "token": "of course changed",
            "airPurifierDisable": false,
            "airPurifierName": "Luftreiniger",
            "silentModeSwitchDisable": true,
            "silentModeSwitchName": "Luftreiniger Silent Mode",
            "temperatureDisable": false,
            "temperatureName": "Luftreiniger Temperature",
            "humidityDisable": false,
            "humidityName": "Luftreiniger Humidity",
            "buzzerSwitchDisable": true,
            "buzzerSwitchName": "Luftreiniger Buzzer",
            "ledBulbDisable": true,
            "ledBulbName": "Luftreiniger LED",
            "airQualityDisable": false,
            "airQualityName": "Luftreiniger AirQuality"
        }]

提示音无法正常显示状态

我已经将如下添加到config.json中了 (I've added these lines in config.json)

"buzzerSwitchDisable": false,
"buzzerSwitchName": "MiAirPurifier2S Buzzer Switch",

开关可以正常显示和拨动,但是退出home.app再进入,无论提示音开关究竟真的是开还是关的状态,这里开关显示都是关的状态。

The switch is able to be toggled on and off. But if you quit home and open it again, it always off.

typeError after update miio

After 'miio' updated, it's not work with follwoing message.

TypeError: miio.Device is not a constructor
I solved this error But I have another error
TypeError: that.device.call is not a function
Please solve it

Graphic trends for temperature and humidity

Is it possible to get support for EVE's graphic trends for the temperature and humidity measured by the Xiaomi? I got other measurements in my home which do support graphic trends and it would be really great to see that feature here too

suggestion: LED Light expose as switch instead of light

With the LED light switch exposed as a light it will get grouped in commands such as "turn off all lights" - that's not the desired behavior for me, but I would like to add turning off the LED to routines. Could it be exposed as a switch instead of a light? Switches can be converted to Lights in the Home app if a user desires.

Call to device timed out: Xiaomi Air Purifier 2S (mc1)

Hi

Thanks for a great plugin. Just got my Xiaomi Air Purifier 2S in the door and succeed in getting the token and plugin up and running with.

The device itself however is not responding in Apple Home app. Quite possibly due to lack of support for model "zhimi.airpurifier.mc1" in miio? Link

Any chance support for zhimi.airpurifier.mc1 will be added directly to the plugin?

I'm getting a"call to device timed out" in Homebridge:
Screenshot 2019-04-09 at 21 28 09

Thanks again :)

用Siri无法操作

在软件和控制中心是可以正常打开和关闭的
但是用siri提示正常打开和关闭, 但是实际是一直在loading

设备:

  1. 小米空气净化器2
  2. ios 11

Air Purifier Pro not recognized

in the device modules, i had to manually add the v7 purifier pro:

'zhimi.airpurifier.v7': AirPurifier,

then it works fine. Thanks for your efforts.

Error: The requested platform 'MiAirPurifierPlatform' was not registered by any plugin.

直接运行homebridge的话可以正常运行,使用systemctl start homebridge运行则报错,报错内容如下

Apr 22 22:25:06 orangepizero homebridge[6410]: Error: The requested platform 'MiAirPurifierPlatform' was not registered by any plugin.
Apr 22 22:25:06 orangepizero homebridge[6410]:     at API.platform (/usr/lib/node_modules/homebridge/lib/api.js:122:13)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Server._loadPlatforms (/usr/lib/node_modules/homebridge/lib/server.js:294:45)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Server.run (/usr/lib/node_modules/homebridge/lib/server.js:85:36)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at module.exports (/usr/lib/node_modules/homebridge/lib/cli.js:40:10)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Object.<anonymous> (/usr/lib/node_modules/homebridge/bin/homebridge:17:22)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Module._compile (module.js:571:32)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Object.Module._extensions..js (module.js:580:10)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Module.load (module.js:488:32)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at tryModuleLoad (module.js:447:12)
Apr 22 22:25:06 orangepizero homebridge[6410]:     at Function.Module._load (module.js:439:3)

homebridge.service 内容如下

[Unit]
Description=HomeBridge
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=/usr/lib/node_modules/homebridge/bin/homebridge
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

config.json 内容如下

                {
                        "platform": "MiAirPurifierPlatform",
                        "deviceCfgs": [{
                                "type": "MiAirPurifier2",
                                "ip": "myip",
                                "token": "mytoken",
                                "airPurifierDisable": false,
                                "airPurifierName": "MiAirPurifier2",
                                "silentModeSwitchDisable": false,
                                "silentModeSwitchName": "MiAirPurifier2 Silent Mode Switch",
                                "temperatureDisable": false,
                                "temperatureName": "MiAirPurifier2 Temperature",
                                "humidityDisable": false,
                                "humidityName": "MiAirPurifier2 Humidity",
                                "buzzerSwitchDisable": true,
                                "buzzerSwitchName": "MiAirPurifier2 Buzzer Switch",
                                "ledBulbDisable": true,
                                "ledBulbName": "MiAirPurifier2 LED Switch",
                                "airQualityDisable": false,
                                "airQualityName": "MiAirPurifier2 AirQuality"
}]
                }

Fanspeed not working

Added the Pro version but it cannot control the fan speed of the device.
Please help

can make a temperature to sensor?

I using mi 2s on homebridge and homekit

but when I setting for automation, temperature of 2S is not sensor.

Just when I open the home app, show only.

Not change temp on home app when I open home app even already changed real temp and on 2s.

so i think if i can you 2s temp like as sensor. on Home app Be instantly reflected.

Thanks.

啥时候能支持max啊

英文不好,就用中文吧。非常感谢提供这个插件。新购置了一台小米的max,所以想问下,啥时候能更新,支持max啊。谢谢!

Feature request: Set volume of beep-sound on Pro

The beep-sound volume can be changed within the Mi Home app. Would be nice if this could be set within homekit too.

Additionally a volume-slider should be part of the main Air Purifier options in Home app.

Currently it can only be turned on/off by using buzzerSwitchDisable in the config.

No Token!

My "miio discover sync" answers as follows:

INFO Discovering devices. Press Ctrl+C to stop.

Device ID: 81001836
Model info: Unknown
Address: 192.168.1.85
Token: ???
Support: Unknown

I did wifi connection reset procedure - again the same. Device ID i correct because router recognized is as: zhimi-airpurifier-mc1_miio81001836

Any ideas?

Regards, Tomek

Xiaomi sensors update (Air Purifier Pro / PM2.5)

Hello,
After working 1 month to build my Homebridge, I am very happy with the result and would like to thank all the contributors of this project, it's just fabulous! I still have a shadow on the board, the automatic update of Xiaomi sensor information that does not work. I have an "Air Purifier Pro" that I integrated using the plugin "Homebridge Mi Airpurifier"
and a "PM2.5" integrated with "Homebridge Mi Pm2_5", both distributed by @deserteageal.
I saw that the "polling" had worked, I added the lines of code to the .json Air Purifier Pro device, but nothing better. For PM2.5, no more updates ...
I am forced to relaunch the app to get the update, which prevents any automatic use ... If anyone had a solution or idea to solve this problem? Thanks in advance

Error with two MiAirPurifier2S

Hi,

I'd like to report a problem. It works well with only one MiAirPurifier2S. But when adding another MiAirPurifier2S to config.json , homebridge compains that Error: Cannot add a bridged Accessory with the same UUID as another bridged Accessory: 82cd607a-98dc-4432-b06d-6dc29ebe2118.

Could you please check the problem?

Full log:

Aug 27 23:08:06 hostname homebridge.homebridge[13825]: HOMEBRIDGE_AUTO_UPDATE_NPM_MODULES=on (default value)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded config.json with 0 accessories and 3 platforms.
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded plugin: homebridge-info
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Registering platform 'homebridge-info.Info'
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded plugin: homebridge-mi-acpartner
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Registering platform 'homebridge-mi-acpartner.XiaoMiAcPartner'
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded plugin: homebridge-mi-airpurifier
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Registering platform 'homebridge-mi-airpurifier.MiAirPurifierPlatform'
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded plugin: homebridge-mi-aqara
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Registering platform 'homebridge-mi-aqara.MiAqaraPlatform'
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loaded plugin: homebridge-server
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Registering platform 'homebridge-server.Server'
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] ---
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] Loading 3 platforms...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [Homebridge Info Server] Initializing Info platform...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [Homebridge Server] Initializing Server platform...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing MiAirPurifierPlatform platform...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]          MiAirPurifierPlatform v0.1.3 By YinHang
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]  GitHub: https://github.com/YinHangCode/homebridge-mi-airpurifier
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]                                              QQ Group: 107927710
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]start success...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]device size: 2, accessories size: 8
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'MiAirPurifier2S'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: HAP Warning: Characteristic 000000AC-0000-1000-8000-0026BB765291 not in required or optional characteristics for service 000000BB-0000-1000-8000-0026BB765291. Adding anyway.
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'MiAirPurifier2S Temperature'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'MiAirPurifier2S Humidity'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'MiAirPurifier2S AirQuality'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'weida de MiAirPurifier2S'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: HAP Warning: Characteristic 000000AC-0000-1000-8000-0026BB765291 not in required or optional characteristics for service 000000BB-0000-1000-8000-0026BB765291. Adding anyway.
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: [2018-8-27 23:08:06] [MiAirPurifierPlatform] Initializing platform accessory 'MiAirPurifier2S Temperature'...
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: /var/snap/homebridge/common/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Accessory.js:264
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: throw new Error("Cannot add a bridged Accessory with the same UUID as another bridged Accessory: " + existing.UUID);
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: ^
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: Error: Cannot add a bridged Accessory with the same UUID as another bridged Accessory: 82cd607a-98dc-4432-b06d-6dc29ebe2118
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Bridge.Accessory.addBridgedAccessory (/var/snap/homebridge/common/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Accessory.js:264:13)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Server.<anonymous> (/var/snap/homebridge/common/lib/node_modules/homebridge/lib/server.js:398:24)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at /var/snap/homebridge/common/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/util/once.js:16:19
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at MiAirPurifierPlatform.accessories (/var/snap/homebridge/common/lib/node_modules/homebridge-mi-airpurifier/index.js:109:9)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Server._loadPlatformAccessories (/var/snap/homebridge/common/lib/node_modules/homebridge/lib/server.js:385:20)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Server._loadPlatforms (/var/snap/homebridge/common/lib/node_modules/homebridge/lib/server.js:329:16)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Server.run (/var/snap/homebridge/common/lib/node_modules/homebridge/lib/server.js:85:36)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at module.exports (/var/snap/homebridge/common/lib/node_modules/homebridge/lib/cli.js:43:10)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Object.<anonymous> (/var/snap/homebridge/common/lib/node_modules/homebridge/bin/homebridge:17:22)
Aug 27 23:08:06 hostname homebridge.homebridge[13825]: at Module._compile (module.js:652:30)

config:

{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:22:3D:E3:CE:30",
        "port": 51826,
        "pin": "031-45-154"
    },

    "description": "HomeBridge@USTC908",

    "platforms": [
     {
         "platform": "Info",
         "port": 9876,
         "name": "Homebridge Info Server",
         "updateFrequency": 10000,
         "updateCheckFrequency": 86400
     },
     {
         "platform": "Server",
         "port"    : 8765,
         "name"    : "Homebridge Server",
         "log"     : "/var/snap/homebridge/current/serber.log",
         "restart" : "snapctl restart homebridge.homebridge"
     },
     {
         "platform": "MiAirPurifierPlatform",
         "deviceCfgs": [
         {
             "type": "MiAirPurifier2S",
             "ip": "100.66.1.152",
             "token": "****",
             "airPurifierDisable": false,
             "airPurifierName": "MiAirPurifier2S",
             "silentModeSwitchDisable": false,
             "silentModeSwitchName": "MiAirPurifier2S Silent Mode Switch",
             "temperatureDisable": false,
             "temperatureName": "MiAirPurifier2S Temperature",
             "humidityDisable": false,
             "humidityName": "MiAirPurifier2S Humidity",
             "buzzerSwitchDisable": true,
             "buzzerSwitchName": "MiAirPurifier2S Buzzer Switch",
             "ledBulbDisable": true,
             "ledBulbName": "MiAirPurifier2S LED Switch",
             "airQualityDisable": false,
             "airQualityName": "MiAirPurifier2S AirQuality"
         }, {
             "type": "MiAirPurifier2S",
             "ip": "100.66.1.156",
             "token": "****",
             "airPurifierDisable": false,
             "airPurifierName": "weida de MiAirPurifier2S",
             "silentModeSwitchDisable": false,
             "silentModeSwitchName": "MiAirPurifier2S Silent Mode Switch",
             "temperatureDisable": false,
             "temperatureName": "MiAirPurifier2S Temperature",
             "humidityDisable": false,
             "humidityName": "MiAirPurifier2S Humidity",
             "buzzerSwitchDisable": true,
             "buzzerSwitchName": "MiAirPurifier2S Buzzer Switch",
             "ledBulbDisable": true,
             "ledBulbName": "MiAirPurifier2S LED Switch",
             "airQualityDisable": false,
             "airQualityName": "MiAirPurifier2S AirQuality"
         }
         ]
     }
    ]
}

Call to device timed out

When I run Homebridge paired with iOS home app, the air purifier accessories are not responding and Homebridge logs this:

Homebridge is running on port 51826.
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirQualityAccessory - AirQuality - getAirQuality Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2HumidityAccessory - Humidity - getHumidity Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2TemperatureAccessory - Temperature - getTemperature Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - SilentModeSwitch - getOn Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - LockPhysicalControls - getLockPhysicalControls Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - RotationSpeed - getRotationSpeed Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - Active - getActive Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState Error: Error: Call to device timed out
[MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifier2AirPurifierAccessory - FilterChangeIndication - getFilterChangeIndication Error: Error: Call to device timed out

Token is the proper one. I got it when connected to zhimi-airpurifier-m1_miapXXXX wifi, but then when I connect air purifier 2 with MiHome app, miio discover sync command returns this:

Device ID: 6136XXXX
Model info: Unknown
Address: 192.168.0.185
Token: ???
Support: Unknown

UUID error

Hi,

When I add a second device, I get the following error:

[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing MiAirPurifierPlatform platform...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]          MiAirPurifierPlatform v0.0.8 By YinHang
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]  GitHub: https://github.com/YinHangCode/homebridge-mi-airpurifier 
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]                                              QQ Group: 107927710  
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]*******************************************************************
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]start success...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][DEBUG]Initializing AirPurifierPro device: 192.168.1.31, accessories size: 4
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][DEBUG]Initializing AirPurifier2 device: 192.168.1.2, accessories size: 4
[2017-10-16 14:59:25] [MiAirPurifierPlatform] [MiAirPurifierPlatform][INFO]device size: 2, accessories size: 8
[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing platform accessory 'AirPurifier'...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing platform accessory 'Temperature'...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing platform accessory 'Humidity'...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing platform accessory 'AirQuality'...
[2017-10-16 14:59:25] [MiAirPurifierPlatform] Initializing platform accessory 'AirPurifier'...
/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Accessory.js:257
      throw new Error("Cannot add a bridged Accessory with the same UUID as another bridged Accessory: " + existing.UUID);
      ^

Error: Cannot add a bridged Accessory with the same UUID as another bridged Accessory: 80916c4a-8d56-4e91-97ad-6e5a69c1a994
    at Bridge.Accessory.addBridgedAccessory (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Accessory.js:257:13)
    at Server.<anonymous> (/usr/local/lib/node_modules/homebridge/lib/server.js:367:24)
    at /usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/util/once.js:16:19
    at MiAirPurifierPlatform.accessories (/usr/local/lib/node_modules/homebridge-mi-airpurifier/index.js:104:9)
    at Server._loadPlatformAccessories (/usr/local/lib/node_modules/homebridge/lib/server.js:354:20)
    at Server._loadPlatforms (/usr/local/lib/node_modules/homebridge/lib/server.js:298:16)
    at Server.run (/usr/local/lib/node_modules/homebridge/lib/server.js:80:36)
    at module.exports (/usr/local/lib/node_modules/homebridge/lib/cli.js:40:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/homebridge/bin/homebridge:17:22)
    at Module._compile (module.js:569:30)

Making all the names unique solves the issue, like for example:

[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'AirPurifier'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'Temperature'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'Humidity'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'AirQuality'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'AirPurifier2'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'Temperature2'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'Humidity2'...
[2017-10-16 15:02:42] [MiAirPurifierPlatform] Initializing platform accessory 'AirQuality2'...

Any help would be appreciated!

first time open "home" apps the airpurifier no respond,when touch for detial it's got be normal

open "home" apps first time the airpurifier switch and sensor no respond
when touch icon for detial it's got be normal and works good,if quit the home app,error will show again
it's only on Mi airpurifier first generation,another one 2s is working good.

log:
[11/22/2018, 11:51:16 PM] [homebridge-miio.XiaomiMiio] miIO Plug 88305382 fetch status
[11/22/2018, 11:51:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - Active - getActive Error: Error: UART timeout
[11/22/2018, 11:51:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: Error: UART timeout
[11/22/2018, 11:51:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]MiAirPurifierAirPurifierAccessory - CurrentAirPurifierState - getCurrentAirPurifierState Error: Error: UART timeout

Anyway to publish the temperature to MQTT broker?

Hi,

I would like to say thank you for such an amazing and reliable plugin to control 2 of my Xiaomi Air Purifiers. It's been working very fine so far.

I would like to ask if it's possible to publish the temperature to MQTT Broker as the device has the temperature sensor in it. I think it will be very useful if possible since the published value can be used in other home automation like switching the mode of the Air Conditioner based on the current room temperature.

Really looking forward to your reply.

Support for Xiaomi Air Purifier Max

The Xiaomi Air Purifier Max was released in December 2017 and you mentioned it was "coming soon" in January. Any updates on this? I'd like to use this plugin with the Max model.

Everything works great with my Purifier 2, thanks for your wonderful work on this plugin.

Air Purifier Pro Fan Speed is not correct + solution

I experienced the following issues with the Air Purifier Pro:

  • Setting higher fan speeds or the maximum speed is not driving the purifier at the maximum speed, not even close to it.
  • In the Home App the Fan Speed Slider setting many times jumps to the bottom of the scale and does not represent the real value of the current speed.

After research I found out that:

when using this plugin and adjusting the FAN SPEED in MANUAL mode in the Home App, the FAN SPEED slider has values from 0-100. This plugin translates the slider setting to a number between 0 and 10, so sending out this parsed value to the purifier. I assume the reason is that other Xiaomi Air Purifiers using fan speed setting from 0 - 10. However Air Purifier Pro supports 17 different values for the FAN SPEED (in Mi App the minimum setting is 7-12m2 and the maximum is 35~60m2). All together there are 17 different values are available. Because the plugin limit is 10, so the maximum setting stops around ~60%. When the plugin checks for the actual fan speed to adjust the slider position, the same incorrect calculation results in setting the slider to the lower range instead of the actual speed.

I modified MiAirPurifierPro.js file in order to make it work properly. The following changes has to be done:

in line 255 the following IF block

if(rotationSpeedCharacteristic.value <= result[0] * 10 && rotationSpeedCharacteristic.value > (result[0] - 1) * 10) {
                                callback(null);
                            } else {
                                rotationSpeedCharacteristic.value = result[0] * 10;
                                callback(null);
                            }

has to be replaced by

rotationSpeedCharacteristic.value = parseInt(result[0] / 0.17);
                            callback(null);

line 279:

callback(null, result[0]);

has to be replaced by

callback(null, parseInt(result[0] / 0.17));

and line 290:

that.device.call("set_level_favorite", [parseInt(value / 10) < 10 ? parseInt(value / 10) + 1 : 10]).then(result => {

has to be replaced by

that.device.call("set_level_favorite", [parseInt(value * 0.17)]).then(result => {

I can't confirm that this issue exists with any other purifier as I don't have them.

I found the MiAirPurifierPro.js file at the following location on my Raspberry Pi but you may have it somewhere else:
/usr/lib/node_modules/homebridge-mi-airpurifier/Devices

To make it more easier I copied my modified MiAirPurifierPro.js here, so you may replace the entire file:

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);
                            rotationSpeedCharacteristic.value = parseInt(result[0] / 0.17);
                            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, parseInt(result[0] / 0.17));
            }).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 * 0.17)]).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;
}

空气净化器2S无法切换到自动

iOS自定义场景中,空气净化器2S无法切换到自动模式,一直是手动模式(也就是最爱模式).在iOS给的场景就不会,比如"早上好"场景就不会出现问题,但是在自定义的场景就不行,无法到自动模式.
希望楼主早日修复bug,好人一生平安.

Xiaomi Airfresh VA2

Do you plan to add support for Xiaomi Airfresh VA2? Maybe it is possible to accelerate this process as quickly as possible to help you financially?

The lowest manual speed of Air Purifier 2S

Hi,
Thanks for this plugin, it works great - although I have one problem:
When I choose the lowest (2-4 m2) level of rotation speed of my Air Purifier 2S in Mi Home app, rotation speed in HomeKit is set to 0%. When I want to set the lowest manual speed of the device in Home.app or via Siri, I can't because setting 0% speed turns off the air purifier, ex. when I say "Set the Air Purifier to 0%", she switches it off. Currently, 1-5% are reserved for 5-9 m2 speed. 2-4m2 speed is not possible to set from HomeKit. It would be great if I can set it.
It's important for me because on of my Xiaomi's sensor is currently broken and I use automation and data from one air purifier to rule the broken one.
Can you help me?

UART error

Whenever I open my home.app , the initial value for Air Quality is No Response.

I need to go to Rooms, then back to Home and then it will show me the air quality, i.e. Excellent.

Using the Mi Air Purifier 1st Gen

I keep seeing this in the Homebridge output
[10/28/2017, 10:39:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]AirPurifierAirPurifierAccessory - TargetAirPurifierState - getTargetAirPurifierState: Error: UART timeout
[10/28/2017, 10:39:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]AirPurifierProLEDBulbAccessory - switchLED - getLEDPower Error: Error: UART timeout
[10/28/2017, 10:39:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]AirPurifierAirQualityAccessory - AirQuality - getAirQuality Error: Error: UART timeout
[10/28/2017, 10:39:17 PM] [MiAirPurifierPlatform] [MiAirPurifierPlatform][ERROR]AirPurifierBuzzerSwitchAccessory - BuzzerSwitch - getBuzzerState Error: Error: UART timeout

Data from PM2.5 sensor

Hi,

Can you pull the data from the sensor, showing the air quality (PM2.5 number value) and display it in HomeKit?

Plug in not starting

hi

i don't know if this plug in is still developped, but i try my chance. I have an error at start, here is the log

ERROR LOADING PLUGIN homebridge-mi-airpurifier:
[3/19/2020, 11:15:44 AM] TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
at validateString (internal/validators.js:112:11)
at Object.join (path.js:1039:7)
at userData (/usr/lib/node_modules/homebridge-mi-airpurifier/node_modules/appdirectory/lib/appdirectory.js:21:29)
at AppDirectory._setTemplates (/usr/lib/node_modules/homebridge-mi-airpurifier/node_modules/appdirectory/lib/appdirectory.js:134:34)
at new AppDirectory (/usr/lib/node_modules/homebridge-mi-airpurifier/node_modules/appdirectory/lib/appdirectory.js:129:10)
at Object. (/usr/lib/node_modules/homebridge-mi-airpurifier/node_modules/miio/lib/tokens.js:8:14)
at Module._compile (internal/modules/cjs/loader.js:955:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
at Module.load (internal/modules/cjs/loader.js:811:32)
at Function.Module._load (internal/modules/cjs/loader.js:723:14)

Can someone help?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.