Предыдущий проект о перепрограммировании заводского термостата вызвал достаточно большой интерес у сообщества (ссылка будет в конце статьи). И вот поступило предложение проверить, можно ли таким же образом избавиться от спама на датчике 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 минут.

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