Home Assistant: Daikin FTXB-C и Tuya IR

15 февраля, 2021Изменена: 6 ноября, 2023 в 13:53

После состоявшегося знакомства с HA и беглого изучения его возможностей, у меня возникло серьезное желание перенести управление кондиционерами в эту систему. А обострилось это желание после того, как я уехал со всей семьей в отпуск, забыв выключить кондиционер в одной из комнат…

В наличии у меня имелось 3 кондиционера Daikin бюджетной серии FTXB-C. Никаких “умных” функций в них не предусмотрено, а поиск возможных хаков или модификаций на тот момент успеха не принес.
Штатно эти кондиционеры комплектуются вот таким пультом дистанционного управления:

Контроль работы

После случая с оставленным на 2 недели работающим кондиционером мне, прежде всего, захотелось иметь возможность определить – работает кондиционер или нет.
Решить эту проблему без серьезных денежных затрат получилось приклеив на шторки кондиционеров по самому обычному датчику-геркону Xiaomi (Door & Window Sensor, MCCGQ01LM). В выключенном состоянии кондиционер закрывает направляющую поток воздуха шторку, что в свою очередь приводит к срабатыванию датчика.
В живую это выглядит так:

Кому-то внешний вид может не понравится, но все остальные рассмотренные мной способы были либо сильно дороже, либо требовали гораздо более серьезных вмешательств в кондиционеры.
В итоге, между несколько сомнительным внешним видом и возможностью контроля я выбрал контроль.

! При размещении датчика, нужно подобрать такое положение, при котором он не будет срабатывать во время работы режима качания шторки.

После размещения датчиков можно уже настроить необходимые сенсоры и автоматизации в HA.
Например, создав отдельные бинарные сенсоры под кондиционеры с device_class: power для удобного отображения в интерфейсе в будущем:

- platform: template
  sensors:
    ac_nursery_status:
      device_class: power
      value_template: "{{ is_state('binary_sensor.0x158d00039cf974_contact', 'on') }}"
    ac_living_room_status:
      device_class: power
      value_template: "{{ is_state('binary_sensor.0x158d0003d54725_contact', 'on') }}"
    ac_bedroom_status:
      device_class: power
      value_template: "{{ is_state('binary_sensor.0x158d0004073b67_contact', 'on') }}"

И автоматизации. Например, с оповещением о слишком долгой работе:

- alias: AC - long running [24h]
  initial_state: true
  trigger:
    platform: state
    entity_id:
      - binary_sensor.0x158d00039cf974_contact
      - binary_sensor.0x158d0003d54725_contact
      - binary_sensor.0x158d0004073b67_contact
    from: 'off'
    to: 'on'
    for:
      hours: 24
  action:
    service: notify.telegram
    data_template:
      message: >
        Внимание, *{{ trigger.to_state.attributes.friendly_name }}* работает больше *24* часов.

– ~ –

Tuya Smart Home

Следующим шагом стала реализация более-менее полноценного управление кондиционером из HA. В отсутствии вариантов управления напрямую, я решил попытать счастья с IR хабами, позволяющими эмулировать практически любой пульт ДУ.
Поиск на Алиэкспрессе выдал огромное разнообразие подобных устройств, из которых я наугад выбрал один из самых дешевых. Из коробки он работает на платформе Tuya и является братом-близнецом Умного Пульта от Яндекса.
При одинаковой начинке, устройства попадаются в разных корпусах. В моем случае это вариации на тему летающих тарелок:

Первое (и довольно продолжительное) время для управления этими устройствами я использовал родное приложение Tuya (Smart Life), в целом оно работало, но с оговоркой на пару неприятных проблем.
Первое и основное – зависимость от интернета и китайских облаков. И с этим ничего не сделать.
Вторая проблема заключалась в том, что стандартная интеграция Tuya не умеет пробрасывать в HA ни сами эти устройства, ни виртуальные кондиционеры, которые можно там создать.
Обойти эту проблему можно создав в приложении по несколько сцен для каждого из кондиционеров.
Например, у меня были сцены с режимом “Охлаждение” и температурой 23 градуса, или “Обогрев” и 25 градусов и т.д.
Были и отдельные сцены для выключения кондиционеров.
Эти сцены, в свою очередь, успешно прилетают в HA и активируя их можно тем самым менять режим работы кондиционера. Но, только на заранее собранные пресеты настроек “режим – температура”, просто так изменить целевую температуру на пару градусов не получится.
В целом этот подход работал, позволяя мне в нужные моменты времени включать кондиционеры в заранее определенных режимах через HA.

– ~ –

ESPHome

Но мне хотелось большего, и как-то мне на глаза попалась крайне интересная статья, в которой был описан прямо мой случай – Daikin, Tuya IR Hub, Home Assistant и т.д.
Описанное там мне очень понравилось и я решил заказать себе еще один IR хаб для экспериментов по перепрошивке его в ESPHome. Как оказалось в дальнейшем, это было очень правильное решение. =)

Самым простым способом перепрошить устройство Tuya является использование tuya-convert, с его помощью можно сравнительно просто заменить прошивку прямо по воздуху, без вскрытия и паяльника.
Забегая вперед, этот инструмент с успехом перепрошил мои “старые” IR хабы. А вот с новым возникли проблемы…

Как оказалось, в последних версиях платформы Tuya были внесены изменения, которые делают невозможным использование tuya-convert для замены прошивки по воздуху. И чем новее устройство, тем выше шанс получить именно такое. Для любопытствующих, вся информация по этой проблеме собрана здесь.
К сожалению, мой новый хаб оказался как раз таким, поэтому пришлось его вскрывать.

После вскрытия видно что хаб построен на модуле TYWE3S, фактически это вариация на тему ESP8266.
В сети достаточно подробной информации о перепрошивке подобных устройств, например здесь, здесь или здесь.
Вкратце, все сводится к пайке проводов к чипу (или к диагностическим площадкам на плате), подключению к компьютеру с использованием USB – UART адаптера и прошивке ESPHome.

После того разобрались с вопросом как шить, можно начинать эксперименты по интеграции в HA.
Моя первая попытка была с таким конфигом ESPHome:

# Переменные для использования в конфиге
substitutions:
  board_name: smartir_04
  room_name: livingroom

esphome:
  name: ${board_name}
  platform: ESP8266
  board: esp01_1m

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "SmartIR_04"
    password: !secret wifi_fallback_ap_pass

captive_portal:

logger:

api:
  password: !secret esphome_api_password

ota:
  password: !secret esphome_api_password

time:
  - platform: homeassistant
    id: homeassistant_time

# Штатный светодиод статуса на GPIO4
status_led:
  pin: 
    number: GPIO4

# Приемник ИК-команд на GPIO5
remote_receiver:
  id: rcvr
  pin: 
    number: GPIO5
    inverted: True
  dump: all

# ИК-передатчик на GPIO14
remote_transmitter:
  pin:
    number: GPIO14
    inverted: false
  carrier_duty_percent: 50%

sensor:
  # Внешний датчик температуры из HA
  - platform: homeassistant
    name: "Current temperature"
    entity_id: sensor.for_esphome_temp_in_${room_name}
    id: ha_temp_${room_name}
    internal: true
    unit_of_measurement: °C
    accuracy_decimals: 1

  - platform: wifi_signal
    name: ${board_name}_wifi_rssi
    update_interval: 60s
    internal: false

binary_sensor:
  - platform: status
    name: ${board_name}_status
    internal: false

  # Кнопка на корпусе - GPIO13
  - platform: gpio
    pin:
      number: GPIO13
      inverted: true
    internal: true
    name: ${board_name}_button
    id: button

climate:
  - platform: daikin
    name: "Test AC"
    receiver_id: rcvr
    sensor: ha_temp_${room_name}

Самая интересная часть здесь – компонент IR Remote Climate, он позволяет создать в HA стандартную сущность Climate (кондиционеры, обогреватели и прочие климатические установки).
При этом есть возможность в качестве датчика температуры использовать любой из доступных в HA (показания внутреннего датчика кондиционера мы получить не можем), за это отвечает параметр sensor.
А также обеспечить некоторую обратную связь от родного пульта ДУ указав параметр receiver_id. Это позволит хабу ловить команды с пульта, дублировать их в эфир и отражать все изменения в HA.
В интерфейсе эту сущность можно представить в виде стандартной карточки thermostat:

В теории все очень удобно! Но в моем случае, к сожалению, не взлетело – кондиционеры не реагировали на команды с хаба, а сам хаб декодировал сигналы с родного пульта как Panasonic…
После долгих поисков и открытия issue в ESPHome, оказалось что у Daikin’а существует большое количество разных реализаций ИК протоколов для их техники (Daikin, Daikin128, Daikin152, Daikin160, Daikin2, Daikin216 и т.д.) и в моем случае протоколы в ESPHome и кондиционере не совпали.

IRremoteESP8266

Решением стало использование сторонней библиотеки IRremoteESP8266.
В результате наглого копирования чужих примеров, изучения в меру своего понимания API ESPHome и кода реализации протоколов Daikin в IRremoteESP8266, я смог добиться полноценного управления своими кондиционерами из HA.

Конфиг ESPHome у меня в итоге выглядит так:

substitutions:
  board_name: smartir_03
  room_name: livingroom

esphome:
  name: ${board_name}
  platform: ESP8266
  board: esp01_1m
  # Здесь подключаем библиотеку IRremoteESP8266 и заголовочный файл daikin_ir.h
  includes: 
    - include/daikin_ir_v2.h
  libraries:
    - IRremoteESP8266

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "SmartIR_04"
    password: !secret wifi_fallback_ap_pass

captive_portal:

logger:

api:
  password: !secret esphome_api_password

ota:
  password: !secret esphome_api_password

time:
  - platform: homeassistant
    id: homeassistant_time

status_led:
  pin: 
    number: GPIO4

remote_transmitter:
  pin:
    number: GPIO14
    inverted: false
  carrier_duty_percent: 50%

sensor:
  - platform: homeassistant
    name: "Current temperature"
    entity_id: sensor.for_esphome_temp_in_${room_name}
    id: ha_temp_${room_name}
    internal: true
    unit_of_measurement: °C
    accuracy_decimals: 1
  - platform: wifi_signal
    name: ${board_name}_wifi_rssi
    update_interval: 60s
    internal: false

binary_sensor:
  - platform: status
    name: ${board_name}_status
    internal: false

  - platform: gpio
    pin:
      number: GPIO13
      inverted: true
    internal: true
    name: ${board_name}_button
    id: button

climate:
  - platform: custom
    lambda: |-
      auto daikinac = new DaikinAC();
      # Подключение внешнего датчика температуры
      daikinac->set_sensor(id(ha_temp_${room_name}));
      App.register_component(daikinac);
      return {daikinac};
    climates:
      - name: "Daikin Livingroom"

Файл daikin_ir_v2.h можно найти у меня в git по этой ссылке. Разместить по пути ../esphome/include/daikin_ir_v2.h.

В целом, получилось реализовать все что мне нужно в повседневной жизни – переключение режимов, выбор температуры и скорости вентилятора, управление движением шторки.

Часть функций реализованных в IRremoteESP8266 я не знаю как использовать в ESPHome, за бортом остались кнопки Powerful, Econo и Comfort. Так же в этом конфиге нет приема и дублирования команд с родного пульта ДУ.
Но лично я в реальной жизни ничего из этого никогда не использовал.

– ~ –

Simple Thermostat

После некоторых экспериментов с интерфейсом, я в итоге остановился на кастомной карточке simple-thermostat. Штатный thermostat занимает много места на экране, и содержит лишнюю для меня информацию. С использованием simple-thermostat получилось компактно разместить все те режимы и функции, которыми я пользуюсь чаще всего, оставив редко используемое доступным в окне объекта кондиционера:

Пример конфигурации карточки:

- type: 'custom:simple-thermostat'
  entity: climate.daikin_nursery
  show_header: false
  decimals: 0
  step_layout: row
  step_size: 1
  hide:
    temperature: true
  sensors:
    - entity: binary_sensor.ac_nursery_status
      icon: mdi:air-filter
  control:
    _names: false
    hvac:
      _name: "Режим:"
      dry: false
      fan_only: false
    swing:
      _name: "Движение шторки:"
      "off":
        icon: mdi:shuffle-disabled
      vertical:
        icon: mdi:shuffle