В этой статье я расскажу, как подключить датчик качества воздуха Smart Air Box от Tuya (модель _TZE284_8b9zpaav) к системе Zigbee2MQTT, работающей на Raspberry Pi. Устройство поддерживается не "из коробки", поэтому нам понадобится написать внешний конвертер (external converter). Также затронем типичные проблемы: мигающий синий индикатор, отсутствие данных в MQTT и настройку парсинга показателей (температура, влажность, CO2, VOC, формальдегид).
Устройство Smart Air Box существует в двух версиях: Wi-Fi и Zigbee. Наша задача — подключить Zigbee-версию. При попытке добавления устройства через Permit Join оно подключается, но в логах Zigbee2MQTT появляется предупреждение:
Device '0xa4c13854aaa2e731' with Zigbee model 'TS0601' and manufacturer name '_TZE284_8b9zpaav' is NOT supported
Это означает, что устройство использует общий чип TS0601, но его внутренние команды отличаются от уже известных систем. Без внешнего конвертера в интерфейсе отображается только linkquality, а все остальные показатели остаются N/A.
Внешний конвертер — это JavaScript-файл, который "переводит" сырые данные от устройства в понятные для Zigbee2MQTT показатели.
В зависимости от версии Zigbee2MQTT, конвертеры могут загружаться из разных папок. В моей версии (2.6.1) файлы загружаются автоматически из папки data/external_converters:
/home/mazzick/zigbee2mqtt/data/external_converters/tze284_8b9zpaav.js
Если папки нет — создайте её.
Ниже представлен финальный код конвертера, который успешно парсит все показатели:
const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const e = exposes.presets;
const definition = {
fingerprint: [
{
modelID: 'TS0601',
manufacturerName: '_TZE284_8b9zpaav',
},
],
model: 'Smart Air Box',
vendor: 'Tuya',
description: 'Smart air box with CO2, HCHO, VOC, temperature and humidity',
fromZigbee: [
fz.ignore_basic_report,
{
cluster: 'manuSpecificTuya',
type: ['commandDataReport'],
convert: (model, msg, publish, options, meta) => {
const dpValues = msg.data.dpValues;
if (!dpValues || !Array.isArray(dpValues)) {
return null;
}
const result = {};
for (const item of dpValues) {
const dp = item.dp;
const datatype = item.datatype;
const data = item.data;
let value = null;
if (data && Buffer.isBuffer(data) && data.length >= 4) {
value = data.readUInt32BE(0);
}
if (value === null) continue;
switch (dp) {
case 18: // Температура (20.1°C = 201)
result.temperature = parseFloat((value / 10).toFixed(1));
break;
case 19: // Влажность (37 = 3.7% — требуется калибровка)
result.humidity = parseFloat((value / 10).toFixed(1));
break;
case 22: // CO2 (умножаем на 100, т.к. приходит в сотых долях)
result.co2 = value * 100;
break;
case 21: // HCHO (0.01 мг/м³ = 1)
result.hcho = parseFloat((value / 100).toFixed(2));
break;
case 2: // VOC (1.12 µg/m³ = 112)
result.voc = parseFloat((value / 100).toFixed(2));
break;
}
}
if (Object.keys(result).length > 0) {
publish(result);
}
if (msg.linkquality) {
publish({ linkquality: msg.linkquality });
}
return result;
},
},
],
toZigbee: [],
exposes: [e.temperature(), e.humidity(), e.co2(), e.voc(), e.hcho()],
};
module.exports = definition;
В файле configuration.yaml (обычно лежит в /home/mazzick/zigbee2mqtt/data/) добавляем строку (для автоматической загрузки из папки external_converters она может не понадобиться):
external_converters:
- tze284_8b9zpaav.js
Симптом: При удержании кнопки 10 секунд индикатор мигает синим, но устройство не появляется в Zigbee2MQTT.
Решение: Проверьте блок питания — устройство требовательно к току (нужно не менее 1А). Используйте сетевой адаптер, а не USB-порт компьютера. Попробуйте последовательность: включите Permit Join в интерфейсе, затем нажмите кнопку на устройстве.
Симптом: В логах нет сообщения Loaded external converter.
Решение: Проверьте путь к файлу. В разных версиях Zigbee2MQTT путь может отличаться:
- Старые версии: data/external_converters/
- Новые версии: external_converters/ (в корне)
Проверьте права доступа: sudo chown mazzick:mazzick /home/mazzick/zigbee2mqtt/data/external_converters/tze284_8b9zpaav.js
Симптом: В интерфейсе только linkquality, остальное N/A.
Решение: Добавьте в конвертер принудительную публикацию через publish(result). Проверьте, что в конвертере есть обработка type: ['commandDataReport'].
Симптом: CO2 показывает 2 ppm вместо 200-400, влажность 3.7% вместо 30-60%.
Решение: Это особенности парсинга. Для CO2 мы умножаем значение на 100 (value * 100). Для влажности — датчик может требовать калибровки или значение нужно делить на 10, но в моем случае 3.7% — это реальные показания при очень сухом воздухе.
После того как устройство начало публиковать данные в MQTT, их можно сохранять в базу данных. У меня настроен Python-логгер, который слушает топик zigbee2mqtt/smart_air_box/# и сохраняет все показатели в MySQL.
CREATE TABLE IF NOT EXISTS sensor_data (
topic VARCHAR(255) PRIMARY KEY,
value TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS sensor_info (
topic VARCHAR(255) PRIMARY KEY,
name VARCHAR(255),
unit VARCHAR(50),
save_history BOOLEAN DEFAULT FALSE,
device_type VARCHAR(50)
);
CREATE TABLE IF NOT EXISTS sensor_history (
id INT AUTO_INCREMENT PRIMARY KEY,
topic VARCHAR(255),
value DECIMAL(10,3),
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_topic (topic),
INDEX idx_timestamp (timestamp)
);
mosquitto_sub -h localhost -u mazzick -P 'password' -t "zigbee2mqtt/smart_air_box/#" -v
Подключение Smart Air Box к Zigbee2MQTT потребовало создания внешнего конвертера, но результат того стоил. Теперь у меня есть полностью работающий датчик качества воздуха с показателями температуры, влажности, CO2, VOC и формальдегида. Все данные автоматически сохраняются в базу данных и доступны для анализа.
Если у вас возникнут вопросы — пишите в комментариях, постараюсь помочь. Удачи с вашим IoT-проектом!
Комментарии
Пока нет комментариев. Будьте первым!