Добавление Xiaomi Mijia Air Detector в Home Assistant
@configitНа днях купил Xiaomi Mijia Air Detector aka Xiaomi Mijia Air Quality Tester и он никак не хотел работать у меня на самой последней версии Home Assistant.
Пришлось немного погуглить, найти пару issues на гитхабе (#419 #420), которые показали, что мой девайс всё таки отдает данные при запросе: "method":"get_air_data","params":[], имея самую свежую прошивку 3.4.4_0087.
Я не использую miio либо miio-cli, а использую компонент php-miio от SkySilver (за что ему огромный респект) написанный для Majordomo на php, работает в разы быстрее и понятнее, есть debug.
Далее я увидел, что нельзя делать запрос с одним и тем же id чаще 1 минуты, отсюда вывод, нам понадобится сгенерировать произвольный id.
Итак приступи к делу:
- Ставим php, если ещё нет:
apt-get install php
Проверяем версию:
php -v
2. Ставим php-miio
git clone https://github.com/skysilver-lab/php-miio.git
3. Проверяем, что работает php-miio и делаем запрос к устройству с выдачей инфо о нем:
php miio-cli.php --ip IP_УСТРОЙСТВА --token ТОКЕН --info
В ответ мы должны получить, что-то вроде:
{"partner_id":"","id":2,"code":0,"message":"ok","result":{"hw_ver":"Linux","fw_ver":"3.4.4_0087","ap":{"ssid":"xxx","bssid":""},"netif":{"localIp":, итд...
Создаем bash скрипт, который будет дергать нужные нам данные через miio-cli.php, для последующего парсинга с рандомным id в HA:
#!/bin/bash
id=$(echo $RANDOM % 1000 + 1 | bc)
php miio-cli.php --ip IP_УСТРОЙСТВА --token ТОКЕН --sendcmd '{"id":'"$id"',"method":"get_air_data","params":[]}' | tail -1 | sed 's/{"result"://g' | sed 's/\,"id.*//g'
Называем его например air_tester.sh и даем ему права на выполнение chmod +x air_tester.sh
4. Выполняем скрипт ./air_tester.sh и получаем что-то вроде:
{"co2e":401,"humidity":51.5,"pm25":11.600000381469727,"temperature":23.600000381469727,"temperature_unit":"c","tvoc":1.3310984373092651,"tvoc_unit":"mg_m3"}
Ура! Данные получены, теперь осталось совсем немного создать через command_line выполнение нашего скрипта в HA, темплейты на все 5 сенсоров и округлить наши значения после точек:
sensor:
- platform: command_line
name: Air Tester
command: '/home/your_user/scripts/air_tester.sh'
value_template: "{{ value_json['co2e']['pm25']['humidity']['temperature']['tvoc'] }}"
json_attributes:
- co2e
- pm25
- humidity
- temperature
- tvoc
scan_interval: 30
- platform: template
sensors:
air_tester_co2:
friendly_name: "CO2a"
unit_of_measurement: "ppm"
value_template: "{{ states.sensor.air_tester.attributes.co2e }}"
- platform: template
sensors:
air_tester_tvoc:
friendly_name: "TVOC"
unit_of_measurement: "mg/m3"
value_template: "{{ ( states.sensor.air_tester.attributes.tvoc | round(2)) }}"
- platform: template
sensors:
air_tester_pm25:
friendly_name: "PM 2.5"
unit_of_measurement: "ppm"
value_template: "{{ ( states.sensor.air_tester.attributes.pm25 | round(1))}}"
- platform: template
sensors:
air_tester_humidity:
friendly_name: "Humidity"
unit_of_measurement: "%"
value_template: "{{ ( states.sensor.air_tester.attributes.humidity | round(1))}}"
- platform: template
sensors:
air_tester_temperature:
friendly_name: "Temp"
unit_of_measurement: "°C"
value_template: "{{ ( states.sensor.air_tester.attributes.temperature | round(1))}}"
Ну а sensor.air_tester можно просто скрыть через custmoize.yaml, также можно нагуглить красивые иконки для сенсоров, в итоге получаем что-то вроде:
Вот и всё! Теперь можно получать каждые 30 секунд данные с нашего устройства, можно чаще, можно реже, как хотите!
Enjoy!
TODO List: Выяснить как прокинуть заряд батареи, управление яркостью экрана, автоотключение экрана итд.
Данная статья была написана и создана специально для канала @configit
При репосте либо копировании статьи просьба указывать ссылку на статью и канал!