Получение данных с датчика углекислого газа Даджет в системы умного дома

  • Tutorial
Датчик углекислого газа Даджет KIT MT8057S давно зарекомендовал себя как достаточно надежный и недорогой прибор. Один недостаток, на мой взгляд — официально данные с него можно получать только фирменной программой под windows, и никак иначе.


Тем не менее, получить данные в linux относительно несложно. Пришлось использовать небольшой костыль, но в итоге показатели co2 и температуры можно получить в консоль, и отправить дальше.

В этой статье рассмотрена отправка данных в IoBroker и Home Assistant.

Потребуется библиотека libhidapi и небольшая программка co2mon, размещена на гитхабе.

apt-get install git cmake g++ pkg-config libhidapi-dev

Скачиваем и компилируем программу co2mon

mkdir co2
cd co2
git clone https://github.com/dmage/co2mon.git
cd co2mon
mkdir build
cd build
cmake ..
make
cd co2mond
mv co2mond ../../../co2mond

Возможно, пути придется подкорректировать под вашу систему.

Программа эта работает в двух режимах — постоянное получение данных в консоли, и в режиме демона. Будучи запущенной без параметров, программа постоянно выводит в консоль текущие показания, пока не будет принудительно закрыта. Немного странное решение, может я не разобрался, но работаем с тем что имеем.

В обоих режимах программа может сохранять данные в текстовые файлы, достаточно добавить ключ -D и указать путь к каталогу.

Я не хотел вешать на и без того слабенький сервер умного дома еще один демон, да и данные об углекислом газе не меняются быстро. Поэтому накидал простенький скрипт, который запускает программу, ждет пять секунд, и убивает ее.

#!/bin/bash
cd /home/server/co2
./co2mond -D /home/server/co2 > log.txt &
sleep 5
pkill co2mond
rm log.txt

Добавляем скрипт в cron, я запускаю его раз в минуту, этого более чем достаточно.

Готово! Теперь в двух текстовых файлах, которые создает программа, есть текущие показания климата.

Важный момент — для получения данных с usb у пользователя должны быть соответствующие права, или cron надо запускать от root'a, соответственно создаваемые текстовые файлы будут тоже рутовыми, это надо учитывать.

Теперь вторая часть — отправляем полученные данные в системы умного дома. Начнем с IoBroker. Для начала с него, так как на тот момент, когда я задался этой задачей, пользовался им.

Там все просто — есть адаптор systeminfo, который умеет читать в том числе и файлы с файловой системы. Не то, чтобы данные температуры были нужны, но почему бы и нет.



Сохраняем, и вуаля:



А потом я перешел на Home Assistant. В нем я использую mosquitto, и данные решил отправлять через него, нацеливаясь на разделение компьютеров в будущем или добавление датчиков.

Установку и настройку брокера не рассматриваю, это выходит за пределы статьи.

На компьютер, к которому подключен датчик, надо установить клиент mosquitto, если он не стоит:

apt-get install mosquitto-clients

В конфиг Home Assistant добавляем два сенсора, и перезагружаем:

- platform: mqtt
  state_topic: "co2/co2"
  name: "co2.co2"
  unit_of_measurement: ppm
 
- platform: mqtt
  state_topic: "co2/temp"
  name: "co2.temp"
  unit_of_measurement: °C

В скрипт, который получает данные, добавляем четыре строчки:

read co2 /home/server/co2/CntR
read temp /home/server/co2/Tamb
mosquitto_pub -h localhost -t "co2/co2" -m $co2 -u "пользователь" -P "пароль"
mosquitto_pub -h localhost -t "co2/temp" -m $temp -u "пользователь" -P "пароль"

Готово, вы прекрасны) Теперь наш крон раз в минуту публикует показания датчиков в топик co2, и которого Home Assistant в свою очередь их считывает:



Теперь мы имеем в системе умного дома данные датчиков, и можно запланировать автоматизацию. У меня включается вытяжка, управляемой приточной вентиляции у меня пока нет, но если включить вытяжку, воздух постепенно обновляется.

Комментарии 10

    0
    зачем создавать log.txt и потом удалять?
    если не в режиме отладки, можно в /dev/null утилизировать выхлоп:

    #!/bin/sh -е
    /home/server/co2/co2mond -D /home/server/co2 >/dev/null &
    sleep 5
    pkill co2mond
    

    Для продвинутых: можно залезть в код co2mond и подпилить чтобы выходил сам после первого успешного замера, тогда и убивать не понадобится. Всё равно сами собираете из исходников…
      0
      В процессе отладки чего то падало у меня, затем и лог сделал. А потом оставил. Да, можно и в /dev/null.

      Меня сложно назвать продвинутым) Так, проглядел исходник, ничего криминального не нашел и использовал как есть.
      +1
      Ну, не знаю… я не ощущаю на NASе, где крутится демон co2mond какой-то нагрузки от него. К заббиксу подключил — и не нарадуюсь.

      UserParameter=smarthome.co2[*],cat /tmp/co2/CntR
      UserParameter=smarthome.temp[*],cat /tmp/co2/Tamb


        0
        У меня 5-10% постоянно в top висели. Возможно, какой то глюк в hid
        0

        Кому интересно, есть пример кода на Расте для снятия данных с этих датчиков построенный на основе hidapi.

          0
          Важный момент — для получения данных с usb нужны администраторские права
          Не нужны. Можно дать пользователю права на usb.
            0
            Спасибо, поправил
            +1
            Не знаю, что конкретно с этим устройством, но если брать референсный датчик, то все решается без таких костылей меньше чем за $1.5 при помощи esp01+esphome по инструкции вот тут. Внутрь устройства вставляется маленькая платка, которая по WiFi подключается к HomeAssistant или к MQTT брокеру и отправляет свои показания.

            Плюсы:
            • Автоматическая регистрация в HomeAssistant
            • Не грузится система компьютера, как писали выше
            • Можно поставить в любом месте, где есть WiFi, а не привязываться проводом к серверу
            • Можно собрать дешевле USB провода для подключения этого устройства к компьютеру
            • Можно добавить дополнительные датчики или исполнительные устройства


            Минусы:
            • WiFi в том плане, что он должен быть и он менее надежен, чем провод


            Это пример для HA, но при желании можно найти и другие прошивки под нужные платформы
              +1
              Я обещал костыль, и я выполнил свое обещание)
              0
              код на Go, сразу с отправкой в mqtt: github.com/kdudkov/co2mon

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое