Moes BHT-002 Zigbee Термостат

Zigbee-термостат Moes BHT-002: особенности работы, совместимость и практический опыт эксплуатации в проектах умного дома.

Moes BHT-002 Zigbee Термостат

Введение

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 позволяет добиться корректного отключения:

  1. Включить heat: {"system_mode":"heat"}
  2. Снизить setpoint до минимума: {"current_heating_setpoint":5}
  3. Перевести в 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.