Умный дом на Home Assistant и 3D печать.
 
Telegram-канал FoxJoy
Почта: dm@foxfoy.ru
Управляем LG-телевизором в HA без снятия ИК-кодов: ESPHome + LG Infrared

Управляем LG-телевизором в HA без снятия ИК-кодов: ESPHome + LG Infrared

С обновлением Home Assistant OS 2026.4.0 появились несколько интересных новинок. Например, нативная интеграция для телевизоров LG — LG Infrared. У меня для управления ИК-техникой (телевизоры, кондиционеры и т.д.) обычно используются RM Mini и RM PRO-4 от Broadlink, но новая интеграция их не поддерживает. LG Infrared требует сущность типа Infrared entity. ESPHome предоставляет её через компонент ir_rf_proxy (ранее назывался infrared).

Для своих устройств управляемых через RM Mini приходилось вручную считывать сигналы с пультов, записывать их в конфиг, и только потом уже была возможность пользоваться ими. Это несколько муторно и долго, но в общем один раз прописал и пользуйся. Если говорить только о телевизорах LG, то в принципе удобная интеграция тем, что не нужно считывать коды управления, они там уже есть. А команды в пультах одинаковые - как вы знаете, одним пультом можно управлять разными телевизорами этого бренда. Вот мне и интересно было попробовать.

Комплектующие и подготовка

Нам понадобится:

  • Контроллер ESP32 (подойдёт любая отладочная плата) 
  • NPN-транзистор S9014 или аналог 
  • Резистор 1 кОм (для базы) 
  • Резистор 100 Ом (для ограничения тока ИК-диода) 

ИК светодиод и транзистор я выпаял из пульта от напольного вентилятора Elenberg, который уже давно отжил своё. Резисторы обычно есть в любом запасе радиолюбителя. 

Распиновка транзистора S9014 (корпус TO-92)
В моей сборке использовалась партия с цоколёвкой C-B-E (если смотреть на плоскую грань выводами вниз):

  • Левая нога — Коллектор (подключается к катоду ИК-светодиода)
  • Средняя нога — База (управление от GPIO через резистор 1 кОм)
  • Правая нога — Эмиттер (на GND ESP32)

Важно: У некоторых производителей встречается обратная распиновка (E-B-C). Перед пайкой обязательно проверьте цоколёвку мультиметром в режиме hFE или по даташиту конкретной партии. Ошибка с базой/коллектором может вывести из строя пин ESP32 или мгновенно перегреть транзистор.

Схема подключения
1. Управление (База)
    Резистор 1 кОм. Один конец паяем к средней ноге транзистора (База), второй — к пину GPIO4 на ESP32.
2. Земля (Эмиттер)
    Правую ногу (Эмиттер) соединяем с GND на ESP32.
3. Светодиод (Коллектор + Питание)
    Короткая ножка (Катод, –) припаивается к левой ноге транзистора (Коллектор).
    Длинная ножка (Анод, +) соединяется через резистор 100 Ом с пином 3.3V (или 5V, если плата поддерживает).

Техническая справка: S9014 рассчитан на ток коллектора до 100 мА. При резисторе 100 Ом и питании 5 В ток через ИК-диод составит около 35–40 мА, что безопасно для транзистора и обеспечивает уверенный сигнал на расстояние 3–5 метров.

Прошивка для ESPHome

Конфигурация минимальная. Главное — правильно связать remote_transmitter и ir_rf_proxy:

esphome: 

  name: esp32-ir-lg
  friendly_name: ESP32-ir-lg

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "ВАШ КЛЮЧ"

ota:
  - platform: esphome
    password: "ВАШ ПАРОЛЬ"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32-Ir-Lg Fallback Hotspot"
    password: "ВАШ ПАРОЛЬ"

captive_portal:

# 1. Базовый ИК-передатчик (аппаратный)
remote_transmitter:
  id: ir_tx
  pin: GPIO4
  carrier_duty_percent: 50%

# 2. Прокси-компонент — создаёт Infrared entity для HA
infrared:
  - platform: ir_rf_proxy
    name: "ESP32 IR Emitter"
    id: ir_proxy_tx
    remote_transmitter_id: ir_tx

# 3. Тестовая кнопка (опционально)
button:
  - platform: template
    name: "Test Power"
    on_press:
      - logger.log: "Test button pressed"

Настройка в Home Assistant

В Настройки → Устройства и службы нажмите Добавить интеграцию, найдите LG Infrared и добавьте её.
HA автоматически обнаружит ESP32-передатчик и создаст 29 сущностей-кнопок (button.lg_tv_power_on, button.lg_tv_menu и т.д.).
Стандартный список кнопок в дашборде выглядит громоздко. Я оформил их в компактный пульт через custom:button-card.

Вот код карточки (в конце
- type: media-control
    entity: media_player.tv_lg_55la620v
замените на свой) и custom:button-card если у вас не установлен, то установите через HACS

type: vertical-stack 

cards:
  - type: grid
    square: false
    columns: 3
    cards:
      - type: custom:button-card
        entity: button.lg_tv_power_on
        name: Вкл
        icon: mdi:power
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#e74c3c"
            - color: "#ffffff"
            - border-radius: 10px
            - height: 50px
            - font-weight: bold
          icon:
            - color: "#ffffff"
          name:
            - color: "#ffffff"
      - type: custom:button-card
        entity: button.lg_tv_power_off
        name: Выкл
        icon: mdi:power-off
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#34495e"
            - color: "#ffffff"
            - border-radius: 10px
            - height: 50px
          icon:
            - color: "#ffffff"
          name:
            - color: "#ffffff"
      - type: custom:button-card
        entity: button.lg_tv_exit
        name: Exit
        icon: mdi:exit-to-app
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#f1c40f"
            - color: "#2c3e50"
            - border-radius: 10px
            - height: 50px
            - font-weight: bold
          icon:
            - color: "#2c3e50"
          name:
            - color: "#2c3e50"
  - type: grid
    square: false
    columns: 3
    cards:
      - type: custom:button-card
        entity: button.lg_tv_menu
        name: Меню
        icon: mdi:menu
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_home
        name: Home
        icon: mdi:home
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_back
        name: Назад
        icon: mdi:arrow-left-bold-circle
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_left
        name: ◀
        icon: mdi:arrow-left-bold-box
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#34495e"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_up
        name: ▲
        icon: mdi:arrow-up-bold-box
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#34495e"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_right
        name: ▶
        icon: mdi:arrow-right-bold-box
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#34495e"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_down
        name: ▼
        icon: mdi:arrow-down-bold-box
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#34495e"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
      - type: custom:button-card
        entity: button.lg_tv_ok
        name: OK
        icon: mdi:circle-outline
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#27ae60"
            - color: "#ffffff"
            - border-radius: 50%
            - height: 50px
            - font-weight: bold
          icon:
            - color: "#ffffff"
          name:
            - color: "#ffffff"
      - type: custom:button-card
        entity: button.lg_tv_guide
        name: Guide
        icon: mdi:television-guide
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 50px
  - type: grid
    square: false
    columns: 5
    cards:
      - type: custom:button-card
        entity: button.lg_tv_number_1
        name: "1"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_2
        name: "2"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_3
        name: "3"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_4
        name: "4"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_5
        name: "5"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_6
        name: "6"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_7
        name: "7"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_8
        name: "8"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_9
        name: "9"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
      - type: custom:button-card
        entity: button.lg_tv_number_0
        name: "0"
        icon: ""
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#1c2833"
            - color: "#ecf0f1"
            - border-radius: 10px
            - height: 45px
            - font-size: 16px
            - grid-column: span 2
            - grid-column-start: 2
  - type: grid
    square: false
    columns: 4
    cards:
      - type: custom:button-card
        entity: button.lg_tv_hdmi_1
        name: HDMI 1
        icon: mdi:hdmi-port
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 8px
            - height: 40px
            - font-size: 10px
      - type: custom:button-card
        entity: button.lg_tv_hdmi_2
        name: HDMI 2
        icon: mdi:hdmi-port
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 8px
            - height: 40px
            - font-size: 10px
      - type: custom:button-card
        entity: button.lg_tv_hdmi_3
        name: HDMI 3
        icon: mdi:hdmi-port
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 8px
            - height: 40px
            - font-size: 10px
      - type: custom:button-card
        entity: button.lg_tv_hdmi_4
        name: HDMI 4
        icon: mdi:hdmi-port
        tap_action:
          action: toggle
        styles:
          card:
            - background-color: "#2c3e50"
            - color: "#ecf0f1"
            - border-radius: 8px
            - height: 40px
            - font-size: 10px
  - type: media-control
    entity: media_player.tv_lg_55la620v_za

Код рабочий, но очень длинный. Чтобы сократить код, используйте button_card_templates в configuration.yaml.

Чего не хватает и что делать дальше
Вы наверняка заметили отсутствие кнопок громкости, Play/Pause, Stop и т.д. Если у вас Smart TV с сетевым управлением (webOS, Android TV), эти команды лучше отдавать через стандартную карточку media-control, которая уже добавлена в конец пульта. 

Если телевизор "безмозглый" или media-player не подключен, недостающие команды придётся добавить по старинке: считать ИК-сигналы обычным пультом через remote_receiver в ESPHome и создать свои template button.

С одной стороны здорово что такая интеграция появилась - не нужно прыгать с считываением кодов с пультов, с другой жаль что часть кнопок отсутсвует и они доступны только через media-control. Надеюсь, в будущих обновлениях HA добавят поддержку сторонних ИК-шлюзов или вынесут громкость/плеер в отдельный набор ИК-кнопок. А пока — рабочее и бюджетное решение для умного дома. Не всегда есть желание пайкой заниматься :)