Moes BHT-002 Zigbee Термостат
Zigbee-термостат Moes BHT-002: особенности работы, совместимость и практический опыт эксплуатации в проектах умного дома.
Введение
Moes BHT-002 — это Zigbee-термостат для управления отоплением и тёплым полом, широко используемый в проектах умного дома. Устройство подключается к серверу автоматизации по Zigbee (через Zigbee2MQTT или ZHA) и позволяет поддерживать заданную температуру в помещении, а также интегрироваться в сценарии Home Assistant.
Важно учитывать, что подобные термостаты нередко продаются под разными коммерческими названиями и артикулами. Например, их можно встретить под маркировкой ME-81H.31 Zigbee и другими OEM-обозначениями. В зависимости от исполнения, такие устройства применяются для:
- электрического тёплого пола
- водяного тёплого пола
- управления котлом отопления
- управления сервоприводами коллекторов
- других задач климатического контроля
При подключении через Zigbee2MQTT эти устройства идентифицируются не по коммерческому названию, а по Zigbee-модели, например:
- Zigbee Model TS0601 _TZE284_ye5jkfsb (Moes BHT series Thermostat)
- Zigbee Model TS0601 _TZE200_ye5jkfsb (Moes BHT series Thermostat)
Несмотря на различия в идентификаторах производителя (_TZE200_…, _TZE284_…), с точки зрения логики работы и поведения в Home Assistant это один и тот же класс устройств — термостаты серии Moes BHT.
В повседневной эксплуатации термостат Moes BHT-002 стабильно работает в типовых сценариях управления климатом, быстро реагирует на изменения температуры и корректно передаёт данные в систему умного дома. Устройство поддерживает базовые режимы работы и не требует сложной конфигурации, что делает его удобным для внедрения как в небольших инсталляциях, так и в более сложных системах автоматизации.
Ниже описаны особенности поведения термостата, которые важно учитывать при интеграции с Home Assistant и Zigbee2MQTT.
Особенность выключения
В некоторых инсталляциях у этого термостата наблюдается нюанс, связанный с обработкой команды выключения. При выключении термостата из Home Assistant в момент активного нагрева может возникнуть ситуация, когда климат-устройство отображается как «Выключено», но при этом визуально продолжает вести себя как находящееся в режиме нагрева.

Термостат публикует в Zigbee2MQTT состояние примерно в таком виде:
{
"current_heating_setpoint": 20,
"heat": "ON",
"last_seen": 1763106652243,
"linkquality": 127,
"local_temperature": 16,
"local_temperature_calibration": -2,
"max_temperature": 40,
"min_temperature_limit": 5,
"preset": "hold",
"preset_mode": "hold",
"running_state": "heat",
"sensor": "IN",
"system_mode": "off",
"child_lock": null,
"deadzone_temperature": null,
"max_temperature_limit": null,
"program": null
}
С технической точки зрения если выключать термостат из Home Assistant, переводя system_mode в off, устройство не обновляет поле running_state, и оно остаётся в значении heat, не переходя в idle. В результате климат-сущность может находиться в состоянии «Выключено», но визуально отображаться как находящаяся в режиме активного нагрева. В интерфейсе Home Assistant индикация нагрева определяется атрибутом hvac_action, значение которого можно посмотреть в панели разработчика. При использовании Zigbee2MQTT атрибут hvac_action не приходит от устройства напрямую, а вычисляется Home Assistant на основании данных, полученных через MQTT, при этом для термостатов серии Moes BHT ключевым параметром является поле running_state. Если running_state остаётся равным heat, Home Assistant интерпретирует это как активный нагрев и устанавливает hvac_action = heating, даже при выключенном system_mode.
Обходное решение через автоматизацию
Отправка команд напрямую через Zigbee2MQTT позволяет добиться корректного отключения:
- Включить heat:
{"system_mode":"heat"} - Снизить setpoint до минимума:
{"current_heating_setpoint":5} - Перевести в off:
{"system_mode":"off"}
После этой последовательности running_state переходит из heat в idle, как и должно происходить при выключении устройства.
Однако реализовать такое обходное решение в автоматизации Home Assistant (на событие выключения climate-entity) достаточно сложно: пользователю будут заметны излишние переключения управляющих элементов климата и изменение температуры (например, до 5 °C), что выглядит неочевидно и может вызвать вопросы.
Сокрытие визуальной индикации нагрева в интерфейсе
В некоторых проектах более практичным решением является не исправление логики работы устройства, а изменение визуального отображения в интерфейсе Home Assistant. Цель такого подхода — скрыть индикацию активного нагрева, которая не соответствует фактическому режиму работы термостата.
При использовании кастомных карточек, например lovelace-mushroom, можно скрыть иконку состояния нагрева (running_state), оставив только базовую информацию о климате. Это позволяет избежать лишних вопросов со стороны пользователей и сделать интерфейс более предсказуемым в повседневной эксплуатации.
Ниже приведён пример карточки mushroom-climate-card с использованием стилей, скрывающих иконку нагрева:
- type: custom:mushroom-climate-card
entity: climate.gostinaia_termostat
name: Гостиная
show_temperature_control: true
show_hvac_modes: false
collapsible_controls: false
primary_info: name
secondary_info: state
card_mod:
style: |
ha-card {
background: none !important;
box-shadow: none !important;
border: none !important;
}
mushroom-badge-icon {
display: none !important;
}
Для использования lovelace-mushroom необходимо поставить mushroom дополнение через HACS, для использования lovelace-card-mod необходимо поставить card-mod через HACS.
Исправление логики через кастомный Zigbee-конвертер
Также существует возможность внести корректировки на уровне Zigbee2MQTT с использованием кастомного Zigbee-конвертера. В этом случае изменяется не интерфейс Home Assistant и не сценарии автоматизации, а сама логика обработки входящих сообщений от устройства.
Суть решения заключается в том, что при обработке данных от термостата поле running_state принудительно синхронизируется с текущим режимом работы (system_mode) и температурными параметрами. При переводе устройства в режим off состояние нагрева устанавливается в idle, а при режиме heat оно определяется на основании сравнения текущей температуры и заданной уставки.
Такой подход позволяет добиться наиболее корректного и предсказуемого поведения термостата во всех частях системы умного дома. При этом он требует понимания внутренней архитектуры Zigbee2MQTT, усложняет сопровождение конфигурации и может потребовать дополнительного внимания при обновлениях системы.
Ниже приведён пример реализации такого подхода. Для этого создаётся файл ts0601_running_state_patch.js, который необходимо разместить в каталоге external_converters, расположенном на одном уровне с конфигурационным файлом Zigbee2MQTT. Описанный способ актуален для версий Zigbee2MQTT 2.x и выше (например, 2.7.1-1).
Кастомный конвертер может выглядеть следующим образом:
// Small patch for Moes BHT-002 (TS0601, _TZE284_ye5jkfsb)
// Fix running_state/heat when system_mode = "off"/"heat"
const legacy = require('zigbee-herdsman-converters/lib/legacy');
// Safety guards
const fzLegacy = legacy && legacy.fromZigbee;
const moesConverter =
fzLegacy &&
fzLegacy.moes_thermostat &&
fzLegacy.moes_thermostat.convert;
if (!moesConverter) {
console.warn('[BHT-002 patch] legacy.fromZigbee.moes_thermostat not found – patch not applied');
} else {
console.log('[BHT-002 patch] Wrapping legacy.fromZigbee.moes_thermostat.convert');
fzLegacy.moes_thermostat.convert = (model, msg, publish, options, meta) => {
const res = moesConverter(model, msg, publish, options, meta) || {};
const manu = meta && meta.device && meta.device.manufacturerName;
// Apply patch to Moes BHT-002
if (manu === '_TZE284_ye5jkfsb' || manu === '_TZE200_ye5jkfsb') {
if (res.system_mode === 'off') {
res.running_state = 'idle';
} else if (res.system_mode === 'heat') {
const current = res.local_temperature ?? meta?.state?.local_temperature;
const setpoint = res.current_heating_setpoint ?? meta?.state?.current_heating_setpoint;
if (typeof current === 'number' && typeof setpoint === 'number') {
if (current < setpoint) {
res.running_state = 'heat';
} else {
res.running_state = 'idle';
}
}
}
}
return res;
};
}
// External converter должен что-то экспортировать
module.exports = [];
Особенность смены температуры
Ниже приведён пример установки температуры через climate.set_temperature, в котором вместе с температурой передаётся и параметр hvac_mode:
- service: climate.set_temperature
data:
hvac_mode: heat
temperature: "{{ states('input_number.temperature_comfort') }}"
target:
entity_id:
- climate.kitchen
При таком вызове Home Assistant отправляет две Zigbee‑команды почти одновременно: установку режима (system_mode = heat) и изменение температуры (current_heating_setpoint). Zigbee2MQTT передаёт их параллельно. В результате термостат сначала применяет режим heat и публикует своё текущее состояние, включая прежнее значение температуры (например, 12°C). Если команда изменения температуры уходит в момент — до того, как устройство ответило о смене режима — она может не быть применена, и температура остаётся прежней. В итоге Home Assistant принимает опубликованное устройством состояние и считает его актуальным. При одновременной отправке hvac_mode и температуры результат может быть непредсказуемым: установка температуры может примениться, а может быть проигнорирована — это зависит от микрозадержек прохождения пакетов от HomeAssistant до конечных устройств.
Для анализа последовательности обмена можно использовать логи Zigbee2MQTT, включив уровень debug и изучив файл в каталоге логов. Ниже приведён пример такого фрагмента:
[2025-11-25 12:29:33] debug: z2m:mqtt: Received MQTT message on 'zigbee2mqtt/Термостат/set/system_mode' with data 'heat'
[2025-11-25 12:29:33] debug: z2m: Publishing 'set' 'system_mode' to 'Термостат'
[2025-11-25 12:29:33] debug: zh:controller:endpoint: ZCL command ... dp":1,"datatype":1,"data":[1]
...
[2025-11-25 12:29:33] debug: z2m:mqtt: Received MQTT message on 'zigbee2mqtt/Термостат/set/current_heating_setpoint' with data '20.0'
[2025-11-25 12:29:33] debug: z2m: Publishing 'set' 'current_heating_setpoint' to 'Термостат'
[2025-11-25 12:29:33] debug: zh:controller:endpoint: ZCL command ... dp":16,"datatype":2,"data":[0,0,0,20]
...
[2025-11-25 12:29:33] info: z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Термостат', payload '{"current_heating_setpoint":12,"system_mode":"heat","running_state":"idle","heat":"OFF","local_temperature":15}'
Итог
В целом термостат работает стабильно, однако в некоторых инсталляциях важно учитывать несколько особенностей, связанных с обработкой команд выключения и отображением текущего состояния в системе умного дома.
Полезные ссылки
- Moes BHT-002 — документация Zigbee2MQTT с описанием поддерживаемых функций и параметров.
- Документация Zigbee2MQTT по использованию external converters — описание механизма подключения и использования кастомных Zigbee-конвертеров.
- Репозиторий lovelace-mushroom — набор современных UI-карточек для Home Assistant с гибкой настройкой отображения.
- Репозиторий lovelace-card-mod — инструмент для применения пользовательских CSS-стилей к карточкам Lovelace.