четверг, 7 декабря 2017 г.

Автоматизация проветривания по уровню углекислого газа (CO2)

Итак, наконец руки дошли!
Делаем автоматизацию проветривания по уровню углекислого газа (CO2).

Тема в последнее время (в Москве и других отвратительных мегаполисах, мда) актуальна. Доходит до того, что отдельные герои открывают окно мотором!
У меня, правда, Лоссней , а это редкость, дорого и в установке сложно. Поэтому расскажу о получении уровня CO2, и что с ним делать потом.


В качестве датчика у меня Мастеркит/Даджет девайс "Детектор углекислого газа" . Сейчас на него, правда, конский ценник. Когда я брал, было ещё дёшево >:) .
У штуковины нет встроенной батарейки (что особенно глупо за такие-то деньги). Однако показывает оно что-то похожее на правду: в лесу благодать, в плацкарте РЖД адЪ. Будем использовать, благо USB у штуки всё же есть.

Я наивно полагал, что данный экземпляр работает через виртуальный COM, и данные с него можно снять банальным терминалом под Linux.
Но злые разработчики зачем-то зафигачили полноценный USB. Уже было совсем поставил USB Wireshark . Но лень, лень! И таки OpenSource – это сила: нашёл вот этот репозиторий  . Спасибо тебе, добрый человек!

Думал, буду опрашивать девайсину раз в минуту кроном, но всё оказалось сложнее. Софтина по ссылке работает только в режиме монитора. К счастью, sh гораздо богаче cli по своим возможностям, и прогу переписывать не придётся.

ID нашего датчика: idVendor="04d9" idProduct="a052".

Значение CO2 получим так:
./co2mond/co2mond | grep --line-buffered -Po "(?<=CntR\t)\d*"

Утилита сама не оставнавливается. Можно сделать так:
timeout 3 ./co2mond/co2mond | grep --line-buffered -Po "(?<=CntR\t)\d*"

Не самое изящное решение, но работает. Прога будет завешена через три секунды после запска.
Теперь добавляем полученное значение в переменную:
co2=$(timeout 3 ./co2mond/co2mond | grep --line-buffered -Po "(?<=CntR\t)\d*")

И надо привести её к числовому формату, иначе не сможем сделать числовое сравнение:
$co2=$( printf "%.0f" $co2 )


Почти справились. Теперь просто сравним значения. Переключать вентиляцию будем моим любимым "Мини-Монстром" 

if [ $co2 -gt 799 ]; 
then
wget -q http://192.168.1.11/password/?sw=2-1 --spider
fi


Можно даже сделать авто-реверт, получая значения с "Мини-Монстра" через JSON. Например, смотрим текущее состояние переключателя так:

wget.exe -qO- http://192.168.1.11/password/?js= | jq ".prt |.[1]"

Для парсинга JSON в командной строке используем утилиту JQ

Собственно, всё. Дышим в датчик для проверки и радуемся :)

Правда, к мастеркитовскому/даджетовскому CO2 датчику есть вопросы:
- если уровень СО2 выше 4000, датчик показывает Hi и красную лампу. Но по USB при этом не даёт вообще ничего. Так сложно было сделать служебный код -1, 9999 или 65535? Разрабы, ау.


Комментариев нет:

Отправить комментарий