В прошлой статье я рассказал, как начать программировать под ESPHome. Пришло время сделать что-то действительно полезное.
Есть такой датчик измерения концентрации углекислого газа в воздухе – MH-Z19B. Он уже поддерживается ESPHome, но проблема в том, что этот датчик имеет встроенную автокалибровку. То есть, он берет минимальный уровень CO2 за прошедшие сутки и считает, что это значение равно 400ppm. В плохо проветриваемом помещении через несколько дней датчик начинает сильно врать.
Но есть решение – автокалибровку можно отключить. Для этого нужно сначала откалибровать датчик на свежем воздухе, а затем послать специальную команду для отключения автоматической калибровки.
Задача осложнялась тем, что датчика у меня нет...
Матчасть
Для начала я выяснил, что существует две ревизии этого датчика – MH-Z19 и MH-Z19B. Отличаются они незначительно, но калибруются немного по-разному. MH-Z19 командой принудительной калибровки калибруется в 0ppm, а MH-Z19B - в 400ppm.
Изучаем даташиты (MH-Z19, MH-Z19B), revspace, библиотеку для работы с датчиком на гитхабе и статьи на хабре. Находим нужные команды для включения и отключения автокалибровки, а также - для принудительной калибровки. Изучаем существующий код работы с датчиком в ESPHome. Вроде ничего сложного.
Пишем код
Для начала нужно определиться, как мы будем работать с датчиком в прошивке. Я выделил несколько обязательных пунктов:
- Возможность включить или выключить автоматическую калибровку сразу при загрузке.
- Возможность включить или выключить автоматическую калибровку во время работы.
- Возможность ручной калибровки.
- Обратная совместимость, т.е. чтобы при прежних настройках конфига ничего в логике работы не менялось.
Первые два пункта можно сделать параметром при описании сенсора в yaml, а вот третий нужно сделать каким-то сервисом, который можно вызвать из Home Assistant.
Как обычно, не буду заострять внимание на коде, лишь покажу финальный вариант.
Проверяем результат (ага, как же – датчика-то у меня нет), создаём Pull request, пишем тесты, если нужно.
Как этим пользоваться
Я добавил параметр для управления автокалибровкой при загрузке, методы для ручного включения/выключения автокалибровки и метод для ручной калибровки.
Вот пример, как отключить автокалибровку на старте (automatic_baseline_calibration: true/false):
sensor: - platform: mhz19 id: my_mhz19_id co2: name: "MH-Z19 CO2 Value" temperature: name: "MH-Z19 Temperature" update_interval: 60s automatic_baseline_calibration: false
Если параметр automatic_baseline_calibration не указан, логика будет такая же, как и до изменений.
А вот пример, как выполнить ручную калибровку. Для этого можно объявить сервис, который позднее можно будет вызвать из Home Assistant:
api: services: - service: mhz19_calibrate_zero then: - mhz19.calibrate_zero: my_mhz19_id
А вот так можно сделать switch для включения и выключения автоматической калибровки из Home Assistant:
switch: - platform: template name: "MH-Z19 ABC" optimistic: true on_turn_on: mhz19.abc_enable: my_mhz19_id on_turn_off: mhz19.abc_disable: my_mhz19_id
Документация
Дело за малым – донести миру о наших прекрасных нововведениях. Документация ESPHome находится на сайте https://esphome.io/, контент этого сайта хранится на гитхабе в репозитории esphome-docs. Редактировать документацию можно прямо через интерфейс Github! Например, страница нужного нам датчика находится здесь и в правом верхнем углу есть карандашик (убеждаемся, что находимся в ветке next).
Такой способ создаст форк репозитория, ветку в нем, закоммитит файл в ветку и вы сможете сделать pull request с вашими изменениями.
Однако, правильнее, на мой взгляд, сделать это вручную. Так вы сможете оценить, как выглядит написанная вами документация на локальной копии сайта.
По инструкции из предыдущей статьи создадим форк репозитория esphome-docs, скачаем его и запустим контейнер:
cd ~ git clone https://github.com/Anonym-tsk/esphome-docs.git cd esphome-docs git checkout next git checkout -b mhz19_autocalibration docker build -t esphome-docs -f Dockerfile. docker run -it -p 8000:8000 -v `pwd`:/data/esphome-docs esphome-docs
Переходим по адресу http://127.0.0.1:8000 и видим локальную копию сайта ESPHome.
Пишем документацию в формате ReStructuredText, перезапускаем контейнер, проверяем, создаем Pull request.
Проверяем на хомяках пользователях и радуемся первым комментариям:
Заключение
Вот так, очень просто можно добавить недостающие функции в ESPHome и написать документацию. После принятия пулл-реквестов код попадет в следующий релиз, а документацию еще до релиза можно будет посмотреть на сайте next.esphome.io
В чате @esphome активно просят добавить поддержку сенсора SenseAir S8 в ESPHome. Но сенсора у меня нет. Если вы заинтересованы в этом, дайте знать – нужны тестировщики. Ну и, конечно, можете поддержать автора – куплю сенсор, добавлю его в ESPHome, напишу статью.
Отличная статья! Спасибо автору!
Потестил MH-Z19B (откалибровал и отключил автокалибровку) и SenseAir S8. И MH-Z19B завышал значения на 50-100ppm + у него были странные провалы и скачки (+100-150ppm), с SenseAir S8 все отлично, работает из коробки, значения очень похожи на правильные.
Вообще я понял есть проблема с готовыми устройствами измерителями CO2, найти смог только несколько (и то они такие себе). Поэтому пришлось собирать самому на esp8266+SenseAir S8, чтобы управлять приточной вентиляцией в каждой комнате.
А на какой прошивке была такая проблема с MH-Z19B?
Пока не могу понять, всё ли в ESPHome работает корректно или что-то не так. Датчика то у меня нет )
esp8266 - ESP Easy Mega (mega-20190731) и на z-uno потестил, так похожая фигня была.
Видимо датчик такой. Если есть возможность, проверь на ESPHome.
Попробуйте изменить питание для MH-Z19B, он довольно капризен по питанию. Попробуйте запитать его отдельно от 5V.
esp8266 - ESP Easy Mega (mega-20190731) и на z-uno потестил, так похожая фигня была.
Купил три датчика, положил возле открытого окна, у двоих уже 400ppm, а третий показывает 760-780ppm и ниже не опускается, ему явно нужна калибровка.
Может кто скинуть пример для calibrate_zero?
Я что-то тыкался, так и не понял какой код добавить в HA, а какой в ESPhome. Служба так нигде и не появилась.
Включение/выключение автокалибровки сразу заработало.
Вот рабочий пример
https://esphome.io/components/sensor/mhz19.html#mhz19-calibrate-zero-action">https://esphome.io/components/...
У меня дома стоит MH-Z19, заработал отлично из коробки, automatic_baseline_calibration стоит false. Купил второй такой же в офис, включил, показывает 400-404 ppm, поставил automatic_baseline_calibration: true, не помогло, спустя выходные как было 400-404, так и осталось. Сейчас вывесил его в окно, подождал 20 минут, отправил команду калибровки, вернул датчик в помещение, теперь значения очень сильно прыгают. В чём может быть дело? Заранее спасибо!
https://sprut.ai/static/media/cache/00/69/14/5/7479629/77626/1000x_image.png?1619452217" alt="1000x_image.png?1619452217" />