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

Датчик шлет значение CO2 каждые 1.5 секунды, не останавливаясь.

Хороший обзор этого датчика есть на канале "У Павла".
Пока сам датчик едет ко мне, пытаюсь найти информацию по сенсору, который применен в устройстве - MH-Z19E. Даташит находится легко. А вот с протоколом обмена как-то не складывается (забегая вперед скажу, что протокол так и не понадобился).
И вот датчик у меня. Подключаем к Хабу Tuya и смотрим, что он умеет. А умеет он только показывать уровень CO2 в PPM.

Само приложение может построить график. А также можно настроить нотификацию на мобильный телефон (но это платно). Все.
Ок. Разбираем корпус, смотрим что внутри. А внутри все тот же модуль Zigbee от Tuya - ZT3L.

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

Нет, никаких секретов нет. Все, что было видно снаружи, только это и используется. RX, TX, PB5, PC0, +3V3 и GND. Устанавливаем модуль на место и припаиваем проводники к GPIO и GND.

Как и в случае с термостатами, какую-либо деятельность на PB5 и PC0 обнаружить не удалось. Ок. Подключаем RX-TX к логанализатору и смотрим. Упс. А там нет обмена с сенсором. Там идет обмен по Tuya Serial Protocol версии 2. Сюрприз.

Смотрим внимательно плату и обращаем внимание на ранее проигнорированную микросхему. И понимаем, что это еще один микроконтроллер и ZT3L по uart общается как раз с ним. А вот он уже общается с сенсором.

С одной стороны это упрощает адаптацию, но с другой стороны кроме CO2 ничего запросить нельзя. Не будет калибровки сенсора, а также температуры. Но, как говорится, что есть, то есть. Будем реализовывать то, что есть.
Подключаем датчик к сети под управлением zigbee2mqtt.

Что мы хотим сделать - реализовать классический кластер zigbee для передачи CO2. Идем в ZCL и смотрим, что кластер для определения CO2 входит в CHAPTER MEASUREMENT AND SENSING. А уже в нем это Concentration Measurement.

Нас интересует Carbon Dioxide с ID 0x040D. Идем в SDK. Опа, сюрприз. Телинк не сделал ничего для этого раздела.

Но это не страшно. Нам просто нужно «задефайнить» сам кластер и несколько атрибутов. И создать функцию регистрации кластера. Это не сложно.
#define ZCL_CLUSTER_MS_CO2_MEASUREMENT 0x040D
#define ZCL_CO2_MEASUREMENT_ATTRID_MEASUREDVALUE 0x0000
#define ZCL_CO2_MEASUREMENT_ATTRID_MINMEASUREDVALUE 0x0001
#define ZCL_CO2_MEASUREMENT_ATTRID_MAXMEASUREDVALUE 0x0002
CODEZCL_ status_t zcl_co2_measurement_register(u8 endpoint, u16 manuCode, u8 attrNum, const zclAttrInfo_t attrTbl[], cluster_forAppCb_t cb)
{
return zcl_registerCluster(endpoint, ZCL_CLUSTER_MS_CO2_MEASUREMENT, manuCode, attrNum, attrTbl, NULL, cb);
}
Все готово. Можно посмотреть, какие команды используются MCU и распарсить их. А их всего две. Первая возвращает значение CO2 в PPM, а вторая все время запрашивает сетевой статус устройства. Так, как "движок" общения по uart был уже реализован в проекте термостата, то адаптация кода не заняла много времени.
Как обновить. Сперва убеждаемся, что у нас именно такой датчик - "TZE200ogkdpgy2 ". Далее определяем локальный файл обновлений в z2m.
[
"url": "images/1141-d3a3-1111114b-tuya_co2sensor_zrd.zigbee",
"modelId": "TS0601",
"manufacturerName": [
"_TZE200_ogkdpgy2"
],
"force": true
}
]
Далее по адресу из этого файла кладем образ ОТА для обновления.
Далее подключаем два внешних конвертора. Первый для обновления оригинальной прошивки на кастомную. Второй для уже обновленного датчика. Перегружаем z2m и видим наш датчик с немного другим именем.

Заходим в раздел ОТА, жмем проверить и потом обновить.


Если все сделано правильно, то мы увидим, что обновление доступно. Жмем на красную кнопку. И обновление по ОТА начнет загружаться.


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

Даже если не подключить внешний конвертор, то z2m умеет работать с CO2 безо всяких конверторов. Но так как конвертор есть, то мы получим следующее.


Частоту репортов можно настроить во вкладке reporting.

Замечу, раньше на это повлиять было нельзя. Теперь есть штатный способ регулировать с какой частотой должны приходить репорты от датчика. На фото раз в 10 секунд, если изменение больше 50 PPM, но не реже 5 минут.

Спасибо Павлу за предоставленный датчик :-)
Комментарии (40)
BURJUY
13.02.2025 00:06А вы не могли бы сбросить готовую прошивку OTA?
Несколько раз перечитал пост, но некоторые моменты не ясны... Где что дефайнить и как заставить его меньше спамить....
Slacky1965 Автор
13.02.2025 00:06В конце статьи есть ссылка проекта на github'е. В каталоге bin все лежит.
BURJUY
13.02.2025 00:06Спасибо, за проект. и за ссылку на Github там более подробная инструкция!
GrustniyNos
13.02.2025 00:06вот тут взять все можно же https://github.com/slacky1965/tuya_co2sensor_zrd
прошивки по очереди вероятно надо прописывать - прошились на одну, потом прописали другую
Anonym
13.02.2025 00:06А без перепрошивки в z2m что ли не получить данные из него было?
BURJUY
13.02.2025 00:06Получать можно но мой каждые 10 сек шлет данные.
Я бы хотел снизить частоту. Но пока завис на шаге подключения конверторов внешних.
Их Z2m тупо не видит...
destman
13.02.2025 00:06В новой версии z2m (2.0+) их достаточно положить в папку external_converters.
HenryPootle
13.02.2025 00:06А если после обновления этой папки нет? Я пробовал создать руками, но что-то не взлетело, пока глубже времени не было лезть.
destman
13.02.2025 00:06ее руками и надо создавать. в том месте где у вас z2m лежит. рядом с его конфигом. по умолчанию оно лежит в папке
/homeassistant/zigbee2mqtt
. Ставьте аддон File editor. Я таким макаром перешивал термостаты. Стали работать стабильно и не спамят в сеть ...
vanyas
13.02.2025 00:06А чем плохо, что шлет каждые 10сек? HA от этого страдать не должен.
destman
13.02.2025 00:06у меня раз в секунду шлет. причем значения почти не меняются. логичнее слать если сильно поменялось значение. для сети из 10 устройств может и не критично. у меня сейчас около 50 умных устройств. разбил их на 2 категории - те что спамят подключил к sls. он неплохо переваривает такой спам. в z2m сеть с 2-мя спамящими термостатами периодически падала...
AgentFire
13.02.2025 00:06у НА для таких датчиков есть программные сенсоры, которые и частоту снизят, и меняться будут при дельтах, и даже "скачки" проигнорируют/сгладят. Мой такой же датчик периодически "багует" на +300 ppm.
Anonym
13.02.2025 00:06На стороне z2m можно отфильтровать частоту репортинга
destman
13.02.2025 00:06Смысла в фильтре особого нет. Новая логика в записывлке все равно проредит старые данные. Тут проблема в том что передача этих данных не имеет смысл и излишне нагружает сеть. для маленьких сетей не очень страшно. а если устройств больше 10 то могут начаться проблемы в виде задержек в отсылке команд. а то и вообще падении zigbee сети на какое-то время.
Slacky1965 Автор
13.02.2025 00:06Это никак не вдияет на загруженность сети. Датчик, как слал каждую секунду, так и шлет. Координатор, как принимал эти пакеты, так и принимает ...
cahbeua
13.02.2025 00:06А кто может ткнуть носом в рабочий кейс по 433 протоколу? Честно говоря был малость шокирован что в НА этот вопрос упорно обходят стороной, при том что 12 из 10 лампочек на рынке идут со своей дистанционкой. Да, таки 3 из этих 12 работают по ИК, но остальные то 433. Гугл находит всего пару еспхом проектов с приёмником и передатчиком, но там такие глубокие гики что написанное не подлежит ни переводу ни пониманию что в итоге делать.
С учётом количества девайсов управляемых по 433 протоколу очень странно что его не пользуют в НА. Есть какой-то сонофф шлюз, но я так понял это единственная приблуда и снята с производства лет 100 назад. Хотя очень не хватает чего то простого - нажал кнопку на дистанционке, отсканировал эфир, сохранил кнопку с названием в НА...
destman
13.02.2025 00:06Вы имеете в виду устройства что управляются по радиоканалу? Оно не очень удобно в использовании. Zigbee сеть сейчас удобнее юзать тк те устройства что подключены к постоянному источнику питания могут работать как ретрансляторы. Поэтому некоторые датчики работают годами (например датчик открытия двери на батарейке cr2032 у меня работает уже года 3). Да и покрытие сети получается больше...
zloalder
13.02.2025 00:06У Broadlink есть "умные" пульты, которые поддерживают ИК и 433. А в HA для них есть штатная интеграция. Но у 433 основной минус, что нет обратной связи, поэтому лучше переходить на другие протоколы.
cahbeua
13.02.2025 00:06Цона немного кусается. ЕСП32 и приёмник передатчик в сборке - 5 баксов, а тут 50 с непонятным исходом.
sintech
13.02.2025 00:06Я так понял, что в какойто момент все аппаратные интеграции вынесли из HA в пользу ESPhome, чтобы упростить установку HA. Те если хотите работать с железом напрямую дрыгая ногами - берите esphome и интегрируйтесь с ним через mqtt.
DieSlogan
13.02.2025 00:06Кажется нет у них своего протокола, во всяком случае, флиппер такой протокол не знает. Можно лишь эмулировать те же команды (вкл/выкл). Для этого подойдёт Ардуино с 433 трансмитером.
DaemonGloom
13.02.2025 00:06Sonoff RFBridge вполне устроил бы вас. Но для прошивки всё равно придётся вскрывать и подключать uart.
Tsimur_S
13.02.2025 00:06А насколько точны подобные сенсоры или они показывают погоду на Марсе?
Когда была ковидная волна постов про делаем "Центр Контроля и Мониторинга Качества Воздуха" из ардуино и что под руку попало то там вроде говорили что их нужно калибровать эталонным воздухом на 400ppm CO2 либо там внутри была
неонкаколбочка с эталонным газом.Насколько с тех пор техника шагнула вперед?
DaemonGloom
13.02.2025 00:06Не шагнула, этот сенсор - VOC, показывает показания крайне примерно. И пытается посчитать CO2 по общему загрязнению воздуха.
Tsimur_S
13.02.2025 00:06Да? Я думал что это NDIR сенсор если верить доке https://www.winsen-sensor.com/d/files/mh-z19e-co2-sensor-manual-v1_0.pdf.
DaemonGloom
13.02.2025 00:06Да, но на фотографии в статье - какой-то другой датчик, кажется. И в комментариях к видео, на которое привёл ссылку автор, тоже пишут про отличающийся датчик.
И, что самое печальное, на али в этом же корпусе продаются датчики с максимально простыми сенсорами.
NutsUnderline
13.02.2025 00:06у меня тоже коробочка с датчиками включая co2 и поддержкой tuya в минимальном виде, но через bluetooth. по умолчанию она тоже шлет avertisment пакеты очень часто - порядка 10 раз в секунду, аккумулятор высаживается очень быстро
Kabytov
13.02.2025 00:06Фигню показывает этот датчик. 350-360 единиц, в то время как два других (хуавей и хонейвел) показывают 800-900, но в них нет zigbee.
Пишу как владелец данного чуда (но у меня еще показываются доп 2 параметра)
Slacky1965 Автор
13.02.2025 00:06Если Ваше чудо паказывает "еще два параметра", то это другой датчик. Именно этот показывает более менее адекватно. И он умеет только один параметр - CO2.
Провал в середине, это я ушел гулять с собаками и открыл все форточки.
Mitya78
А к икеевскому хабу его можно подключить?
Slacky1965 Автор
Не знаю. Если умеет CO2 стандартный, то будет. Если не умеет, не будет. в УДЯ не работает.
Mitya78
ZigBee это вообще стандартный протокол или просто общее название, а каждый лепит своё несовместимое?
Slacky1965 Автор
Стандарт. Но есть один нюанс :))
Допустим, Ikea не делала никакого датчика CO2. Зачем им в свой Хаб добавлять поддержку этого кластера, если они такие датчики не производят. Это просто размышления, для понимания ...
AlekseyPraskovin
Стандарт, на который все разработчики устройств осознанно и целенаправленно кладут член
Slacky1965 Автор
Ну формально даже Tuya стандарт не нарушает. Зарегистрировали свой кластер. А что внутри гонять по нему, это уже дело пятое ...
AlekseyPraskovin
А это вопросы к стандарту, если он такое допускает)
withkittens
Для этого есть Z-Wave :) Но девайсы, конечно, дороже, чем ZigBee, иногда значительно.