Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр Анемометр

► wifi inside

Пациент готов к операции:

Для вскрытия надо вытащить 4 резиновых заглушки:

И выкрутить винты, скрывающиеся под ними. После этого можно осторожно разъединить две части корпуса(например пластиковой карточкой):

Осторожно — потому что внутри они соединены трубкой, которую надо аккуратно отцепить и засунуть внутрь корпуса, чтобы не мешалась:

На нижней части платы расположены 4 контактных отверстия:

Люди, знакомые с электроникой, поймут их назначение по буквам рядом с ним. Остальные поймут это из моего объяснения: V (voltage) — питание, D(data) — данные, С(clock) — синхронизация, G(ground) — земля. G, он же GND, он же «земля» — нулевая точка, от которой отсчитывается напряжение питание(то, которое V) и уровни сигналов данных.

С, он же clock, он же тактовый, он же синхросигнал — специальный сигнал, который указывает принимающей стороне, когда надо считывать сигнал с линии данных(которая D). В отличии асинхронных протоколов(типа UART/RS-232), где такого сигнала нет, и синхронизация строится на точном указании одинаковой частоты(=скорости) на передающей и принимающей стороне(все эти 1200, 9600, 115200 бод), в синхронном протоколе есть отдельная линия, смена уровня на которой означает, что приемник должен измерить состояние линии данных поняв, какой бит передается в текущий момент.

Плюсом синхронного протокола является нечувствительность к разнице тактирования устройств(можно хоть ручками набирать байты, если не ограничений по времени), минусом — необходимость отдельного провода. В принципе, при одинаковой частоте передачи, можно разбирать синхронную передачу и без тактового сигнала, но такими извращениями мы страдать не будем.

Цепляемся осциллографом на контакты и видим посылки с данными:

Приближаем, и вот уже можем разглядеть отдельные биты:

Можем даже расшифровать сообщение, но не будем. Нам важно понять, что он действительно что-то отправляет, чтобы потом не думать «а почему у меня данные не приходят» по причине их отсутствия.

Вместо осциллографа припаиваем и клеим термоклеем платку с ESP8266:

Подключаем ее по UART к компьютеру(на фото два провода, без земли, потому что измеритель питается от того же ноута) и начинаем писать код.

► исходники

Пишется код в среде Arduino c включенной поддержкой ESP8266(как ее включить, можно прочитать вот

► собираем статистику


Однако, пока что ситуации «посмотрел на экран измерителя» и «посмотрел на веб-страничку» отличаются не очень сильно. Чтобы было интереснее, надо либо чем-то управлять, либо собирать статистику.

Конечно, можно еще поковыряться с ESP, использовав ее память под хранение графика, или сделав так, чтобы она управляла каким-нибудь WiFi-реле… Но я не поклонник распределённых систем, и считаю, что у умного дома должен быть как минимум один сервер.

Для того, чтобы сделать из единичных показаний график, я воспользуюсь возможностями Logic Machine — скриптами и трендами. Конечно, все тоже самое можно сделать и на любом компьютере, но раз инструменты есть у меня под рукой, почему бы не воспользоваться.

Создаем новый Sheduled-скрипт(выполняющийся по расписанию), настраиваем его на запуск каждую минуту:

Внутри пишем что-то вроде этого:

► управляем вентилятором

В качестве площадки для тестирования вентиляции, управляемой по уровню CO₂, я выбрал

. В нем уже настроено управление вентиляцией с контроллера(как именно, смотрите по предыдущей ссылке), так что мне просто оставалось настроить реакцию на повышение уровня CO₂. В LM делается это так:

Создаем новый скрипт типа Event-based(выполняемый при изменении объекта), устанавливаем в качестве объекта мониторинга объект, в который мы записывает текущее значение CO₂:

В коде скрипта пишем несложную логику, которая будет включать вентиляцию при уровне углекислоты выше 1000ppm, и выключать при уровне меньше 800, реализуя гистерезис для предотвращения частого включения-выключения вентиляции:

--Скрипт выполняет при любом изменении объекта
value = grp.getvalue("S_CO2_CO2") --Получаем значение обьекта с количеством углекислого газа
if (value > 1000) then --Если его больше, чем 1000ppm...
  grp.write('HP-7.1', true) --..включаем вентиляцию
elseif (value < 800) then --Если CO₂ меньше, чем 800ppm...
  grp.write('HP-7.1', false) --..выключаем вентиляцию
end 

Таким образом, вентиляция включится при повышении уровня CO₂ до 1000ppm, и не выключится, пока не опустит его значение до 800ppm.

Жужжит!

Ссылки:

Внутренности похожего устройства и описание протоколаОбзор прибораРазбор прибораПодключение измерителя к Arduino

Если вам интересны темы интернета устройств и умного дома, добро пожаловать в канал в телеграме: telegram.me/IOTandSmarthome

В течение 14 дней, со дня публикации данной статьи, вы можете приобрести «Монитор качества воздуха» с 10%-й скидкой, используя код GEEKT-MK.

Про анемометры:  Датчик положения дроссельной заслонки, ДПДЗ, TPS (Р) (с. 2) - Ford Focus 1

Изучение трафика

Первым делом нужно было посмотреть, как ClearGrass передает данные в приложение

qingping

. ClearGrass подключается к интернет по Wi-Fi. Чтобы слушать трафик я поднял на Raspberry Pi Wi-Fi точку доступа и запустил tcpdump собирать информацию:

sudo tcpdump -i wlan0 -vv -s0 -X -n port 1883 -s 65535 -w cleargrass.pcap


Анализ трафика показал, что ClearGrass обращается примерно к 5 разным IP адресам, а на 154.8.191.174 передает в незашифрованном виде по протоколу

MQTT

данные о качестве воздуха.

Заворачиваем трафик с ClearGrass на Raspberry Pi

Немного поэкспериментировав с

iptables

я пришел к такому правилу:

sudo iptables -i wlan0 -t nat -A PREROUTING -s 192.168.115.19 -j REDIRECT

Читается оно так: «Весь новый трафик на интерфейсе wlan0 от 192.168.115.19 (IP ClearGrass) перенаправлять локально». Я не большой знаток iptables, поэтому буду рад предложениям и улучшениям. В этом правиле есть минус, если анализатор уже подключен к Raspberry Pi, то трафик не будет перенаправляться. Сначала нужно запустить правило и только затем подключить ClearGrass к Raspberry Pi по Wi-Fi.

В итоге, подняв MQTT брокер mosquitto на Raspberry Pi я увидел, что анализатор передает данные о качестве воздуха раз в минуты.

MQTT нано-брокер на JS для домашней автоматизации Z-Way

В качестве сервера домашней автоматизации я использую Z-Way, который поддерживает множество Z-Wave устройств и возможность писать скрипты на JS.

К сожалению для Z-Way нет MQTT брокера на JS (в отличие от систем на базе node.js), поэтому я решил написать минимальные брокер, который только принимает данные от этого анализатора и ничего больше не умеет. Не читая особо документацию я посмотрел на общение между анализатором и mosquitto и составил следующую последовательность:

MQTT PROTOCOL

Connect Command (sensor -> broker)
	0x10 - Connect Command

Connect Ack (broker -> sensor)
	0x20 - Connect Ack
	0x02 - Len 2
	0x00
	0x00 - Connection Accepted

Subscribe Request (sensor -> broker)
	0x82 - 0b1000 0010; 0b1000 - Subscribe Request

Subscribe Ack (broker -> sensor)
	0x90 - 0b1001 0000; 0b1001 - Subscribe Ack
	0x03 - Len 3
	0x00
	0x08 - Message identifier 8
	0x00 - Fire and Forget

Ping Request (sensor -> broker)
	0xC0 - Ping Request
	0x00 - Len 0

Ping Response (broker -> sensor)
	0xD0 - Ping Response
	0x00 - Len 0

Publish Message (sensor -> broker)
	0x30 - Publish Message
	0x96
	0x04 - Len 534

В итоге родился простой JS скрипт:

mqttSocket.reusable();
mqttSocket.bind(1883);
mqttSocket.onrecv = function(data, host, port) {
	var arr = new Uint8Array(data);

	switch(arr[0]) {
		// PING
		case 0xC0:
			console.log("---------- MQTT PING RESPONSE");
			this.send([0xD0, 0x00]);
			break;
		// CONNECT
		case 0x10:
			console.log("---------- MQTT CONNECT ACK");
			this.send([0x20, 0x02, 0x00, 0x00]);
			break;
		// SUBSCRIBE
		case 0x82:
			console.log("---------- MQTT SUBSCRIBE ACK");
			this.send([0x90, 0x03, arr[2], arr[3], 0x00]);
			break;
		// PUBLISH
		case 0x30:
			var sensorPayload = self.getPayload(arr);
			var sensorMessage = sensorPayload.substr(sensorPayload.indexOf('{'), sensorPayload.lastIndexOf('}'));
			var sensorObj = JSON.parse(sensorMessage);
			console.logJS("---------- MQTT MESSAGE:", sensorObj);
			console.logJS("---------- CO2: ", sensorObj.data.co2);
			self.vDevCO2.set("metrics:level", sensorObj.data.co2);
			break;
	}
};
mqttSocket.listen();

Конечно пока многое не учитывается, например в одной посылке, может прийти и PING, и MESSAGE, а я что-то из этого пропущу. Возможно в будущем я использую кодовую базу

для создания MQTT брокера для Z-Way. А на данный момент целью была принципиальная возможность получить локально данные о качестве воздуха с анализатора Xiaomi ClearGrass Air Detector и эта цель достигнута.

В перспективе хочу установить Z-Wave версию бризера TION S3 и управлять им основываясь на данных от ClearGrass.

Blynk

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

и т.п. Но как-то они показались слишком громоздкими для моего случая. Различные системы «умных домов», которые умеют работать с датчики, тоже из пушки по воробьям.

Blynk в первую очередь привлек своим дизайном, и хорошей документацией с примерами. Прошли считанные минуты на ознакомление, и вот уже на экране телефона выводится температура и влажность с красивыми графиками. В итоге было решено остановиться на нём. Тем более, что для Blynk, при желании, можно настроить локальный сервер.

Вот так выглядит проветривание 10 минут, в режиме откинутое окно (в районе 0 часов), потом CO2 довольно быстро поднимается, при том, что я сейчас один в квартире.

Вроде всё хорошо, CO2 быстро снизился до 410 ppm, но график PM2.5 увеличился в 2,5 раза, и температура упала на 2 градуса.

Вариант автоматизации

Самый идеальный по моему мнению вариант автоматизации — это использование датчика газа вместе с приводом для крана. Я уже делал обзор на такой электропривод. Огромный плюс его в том, что ставится он поверх любого шарового крана, а не в разрыв трубы, что дает возможность не нарушать законы и не вносить изменений в действующий газопровод (ни одна газоснабжающая организация не даст вам поставить полноценный клапан в разрыв трубы, по крайней мере в РБ).

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Для самых нетерпеливых, выкладываю исходник прошивки


И QR-код для клонирования проекта Blynk

Как я дошел до этого

DIY устройств на этих датчиках в интернете вагон и маленькая тележка. Но почему-то, в основном люди зациклены на создании, так сказать, Standalone-решений. Т.е. коробочка с датчиками и экраном, на который выводятся показания. Но я не в восторге от экранчиков от Nokia и всяких символьных 1604 и подобных, тем более хотелось бы видеть графики для анализа изменений.

Про анемометры:  Как измерить температуру дома?

А поскольку занимаюсь web-разработкой, сразу же пришла мысль об отделении «мух от котлет». Т.е. датчики занимаются только сбором данных и отправкой их на сервер. Ну, а с сервера мы можем получить эти данные в нужном виде и для нужного устройства. В простейшем виде можем просто показания посмотреть, но в то же время спокойно можем к эти данным привязать исполнительное устройство (например, включение приточной вентиляции или открытие форточки сервоприводом).

Мониторинг co2, влажности и температуры

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Всем привет!

Мы все дышим. Этот клинический факт означает, что в наш организм поступает смесь газов, не все из которых одинаково полезны. К примеру, рассмотрим СО2. В сети достаточно информации о влиянии этого газа на самочувствие человека. В целом, все сходятся на мнении, что нормальная концентрация CO2 это 400-600 ppm, 800-1000 ppm легкое недомогание, выше 1000ppm общий дискомфорт, головные боли, проблемы с концентрацией внимания.
Удивительно, но факт: уровень CO2 в комнате с закрытыми окнами и одним человеком легко уходит в зону 900ppm всего за пару часов.
Поэтому, если Вы так же, как и я, хотите следить за своим самочувствием, добро пожаловать под кат. В этой статье я покажу, как самому сделать монитор CO2, влажности и температуры

Тема IoT (Интернет вещей) сейчас популярна и считается достаточно перспективной. Эксперты предсказывают, что будущем основной объем данных будут генерировать именно такие «вещички». Основная задача этих устройств — создание комфортной среды для человека.

Что ж, сделаем свою жизнь немного удобнее. Как всегда, начинаем с формулирования постановки задачи: мы хотим понимать не превышена ли концентрация углекислого газа в комнате, нужно ли увлажнять воздух, ну и заодно измерим температуру. Основной канал предоставления информации — либо дисплей, либо цветовая подсветка. Это удобно и быстро. К примеру, я не хочу лезть в телефон, чтобы посмотреть нужно ли мне открыть окно на проветривание. Как следствие, устройство должно работать как в связке с сервером умного дома, так и быть самостоятельным безо всяких умных домов.
Я выбрал цветовую индикацию:
Зеленый, медленно мигает раз в 5 секунд — до 600ppm
Желтый горит постоянно — до 900ppm
Красный горит постоянно — выше 900ppm
Вот как это выглядит
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Переходим к реализации. Сразу оговорюсь, устройство было сделано несколько лет назад, сейчас я бы спроектировал его по-другому. Но в этом необходимости нет — работает вполне надежно.
Итак, нам понадобится:
— микроконтроллер ESP-8266. В моем случае его реализация в виде Wemos D1 mini — всем советую. На мой взгляд это лучшая реализация отладочной платы для ESP8266
Ссылка на Wemos D1 mini Aliexpress
— MH-Z19B для измерения CO2. Похоже это наиболее популярный датчик по соотношению цена/ вранье по ppm
Ссылка на MH-Z19B Aliexpress
— датчик температуры, давления и влажности BME-280. Точный, надежный и беспроблемный как автомат Калашникова. С удивлением обнаружил этот датчик даже в полетном контроллере квадрокоптера в качестве высотомера (учитывая специфику, понятно какие требования выдвигаются к точности измерения высоты)
Ссылка на BME280 Aliexpress
— Корпус… Корпус, как говорится, определяет. Поэтому я взял мини колонку, варварски выдернул из нее начинку и воткнул туда датчики. Использование колонки позволит сделать хорошую циркуляцию воздуха у датчиков за счет большой площади декоративной сеточки.
Ссылка на колонку Aliexpress
— светодиоды для цветовой индикации
В итоге без корпуса стоимость компонентов выходит – 2000 руб

Проектируем, разводим и изготавливаем печатную плату. Для себя я делаю по технологии ЛУТ, в остальных случаях заказываю на производстве в Китае.
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Логическая схема и печатная плата доступна на EasyPDA
Проект EasyEDA
Прошиваем микроконтроллер. Ссылка на исходный код прошивки:
Проект на GitHub
Поддерживается как прошивка по micro USB, так и прошивка по воздуху (OTA)
С этого момента устройство может работать самостоятельно. При первом включении устройство создаст свою точку доступа WiFi. Необходимо подключиться, зайти на web страницу устройства, выбрать вашу WiFi и ввести логин и пароль.

Зарегистрируем датчики на сервере умного дома в Home Assistant. В файл configuration.yaml помещаем код из файла climate.yaml Перезагружаем сервер и после этого датчики будут доступны для размещения на домашнем экране. Моя карточка выглядит следующим образом:
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Показания датчиков используются в сценариях, которые я пишу на Node Red (установленный как addon в Home Assistant)
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Показания температуры используются для управления кондиционером и регуляторами радиаторов, показания CO2 и влажности приходят на телефон в случае превышения пороговых значений

Про анемометры:  Почему ваш детектор угарного газа пищит - gadgetshelp,com

О датчиках

Датчики SenseAir S8 бывают нескольких сильно отличающихся модификаций. Для наших целей отлично подходит модификация 004-0-0053, и у себя использовал именно её. Обратите внимание, что S8 датчики есть для промышленного применения, с виду одинаковые, но на значительно большие диапазоны, к примеру модель 004-0-0024 измеряет от 400 до 32000 ppm (но при этом точность ±1000 ppm, у модели 0053 точность ±40 ppm), в домашних же условиях 400-800 ppm это хорошо, а больше 2000 ppm уже будет очень плохое самочувствие.

Обращаю внимание, что датчики температуры BME280 в виде готовых модулей, бывают на напряжение 3,3 В и на 5 В. В нашем случае нужен именно на 3,3 В.

Датчики пыли PM 2.5 бывают тоже несколько вариантов PMSA003-A (вход и выход воздуха с одной стороны) и PMSA003-C (вход и выход с противоположных сторон). Тут в принципе без особой разницы, зависит от того, как удобнее будет в корпусе. Также есть более старые поколения этого датчика PMS7003, PMS5003 (без дополнительных букв).

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

Подключение


Схема подключения выглядит так.

Подключение к home assistant

Для подключения к Home Assistant понадобится шлюз Zigbee, либо координатор Zigbee. Данный датчик газа полностью поддерживается, вплоть до поддержки смены чувствительности через MQTT протокол (MQTT сообщения через которые общается сенсор со шлюзом). Подробно все параметры сообщения от датчика рассмотрим ниже.

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

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

Подключение к mi home

Моя цель, как всегда, подключить к умному дому Home Assistant, но ведь не всем он нужен и большинство использует стандартный Mi Home, которого 90% пользователей хватит за глаза. Сервер умного дома использует один универсальный шлюз для Bluetooth и Zigbee устройств любых (почти) производителей, а вот для Mi Home нужно иметь именно Xiaomi шлюз.

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Прошивка


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

При первой загрузке, или, когда не удаётся подключиться к сети, девайс переходит в режим точки доступа, и создаёт сеть вида esp32_eae234 (где после esp32 кусочек серийного номера чипа, т.е. он будет разный).

Вы на смартфоне открываете список сетей и подключаетесь к этой сети. После чего телефон скажет, что для подключения нужно открыть браузер (точно также как в различных WiFi сетях магазинов, кафешек и т.п.). В браузере открывается страничка, в которой можно из списка доступных сетей выбрать нужную, ввести пароль для неё, а также ввести Token для Blynk.

Проект для Blynk можно будет клонировать просто отсканировав QR-код. И в дальнейшем вы сможете либо использовать его в готовом виде, либо изменить его под себя.

Саму же прошивку с инструкциями по установке и исходники, опубликую попозже. Хотелось бы получить обратную связь по необходимым функциям, ну и несколько добровольцев «для опытов», чтобы можно было провести закрытое beta-тестирование, прежде, чем выкладывать в открытый доступ. Если будет востребовано, то могу и сайтик организовать, чтобы можно было обновления выкладывать.

Расположение датчика газа

По расположению есть некоторые особенности. Датчик нужно располагать не ближе метра от источника газа и не дальше 4 метров, нельзя располагать его прямо над источником, также нельзя ставить ниже, чем 30 см от потолка (метан легче воздуха и будет скапливаться вверху). Можно ставить на стену, либо на потолок. И последнее, кабель из датчика всегда должен выходить справа.

Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Технические характеристики

Производитель

Mijia

Модель

JTQJ-BF-01LMBW

Материал корпуса

Матово-белый ABS пластик

Рабочая температура

-10℃—55℃

Питание

12V ⎓ 70mA

Обнаруживаемый газ

Метан

Модули связи

ZigBee

Габариты (корпус)

80 мм x 80 мм x 29 мм

Вес

80 гр.

Комплект поставки. В комплекте датчик с платформой для крепления на стену или потолок, дюбели и шурупы, двухсторонний скотч (если не хотите сверлить стены). Блок питания 12В 0.5А.
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр
Работаем с датчиком CO₂ Xiaomi ClearGrass Air Detector локально, без китайских серверов / Хабр

Вывод

Использовать такой датчик газа вместо «базового», где это обязательно, вряд ли получится, так как на Xiaomi датчик нет сертификата, который принимают наши газовые службы. А вот поставить рядом с целью использования автоматизаций в умном доме никто не запрещает. Однозначно рекомендую ставить в связке с электроприводом, чтобы газ перекрывался при обнаружении утечки.

Оцените статью
Анемометры
Добавить комментарий