Перепрошивка терморегулятора теплого пола Moes и заведение в Home Assistant

Некоторое время назад я установил себе терморегулятор теплого пола Moes BHT-002-GBLW, подключил его в приложении TuyaSmart и завел в Home Assistant через интеграцию Tuya. Подробный рассказ о том как все это было.

Через приложение TuyaSmart все нормально работает. Видно температуру в помещении (используется датчик который находится в самом терморегуляторе), видно температуру теплого пола (для этого используется щуп, который вмонтирован в пол). В приложении можно установить желаемую температуру и включить-выключить терморегулятор:

Но интеграция в Home Assistant работает отвратительно:

Код интеграции Tuya в Home Assistant открыт, лежит на GitHub. Вообще, в теории, этот код можно взять и исправить.

Но я считаю что интеграция Tuya работает концептуально неправильно. Tuya работает через внешние сервера. Если дома не будет интернета, то не получится управлять этим терморегулятором ни из приложения, ни из Home Assistant.

Но этот терморегулятор можно перепрошить и настроить чтобы он работал без взаимодействия с серверами Tuya. Еще до покупки я знал что его можно перепрошить, собственно говоря, поэтому я и купил именно эту модель.

Другая прошивка

В мире Home Assistant очень популярны прошивки ESPHome и Tasmota. Возможно что можно использовать эти прошивки на терморегуляторе Moes (но про это я ничего не знаю). Я использовал прошивку про которую точно знал что с ней все получится. Эта прошивка сделана специально для этого устройства.

Вот репозиторий с кодом: https://github.com/klausahrenberg/WThermostatBeca

Из всего этого репозитория нужен один единственный файл. "WThermostat_1.00.bin" — это уже собранная прошивка. Этот файл нужно залить на устройство и тогда термостат будет работать не с удаленными серверами Tuya, а с вашим собственным сервером MQTT.

Термостат будет отправлять данные на ваш MQTT сервер. Home Assistant тоже подключен к этому MQTT серверу и узнает о том что термостат туда отправил. Для того чтобы поменять температуру на терморегуляторе HA отправляет данные на MQTT сервер, терморегулятор видит эти данные и делает то что там описано.

Итак, файл с прошивкой есть, нужно его залить на устройство.

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

Так вполне можно сделать. Вот подробности о том как это делается.

Но в случае этого терморегулятора можно залить прошивку и без необходимости разбирать устройство и подпаиваться к контактам. Существует специальная программа, которая позволяет залить прошивку на устройство по воздуху через WiFi.

Итого, есть два способа как можно перепрошить это устройство. Если вы хорошо владеете паяльником, то вам проще будет разобрать устройство и подпаяться, а если вы знаете как работать с софтом лучше чем то как работать с паяльником, то вам стоит прошивать устройство по воздуху.

Я гораздо лучше разбираюсь в софте, чем в том как паять, поэтому я пошел по пути беспроводной прошивки.

Заливка прошивки по воздуху

Существует специальный проект https://github.com/ct-Open-Source/tuya-convert с помощью которого можно заливать кастомные прошивки на разные устройства, которые умеют взаимодействовать с Tuya.

С помощью этого проекта можно залить файл с прошивкой на терморегулятор Moes BHT-002-GBLW.

Как работает этот проект. Софт этого проекта запускается на компьютере, он переводит WiFi карту в режим точки доступа. Tuya устройство переводится в режим настройки. Устройство видит точку доступа, подключается к ней и софт говорит что устройство должно залить на себя указанную прошивку. Устройство выполняет эту команду и после выключения-включения на устройстве работает уже новая прошивка.

Этот софт работает на linux. Самый простой способ запустить этот софт, если у вас есть отдельный компьютер, ноутбук или raspberry pi с linux на борту. Но можно запустить этот софт и с помощью VirtualBox на mac или на Windows.

Я запускал этот софт на моем старом ноутбуке на который я специально для этой задачи поставил свежую Ubuntu 18.04. Но оказалось что этот софт очень требователен к WiFi карте. Встроенная в ноутбук карточка ему не подошла (по какой-то причине не смог создать из нее точку доступа). Поэтому я подключил к своему старому ноутбуку usb WiFi карту от Raspberry Pi, которая у меня, к счастью, была.

В самом начале, я еще попробовал запустить этот софт на моем основном ноутбуке. Это macbook. В репозитории с проектом я увидел что там есть Dockerfile и я попробовал скомпилировать и запустить этот софт на своем маке. Образ собирается и из него можно запустить контейнер, но он сразу же ругается на то что не нашел подходящую WiFi карточку и завершает работу:

bessarabov@bessarabov-osx:~/tuya-convert/1$ docker-compose exec tuya start
tuya-convert v2.4.3
======================================================
TUYA-CONVERT

https://github.com/ct-Open-Source/tuya-convert
TUYA-CONVERT was developed by Michael Steigerwald from the IT security company VTRUST (https://www.vtrust.de/) in collaboration with the techjournalists Merlin Schumacher, Pina Merkert, Andrijan Moecker and Jan Mahn at c't Magazine. (https://www.ct.de/)


======================================================
PLEASE READ THIS CAREFULLY!
======================================================
TUYA-CONVERT creates a fake update server environment for ESP8266/85 based tuya devices. It enables you to backup your devices firmware and upload an alternative one (e.g. ESPEasy, Tasmota, Espurna) without the need to open the device and solder a serial connection (OTA, Over-the-air).
Please make sure that you understand the consequences of flashing an alternative firmware, since you might lose functionality!

Flashing an alternative firmware can cause unexpected device behavior and/or render the device unusable. Be aware that you do use this software at YOUR OWN RISK! Please acknowledge that VTRUST and c't Magazine (or Heise Medien GmbH & Co. KG) CAN NOT be held accountable for ANY DAMAGE or LOSS OF FUNCTIONALITY by typing yes + Enter

yes
nl80211 not found.
AP mode not supported!
Please attach a WiFi card that supports AP mode.
======================================================
Cleaning up...
No screen session found.
No screen session found.
No screen session found.
No screen session found.
Closing AP
Exiting...

Я не стал пытаться запустить этот софт на маке, а пошел по более простому пути — взял ноутбук с linux (благо у меня было такое устройство).

После того как есть устройство на котором можно запустить этот софт дальше все очень просто.

На устройстве собирается этот софт:

$ git clone https://github.com/ct-Open-Source/tuya-convert
$ cd tuya-convert
$ ./install_prereq.sh

Потом нужно взять файл "WThermostat_1.00.bin" из репозитория https://github.com/klausahrenberg/WThermostatBeca и положить его в папку "files/", к тем файлам которые там уже есть.

Потом нужно запустить этот софт:

$ ./start_flash.sh

Все, софт работает. После этого нужно сделать то о чем говорит софт:

  1. Подключаться к wifi сети с другого устройства (я подключал свой iPhone)
  2. И перевести терморегулятор в режим настройки

Для того чтобы терморугулятор перешел в режим настройки нужно:

Потом нужно отвечать на вопросы которые софт спрашивает. Один из последних вопросов, который задаст софт — какую прошивку нужно залить на устройство. Нужно выбрать "WThermostat_1.00.bin"

Прошивка устройства у меня заняла меньше пяти минут с момента запуска "./start_flash.sh".

(но на подготовительные этапы у меня ушло много часов (попробовать на маке в докере, не работает, найти старый ноутбук, там слишком старая ubuntu, поставить новую ubuntu, узнать что не работает со встроенной WiFi карточкой, найти usb WiFi карточку))

Настройка терморегулятора

Итак, новая прошивка залита на терморегулятор, теперь его нужно настроить.

После того как на него залита новая прошивка терморегулятор переходит в режим точки доступа. Нужно подключить к WiFi точке которая называется что-то вроде "Thermostat-Beca_xxxxxx". Пароль 12345678

После подключения к этой точке доступа можно зайти на этот терморегулятор браузером. Адрес http://192.168.4.1 Будет показано меню с кнопками:

Самое главное — это первый пункт. "Configure network". Нужно зайти туда и указать данные про WiFi сеть к которой должен приконектится термостат. Дальше я в логах роутера увидел какой ip адрес получил термостат и смог заходить на него по адресе http://192.168.31.40/config (после того как термостат подключен к сети меню с настройкой находится не на главной странице, а на /config)

Там же где настраивается подключение к WiFi указывается и все данные для подключения к MQTT серверу:

Возможно настроить управление этим терморегулятором и без MQTT сервера, но у меня такой сервер уже есть (для всяких zigbee устройств), так что мне было удобно использовать именно MQTT.

Вот какие данные приходят в MQTT от этого термостата:

Управление через MQTT следующее.

Если отправить пустое сообщение в топик "thermostatbeca_13610097/things/thermostat/properties", то терморегулятор в ответ пришлет свой текущий статус в этот же топик.

И есть две возможности для того чтобы управлять термостатом. Чтобы установить температуру можно либо заслать json вида:

{
  "targetTemperature" : 30
}

в топик "thermostatbeca_13610097/things/thermostat/properties", либо отправить число 30 в топик "thermostatbeca_13610097/things/thermostat/properties/targetTemperature". И то и другое установит температуру в 30 градусов. Также можно включать-выключать терморегулятор и устанавливать/снимать блокировку.

Настройка Home Assistant

Терморегулятор подключен к сети WiFi, он общается с MQTT сервером, им можно управлять с помощью отправки команд в этот MQTT сервер. Но руками команды в MQTT сервер отправлять не очень удобно. Хочется настроить Home Assistant, чтобы все управление терморегулятором было из HA.

На GitHub есть большое обсуждение как правильно заводить этот термостат в HA. Я внимательно перечитал весь этот тред, потом достаточно долго провозился, но сделал конфиг чтобы терморегулятор работал с HA именно так как бы мне хотелось. В итоге очень доволен. Вот что у меня получилось:

climate:
  - platform: mqtt
    name: Tech Thermostat

    # То что можно выбрать в интерфейсе, минимальная и максимальная температура и шаг изменения
    min_temp: 1
    max_temp: 35
    temp_step: 0.5

    # То каким образом определяется текущий статус устройства
    mode_state_topic: "thermostatbeca_13610097/things/thermostat/properties"
    mode_state_template: >
      {% if value_json.deviceOn == true %}
      heat
      {% else %}
      off
      {% endif %}
    modes:
      - "off"
      - "heat"

    # То как определяется какая сейчас температура
    current_temperature_topic: "thermostatbeca_13610097/things/thermostat/properties"
    current_temperature_template: "{{ value_json.temperature }}"

    # То как определяется какая установлена желаемая температура
    temperature_state_topic: "thermostatbeca_13610097/things/thermostat/properties"
    temperature_state_template: "{{ value_json.targetTemperature }}"

    # То куда отправляются данные когда в интерфейсе меняется температура
    temperature_command_topic: "thermostatbeca_13610097/things/thermostat/properties/targetTemperature"

    # То как происходит включение-выключение устройства
    power_command_topic: "thermostatbeca_13610097/things/thermostat/properties/deviceOn"
    payload_on: "true"
    payload_off: "false"

sensor:
  - platform: mqtt
    name: "tech_thermostat_floor_temperature"
    state_topic: "thermostatbeca_13610097/things/thermostat/properties"
    unit_of_measurement: '°C'
    value_template: "{{ value_json.floorTemperature | float }}"

switch:
  - platform: mqtt
    name: tech_thermostat_locked
    icon: mdi:lock
    state_topic: "thermostatbeca_13610097/things/thermostat/properties"
    value_template: '{{ value_json.locked }}'
    state_on: True
    state_off: False
    command_topic: "thermostatbeca_13610097/things/thermostat/properties/locked"
    payload_on: 'true'
    payload_off: 'false'

Термостат работает так как я ожидаю. Через интерфейс HA его можно выключить, а потом включить. Можно установить температура. Это все делается через привычный контрол термостата.

Еще через интерфейс HA его можно заблокировать и разблокировать. Честно говоря, я совершенно не планирую управлять им с помощью нажатия на сенсорный экран на самом устройстве. Скорее всего я всегда буду держать его в заблокированном состоянии и уберу из интерфейса контрол блокировки/разблокировки. Но на первом этапе я решил его оставить (на всякий случай).

Плюс я отдельно создал сенсор в который пишу температуру теплого пола. Я не очень понимаю зачем мне она нужна. Терморегулятор поддерживает температуру опираясь на данные не с щупа, а из встроенного датчика (кстати, я не знаю как это изменить, в mqtt я такого не видел, возможно это нужно настроить на устройстве физически). Но для интереса я решил ее тоже завести в HA.

Для меня было удивительно, но встроенный датчик температуры вполне прилично измеряет. Вот график. Зеленая линия это данные со встроенного датчика. Красная линия — это температура с устройства на базе Wemos D1 Mini и AM2302 которое я сам спаял, которое находится в этой же комнате.

Что могло бы быть лучше

Я очень доволен тем что получилось. Во первых, меня очень радует цена устройства: 1800 рублей вместе с доставкой. Ссылка на AliExpress.

Немного возни и есть возможность управлять теплым полом из HA.

Но все могло бы быть еще лучше. Есть несколько проблем.

Первая проблема — это то часть устройства которая управляется по WiFi физически не знает, греет ли в данный момент теплый пол или нет. Поэтому информации об этом в HA нет. Есть возможность разобрать устройство и что-то там подпаять, тогда устройство узнает про статус реле и сможет отдавать эту информацию в HA. Я это не делал. Я планирую подключить этот терморегулятор через устройство Sonoff pow r2, им замерять потребление электричества и на основании этого понимать греет ли сейчас теплый пол или не греет.

Вторая проблема. Прошивка не отдает флаг retain в MQTT, поэтому после того как HA перезапускается несколько минут он не знает статус терморегулятора. Из-за этого на графике температур появляются провалы в тот момент когда HA перезагружался. Я написал про этот тикет, но не знаю исправят ли это или нет. Существует альтернативная прошивка, которая передает ratain флаг, но там столько всего друго еще накручено, что я не решился ее использовать. UPDATE — тикет решен, 2020-04-03 вышла версия прошивки "WThermostat_1.02.bin", которая всегда отправляет данные с retain флагом.

Третья проблема. Если пропадает электричество, то терморегулятор забывает те настройки которые в него HA отправлял. Это можно вылечить автоматизацией HA, но пока я это не сделал.

Итого. Я доволен тем что получилось. Настраивал долго, но в итоге практически все работает так как мне бы хотелось.

Иван Бессарабов
ivan@bessarabov.ru

26 марта 2020

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha