diff --git a/bundles/org.openhab.binding.miio/README.md b/bundles/org.openhab.binding.miio/README.md
index 7259f8278486..b0955db28285 100644
--- a/bundles/org.openhab.binding.miio/README.md
+++ b/bundles/org.openhab.binding.miio/README.md
@@ -98,6 +98,7 @@ However, for devices that are unsupported, you may override the value and try to
| Mi Air Purifier MS1 | miio:basic | [zhimi.airpurifier.ma1](#zhimi-airpurifier-ma1) | Yes | |
| Mi Air Purifier MS2 | miio:basic | [zhimi.airpurifier.ma2](#zhimi-airpurifier-ma2) | Yes | |
| Mi Air Purifier 3 | miio:basic | [zhimi.airpurifier.ma4](#zhimi-airpurifier-ma4) | Yes | |
+| Mi Air Purifier 3 | miio:basic | [zhimi.airpurifier.mb3](#zhimi-airpurifier-mb3) | Yes | |
| Mi Air Purifier Super | miio:basic | [zhimi.airpurifier.sa1](#zhimi-airpurifier-sa1) | Yes | |
| Mi Air Purifier Super 2 | miio:basic | [zhimi.airpurifier.sa2](#zhimi-airpurifier-sa2) | Yes | |
| Mi Fresh Air Ventilator | miio:basic | [dmaker.airfresh.t2017](#dmaker-airfresh-t2017) | Yes | |
@@ -561,22 +562,120 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
-| power | Switch | Power |
-| mode | String | Mode |
-| humidity | Number | Humidity |
-| aqi | Number | Air Quality Index |
-| averageaqi | Number | Average Air Quality Index |
-| led | Switch | LED Status |
-| buzzer | Switch | Buzzer Status |
-| filtermaxlife | Number | Filter Max Life |
-| filterhours | Number | Filter Hours used |
-| usedhours | Number | Run Time |
-| motorspeed | Number | Motor Speed |
-| filterlife | Number | Filter Life |
-| favoritelevel | Number | Favorite Level |
-| temperature | Number | Temperature |
-| purifyvolume | Number | Purivied Volume |
-| childlock | Switch | Child Lock |
+| Fault | Number | Air Purifier-Device Fault |
+| On | Switch | Air Purifier-Switch Status |
+| FanLevel | Number | Air Purifier-Fan Level |
+| Mode | Number | Air Purifier-Mode |
+| FirmwareRevision | String | Device Information-Current Firmware Version |
+| Manufacturer | String | Device Information-Device Manufacturer |
+| Model | String | Device Information-Device Model |
+| SerialNumber | String | Device Information-Device Serial Number |
+| Pm25Density | Number | Environment-PM2.5 Density |
+| RelativeHumidity | Number | Environment-Relative Humidity |
+| Temperature | Number | Environment-Temperature |
+| FilterLifeLevel | Number | Filter-Filter Life Level |
+| FilterUsedTime | String | Filter-Filter Used Time |
+| Alarm | Switch | Alarm-Alarm |
+| Brightness | Number | Indicator Light-Brightness |
+| On1 | Switch | Indicator Light-Switch Status |
+| PhysicalControlsLocked | Switch | Physical Control Locked-Physical Control Locked |
+| ButtonPressed | String | button-button_pressed |
+| FilterMaxTime | Number | filter-time-filter-max-time |
+| FilterHourUsedDebug | Number | filter-time-filter-hour-used-debug |
+| M1Strong | Number | motor-speed-m1-strong |
+| M1High | Number | motor-speed-m1-high |
+| M1Med | Number | motor-speed-m1-med |
+| M1MedL | Number | motor-speed-m1-med-l |
+| M1Low | Number | motor-speed-m1-low |
+| M1Silent | Number | motor-speed-m1-silent |
+| M1Favorite | Number | motor-speed-m1-favorite |
+| Motor1Speed | Number | motor-speed-motor1-speed |
+| Motor1SetSpeed | Number | motor-speed-motor1-set-speed |
+| FavoriteFanLevel | Number | motor-speed-favorite fan level |
+| UseTime | Number | use-time-use-time |
+| PurifyVolume | Number | aqi-purify-volume |
+| AverageAqi | Number | aqi-average-aqi |
+| AverageAqiCnt | Number | aqi-average-aqi-cnt |
+| AqiZone | String | aqi-aqi-zone |
+| SensorState | String | aqi-sensor-state |
+| AqiGoodh | Number | aqi-aqi-goodh |
+| AqiRunstate | Number | aqi-aqi-runstate |
+| AqiState | Number | aqi-aqi-state |
+| AqiUpdataHeartbeat | Number | aqi-aqi-updata-heartbeat |
+| RfidTag | String | rfid-rfid-tag |
+| RfidFactoryId | String | rfid-rfid-factory-id |
+| RfidProductId | String | rfid-rfid-product-id |
+| RfidTime | String | rfid-rfid-time |
+| RfidSerialNum | String | rfid-rfid-serial-num |
+| AppExtra | Number | others-app-extra |
+| MainChannel | Number | others-main-channel |
+| SlaveChannel | Number | others-slave-channel |
+| Cola | String | others-cola |
+| ButtomDoor | Switch | others-buttom-door |
+| RebootCause | Number | others-reboot_cause |
+| HwVersion | Number | others-hw-version |
+| I2cErrorCount | Number | others-i2c-error-count |
+| ManualLevel | Number | others-manual-level |
+
+### Mi Air Purifier 3 (zhimi.airpurifier.mb3) Channels
+
+| Channel | Type | Description |
+|------------------|---------|-------------------------------------|
+| Fault | Number | Air Purifier-fault |
+| On | Switch | Air Purifier-Switch Status |
+| FanLevel | Number | Air Purifier-Fan Level |
+| Mode | Number | Air Purifier-Mode |
+| FirmwareRevision | String | Device Information-Current Firmware Version |
+| Manufacturer | String | Device Information-Device Manufacturer |
+| Model | String | Device Information-Device Model |
+| SerialNumber | String | Device Information-Device Serial Number |
+| Pm25Density | Number | Environment-PM2.5 |
+| RelativeHumidity | Number | Environment-Relative Humidity |
+| Temperature | Number | Environment-Temperature |
+| FilterLifeLevel | Number | Filter-Filter Life Level |
+| FilterUsedTime | String | Filter-Filter Used Time |
+| Alarm | Switch | Alarm-Alarm |
+| Brightness | Number | Indicator Light-brightness |
+| On1 | Switch | Indicator Light-Switch Status |
+| PhysicalControlsLocked | Switch | Physical Control Locked-Physical Control Locked |
+| ButtonPressed | String | Button-button-pressed |
+| FilterMaxTime | Number | filter-time-filter-max-time |
+| FilterHourDebug | Number | filter-time-filter-hour-debug |
+| MotorStrong | Number | motor-speed-motor-strong |
+| MotorHigh | Number | motor-speed-motor-high |
+| MotorMed | Number | motor-speed-motor-med |
+| MotorMedL | Number | motor-speed-motor-med-l |
+| MotorLow | Number | motor-speed-motor-low |
+| MotorSilent | Number | motor-speed-motor-silent |
+| MotorFavorite | Number | motor-speed-motor-favorite |
+| MotorSpeed | Number | motor-speed-motor-speed |
+| MotorSetSpeed | Number | motor-speed-motor-set-speed |
+| FavoriteFanLevel | Number | motor-speed-favorite-fan-level |
+| UseTime | Number | use-time-use-time |
+| PurifyVolume | Number | aqi-purify-volume |
+| AverageAqi | Number | aqi-average-aqi |
+| AverageAqiCnt | Number | aqi-average-aqi-cnt |
+| AqiZone | String | aqi-aqi-zone |
+| SensorState | String | aqi-sensor-state |
+| AqiGoodh | Number | aqi-aqi-goodh |
+| AqiRunstate | Number | aqi-aqi-runstate |
+| AqiState | Number | aqi-aqi-state |
+| AqiUpdataHeartbeat | Number | aqi-aqi-updata-heartbeat |
+| RfidTag | String | rfid-rfid-tag |
+| RfidFactoryId | String | rfid-rfid-factory-id |
+| RfidProductId | String | rfid-rfid-product-id |
+| RfidTime | String | rfid-rfid-time |
+| RfidSerialNum | String | rfid-rfid-serial-num |
+| AppExtra | Number | others-app-extra |
+| MainChannel | Number | others-main-channel |
+| SlaveChannel | Number | others-slave-channel |
+| Cola | String | others-cola |
+| ButtomDoor | Switch | others-buttom-door |
+| RebootCause | Number | others-reboot-cause |
+| HwVersion | Number | others-hw-version |
+| IicErrorCount | Number | others-iic-error-count |
+| ManualLevel | Number | others-manual-level |
+| CountryCode | Number | others-National code |
### Mi Air Purifier Super (zhimi.airpurifier.sa1) Channels
@@ -1106,7 +1205,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1119,7 +1218,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1132,7 +1231,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1145,7 +1244,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1158,7 +1257,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1171,7 +1270,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| ambientBrightness | Number | Ambient Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
@@ -1189,7 +1288,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| ambientBrightness | Number | Ambient Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
@@ -1207,7 +1306,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1220,7 +1319,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1233,7 +1332,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1246,7 +1345,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1259,7 +1358,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1272,7 +1371,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| ambientBrightness | Number | Ambient Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
@@ -1290,7 +1389,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1303,7 +1402,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1316,7 +1415,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1329,7 +1428,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1340,7 +1439,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1351,7 +1450,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1362,7 +1461,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1373,7 +1472,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1384,7 +1483,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1395,7 +1494,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1408,7 +1507,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1421,7 +1520,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | Number | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | Number | Color Mode |
@@ -1432,7 +1531,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1445,7 +1544,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1458,7 +1557,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1471,7 +1570,7 @@ e.g. `smarthome:send actionCommand 'upd_timer["1498595904821", "on"]'` would ena
| Channel | Type | Description |
|------------------|---------|-------------------------------------|
| power | Switch | Power |
-| brightness | Number | Brightness |
+| brightness | Dimmer | Brightness |
| delayoff | String | Shutdown Timer |
| colorTemperature | Number | Color Temperature |
| colorMode | String | Color Mode |
@@ -1884,22 +1983,123 @@ note: Autogenerated example. Replace the id (airpurifier) in the channel with yo
```java
Group G_airpurifier "Mi Air Purifier 3"
-Switch power "Power" (G_airpurifier) {channel="miio:basic:airpurifier:power"}
-String mode "Mode" (G_airpurifier) {channel="miio:basic:airpurifier:mode"}
-Number humidity "Humidity" (G_airpurifier) {channel="miio:basic:airpurifier:humidity"}
-Number aqi "Air Quality Index" (G_airpurifier) {channel="miio:basic:airpurifier:aqi"}
-Number averageaqi "Average Air Quality Index" (G_airpurifier) {channel="miio:basic:airpurifier:averageaqi"}
-Switch led "LED Status" (G_airpurifier) {channel="miio:basic:airpurifier:led"}
-Switch buzzer "Buzzer Status" (G_airpurifier) {channel="miio:basic:airpurifier:buzzer"}
-Number filtermaxlife "Filter Max Life" (G_airpurifier) {channel="miio:basic:airpurifier:filtermaxlife"}
-Number filterhours "Filter Hours used" (G_airpurifier) {channel="miio:basic:airpurifier:filterhours"}
-Number usedhours "Run Time" (G_airpurifier) {channel="miio:basic:airpurifier:usedhours"}
-Number motorspeed "Motor Speed" (G_airpurifier) {channel="miio:basic:airpurifier:motorspeed"}
-Number filterlife "Filter Life" (G_airpurifier) {channel="miio:basic:airpurifier:filterlife"}
-Number favoritelevel "Favorite Level" (G_airpurifier) {channel="miio:basic:airpurifier:favoritelevel"}
-Number temperature "Temperature" (G_airpurifier) {channel="miio:basic:airpurifier:temperature"}
-Number purifyvolume "Purivied Volume" (G_airpurifier) {channel="miio:basic:airpurifier:purifyvolume"}
-Switch childlock "Child Lock" (G_airpurifier) {channel="miio:basic:airpurifier:childlock"}
+Number Fault "Air Purifier-Device Fault" (G_airpurifier) {channel="miio:basic:airpurifier:Fault"}
+Switch On "Air Purifier-Switch Status" (G_airpurifier) {channel="miio:basic:airpurifier:On"}
+Number FanLevel "Air Purifier-Fan Level" (G_airpurifier) {channel="miio:basic:airpurifier:FanLevel"}
+Number Mode "Air Purifier-Mode" (G_airpurifier) {channel="miio:basic:airpurifier:Mode"}
+String FirmwareRevision "Device Information-Current Firmware Version" (G_airpurifier) {channel="miio:basic:airpurifier:FirmwareRevision"}
+String Manufacturer "Device Information-Device Manufacturer" (G_airpurifier) {channel="miio:basic:airpurifier:Manufacturer"}
+String Model "Device Information-Device Model" (G_airpurifier) {channel="miio:basic:airpurifier:Model"}
+String SerialNumber "Device Information-Device Serial Number" (G_airpurifier) {channel="miio:basic:airpurifier:SerialNumber"}
+Number Pm25Density "Environment-PM2.5 Density" (G_airpurifier) {channel="miio:basic:airpurifier:Pm25Density"}
+Number RelativeHumidity "Environment-Relative Humidity" (G_airpurifier) {channel="miio:basic:airpurifier:RelativeHumidity"}
+Number Temperature "Environment-Temperature" (G_airpurifier) {channel="miio:basic:airpurifier:Temperature"}
+Number FilterLifeLevel "Filter-Filter Life Level" (G_airpurifier) {channel="miio:basic:airpurifier:FilterLifeLevel"}
+String FilterUsedTime "Filter-Filter Used Time" (G_airpurifier) {channel="miio:basic:airpurifier:FilterUsedTime"}
+Switch Alarm "Alarm-Alarm" (G_airpurifier) {channel="miio:basic:airpurifier:Alarm"}
+Number Brightness "Indicator Light-Brightness" (G_airpurifier) {channel="miio:basic:airpurifier:Brightness"}
+Switch On1 "Indicator Light-Switch Status" (G_airpurifier) {channel="miio:basic:airpurifier:On1"}
+Switch PhysicalControlsLocked "Physical Control Locked-Physical Control Locked" (G_airpurifier) {channel="miio:basic:airpurifier:PhysicalControlsLocked"}
+String ButtonPressed "button-button_pressed" (G_airpurifier) {channel="miio:basic:airpurifier:ButtonPressed"}
+Number FilterMaxTime "filter-time-filter-max-time" (G_airpurifier) {channel="miio:basic:airpurifier:FilterMaxTime"}
+Number FilterHourUsedDebug "filter-time-filter-hour-used-debug" (G_airpurifier) {channel="miio:basic:airpurifier:FilterHourUsedDebug"}
+Number M1Strong "motor-speed-m1-strong" (G_airpurifier) {channel="miio:basic:airpurifier:M1Strong"}
+Number M1High "motor-speed-m1-high" (G_airpurifier) {channel="miio:basic:airpurifier:M1High"}
+Number M1Med "motor-speed-m1-med" (G_airpurifier) {channel="miio:basic:airpurifier:M1Med"}
+Number M1MedL "motor-speed-m1-med-l" (G_airpurifier) {channel="miio:basic:airpurifier:M1MedL"}
+Number M1Low "motor-speed-m1-low" (G_airpurifier) {channel="miio:basic:airpurifier:M1Low"}
+Number M1Silent "motor-speed-m1-silent" (G_airpurifier) {channel="miio:basic:airpurifier:M1Silent"}
+Number M1Favorite "motor-speed-m1-favorite" (G_airpurifier) {channel="miio:basic:airpurifier:M1Favorite"}
+Number Motor1Speed "motor-speed-motor1-speed" (G_airpurifier) {channel="miio:basic:airpurifier:Motor1Speed"}
+Number Motor1SetSpeed "motor-speed-motor1-set-speed" (G_airpurifier) {channel="miio:basic:airpurifier:Motor1SetSpeed"}
+Number FavoriteFanLevel "motor-speed-favorite fan level" (G_airpurifier) {channel="miio:basic:airpurifier:FavoriteFanLevel"}
+Number UseTime "use-time-use-time" (G_airpurifier) {channel="miio:basic:airpurifier:UseTime"}
+Number PurifyVolume "aqi-purify-volume" (G_airpurifier) {channel="miio:basic:airpurifier:PurifyVolume"}
+Number AverageAqi "aqi-average-aqi" (G_airpurifier) {channel="miio:basic:airpurifier:AverageAqi"}
+Number AverageAqiCnt "aqi-average-aqi-cnt" (G_airpurifier) {channel="miio:basic:airpurifier:AverageAqiCnt"}
+String AqiZone "aqi-aqi-zone" (G_airpurifier) {channel="miio:basic:airpurifier:AqiZone"}
+String SensorState "aqi-sensor-state" (G_airpurifier) {channel="miio:basic:airpurifier:SensorState"}
+Number AqiGoodh "aqi-aqi-goodh" (G_airpurifier) {channel="miio:basic:airpurifier:AqiGoodh"}
+Number AqiRunstate "aqi-aqi-runstate" (G_airpurifier) {channel="miio:basic:airpurifier:AqiRunstate"}
+Number AqiState "aqi-aqi-state" (G_airpurifier) {channel="miio:basic:airpurifier:AqiState"}
+Number AqiUpdataHeartbeat "aqi-aqi-updata-heartbeat" (G_airpurifier) {channel="miio:basic:airpurifier:AqiUpdataHeartbeat"}
+String RfidTag "rfid-rfid-tag" (G_airpurifier) {channel="miio:basic:airpurifier:RfidTag"}
+String RfidFactoryId "rfid-rfid-factory-id" (G_airpurifier) {channel="miio:basic:airpurifier:RfidFactoryId"}
+String RfidProductId "rfid-rfid-product-id" (G_airpurifier) {channel="miio:basic:airpurifier:RfidProductId"}
+String RfidTime "rfid-rfid-time" (G_airpurifier) {channel="miio:basic:airpurifier:RfidTime"}
+String RfidSerialNum "rfid-rfid-serial-num" (G_airpurifier) {channel="miio:basic:airpurifier:RfidSerialNum"}
+Number AppExtra "others-app-extra" (G_airpurifier) {channel="miio:basic:airpurifier:AppExtra"}
+Number MainChannel "others-main-channel" (G_airpurifier) {channel="miio:basic:airpurifier:MainChannel"}
+Number SlaveChannel "others-slave-channel" (G_airpurifier) {channel="miio:basic:airpurifier:SlaveChannel"}
+String Cola "others-cola" (G_airpurifier) {channel="miio:basic:airpurifier:Cola"}
+Switch ButtomDoor "others-buttom-door" (G_airpurifier) {channel="miio:basic:airpurifier:ButtomDoor"}
+Number RebootCause "others-reboot_cause" (G_airpurifier) {channel="miio:basic:airpurifier:RebootCause"}
+Number HwVersion "others-hw-version" (G_airpurifier) {channel="miio:basic:airpurifier:HwVersion"}
+Number I2cErrorCount "others-i2c-error-count" (G_airpurifier) {channel="miio:basic:airpurifier:I2cErrorCount"}
+Number ManualLevel "others-manual-level" (G_airpurifier) {channel="miio:basic:airpurifier:ManualLevel"}
+```
+
+### Mi Air Purifier 3 (zhimi.airpurifier.mb3) item file lines
+
+note: Autogenerated example. Replace the id (airpurifier) in the channel with your own. Replace `basic` with `generic` in the thing UID depending on how your thing was discovered.
+
+```java
+Group G_airpurifier "Mi Air Purifier 3"
+Number Fault "Air Purifier-fault" (G_airpurifier) {channel="miio:basic:airpurifier:Fault"}
+Switch On "Air Purifier-Switch Status" (G_airpurifier) {channel="miio:basic:airpurifier:On"}
+Number FanLevel "Air Purifier-Fan Level" (G_airpurifier) {channel="miio:basic:airpurifier:FanLevel"}
+Number Mode "Air Purifier-Mode" (G_airpurifier) {channel="miio:basic:airpurifier:Mode"}
+String FirmwareRevision "Device Information-Current Firmware Version" (G_airpurifier) {channel="miio:basic:airpurifier:FirmwareRevision"}
+String Manufacturer "Device Information-Device Manufacturer" (G_airpurifier) {channel="miio:basic:airpurifier:Manufacturer"}
+String Model "Device Information-Device Model" (G_airpurifier) {channel="miio:basic:airpurifier:Model"}
+String SerialNumber "Device Information-Device Serial Number" (G_airpurifier) {channel="miio:basic:airpurifier:SerialNumber"}
+Number Pm25Density "Environment-PM2.5" (G_airpurifier) {channel="miio:basic:airpurifier:Pm25Density"}
+Number RelativeHumidity "Environment-Relative Humidity" (G_airpurifier) {channel="miio:basic:airpurifier:RelativeHumidity"}
+Number Temperature "Environment-Temperature" (G_airpurifier) {channel="miio:basic:airpurifier:Temperature"}
+Number FilterLifeLevel "Filter-Filter Life Level" (G_airpurifier) {channel="miio:basic:airpurifier:FilterLifeLevel"}
+String FilterUsedTime "Filter-Filter Used Time" (G_airpurifier) {channel="miio:basic:airpurifier:FilterUsedTime"}
+Switch Alarm "Alarm-Alarm" (G_airpurifier) {channel="miio:basic:airpurifier:Alarm"}
+Number Brightness "Indicator Light-brightness" (G_airpurifier) {channel="miio:basic:airpurifier:Brightness"}
+Switch On1 "Indicator Light-Switch Status" (G_airpurifier) {channel="miio:basic:airpurifier:On1"}
+Switch PhysicalControlsLocked "Physical Control Locked-Physical Control Locked" (G_airpurifier) {channel="miio:basic:airpurifier:PhysicalControlsLocked"}
+String ButtonPressed "Button-button-pressed" (G_airpurifier) {channel="miio:basic:airpurifier:ButtonPressed"}
+Number FilterMaxTime "filter-time-filter-max-time" (G_airpurifier) {channel="miio:basic:airpurifier:FilterMaxTime"}
+Number FilterHourDebug "filter-time-filter-hour-debug" (G_airpurifier) {channel="miio:basic:airpurifier:FilterHourDebug"}
+Number MotorStrong "motor-speed-motor-strong" (G_airpurifier) {channel="miio:basic:airpurifier:MotorStrong"}
+Number MotorHigh "motor-speed-motor-high" (G_airpurifier) {channel="miio:basic:airpurifier:MotorHigh"}
+Number MotorMed "motor-speed-motor-med" (G_airpurifier) {channel="miio:basic:airpurifier:MotorMed"}
+Number MotorMedL "motor-speed-motor-med-l" (G_airpurifier) {channel="miio:basic:airpurifier:MotorMedL"}
+Number MotorLow "motor-speed-motor-low" (G_airpurifier) {channel="miio:basic:airpurifier:MotorLow"}
+Number MotorSilent "motor-speed-motor-silent" (G_airpurifier) {channel="miio:basic:airpurifier:MotorSilent"}
+Number MotorFavorite "motor-speed-motor-favorite" (G_airpurifier) {channel="miio:basic:airpurifier:MotorFavorite"}
+Number MotorSpeed "motor-speed-motor-speed" (G_airpurifier) {channel="miio:basic:airpurifier:MotorSpeed"}
+Number MotorSetSpeed "motor-speed-motor-set-speed" (G_airpurifier) {channel="miio:basic:airpurifier:MotorSetSpeed"}
+Number FavoriteFanLevel "motor-speed-favorite-fan-level" (G_airpurifier) {channel="miio:basic:airpurifier:FavoriteFanLevel"}
+Number UseTime "use-time-use-time" (G_airpurifier) {channel="miio:basic:airpurifier:UseTime"}
+Number PurifyVolume "aqi-purify-volume" (G_airpurifier) {channel="miio:basic:airpurifier:PurifyVolume"}
+Number AverageAqi "aqi-average-aqi" (G_airpurifier) {channel="miio:basic:airpurifier:AverageAqi"}
+Number AverageAqiCnt "aqi-average-aqi-cnt" (G_airpurifier) {channel="miio:basic:airpurifier:AverageAqiCnt"}
+String AqiZone "aqi-aqi-zone" (G_airpurifier) {channel="miio:basic:airpurifier:AqiZone"}
+String SensorState "aqi-sensor-state" (G_airpurifier) {channel="miio:basic:airpurifier:SensorState"}
+Number AqiGoodh "aqi-aqi-goodh" (G_airpurifier) {channel="miio:basic:airpurifier:AqiGoodh"}
+Number AqiRunstate "aqi-aqi-runstate" (G_airpurifier) {channel="miio:basic:airpurifier:AqiRunstate"}
+Number AqiState "aqi-aqi-state" (G_airpurifier) {channel="miio:basic:airpurifier:AqiState"}
+Number AqiUpdataHeartbeat "aqi-aqi-updata-heartbeat" (G_airpurifier) {channel="miio:basic:airpurifier:AqiUpdataHeartbeat"}
+String RfidTag "rfid-rfid-tag" (G_airpurifier) {channel="miio:basic:airpurifier:RfidTag"}
+String RfidFactoryId "rfid-rfid-factory-id" (G_airpurifier) {channel="miio:basic:airpurifier:RfidFactoryId"}
+String RfidProductId "rfid-rfid-product-id" (G_airpurifier) {channel="miio:basic:airpurifier:RfidProductId"}
+String RfidTime "rfid-rfid-time" (G_airpurifier) {channel="miio:basic:airpurifier:RfidTime"}
+String RfidSerialNum "rfid-rfid-serial-num" (G_airpurifier) {channel="miio:basic:airpurifier:RfidSerialNum"}
+Number AppExtra "others-app-extra" (G_airpurifier) {channel="miio:basic:airpurifier:AppExtra"}
+Number MainChannel "others-main-channel" (G_airpurifier) {channel="miio:basic:airpurifier:MainChannel"}
+Number SlaveChannel "others-slave-channel" (G_airpurifier) {channel="miio:basic:airpurifier:SlaveChannel"}
+String Cola "others-cola" (G_airpurifier) {channel="miio:basic:airpurifier:Cola"}
+Switch ButtomDoor "others-buttom-door" (G_airpurifier) {channel="miio:basic:airpurifier:ButtomDoor"}
+Number RebootCause "others-reboot-cause" (G_airpurifier) {channel="miio:basic:airpurifier:RebootCause"}
+Number HwVersion "others-hw-version" (G_airpurifier) {channel="miio:basic:airpurifier:HwVersion"}
+Number IicErrorCount "others-iic-error-count" (G_airpurifier) {channel="miio:basic:airpurifier:IicErrorCount"}
+Number ManualLevel "others-manual-level" (G_airpurifier) {channel="miio:basic:airpurifier:ManualLevel"}
+Number CountryCode "others-National code" (G_airpurifier) {channel="miio:basic:airpurifier:CountryCode"}
```
### Mi Air Purifier Super (zhimi.airpurifier.sa1) item file lines
@@ -2558,7 +2758,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Lamp"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2574,7 +2774,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Lamp"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2590,7 +2790,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2606,7 +2806,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v2"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2622,7 +2822,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v3"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2638,7 +2838,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v4 (JIAOYUE 650 RGB)"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
@@ -2659,7 +2859,7 @@ note: Autogenerated example. Replace the id (ceiling4) in the channel with your
```java
Group G_ceiling4 "Yeelight LED Ceiling Lamp v4"
Switch power "Power" (G_ceiling4) {channel="miio:basic:ceiling4:power"}
-Number brightness "Brightness" (G_ceiling4) {channel="miio:basic:ceiling4:brightness"}
+Dimmer brightness "Brightness" (G_ceiling4) {channel="miio:basic:ceiling4:brightness"}
Number ambientBrightness "Ambient Brightness" (G_ceiling4) {channel="miio:basic:ceiling4:ambientBrightness"}
Number delayoff "Shutdown Timer" (G_ceiling4) {channel="miio:basic:ceiling4:delayoff"}
Number colorTemperature "Color Temperature" (G_ceiling4) {channel="miio:basic:ceiling4:colorTemperature"}
@@ -2680,7 +2880,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v5"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2696,7 +2896,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v6"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2712,7 +2912,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v7"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2728,7 +2928,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v8"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2744,7 +2944,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v9"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2760,7 +2960,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Meteorite lamp"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
@@ -2781,7 +2981,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v11"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2797,7 +2997,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v12"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2813,7 +3013,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight LED Ceiling Lamp v13"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2829,7 +3029,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight ct2"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2843,7 +3043,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight White Bulb"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2857,7 +3057,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight White Bulb v2"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2871,7 +3071,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2885,7 +3085,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2899,7 +3099,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2913,7 +3113,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Strip"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2929,7 +3129,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Strip"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2945,7 +3145,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
Number delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2959,7 +3159,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Color Bulb"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2975,7 +3175,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Color Bulb YLDP06YL 10W"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -2991,7 +3191,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Color Bulb YLDP02YL 9W"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
@@ -3007,7 +3207,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
```java
Group G_light "Yeelight Bulb YLDP13YL (8,5W)"
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
-Number brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
+Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
String delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
String colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoCommand.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoCommand.java
index d1772d71b60a..c3103ebe91db 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoCommand.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoCommand.java
@@ -37,6 +37,7 @@ public enum MiIoCommand {
SET_BRIGHT("set_bright"),
SET_WIFI_LET("set_wifi_led"),
SET_FAVORITE("set_level_favorite"),
+ ACTION("action"),
// vacuum commands
START_VACUUM("app_start"),
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoDevices.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoDevices.java
index 8ffc7f606ab2..95c78cf48740 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoDevices.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoDevices.java
@@ -47,6 +47,7 @@ public enum MiIoDevices {
AIR_PURIFIERMA1("zhimi.airpurifier.ma1", "Mi Air Purifier MS1", THING_TYPE_BASIC),
AIR_PURIFIERMA2("zhimi.airpurifier.ma2", "Mi Air Purifier MS2", THING_TYPE_BASIC),
AIR_PURIFIERMA4("zhimi.airpurifier.ma4", "Mi Air Purifier 3", THING_TYPE_BASIC),
+ AIR_PURIFIERMMB3("zhimi.airpurifier.mb3", "Mi Air Purifier 3", THING_TYPE_BASIC),
AIR_PURIFIERSA1("zhimi.airpurifier.sa1", "Mi Air Purifier Super", THING_TYPE_BASIC),
AIR_PURIFIERSA2("zhimi.airpurifier.sa2", "Mi Air Purifier Super 2", THING_TYPE_BASIC),
AIRFRESH_T2017("dmaker.airfresh.t2017", "Mi Fresh Air Ventilator", THING_TYPE_BASIC),
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/ActionConditions.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/ActionConditions.java
new file mode 100644
index 000000000000..fdc92223f03b
--- /dev/null
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/ActionConditions.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.miio.internal.basic;
+
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Conditional Execution of rules
+ *
+ * @author Marcel Verpaalen - Initial contribution
+ */
+@NonNullByDefault
+public class ActionConditions {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ActionConditions.class);
+
+ /**
+ * Check if it matches the firmware version.
+ *
+ * @param condition
+ * @param deviceVariables
+ * @param value
+ * @return value in case firmware is matching, return null if not
+ */
+ private static @Nullable JsonElement firmwareCheck(MiIoDeviceActionCondition condition,
+ Map deviceVariables, @Nullable JsonElement value) {
+ // TODO: placeholder for firmware version check to allow for firmware dependent actions
+ return value;
+ }
+
+ /**
+ * Check if the value is a valid brightness between 1-99.
+ * If <1 returns Off, if >99 returns On to activate the power On/Off switch
+ *
+ * @param value
+ * @return
+ */
+ private static @Nullable JsonElement brightness(@Nullable JsonElement value) {
+ if (value != null && value.isJsonPrimitive() && value.getAsJsonPrimitive().isNumber()) {
+ int intVal = value.getAsInt();
+ if (intVal > 99) {
+ return new JsonPrimitive("on");
+ }
+ if (intVal < 1) {
+ return new JsonPrimitive("off");
+ }
+ } else {
+ LOGGER.debug("Could not parse brightness. Value '{}' is not an int", value);
+ }
+ return null;
+ }
+
+ /**
+ * Check if the value is a valid brightness between 1-99 which can be send to brightness channel.
+ * If not returns a null
+ *
+ * @param value
+ * @return
+ */
+ private static @Nullable JsonElement brightnessExists(@Nullable JsonElement value) {
+ if (value != null && value.isJsonPrimitive() && value.getAsJsonPrimitive().isNumber()) {
+ int intVal = value.getAsInt();
+ if (intVal > 0 && intVal < 99) {
+ return value;
+ }
+ } else {
+ LOGGER.debug("Could not parse brightness. Value '{}' is not an int", value);
+ }
+ return null;
+ }
+
+ public static @Nullable JsonElement executeAction(MiIoDeviceActionCondition condition,
+ Map deviceVariables, @Nullable JsonElement value) {
+ switch (condition.getName().toUpperCase()) {
+ case "FIRMWARE":
+ return firmwareCheck(condition, deviceVariables, value);
+ case "BRIGHTNESSEXISTING":
+ return brightnessExists(value);
+ case "BRIGHTNESSONOFF":
+ return brightness(value);
+ default:
+ LOGGER.debug("Condition {} not found. Returning '{}'", condition,
+ value != null ? value.toString() : "");
+ return value;
+ }
+ }
+}
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoBasicChannel.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoBasicChannel.java
index 2ca570b1f13f..975dad9e58d6 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoBasicChannel.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoBasicChannel.java
@@ -35,6 +35,12 @@ public class MiIoBasicChannel {
@SerializedName("property")
@Expose
private @Nullable String property;
+ @SerializedName("siid")
+ @Expose
+ private @Nullable Integer siid;
+ @SerializedName("piid")
+ @Expose
+ private @Nullable Integer piid;
@SerializedName("friendlyName")
@Expose
private @Nullable String friendlyName;
@@ -69,6 +75,40 @@ public void setProperty(String property) {
this.property = property;
}
+ public int getSiid() {
+ final Integer siid = this.siid;
+ if (siid != null) {
+ return siid.intValue();
+ } else {
+ return 0;
+ }
+ }
+
+ public void setSiid(Integer siid) {
+ this.siid = siid;
+ }
+
+ public int getPiid() {
+ final Integer piid = this.piid;
+ if (piid != null) {
+ return piid.intValue();
+ } else {
+ return 0;
+ }
+ }
+
+ public void setPiid(Integer piid) {
+ this.piid = piid;
+ }
+
+ public boolean isMiOt() {
+ if (piid != null && siid != null && (getPiid() != 0 || getSiid() != 0)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
public String getFriendlyName() {
final String fn = friendlyName;
return (fn == null || type == null || fn.isEmpty()) ? getChannel() : fn;
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceAction.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceAction.java
index 27db674df3c1..7a2f8254a843 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceAction.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceAction.java
@@ -33,19 +33,12 @@ public class MiIoDeviceAction {
@SerializedName("parameterType")
@Expose
private CommandParameterType commandParameterType = CommandParameterType.EMPTY;
- @SerializedName("preCommandParameter1")
+ @SerializedName("parameters")
@Expose
- private @Nullable String preCommandParameter1;
- @SerializedName("parameter1")
- @Expose
- private @Nullable String parameter1;
- @SerializedName("parameter2")
- @Expose
- private @Nullable String parameter2;
- @SerializedName("parameter3")
- @Expose
- private @Nullable String parameter3;
private @Nullable JsonArray parameters;
+ @SerializedName("condition")
+ @Expose
+ private @Nullable MiIoDeviceActionCondition condition;
public JsonArray getParameters() {
final @Nullable JsonArray parameter = this.parameters;
@@ -77,42 +70,17 @@ public void setparameterType(String type) {
this.commandParameterType = org.openhab.binding.miio.internal.basic.CommandParameterType.fromString(type);
}
- public @Nullable String getPreCommandParameter1() {
- return preCommandParameter1;
- }
-
- public void setPreCommandParameter1(String preCommandParameter1) {
- this.preCommandParameter1 = preCommandParameter1;
- }
-
- public @Nullable String getParameter1() {
- return parameter1;
- }
-
- public void setParameter1(String parameter1) {
- this.parameter1 = parameter1;
- }
-
- public @Nullable String getParameter2() {
- return parameter2;
- }
-
- public void setParameter2(String parameter2) {
- this.parameter1 = parameter2;
- }
-
- public @Nullable String getParameter3() {
- return parameter3;
+ public @Nullable MiIoDeviceActionCondition getCondition() {
+ return condition;
}
- public void setParameter3(String parameter3) {
- this.parameter1 = parameter3;
+ public void setCondition(@Nullable MiIoDeviceActionCondition condition) {
+ this.condition = condition;
}
@Override
public String toString() {
return "MiIoDeviceAction [command=" + command + ", commandParameterType=" + commandParameterType
- + ", preCommandParameter1=" + preCommandParameter1 + ", parameter1=" + parameter1 + ", parameter2="
- + parameter2 + ", parameter3=" + parameter3 + "]";
+ + (parameters != null ? ", parameters=" + getParameters().toString() : "") + "]";
}
}
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceActionCondition.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceActionCondition.java
new file mode 100644
index 000000000000..d1b96621648d
--- /dev/null
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/MiIoDeviceActionCondition.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.miio.internal.basic;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Mapping actions conditions
+ *
+ * @author Marcel Verpaalen - Initial contribution
+ */
+@NonNullByDefault
+public class MiIoDeviceActionCondition {
+
+ @SerializedName("name")
+ @Expose
+ private @Nullable String name;
+ @SerializedName("parameters")
+ @Expose
+ private @Nullable JsonElement parameters;
+
+ public String getName() {
+ final @Nullable String command = this.name;
+ return command != null ? command : "";
+ }
+
+ public void setName(String command) {
+ this.name = command;
+ }
+
+ public JsonElement getParameters() {
+ final JsonElement parameter = this.parameters;
+ return parameter != null ? parameter : JsonNull.INSTANCE;
+ }
+
+ public void setParameters(JsonArray parameters) {
+ this.parameters = parameters;
+ }
+
+ @Override
+ public String toString() {
+ return "MiIoDeviceActionCondition [condition=" + name + ",parameters=" + getParameters().toString() + "]";
+ }
+}
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/CloudConnector.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/CloudConnector.java
index 346a1f9e3666..b42f504836aa 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/CloudConnector.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/CloudConnector.java
@@ -159,7 +159,7 @@ public void setCredentials(@Nullable String username, @Nullable String password,
private boolean logon() {
if (username.isEmpty() || password.isEmpty()) {
- logger.info("No Xiaomi cloud credentials. Cloud connectivity diabled");
+ logger.info("No Xiaomi cloud credentials. Cloud connectivity disabled");
logger.debug("Logon details: username: '{}', pass: '{}', country: '{}'", username,
password.replaceAll(".", "*"), country);
return connected;
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoAbstractHandler.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoAbstractHandler.java
index bcd493ffc0d2..426e2c5fe457 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoAbstractHandler.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoAbstractHandler.java
@@ -372,6 +372,7 @@ private void updateProperties(JsonObject miioInfo) {
if (info.mcuFwVer != null) {
properties.put("mcuFirmware", info.mcuFwVer);
}
+ deviceVariables.putAll(properties);
updateProperties(properties);
}
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoBasicHandler.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoBasicHandler.java
index 3c6c3b32f61f..43c55131f141 100644
--- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoBasicHandler.java
+++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoBasicHandler.java
@@ -45,12 +45,14 @@
import org.openhab.binding.miio.internal.MiIoCryptoException;
import org.openhab.binding.miio.internal.MiIoSendCommand;
import org.openhab.binding.miio.internal.Utils;
+import org.openhab.binding.miio.internal.basic.ActionConditions;
import org.openhab.binding.miio.internal.basic.CommandParameterType;
import org.openhab.binding.miio.internal.basic.Conversions;
import org.openhab.binding.miio.internal.basic.MiIoBasicChannel;
import org.openhab.binding.miio.internal.basic.MiIoBasicDevice;
import org.openhab.binding.miio.internal.basic.MiIoDatabaseWatchService;
import org.openhab.binding.miio.internal.basic.MiIoDeviceAction;
+import org.openhab.binding.miio.internal.basic.MiIoDeviceActionCondition;
import org.openhab.binding.miio.internal.transport.MiIoAsyncCommunication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -84,7 +86,7 @@ public class MiIoBasicHandler extends MiIoAbstractHandler {
List refreshList = new ArrayList<>();
private @Nullable MiIoBasicDevice miioDevice;
- private Map actions = new HashMap<>();
+ private Map actions = new HashMap<>();
public MiIoBasicHandler(Thing thing, MiIoDatabaseWatchService miIoDatabaseWatchService) {
super(thing, miIoDatabaseWatchService);
@@ -130,73 +132,94 @@ public void handleCommand(ChannelUID channelUID, Command command) {
}
logger.debug("Locating action for channel {}: {}", channelUID.getId(), command);
if (!actions.isEmpty()) {
- if (actions.containsKey(channelUID.getId())) {
+ if (actions.containsKey(channelUID)) {
int valuePos = 0;
- @Nullable
- JsonElement value = null;
- MiIoDeviceAction action = actions.get(channelUID.getId());
- JsonArray parameters = actions.get(channelUID.getId()).getParameters();
- for (int i = 0; i < action.getParameters().size(); i++) {
- JsonElement p = action.getParameters().get(i);
- if (p.isJsonPrimitive() && p.getAsString().toLowerCase().contains("$value$")) {
- valuePos = i;
+ MiIoBasicChannel miIoBasicChannel = actions.get(channelUID);
+ for (MiIoDeviceAction action : miIoBasicChannel.getActions()) {
+ @Nullable
+ JsonElement value = null;
+ JsonArray parameters = action.getParameters();
+ for (int i = 0; i < action.getParameters().size(); i++) {
+ JsonElement p = action.getParameters().get(i);
+ if (p.isJsonPrimitive() && p.getAsString().toLowerCase().contains("$value$")) {
+ valuePos = i;
+ }
}
- }
- String cmd = actions.get(channelUID.getId()).getCommand();
- CommandParameterType paramType = actions.get(channelUID.getId()).getparameterType();
- if (paramType == CommandParameterType.COLOR) {
- if (command instanceof HSBType) {
- HSBType hsb = (HSBType) command;
- Color color = Color.getHSBColor(hsb.getHue().floatValue() / 360,
- hsb.getSaturation().floatValue() / 100, hsb.getBrightness().floatValue() / 100);
- value = new JsonPrimitive(
- (color.getRed() * 65536) + (color.getGreen() * 256) + color.getBlue());
+ String cmd = action.getCommand();
+ CommandParameterType paramType = action.getparameterType();
+ if (paramType == CommandParameterType.COLOR) {
+ if (command instanceof HSBType) {
+ HSBType hsb = (HSBType) command;
+ Color color = Color.getHSBColor(hsb.getHue().floatValue() / 360,
+ hsb.getSaturation().floatValue() / 100, hsb.getBrightness().floatValue() / 100);
+ value = new JsonPrimitive(
+ (color.getRed() << 16) + (color.getGreen() << 8) + color.getBlue());
+ } else if (command instanceof DecimalType) {
+ // actually brightness is being set instead of a color
+ cmd = "set_bright";
+ value = new JsonPrimitive(((DecimalType) command).toBigDecimal());
+ } else {
+ logger.debug("Unsupported command for COLOR: {}", command);
+ }
+ } else if (command instanceof OnOffType) {
+ if (paramType == CommandParameterType.ONOFF) {
+ value = new JsonPrimitive(command == OnOffType.ON ? "on" : "off");
+ } else if (paramType == CommandParameterType.ONOFFPARA) {
+ cmd = cmd.replace("*", command == OnOffType.ON ? "on" : "off");
+ } else if (paramType == CommandParameterType.ONOFFBOOL) {
+ boolean boolCommand = command == OnOffType.ON;
+ value = new JsonPrimitive(boolCommand);
+ } else if (paramType == CommandParameterType.ONOFFBOOLSTRING) {
+ value = new JsonPrimitive(command == OnOffType.ON ? "true" : "false");
+ }
} else if (command instanceof DecimalType) {
- // actually brightness is being set instead of a color
- cmd = "set_bright";
value = new JsonPrimitive(((DecimalType) command).toBigDecimal());
+ } else if (command instanceof StringType) {
+ if (paramType == CommandParameterType.STRING) {
+ value = new JsonPrimitive(command.toString().toLowerCase());
+ } else if (paramType == CommandParameterType.CUSTOMSTRING) {
+ value = new JsonPrimitive(parameters.get(valuePos).getAsString().replace("$value",
+ command.toString().toLowerCase()));
+ }
} else {
- logger.debug("Unsupported command for COLOR: {}", command);
+ value = new JsonPrimitive(command.toString().toLowerCase());
}
- } else if (command instanceof OnOffType) {
- if (paramType == CommandParameterType.ONOFF) {
- value = new JsonPrimitive(command == OnOffType.ON ? "on" : "off");
- } else if (paramType == CommandParameterType.ONOFFPARA) {
- cmd = cmd.replace("*", command == OnOffType.ON ? "on" : "off");
- } else if (paramType == CommandParameterType.ONOFFBOOL) {
- boolean boolCommand = command == OnOffType.ON;
- value = new JsonPrimitive(boolCommand);
- } else if (paramType == CommandParameterType.ONOFFBOOLSTRING) {
- value = new JsonPrimitive(command == OnOffType.ON ? "true" : "false");
+ // Check for miot channel
+ if (miIoBasicChannel.isMiOt()) {
+ value = miotTransform(miIoBasicChannel, value);
}
- } else if (command instanceof DecimalType) {
- value = new JsonPrimitive(((DecimalType) command).toBigDecimal());
- } else if (command instanceof StringType) {
- if (paramType == CommandParameterType.STRING) {
- value = new JsonPrimitive(command.toString().toLowerCase());
- } else if (paramType == CommandParameterType.CUSTOMSTRING) {
- value = new JsonPrimitive(parameters.get(valuePos).getAsString().replace("$value",
- command.toString().toLowerCase()));
+ final MiIoDeviceActionCondition miIoDeviceActionCondition = action.getCondition();
+ if (miIoDeviceActionCondition != null) {
+ value = ActionConditions.executeAction(miIoDeviceActionCondition, deviceVariables, value);
}
- } else {
- value = new JsonPrimitive(command.toString().toLowerCase());
- }
- if (paramType != CommandParameterType.NONE && value != null) {
- if (parameters.size() > 0) {
- parameters.set(valuePos, value);
+ if (paramType != CommandParameterType.NONE && value != null) {
+ if (parameters.size() > 0) {
+ parameters.set(valuePos, value);
+ } else {
+ parameters.add(value);
+ }
+ }
+ if (paramType != CommandParameterType.EMPTY) {
+ cmd = cmd + parameters.toString();
+ }
+ if (value != null) {
+ logger.debug("Sending command {}", cmd);
+ sendCommand(cmd);
} else {
- parameters.add(value);
+ if (miIoDeviceActionCondition != null) {
+ logger.debug("Conditional command {} not send, condition {} not met", cmd,
+ miIoDeviceActionCondition.getName());
+ } else {
+ logger.debug("Command not send. Value null");
+ }
}
}
- if (paramType != CommandParameterType.EMPTY) {
- cmd = cmd + parameters.toString();
- }
- logger.debug("Sending command {}", cmd);
- sendCommand(cmd);
} else {
logger.debug("Channel Id {} not in mapping.", channelUID.getId());
- for (String a : actions.keySet()) {
- logger.trace("Available entries: {} : {}", a, actions.get(a).getCommand());
+ if (logger.isTraceEnabled()) {
+ for (ChannelUID a : actions.keySet()) {
+ logger.trace("Available entries: {} : {}", a, actions.get(a).getFriendlyName());
+ }
}
}
updateDataCache.invalidateValue();
@@ -206,6 +229,15 @@ public void handleCommand(ChannelUID channelUID, Command command) {
}
}
+ private @Nullable JsonElement miotTransform(MiIoBasicChannel miIoBasicChannel, @Nullable JsonElement value) {
+ JsonObject json = new JsonObject();
+ json.addProperty("did", miIoBasicChannel.getChannel());
+ json.addProperty("siid", miIoBasicChannel.getSiid());
+ json.addProperty("piid", miIoBasicChannel.getPiid());
+ json.add("value", value);
+ return json;
+ }
+
@Override
protected synchronized void updateData() {
logger.debug("Periodic update for '{}' ({})", getThing().getUID().toString(), getThing().getThingTypeUID());
@@ -233,7 +265,17 @@ private boolean refreshProperties(MiIoBasicDevice device) {
int maxProperties = device.getDevice().getMaxProperties();
JsonArray getPropString = new JsonArray();
for (MiIoBasicChannel miChannel : refreshList) {
- getPropString.add(miChannel.getProperty());
+ JsonElement property;
+ if (miChannel.isMiOt()) {
+ JsonObject json = new JsonObject();
+ json.addProperty("did", miChannel.getProperty());
+ json.addProperty("siid", miChannel.getSiid());
+ json.addProperty("piid", miChannel.getPiid());
+ property = json;
+ } else {
+ property = new JsonPrimitive(miChannel.getProperty());
+ }
+ getPropString.add(property);
if (getPropString.size() >= maxProperties) {
sendRefreshProperties(command, getPropString);
getPropString = new JsonArray();
@@ -309,12 +351,13 @@ private boolean buildChannelStructure(String deviceName) {
if (device != null) {
for (MiIoBasicChannel miChannel : device.getDevice().getChannels()) {
logger.debug("properties {}", miChannel);
- for (MiIoDeviceAction action : miChannel.getActions()) {
- actions.put(miChannel.getChannel(), action);
- }
if (!miChannel.getType().isEmpty()) {
- channelsAdded += addChannel(thingBuilder, miChannel.getChannel(), miChannel.getChannelType(),
- miChannel.getType(), miChannel.getFriendlyName()) ? 1 : 0;
+ ChannelUID channelUID = addChannel(thingBuilder, miChannel.getChannel(),
+ miChannel.getChannelType(), miChannel.getType(), miChannel.getFriendlyName());
+ if (channelUID != null) {
+ actions.put(channelUID, miChannel);
+ channelsAdded++;
+ }
}
}
}
@@ -334,12 +377,12 @@ private boolean buildChannelStructure(String deviceName) {
return false;
}
- private boolean addChannel(ThingBuilder thingBuilder, @Nullable String channel, String channelType,
+ private @Nullable ChannelUID addChannel(ThingBuilder thingBuilder, @Nullable String channel, String channelType,
@Nullable String datatype, String friendlyName) {
if (channel == null || channel.isEmpty() || datatype == null || datatype.isEmpty()) {
logger.info("Channel '{}', UID '{}' cannot be added incorrectly configured database. ", channel,
getThing().getUID());
- return false;
+ return null;
}
ChannelUID channelUID = new ChannelUID(getThing().getUID(), channel);
ChannelTypeUID channelTypeUID = new ChannelTypeUID(channelType);
@@ -350,11 +393,10 @@ private boolean addChannel(ThingBuilder thingBuilder, @Nullable String channel,
logger.info("Channel '{}' for thing {} already exist... removing", channel, getThing().getUID());
thingBuilder.withoutChannel(new ChannelUID(getThing().getUID(), channel));
}
-
Channel newChannel = ChannelBuilder.create(channelUID, datatype).withType(channelTypeUID)
.withLabel(friendlyName).build();
thingBuilder.withChannel(newChannel);
- return true;
+ return channelUID;
}
private @Nullable MiIoBasicChannel getChannel(String parameter) {
@@ -375,11 +417,20 @@ private void updatePropsFromJsonArray(MiIoSendCommand response) {
para.size(), res.size(), para, res);
}
for (int i = 0; i < para.size(); i++) {
- String param = para.get(i).getAsString();
+ // This is a miot parameter
+ String param;
+ final JsonElement paraElement = para.get(i);
+ if (paraElement.isJsonObject()) { // miot channel
+ param = paraElement.getAsJsonObject().get("did").getAsString();
+ } else {
+ param = paraElement.getAsString();
+ }
JsonElement val = res.get(i);
if (val.isJsonNull()) {
logger.debug("Property '{}' returned null (is it supported?).", param);
continue;
+ } else if (val.isJsonObject()) { // miot channel
+ val = val.getAsJsonObject().get("value");
}
MiIoBasicChannel basicChannel = getChannel(param);
updateChannel(basicChannel, param, val);
@@ -454,6 +505,7 @@ public void onMessageReceived(MiIoSendCommand response) {
case MIIO_INFO:
break;
case GET_VALUE:
+ case GET_PROPERTIES:
case GET_PROPERTY:
if (response.getResult().isJsonArray()) {
updatePropsFromJsonArray(response);
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/ESH-INF/thing/commonChannels.xml b/bundles/org.openhab.binding.miio/src/main/resources/ESH-INF/thing/commonChannels.xml
index 37b9ecc90426..496795834082 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/ESH-INF/thing/commonChannels.xml
+++ b/bundles/org.openhab.binding.miio/src/main/resources/ESH-INF/thing/commonChannels.xml
@@ -438,4 +438,24 @@
+
+ Number
+
+
+
+ Number
+
+
+
+ Number
+
+
+
+ String
+
+
+
+ Switch
+
+
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.bulb.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.bulb.json
index 5574eb1fbfa4..4daa33fa2637 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.bulb.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.bulb.json
@@ -32,7 +32,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.candle.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.candle.json
index 195184aa41e5..4687ee4c0533 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.candle.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.candle.json
@@ -29,7 +29,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.ceiling.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.ceiling.json
index 8a357d6d5846..8a23d97aad7e 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.ceiling.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.ceiling.json
@@ -29,7 +29,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.mono.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.mono.json
index 936149b04573..d4ecb7873b06 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.mono.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.mono.json
@@ -28,7 +28,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.moonlight.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.moonlight.json
index d2a9fa480684..13894279d637 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.moonlight.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.moonlight.json
@@ -28,7 +28,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.sread1.json b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.sread1.json
index ed12bab6bb91..a6ede3fa0661 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.sread1.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/philips.light.sread1.json
@@ -28,7 +28,17 @@
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling.json b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling.json
index 7e1831b40e24..3998ff34ed70 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling.json
@@ -31,13 +31,23 @@
"property": "bright",
"friendlyName": "Brightness",
"channel": "brightness",
- "type": "Number",
+ "type": "Dimmer",
"refresh": true,
"ChannelGroup": "actions",
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling2.json b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling2.json
index af188aa680e5..1428911f3342 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling2.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling2.json
@@ -22,13 +22,23 @@
"property": "bright",
"friendlyName": "Brightness",
"channel": "brightness",
- "type": "Number",
+ "type": "Dimmer",
"refresh": true,
"ChannelGroup": "actions",
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling4.json b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling4.json
index 32a8975b850f..2fa408e9ca47 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling4.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.ceiling4.json
@@ -24,13 +24,23 @@
"property": "bright",
"friendlyName": "Brightness",
"channel": "brightness",
- "type": "Number",
+ "type": "Dimmer",
"refresh": true,
"ChannelGroup": "actions",
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.color1.json b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.color1.json
index ba53cdae6e1b..37c6bfe0d740 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.color1.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.color1.json
@@ -29,13 +29,23 @@
"property": "bright",
"friendlyName": "Brightness",
"channel": "brightness",
- "type": "Number",
+ "type": "Dimmer",
"refresh": true,
"ChannelGroup": "actions",
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.lamp1.json b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.lamp1.json
index 686237708faf..c9e65997f52f 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.lamp1.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/yeelink.light.lamp1.json
@@ -28,13 +28,23 @@
"property": "bright",
"friendlyName": "Brightness",
"channel": "brightness",
- "type": "Number",
+ "type": "Dimmer",
"refresh": true,
"ChannelGroup": "actions",
"actions": [
{
"command": "set_bright",
- "parameterType": "NUMBER"
+ "parameterType": "NUMBER",
+ "condition": {
+ "name": "BrightnessExisting"
+ }
+ },
+ {
+ "command": "set_power",
+ "parameterType": "ONOFF",
+ "condition": {
+ "name": "BrightnessOnOff"
+ }
}
]
},
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.m1.json b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.m1.json
index f6932c94106c..ae5e035cb9fd 100644
--- a/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.m1.json
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.m1.json
@@ -8,7 +8,6 @@
"zhimi.airpurifier.v3",
"zhimi.airpurifier.v5",
"zhimi.airpurifier.ma1",
- "zhimi.airpurifier.ma4",
"zhimi.airpurifier.sa1",
"zhimi.airpurifier.sa2",
"zhimi.airpurifier.mb1",
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.ma4-miot.json b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.ma4-miot.json
new file mode 100644
index 000000000000..d23a846c76e8
--- /dev/null
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.ma4-miot.json
@@ -0,0 +1,715 @@
+{
+ "deviceMapping": {
+ "id": [
+ "zhimi.airpurifier.ma4"
+ ],
+ "propertyMethod": "get_properties",
+ "maxProperties": 2,
+ "channels": [
+ {
+ "property": "fault",
+ "siid": 2,
+ "piid": 1,
+ "friendlyName": "Air Purifier-Device Fault",
+ "channel": "Fault",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "on",
+ "siid": 2,
+ "piid": 2,
+ "friendlyName": "Air Purifier-Switch Status",
+ "channel": "On",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "fan-level",
+ "siid": 2,
+ "piid": 4,
+ "friendlyName": "Air Purifier-Fan Level",
+ "channel": "FanLevel",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "mode",
+ "siid": 2,
+ "piid": 5,
+ "friendlyName": "Air Purifier-Mode",
+ "channel": "Mode",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "firmware-revision",
+ "siid": 1,
+ "piid": 4,
+ "friendlyName": "Device Information-Current Firmware Version",
+ "channel": "FirmwareRevision",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "manufacturer",
+ "siid": 1,
+ "piid": 1,
+ "friendlyName": "Device Information-Device Manufacturer",
+ "channel": "Manufacturer",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "model",
+ "siid": 1,
+ "piid": 2,
+ "friendlyName": "Device Information-Device Model",
+ "channel": "Model",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "serial-number",
+ "siid": 1,
+ "piid": 3,
+ "friendlyName": "Device Information-Device Serial Number",
+ "channel": "SerialNumber",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "pm2.5-density",
+ "siid": 3,
+ "piid": 6,
+ "friendlyName": "Environment-PM2.5 Density",
+ "channel": "Pm25Density",
+ "channelType": "miot_float",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "relative-humidity",
+ "siid": 3,
+ "piid": 7,
+ "friendlyName": "Environment-Relative Humidity",
+ "channel": "RelativeHumidity",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "temperature",
+ "siid": 3,
+ "piid": 8,
+ "friendlyName": "Environment-Temperature",
+ "channel": "Temperature",
+ "channelType": "miot_float",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-life-level",
+ "siid": 4,
+ "piid": 3,
+ "friendlyName": "Filter-Filter Life Level",
+ "channel": "FilterLifeLevel",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-used-time",
+ "siid": 4,
+ "piid": 5,
+ "friendlyName": "Filter-Filter Used Time",
+ "channel": "FilterUsedTime",
+ "channelType": "miot_uint16",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "alarm",
+ "siid": 5,
+ "piid": 1,
+ "friendlyName": "Alarm-Alarm",
+ "channel": "Alarm",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "brightness",
+ "siid": 6,
+ "piid": 1,
+ "friendlyName": "Indicator Light-Brightness",
+ "channel": "Brightness",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "on1",
+ "siid": 6,
+ "piid": 6,
+ "friendlyName": "Indicator Light-Switch Status",
+ "channel": "On1",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "physical-controls-locked",
+ "siid": 7,
+ "piid": 1,
+ "friendlyName": "Physical Control Locked-Physical Control Locked",
+ "channel": "PhysicalControlsLocked",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "button-pressed",
+ "siid": 8,
+ "piid": 1,
+ "friendlyName": "button-button_pressed",
+ "channel": "ButtonPressed",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-max-time",
+ "siid": 9,
+ "piid": 1,
+ "friendlyName": "filter-time-filter-max-time",
+ "channel": "FilterMaxTime",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "filter-hour-used-debug",
+ "siid": 9,
+ "piid": 2,
+ "friendlyName": "filter-time-filter-hour-used-debug",
+ "channel": "FilterHourUsedDebug",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-strong",
+ "siid": 10,
+ "piid": 1,
+ "friendlyName": "motor-speed-m1-strong",
+ "channel": "M1Strong",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-high",
+ "siid": 10,
+ "piid": 2,
+ "friendlyName": "motor-speed-m1-high",
+ "channel": "M1High",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-med",
+ "siid": 10,
+ "piid": 3,
+ "friendlyName": "motor-speed-m1-med",
+ "channel": "M1Med",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-med-l",
+ "siid": 10,
+ "piid": 4,
+ "friendlyName": "motor-speed-m1-med-l",
+ "channel": "M1MedL",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-low",
+ "siid": 10,
+ "piid": 5,
+ "friendlyName": "motor-speed-m1-low",
+ "channel": "M1Low",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-silent",
+ "siid": 10,
+ "piid": 6,
+ "friendlyName": "motor-speed-m1-silent",
+ "channel": "M1Silent",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "m1-favorite",
+ "siid": 10,
+ "piid": 7,
+ "friendlyName": "motor-speed-m1-favorite",
+ "channel": "M1Favorite",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor1-speed",
+ "siid": 10,
+ "piid": 8,
+ "friendlyName": "motor-speed-motor1-speed",
+ "channel": "Motor1Speed",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "motor1-set-speed",
+ "siid": 10,
+ "piid": 9,
+ "friendlyName": "motor-speed-motor1-set-speed",
+ "channel": "Motor1SetSpeed",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "favorite-fan-level",
+ "siid": 10,
+ "piid": 10,
+ "friendlyName": "motor-speed-favorite fan level",
+ "channel": "FavoriteFanLevel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "use-time",
+ "siid": 12,
+ "piid": 1,
+ "friendlyName": "use-time-use-time",
+ "channel": "UseTime",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "purify-volume",
+ "siid": 13,
+ "piid": 1,
+ "friendlyName": "aqi-purify-volume",
+ "channel": "PurifyVolume",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "average-aqi",
+ "siid": 13,
+ "piid": 2,
+ "friendlyName": "aqi-average-aqi",
+ "channel": "AverageAqi",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "average-aqi-cnt",
+ "siid": 13,
+ "piid": 3,
+ "friendlyName": "aqi-average-aqi-cnt",
+ "channel": "AverageAqiCnt",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-zone",
+ "siid": 13,
+ "piid": 4,
+ "friendlyName": "aqi-aqi-zone",
+ "channel": "AqiZone",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "sensor-state",
+ "siid": 13,
+ "piid": 5,
+ "friendlyName": "aqi-sensor-state",
+ "channel": "SensorState",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-goodh",
+ "siid": 13,
+ "piid": 6,
+ "friendlyName": "aqi-aqi-goodh",
+ "channel": "AqiGoodh",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "aqi-runstate",
+ "siid": 13,
+ "piid": 7,
+ "friendlyName": "aqi-aqi-runstate",
+ "channel": "AqiRunstate",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-state",
+ "siid": 13,
+ "piid": 8,
+ "friendlyName": "aqi-aqi-state",
+ "channel": "AqiState",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-updata-heartbeat",
+ "siid": 13,
+ "piid": 9,
+ "friendlyName": "aqi-aqi-updata-heartbeat",
+ "channel": "AqiUpdataHeartbeat",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "rfid-tag",
+ "siid": 14,
+ "piid": 1,
+ "friendlyName": "rfid-rfid-tag",
+ "channel": "RfidTag",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-factory-id",
+ "siid": 14,
+ "piid": 2,
+ "friendlyName": "rfid-rfid-factory-id",
+ "channel": "RfidFactoryId",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-product-id",
+ "siid": 14,
+ "piid": 3,
+ "friendlyName": "rfid-rfid-product-id",
+ "channel": "RfidProductId",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-time",
+ "siid": 14,
+ "piid": 4,
+ "friendlyName": "rfid-rfid-time",
+ "channel": "RfidTime",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-serial-num",
+ "siid": 14,
+ "piid": 5,
+ "friendlyName": "rfid-rfid-serial-num",
+ "channel": "RfidSerialNum",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "app-extra",
+ "siid": 15,
+ "piid": 1,
+ "friendlyName": "others-app-extra",
+ "channel": "AppExtra",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "main-channel",
+ "siid": 15,
+ "piid": 2,
+ "friendlyName": "others-main-channel",
+ "channel": "MainChannel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "slave-channel",
+ "siid": 15,
+ "piid": 3,
+ "friendlyName": "others-slave-channel",
+ "channel": "SlaveChannel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "cola",
+ "siid": 15,
+ "piid": 4,
+ "friendlyName": "others-cola",
+ "channel": "Cola",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "STRING"
+ }
+ ]
+ },
+ {
+ "property": "buttom-door",
+ "siid": 15,
+ "piid": 5,
+ "friendlyName": "others-buttom-door",
+ "channel": "ButtomDoor",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "reboot-cause",
+ "siid": 15,
+ "piid": 6,
+ "friendlyName": "others-reboot_cause",
+ "channel": "RebootCause",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "hw-version",
+ "siid": 15,
+ "piid": 8,
+ "friendlyName": "others-hw-version",
+ "channel": "HwVersion",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "i2c-error-count",
+ "siid": 15,
+ "piid": 9,
+ "friendlyName": "others-i2c-error-count",
+ "channel": "I2cErrorCount",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "manual-level",
+ "siid": 15,
+ "piid": 10,
+ "friendlyName": "others-manual-level",
+ "channel": "ManualLevel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ }
+ ]
+ }
+}
diff --git a/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.mb3-miot.json b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.mb3-miot.json
new file mode 100644
index 000000000000..5ec483a0b145
--- /dev/null
+++ b/bundles/org.openhab.binding.miio/src/main/resources/database/zhimi.airpurifier.mb3-miot.json
@@ -0,0 +1,736 @@
+{
+ "deviceMapping": {
+ "id": [
+ "zhimi.airpurifier.mb3"
+ ],
+ "propertyMethod": "get_properties",
+ "maxProperties": 2,
+ "channels": [
+ {
+ "property": "fault",
+ "siid": 2,
+ "piid": 1,
+ "friendlyName": "Air Purifier-fault",
+ "channel": "Fault",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "on",
+ "siid": 2,
+ "piid": 2,
+ "friendlyName": "Air Purifier-Switch Status",
+ "channel": "On",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "fan-level",
+ "siid": 2,
+ "piid": 4,
+ "friendlyName": "Air Purifier-Fan Level",
+ "channel": "FanLevel",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "mode",
+ "siid": 2,
+ "piid": 5,
+ "friendlyName": "Air Purifier-Mode",
+ "channel": "Mode",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "firmware-revision",
+ "siid": 1,
+ "piid": 4,
+ "friendlyName": "Device Information-Current Firmware Version",
+ "channel": "FirmwareRevision",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "manufacturer",
+ "siid": 1,
+ "piid": 1,
+ "friendlyName": "Device Information-Device Manufacturer",
+ "channel": "Manufacturer",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "model",
+ "siid": 1,
+ "piid": 2,
+ "friendlyName": "Device Information-Device Model",
+ "channel": "Model",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "serial-number",
+ "siid": 1,
+ "piid": 3,
+ "friendlyName": "Device Information-Device Serial Number",
+ "channel": "SerialNumber",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "pm2.5-density",
+ "siid": 3,
+ "piid": 6,
+ "friendlyName": "Environment-PM2.5",
+ "channel": "Pm25Density",
+ "channelType": "miot_float",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "relative-humidity",
+ "siid": 3,
+ "piid": 7,
+ "friendlyName": "Environment-Relative Humidity",
+ "channel": "RelativeHumidity",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "temperature",
+ "siid": 3,
+ "piid": 8,
+ "friendlyName": "Environment-Temperature",
+ "channel": "Temperature",
+ "channelType": "miot_float",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-life-level",
+ "siid": 4,
+ "piid": 3,
+ "friendlyName": "Filter-Filter Life Level",
+ "channel": "FilterLifeLevel",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-used-time",
+ "siid": 4,
+ "piid": 5,
+ "friendlyName": "Filter-Filter Used Time",
+ "channel": "FilterUsedTime",
+ "channelType": "miot_uint16",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "alarm",
+ "siid": 5,
+ "piid": 1,
+ "friendlyName": "Alarm-Alarm",
+ "channel": "Alarm",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "brightness",
+ "siid": 6,
+ "piid": 1,
+ "friendlyName": "Indicator Light-brightness",
+ "channel": "Brightness",
+ "channelType": "miot_uint8",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "on1",
+ "siid": 6,
+ "piid": 6,
+ "friendlyName": "Indicator Light-Switch Status",
+ "channel": "On1",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "physical-controls-locked",
+ "siid": 7,
+ "piid": 1,
+ "friendlyName": "Physical Control Locked-Physical Control Locked",
+ "channel": "PhysicalControlsLocked",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "ONOFFBOOL"
+ }
+ ]
+ },
+ {
+ "property": "button-pressed",
+ "siid": 8,
+ "piid": 1,
+ "friendlyName": "Button-button-pressed",
+ "channel": "ButtonPressed",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "filter-max-time",
+ "siid": 9,
+ "piid": 1,
+ "friendlyName": "filter-time-filter-max-time",
+ "channel": "FilterMaxTime",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "filter-hour-debug",
+ "siid": 9,
+ "piid": 2,
+ "friendlyName": "filter-time-filter-hour-debug",
+ "channel": "FilterHourDebug",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-strong",
+ "siid": 10,
+ "piid": 1,
+ "friendlyName": "motor-speed-motor-strong",
+ "channel": "MotorStrong",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-high",
+ "siid": 10,
+ "piid": 2,
+ "friendlyName": "motor-speed-motor-high",
+ "channel": "MotorHigh",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-med",
+ "siid": 10,
+ "piid": 3,
+ "friendlyName": "motor-speed-motor-med",
+ "channel": "MotorMed",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-med-l",
+ "siid": 10,
+ "piid": 4,
+ "friendlyName": "motor-speed-motor-med-l",
+ "channel": "MotorMedL",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-low",
+ "siid": 10,
+ "piid": 5,
+ "friendlyName": "motor-speed-motor-low",
+ "channel": "MotorLow",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-silent",
+ "siid": 10,
+ "piid": 6,
+ "friendlyName": "motor-speed-motor-silent",
+ "channel": "MotorSilent",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-favorite",
+ "siid": 10,
+ "piid": 7,
+ "friendlyName": "motor-speed-motor-favorite",
+ "channel": "MotorFavorite",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "motor-speed",
+ "siid": 10,
+ "piid": 8,
+ "friendlyName": "motor-speed-motor-speed",
+ "channel": "MotorSpeed",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "motor-set-speed",
+ "siid": 10,
+ "piid": 9,
+ "friendlyName": "motor-speed-motor-set-speed",
+ "channel": "MotorSetSpeed",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "favorite-fan-level",
+ "siid": 10,
+ "piid": 10,
+ "friendlyName": "motor-speed-favorite-fan-level",
+ "channel": "FavoriteFanLevel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "use-time",
+ "siid": 12,
+ "piid": 1,
+ "friendlyName": "use-time-use-time",
+ "channel": "UseTime",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "purify-volume",
+ "siid": 13,
+ "piid": 1,
+ "friendlyName": "aqi-purify-volume",
+ "channel": "PurifyVolume",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "average-aqi",
+ "siid": 13,
+ "piid": 2,
+ "friendlyName": "aqi-average-aqi",
+ "channel": "AverageAqi",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "average-aqi-cnt",
+ "siid": 13,
+ "piid": 3,
+ "friendlyName": "aqi-average-aqi-cnt",
+ "channel": "AverageAqiCnt",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-zone",
+ "siid": 13,
+ "piid": 4,
+ "friendlyName": "aqi-aqi-zone",
+ "channel": "AqiZone",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "sensor-state",
+ "siid": 13,
+ "piid": 5,
+ "friendlyName": "aqi-sensor-state",
+ "channel": "SensorState",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-goodh",
+ "siid": 13,
+ "piid": 6,
+ "friendlyName": "aqi-aqi-goodh",
+ "channel": "AqiGoodh",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "aqi-runstate",
+ "siid": 13,
+ "piid": 7,
+ "friendlyName": "aqi-aqi-runstate",
+ "channel": "AqiRunstate",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-state",
+ "siid": 13,
+ "piid": 8,
+ "friendlyName": "aqi-aqi-state",
+ "channel": "AqiState",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "aqi-updata-heartbeat",
+ "siid": 13,
+ "piid": 9,
+ "friendlyName": "aqi-aqi-updata-heartbeat",
+ "channel": "AqiUpdataHeartbeat",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "rfid-tag",
+ "siid": 14,
+ "piid": 1,
+ "friendlyName": "rfid-rfid-tag",
+ "channel": "RfidTag",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-factory-id",
+ "siid": 14,
+ "piid": 2,
+ "friendlyName": "rfid-rfid-factory-id",
+ "channel": "RfidFactoryId",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-product-id",
+ "siid": 14,
+ "piid": 3,
+ "friendlyName": "rfid-rfid-product-id",
+ "channel": "RfidProductId",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-time",
+ "siid": 14,
+ "piid": 4,
+ "friendlyName": "rfid-rfid-time",
+ "channel": "RfidTime",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "rfid-serial-num",
+ "siid": 14,
+ "piid": 5,
+ "friendlyName": "rfid-rfid-serial-num",
+ "channel": "RfidSerialNum",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "app-extra",
+ "siid": 15,
+ "piid": 1,
+ "friendlyName": "others-app-extra",
+ "channel": "AppExtra",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "main-channel",
+ "siid": 15,
+ "piid": 2,
+ "friendlyName": "others-main-channel",
+ "channel": "MainChannel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "slave-channel",
+ "siid": 15,
+ "piid": 3,
+ "friendlyName": "others-slave-channel",
+ "channel": "SlaveChannel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ },
+ {
+ "property": "cola",
+ "siid": 15,
+ "piid": 4,
+ "friendlyName": "others-cola",
+ "channel": "Cola",
+ "channelType": "miot_string",
+ "type": "String",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "STRING"
+ }
+ ]
+ },
+ {
+ "property": "buttom-door",
+ "siid": 15,
+ "piid": 5,
+ "friendlyName": "others-buttom-door",
+ "channel": "ButtomDoor",
+ "channelType": "miot_bool",
+ "type": "Switch",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "reboot-cause",
+ "siid": 15,
+ "piid": 6,
+ "friendlyName": "others-reboot-cause",
+ "channel": "RebootCause",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "hw-version",
+ "siid": 15,
+ "piid": 8,
+ "friendlyName": "others-hw-version",
+ "channel": "HwVersion",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "iic-error-count",
+ "siid": 15,
+ "piid": 9,
+ "friendlyName": "others-iic-error-count",
+ "channel": "IicErrorCount",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "manual-level",
+ "siid": 15,
+ "piid": 10,
+ "friendlyName": "others-manual-level",
+ "channel": "ManualLevel",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": []
+ },
+ {
+ "property": "country-code",
+ "siid": 15,
+ "piid": 11,
+ "friendlyName": "others-National code",
+ "channel": "CountryCode",
+ "channelType": "miot_int32",
+ "type": "Number",
+ "refresh": true,
+ "actions": [
+ {
+ "command": "set_properties",
+ "parameterType": "NUMBER"
+ }
+ ]
+ }
+ ]
+ }
+}