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

Недорогой, но достаточно качественный датчик CO2 на Али.
Недорогой, но достаточно качественный датчик CO2 на Али.

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

Лог z2m.
Лог z2m.

Хороший обзор этого датчика есть на канале "У Павла".

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

И вот датчик у меня. Подключаем к Хабу Tuya и смотрим, что он умеет. А умеет он только показывать уровень CO2 в PPM.

Само приложение может построить график. А также можно настроить нотификацию на мобильный телефон (но это платно). Все.

Ок. Разбираем корпус, смотрим что внутри. А внутри все тот же модуль Zigbee от Tuya - ZT3L.

Плата датчика сверху.
Плата датчика сверху.

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

Плата с удаленным модулем ZT3L.
Плата с удаленным модулем ZT3L.

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

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

Передача 1033 ppm.
Передача 1033 ppm.

Смотрим внимательно плату и обращаем внимание на ранее проигнорированную микросхему. И понимаем, что это еще один микроконтроллер и 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 минут.

Спасибо Павлу за предоставленный датчик :-)

Проект датчика на github'е

Проект термостата и статья на Хабре

Комментарии (40)


  1. Mitya78
    13.02.2025 00:06

    А к икеевскому хабу его можно подключить?


    1. Slacky1965 Автор
      13.02.2025 00:06

      Не знаю. Если умеет CO2 стандартный, то будет. Если не умеет, не будет. в УДЯ не работает.


      1. Mitya78
        13.02.2025 00:06

        ZigBee это вообще стандартный протокол или просто общее название, а каждый лепит своё несовместимое?


        1. Slacky1965 Автор
          13.02.2025 00:06

          Стандарт. Но есть один нюанс :))

          Допустим, Ikea не делала никакого датчика CO2. Зачем им в свой Хаб добавлять поддержку этого кластера, если они такие датчики не производят. Это просто размышления, для понимания ...


        1. AlekseyPraskovin
          13.02.2025 00:06

          Стандарт, на который все разработчики устройств осознанно и целенаправленно кладут член


          1. Slacky1965 Автор
            13.02.2025 00:06

            Ну формально даже Tuya стандарт не нарушает. Зарегистрировали свой кластер. А что внутри гонять по нему, это уже дело пятое ...


            1. AlekseyPraskovin
              13.02.2025 00:06

              А это вопросы к стандарту, если он такое допускает)


              1. withkittens
                13.02.2025 00:06

                Для этого есть Z-Wave :) Но девайсы, конечно, дороже, чем ZigBee, иногда значительно.


  1. BURJUY
    13.02.2025 00:06

    А вы не могли бы сбросить готовую прошивку OTA?

    Несколько раз перечитал пост, но некоторые моменты не ясны... Где что дефайнить и как заставить его меньше спамить....


    1. Slacky1965 Автор
      13.02.2025 00:06

      В конце статьи есть ссылка проекта на github'е. В каталоге bin все лежит.


      1. BURJUY
        13.02.2025 00:06

        Спасибо, за проект. и за ссылку на Github там более подробная инструкция!


        1. GrustniyNos
          13.02.2025 00:06

          вот тут взять все можно же https://github.com/slacky1965/tuya_co2sensor_zrd
          прошивки по очереди вероятно надо прописывать - прошились на одну, потом прописали другую


  1. Anonym
    13.02.2025 00:06

    А без перепрошивки в z2m что ли не получить данные из него было?


    1. BURJUY
      13.02.2025 00:06

      Получать можно но мой каждые 10 сек шлет данные.

      Я бы хотел снизить частоту. Но пока завис на шаге подключения конверторов внешних.

      Их Z2m тупо не видит...


      1. destman
        13.02.2025 00:06

        В новой версии z2m (2.0+) их достаточно положить в папку external_converters.


        1. HenryPootle
          13.02.2025 00:06

          А если после обновления этой папки нет? Я пробовал создать руками, но что-то не взлетело, пока глубже времени не было лезть.


          1. destman
            13.02.2025 00:06

            ее руками и надо создавать. в том месте где у вас z2m лежит. рядом с его конфигом. по умолчанию оно лежит в папке /homeassistant/zigbee2mqtt. Ставьте аддон File editor. Я таким макаром перешивал термостаты. Стали работать стабильно и не спамят в сеть ...


      1. vanyas
        13.02.2025 00:06

        А чем плохо, что шлет каждые 10сек? HA от этого страдать не должен.


        1. destman
          13.02.2025 00:06

          у меня раз в секунду шлет. причем значения почти не меняются. логичнее слать если сильно поменялось значение. для сети из 10 устройств может и не критично. у меня сейчас около 50 умных устройств. разбил их на 2 категории - те что спамят подключил к sls. он неплохо переваривает такой спам. в z2m сеть с 2-мя спамящими термостатами периодически падала...


          1. AgentFire
            13.02.2025 00:06

            у НА для таких датчиков есть программные сенсоры, которые и частоту снизят, и меняться будут при дельтах, и даже "скачки" проигнорируют/сгладят. Мой такой же датчик периодически "багует" на +300 ppm.


            1. destman
              13.02.2025 00:06

              это по сути фильтры. они ничего не смогу сделать с нагрузкой на zigbee сеть.


      1. Anonym
        13.02.2025 00:06

        На стороне z2m можно отфильтровать частоту репортинга


        1. BURJUY
          13.02.2025 00:06

          каким образом? не могли бы подробно рассказать?


        1. destman
          13.02.2025 00:06

          Смысла в фильтре особого нет. Новая логика в записывлке все равно проредит старые данные. Тут проблема в том что передача этих данных не имеет смысл и излишне нагружает сеть. для маленьких сетей не очень страшно. а если устройств больше 10 то могут начаться проблемы в виде задержек в отсылке команд. а то и вообще падении zigbee сети на какое-то время.


        1. Slacky1965 Автор
          13.02.2025 00:06

          Это никак не вдияет на загруженность сети. Датчик, как слал каждую секунду, так и шлет. Координатор, как принимал эти пакеты, так и принимает ...


  1. cahbeua
    13.02.2025 00:06

    А кто может ткнуть носом в рабочий кейс по 433 протоколу? Честно говоря был малость шокирован что в НА этот вопрос упорно обходят стороной, при том что 12 из 10 лампочек на рынке идут со своей дистанционкой. Да, таки 3 из этих 12 работают по ИК, но остальные то 433. Гугл находит всего пару еспхом проектов с приёмником и передатчиком, но там такие глубокие гики что написанное не подлежит ни переводу ни пониманию что в итоге делать.

    С учётом количества девайсов управляемых по 433 протоколу очень странно что его не пользуют в НА. Есть какой-то сонофф шлюз, но я так понял это единственная приблуда и снята с производства лет 100 назад. Хотя очень не хватает чего то простого - нажал кнопку на дистанционке, отсканировал эфир, сохранил кнопку с названием в НА...


    1. destman
      13.02.2025 00:06

      Вы имеете в виду устройства что управляются по радиоканалу? Оно не очень удобно в использовании. Zigbee сеть сейчас удобнее юзать тк те устройства что подключены к постоянному источнику питания могут работать как ретрансляторы. Поэтому некоторые датчики работают годами (например датчик открытия двери на батарейке cr2032 у меня работает уже года 3). Да и покрытие сети получается больше...


    1. zloalder
      13.02.2025 00:06

      У Broadlink есть "умные" пульты, которые поддерживают ИК и 433. А в HA для них есть штатная интеграция. Но у 433 основной минус, что нет обратной связи, поэтому лучше переходить на другие протоколы.


      1. cahbeua
        13.02.2025 00:06

        Цона немного кусается. ЕСП32 и приёмник передатчик в сборке - 5 баксов, а тут 50 с непонятным исходом.


    1. sintech
      13.02.2025 00:06

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


    1. vantage
      13.02.2025 00:06

      Broadlink поддерживается в HA https://broadlink.ru/broadlink-rm4-pro


    1. DieSlogan
      13.02.2025 00:06

      Кажется нет у них своего протокола, во всяком случае, флиппер такой протокол не знает. Можно лишь эмулировать те же команды (вкл/выкл). Для этого подойдёт Ардуино с 433 трансмитером.


    1. DaemonGloom
      13.02.2025 00:06

      Sonoff RFBridge вполне устроил бы вас. Но для прошивки всё равно придётся вскрывать и подключать uart.


  1. Tsimur_S
    13.02.2025 00:06

    А насколько точны подобные сенсоры или они показывают погоду на Марсе?

    Когда была ковидная волна постов про делаем "Центр Контроля и Мониторинга Качества Воздуха" из ардуино и что под руку попало то там вроде говорили что их нужно калибровать эталонным воздухом на 400ppm CO2 либо там внутри была неонка колбочка с эталонным газом.

    Насколько с тех пор техника шагнула вперед?


    1. DaemonGloom
      13.02.2025 00:06

      Не шагнула, этот сенсор - VOC, показывает показания крайне примерно. И пытается посчитать CO2 по общему загрязнению воздуха.


      1. Tsimur_S
        13.02.2025 00:06

        Да? Я думал что это NDIR сенсор если верить доке https://www.winsen-sensor.com/d/files/mh-z19e-co2-sensor-manual-v1_0.pdf.


        1. DaemonGloom
          13.02.2025 00:06

          Да, но на фотографии в статье - какой-то другой датчик, кажется. И в комментариях к видео, на которое привёл ссылку автор, тоже пишут про отличающийся датчик.

          И, что самое печальное, на али в этом же корпусе продаются датчики с максимально простыми сенсорами.


  1. NutsUnderline
    13.02.2025 00:06

    у меня тоже коробочка с датчиками включая co2 и поддержкой tuya в минимальном виде, но через bluetooth. по умолчанию она тоже шлет avertisment пакеты очень часто - порядка 10 раз в секунду, аккумулятор высаживается очень быстро


  1. Kabytov
    13.02.2025 00:06

    Фигню показывает этот датчик. 350-360 единиц, в то время как два других (хуавей и хонейвел) показывают 800-900, но в них нет zigbee.

    Пишу как владелец данного чуда (но у меня еще показываются доп 2 параметра)


    1. Slacky1965 Автор
      13.02.2025 00:06

      Если Ваше чудо паказывает "еще два параметра", то это другой датчик. Именно этот показывает более менее адекватно. И он умеет только один параметр - CO2.

      Провал в середине, это я ушел гулять с собаками и открыл все форточки.