Разработка автоматизаций в Home Assistant с помощью Claude. DIY или Сделай сам.. DIY или Сделай сам. home assistant.. DIY или Сделай сам. home assistant. home automation.. DIY или Сделай сам. home assistant. home automation. homeassistant.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик. ИИ.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик. ИИ. ии-агенты.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик. ИИ. ии-агенты. искусственный интеллект.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик. ИИ. ии-агенты. искусственный интеллект. ремонт.. DIY или Сделай сам. home assistant. home automation. homeassistant. llm-агент. mcp. Блог компании Домклик. ИИ. ии-агенты. искусственный интеллект. ремонт. Умный дом.
Разработка автоматизаций в Home Assistant с помощью Claude - 1
Разработка автоматизаций в Home Assistant с помощью Claude - 2

Сергей Гречишников

Android Developer в Новостройках @ Домклик

Недавно я переехал в новую квартиру и ремонт решил делать с упором на умный дом. Весь свет управляется через реле и диммеры Wirenboard, все выключатели — это сухие контакты, подключённые к этим реле. Кондиционеры выбирал только те, которые можно интегрировать в Home Assistant (в моём случае через ESPHome). Тёплые полы — ZigBee, и т.д. Про архитектуру и путь, которым я к ней пришёл, можно написать отдельную статью. Здесь же я расскажу про свой подход к написанию автоматизаций и разработке дашбордов.

Думаю, многие, кто делал ремонт, знают, как выглядят первые несколько месяцев после переезда. В моём случае это было как минимум продолжение ремонта. Надо было покупать мебель, доделывать санузел и заниматься другими «увлекательными» делами, которыми, если честно, заниматься больше не хочется. Одним словом, времени «развлекаться» с умным домом у меня не было, но желание было!

По своей профессии я уже сталкивался с LMM и агентами для разработки. Даже писал об этом статью на Хабре («Как нам в Домклик LLM рефакторинг делала»). Она более глубокая и техническая — если вам это интересно, можете почитать. Поэтому я неплохо понимал, как можно заставить LLM написать код, который мне нужен. Когда наткнулся на проект «The Unofficial and Awesome Home Assistant MCP Server» (далее для краткости — HA MCP), он меня сразу заинтересовал. Я решил дать ему шанс (и не я один, у него целых 3,7 тыс. звёзд!).

Как ИИ может облегчить жизнь с умным домом

Использование LLM в умном доме — не новая концепция. Уже существуют инструменты, которые применяют системы Speech-To-Text и LLM для управления устройствами, например, Voice Assistant. Допустим, вы говорите: «Включи весь свет в спальне». STT преобразует вашу речь в текст, а LLM, получив этот «промт» и список устройств, выполняет необходимые действия. У Home Assistant уже есть интеграции с Ollama, OpenRouter и другими ИИ-провайдерами.

В статье я хочу рассказать об использовании ИИ с другой стороны: со стороны разработки автоматизаций, сценариев и дашбордов. Идея здесь тоже не нова. Автоматизации — это YAML, который можно редактировать вручную. Если предоставить ИИ-агенту доступ к этим файлам, он сможет изменять их за нас. Именно это и делает HA MCP: он позволяет LLM напрямую редактировать файлы конфигураций вместо перемещения YAML между интерфейсом Home Assistant и чатом.

Всё это звучит очень многообещающе, однако внимательный читатель сразу скажет: «Это всё небезопасно, ИИ всё сломает, а мне потом это чинить». Так вот, примечание:

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

Что такое MCP и как его настроить

MCP — это протокол для интеграции ИИ с различными сервисами и инструментами (а именно Model Context Protocol). Он был разработан компанией Anthropic (создателем Claude) в 2024 г. Фактически, MCP-сервер — интерфейс, который предоставляет модели различные инструменты и данные.

Пример: я открываю Claude Desktop и прошу его выключить свет на кухне. Claude понимает контекст задачи, находит нужный инструмент в MCP (ha_search для поиска нужной сущности), затем выбирает необходимые сущности и вызывает инструмент ha_call_service для переключения их состояния. Вуаля, свет на кухне выключен.

Как настроить

Есть два варианта настройки, и они оба описаны на странице репозитория:

  1. Установка как Add‑on непосредственно в Home Assistant

  2. Локальный запуск на ПК с Claude Desktop

Я выбрал второй вариант, поэтому расскажу о нём (инструкция основана на Windows; для других ОС информация есть в репозитории).

  1. Создайте аккаунт в Claude (вероятно, этот MCP будет работать и с другими LLM, но я не проверял)

  2. Запустите скрипт установки MCP из инструкции

  3. Установите Claude Desktop (можно также использовать Claude Code)

  4. Спросите у него: «Видишь ли ты мой Home Assistant?»

Ещё у MCP появился мастер установки, но я его не тестировал.

Что умеет

Я давал ИИ-агенту различные задачи. Разберём их по порядку.

Дашборды

Я люблю красивый интерфейс, и на работе могу потратить много времени на тюнинг анимаций и «pixel‑perfect». Однако в своём умном доме мне, честно говоря, очень лень этим заниматься. Листая Reddit, я видел множество примеров очень красивых дашбордов и захотел попробовать создать что‑то хотя бы отдалённо похожее. Я выбрал несколько понравившихся библиотек компонентов (Mushroom, Bubble Card, Navbar‑card и другие), примерно продумал, что и как я хочу видеть, описал это и передал в Claude. Вот что получилось:

Разводящая страница с комнатами, общим управлением кондиционерами и основными датчиками

Разводящая страница с комнатами, общим управлением кондиционерами и основными датчиками
Экран гостиной

Экран гостиной
Экран спальни

Экран спальни

Да, сами экраны простые, но они выполняют поставленные перед дашбордом задачи. А самое главное, 90% работы сделано при помощи LLM. Оставшиеся 10% — это мелкие корректировки, такие как смена датчика или названия, ради которых мне было лень открывать Claude.

Автоматизации

Если дашборды — это больше визуальная составляющая умного дома (хотя, на мой взгляд, очень важная), то автоматизации — 80% всей его магии. Несколько лет назад я увидел мнение, с которым полностью согласен:

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

Именно об автоматизациях здесь и идёт речь. В Home Assistant они бывают очень разнообразными: от «КОГДА кнопка A нажата, ВКЛЮЧИ свет в спальне» до более сложных сценариев, например, для управления климатом. Я уже придумал несколько автоматизаций, которые хотел воплотить.

Мастер выключатель с сохранением состояния

Так как весь свет у меня умный, то и мастер выключатель решено было сделать умным, без “классического” контактора. Изначально логика его работы была крайне простая “выключи весь свет кроме вытяжки”, однако потом захотелось комфорта. Я хотел иметь возможность нажать на мастер выключатель повторно и восстановить состояние которое было до выключения, но если функцией восстановления никто не воспользовался, было взаимодействие со светом, то “слепок” нужно было сбрасывать.

Код автоматизации

Автоматизация обрабатывает нажатие на мастер выключатель

alias: Master Switch Toggle
description: Нажатие на WB-MCM8 124 Master switch — вызывает script.master_switch_toggle
triggers:
  - entity_id: binary_sensor.switch_master
    to: "on"
    trigger: state
conditions: []
actions:
  - action: script.master_switch_toggle
mode: single

Автоматизация обрабатывает сброс сцены

alias: Master Switch Snapshot Invalidate
description: >-
  СбАвтоматизация обрабатывает сброс сценырасывает сохранённое состояние если свет был включён вручную после нажатия
  master switch.
triggers:
  - entity_id:
      - light.light_living_room_back
      - light.light_living_room_front
      - light.light_living_room_table
      - light.light_living_room_track_1
      - light.light_livingroom_track_2
      - light.light_living_room_spheres
      - light.led_kitchen
      - light.kitchen_spheres
      - light.light_kitchen_track_1
      - light.light_kitchen_track_2
      - light.light_bedroom_1
      - light.light_bedroom_2
      - light.light_bedroom_wardrobe
      - light.light_bedroom_wardrobe_bra
      - light.light_hall_spot_wall
      - light.light_hall_spot_mirror
      - light.led_office
      - light.light_office
      - light.led_master_bathroom
      - light.light_master_bathroom
      - light.hood_bathrooms
      - light.light_laundry_room
      - light.led_wardrobe
      - light.light_warderbe
    to: "on"
    trigger: state
conditions:
  - condition: state
    entity_id: input_boolean.master_switch_has_snapshot
    state: "on"
actions:
  - target:
      entity_id: input_boolean.master_switch_has_snapshot
    action: input_boolean.turn_off
mode: single

Скрипт выключения света с сохранением и восстановлением

alias: Master Switch Toggle
description: >-
  Сохраняет состояние света и выключает всё (1-й вызов), или восстанавливает
  сохранённое состояние (2-й вызов). Использует
  input_boolean.master_switch_has_snapshot как флаг.
icon: mdi:lightbulb-group
mode: single
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_boolean.master_switch_has_snapshot
            state: "off"
        sequence:
          - data:
              scene_id: master_switch_snapshot
              snapshot_entities:
                - light.light_living_room_back
                - light.light_living_room_front
                - light.light_living_room_table
                - light.light_living_room_track_1
                - light.light_livingroom_track_2
                - light.light_living_room_spheres
                - light.led_kitchen
                - light.kitchen_spheres
                - light.light_kitchen_track_1
                - light.light_kitchen_track_2
                - light.light_bedroom_1
                - light.light_bedroom_2
                - light.light_bedroom_wardrobe
                - light.light_bedroom_wardrobe_bra
                - light.light_hall_spot_wall
                - light.light_hall_spot_mirror
                - light.led_office
                - light.light_office
                - light.led_master_bathroom
                - light.light_master_bathroom
                - light.light_laundry_room
                - light.led_wardrobe
                - light.light_warderbe
            action: scene.create
          - target:
              entity_id: input_boolean.master_switch_has_snapshot
            action: input_boolean.turn_on
            data: {}
          - target:
              entity_id:
                - light.light_living_room_back
                - light.light_living_room_front
                - light.light_living_room_table
                - light.light_living_room_track_1
                - light.light_livingroom_track_2
                - light.light_living_room_spheres
                - light.led_kitchen
                - light.kitchen_spheres
                - light.light_kitchen_track_1
                - light.light_kitchen_track_2
                - light.light_bedroom_1
                - light.light_bedroom_2
                - light.light_bedroom_wardrobe
                - light.light_bedroom_wardrobe_bra
                - light.light_hall_spot_wall
                - light.light_hall_spot_mirror
                - light.led_office
                - light.light_office
                - light.led_master_bathroom
                - light.light_master_bathroom
                - light.light_laundry_room
                - light.led_wardrobe
                - light.light_warderbe
            action: light.turn_off
            data: {}
      - conditions:
          - condition: state
            entity_id: input_boolean.master_switch_has_snapshot
            state: "on"
        sequence:
          - target:
              entity_id: input_boolean.master_switch_has_snapshot
            action: input_boolean.turn_off
            data: {}
          - target:
              entity_id: scene.master_switch_snapshot
            data:
              transition: 1
            action: scene.turn_on

Автоматизация получилась довольно простая, тем не менее, было приятно не писать список из всех возможных светильников.

Общее управление кондиционерами

Затем я решил заняться климат-контролем. Хотя я представляю себе более сложную систему, но пока я решил сосредоточиться на управлении кондиционерами, поскольку не все нужные компоненты у меня есть. У меня три кондиционера, все они интегрированы в Home Assistant. Но иногда возникает потребность управлять ими одновременно. Для этого мне понадобились: один Number Helper, который будет выставлять температуру, четыре скрипта для активации различных режимов (выключение, охлаждение, обогрев и авто), логика отображения текущего состояния и интерфейс.

С этой задачей агент справился на отлично, и результат меня полностью устроил с первого раза. Он даже выявил проблему в конфигурации одного из кондиционеров, где был отключён один из режимов.

Интерфейс управления кондиционерами

Интерфейс управления кондиционерами

Вечернее диммирование

Дальше мне очень хотелось автоматизировать диммирование света вечером. Мне гораздо легче засыпать, если перед сном я не нахожусь под ярким освещением. Мой первоначальный план был прост: с 01:00 до 03:00 свет должен плавно затухать от текущей яркости до 50%. Казалось бы, всё просто, но есть несколько нюансов, которые усложняют задачу:

  1. Если какой‑нибудь светильник уже включён, например, на 70% яркости, то при старте автоматизации его яркость не должна подниматься до 100%

  2. Если пользователь в любой момент вручную изменит яркость светильника, то этот светильник должен перестать изменять свою яркость

Изначальная версия промта для этой автоматизации

Помоги мне создать автоматизацию в Home Assistant:

Автоматически приглушает свет от 100 до 50%. Делает это плавно в течение длительного времени. Начинается в 01:00 и достигает 50% яркости в 03:00. При этом есть несколько ограничений: 1) если источник света уже имеет яркость ниже целевой, поднимать яркость не надо; 2) должна быть возможность перезаписать яркость источника света. Например, если при целевой яркости в 70% кто‑то вручную устанавливает 100% (или любое другое значение), этот светильник будет игнорироваться автоматизацией до тех пор, пока его не выключат.

LLM справилась с первого раза: агент создал автоматизацию, которая плавно приглушала свет во всей квартире. Однако обнаружился нюанс: установка яркости диммеру через MQTT приводила к включению лампы, даже если она была выключена. Это не ошибка LLM, но требует исправления. Я не придумал ничего лучше, чем создать хелперы, позволяющие напрямую в MQTT изменять яркость, минуя Entity. После внедрения этих изменений система заработала как надо!

Код готовой автоматизации
alias: Night Dimming 01:00-03:00 (number)
description: >-
  Плавно приглушает свет с 100% до 50% с 01:00 до 03:00. Каждые 3 минуты
  снижение на 1%. Яркость устанавливается через number сущности без включения
  ламп. Включённые лампы с изменённой вручную яркостью игнорируются.
triggers:
  - at: "01:00:00"
    trigger: time
actions:
  - variables:
      brightness_start: 100
      step_pct: 1
      step_minutes: 3
      total_steps: 50
      tolerance_pct: 5
      light_to_number:
        light.light_office: number.wb_mdm3_15_channel_1_brightness
        light.light_laundry_room: number.wb_mdm3_15_channel_3_brightness
        light.light_living_room_back: number.wb_mdm3_35_channel_1_brightness
        light.light_living_room_front: number.wb_mdm3_35_channel_2_brightness
        light.light_living_room_table: number.wb_mdm3_35_channel_3_brightness
        light.light_bedroom_1: number.wb_mdm3_82_channel_1_brightness
        light.light_bedroom_2: number.wb_mdm3_82_channel_2_brightness
        light.light_bedroom_wardrobe: number.wb_mdm3_82_channel_3_brightness
        light.hood_bathrooms: number.wb_mdm3_94_channel_1_brightness
        light.kitchen_spheres: number.wb_mdm3_94_channel_2_brightness
        light.led_office: number.wb_led_30_channel_2_brightness
        light.led_kitchen: number.wb_led_30_channel_3_brightness
        light.led_wardrobe: number.wb_led_30_channel_4_brightness
  - repeat:
      count: "{{ total_steps }}"
      sequence:
        - variables:
            new_target_pct: "{{ brightness_start - step_pct * repeat.index }}"
            prev_target_pct: "{{ brightness_start - step_pct * (repeat.index - 1) }}"
        - repeat:
            for_each: "{{ light_to_number.keys() | list }}"
            sequence:
              - variables:
                  light_entity: "{{ repeat.item }}"
                  number_entity: "{{ light_to_number[repeat.item] }}"
              - choose:
                  - conditions:
                      - condition: template
                        value_template: "{{ states(light_entity) == 'off' }}"
                    sequence:
                      - target:
                          entity_id: "{{ number_entity }}"
                        data:
                          value: "{{ new_target_pct }}"
                        action: number.set_value
                  - conditions:
                      - condition: template
                        value_template: "{{ states(light_entity) == 'on' }}"
                      - condition: template
                        value_template: >-
                          {{ (state_attr(light_entity, 'brightness') | int(-1) /
                          255 * 100) | round(0) >= new_target_pct }}
                      - condition: template
                        value_template: >-
                          {{ ((state_attr(light_entity, 'brightness') | int(-1)
                          / 255 * 100) | round(0) - prev_target_pct) | abs <=
                          tolerance_pct }}
                    sequence:
                      - target:
                          entity_id: "{{ number_entity }}"
                        data:
                          value: "{{ new_target_pct }}"
                        action: number.set_value
        - delay:
            minutes: "{{ step_minutes }}"
mode: single

Следующим запросом, кстати говоря, был написан скрипт который возвращает все лампы к уровню яркости по умолчанию в 9 утра, что бы следующим вечером, при включении, свет не был тусклым.

Отладка

Агент с помощью MCP-сервера может помочь не только в создании новых автоматизаций, но и в поиске багов в уже существующих. Мне это пригодилось пока лишь однажды. У меня периодически отключался свет во всей квартире, и я никак не мог найти закономерность. После одного запроса Claude обнаружил, что проблема крылась в неправильно настроенной автоматизации. Сразу оговорюсь: эту автоматизацию создал я сам.

Бекапы

Самое главное при работе с любыми «нейроагентами» — понимать, что любой ИИ — это«черный ящик», который получает запрос и выдаёт ответ, который считает наиболее подходящим. Кроме того, агенты подвержены «галлюцинациям» (вспомните многочисленные случаи, когда ИИ по просьбе обновить базу данных просто удалял её!). Поэтому всегда делайте бекапы перед экспериментами!

Заключение

Когда я только начинал исследовать HA MCP, то ожидал, что получу инструмент, который придётся долго дорабатывать. Однако оказалось, что это очень удобный механизм, ускоряющий создание автоматизаций и дашбордов. Мне не нужно вручную составлять или писать YAML-код. Достаточно просто описать алгоритм, который уже есть у меня в голове, и искусственный интеллект выполнит всю монотонную работу. Переезжая в новую квартиру с умным домом, я думал, что займусь автоматизацией не раньше чем через полгода, так как дел было по горло. Но благодаря MCP мне удалось довольно быстро настроить автоматизации и создать мою любимую – вечернее диммирование. А какие у вас любимые автоматизации? Может быть вы тоже используете ИИ для их создания? Предлагаю обсудить в комментариях!

Автор: SrgGrch

Источник