Все началось с того, что я хотел включить свет в туалете, а он включился через три секунды.

У меня стоял шлюз Xiaomi, датчик движения Aqara и какая-то ноунейм релешка. Схема работала так: датчик видит меня -> сигнал летит в Китай на сервер Xiaomi -> там скрипт думает -> сигнал летит обратно ко мне в квартиру -> свет включается.

В тот момент я понял две вещи.

Первая: я не хочу, чтобы товарищ майор из Пекина знал, как часто я хожу в туалет.

Вторая: мой дом не должен превращаться в тыкву, когда провайдер проводит плановые работы.

Ниже рассказ о том, как я выкинул все проприетарные шлюзы, купил один свисток и поднял Home Assistant.

Почему Wi-Fi устройства - это зло

Многие новички покупают Wi-Fi розетки. Это дешево, не нужен шлюз.

Но когда у вас 5 устройств - все ок. Когда их 50 - ваш домашний роутер начинает сходить с ума. Wi-Fi не предназначен для того, чтобы держать постоянный коннект с кучей мелких датчиков, которые шлют по 5 байт данных.

Плюс энергопотребление. Wi-Fi датчик на батарейке живет месяц. Zigbee - два года.

Железо: один стик, чтобы править всеми

Чтобы отвязаться от экосистем (Xiaomi, Tuya, Apple), нужен координатор.

Я взял Sonoff Zigbee 3.0 USB Dongle Plus.

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

Прошивается за 5 минут, после чего превращается в универсальный приемник, который понимает вообще всё: от лампочек IKEA до датчиков протечки с AliExpress.

Софт: Зоопарк в контейнерах

Вся магия строится на связке трех китов:

  1. Zigbee2MQTT (z2m). Эта штука общается со свистком и переводит сигналы zigbee в понятный протокол MQTT.

  2. Mosquitto. Брокер сообщений. Почтальон, который носит письма между сервисами.

  3. Home Assistant (HA). Мозг. Там крутятся скрипты и красивый интерфейс (который вы настроите один раз и никогда не будете открывать).

Почему z2m, а не нативный ZHA в Home Assistant?

Потому что архитектура должна быть модульной. Если я завтра захочу снести HA и поставить OpenHAB (чур меня), мне не придется переспаривать все 50 датчиков. Они живут в z2m.

Вот docker-compose.yml, который поднимает всё сразу.

Обратите внимание на проброс устройства /dev/ttyACM0 - это и есть наш стик.

YAML

version: '3.8'

services:
  mqtt:
    image: eclipse-mosquitto:2.0
    restart: unless-stopped
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
    ports:
      - "1883:1883"

  zigbee2mqtt:
    container_name: zigbee2mqtt
    image: koenkk/zigbee2mqtt
    restart: unless-stopped
    depends_on:
      - mqtt
    volumes:
      - ./zigbee2mqtt/data:/app/data
      - /run/udev:/run/udev:ro
    environment:
      - TZ=Europe/Moscow
    devices:
      # Проверяйте адрес через ls -l /dev/serial/by-id/
      - /dev/ttyACM0:/dev/ttyACM0

  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    restart: unless-stopped
    depends_on:
      - mqtt
      - zigbee2mqtt
    volumes:
      - ./ha_config:/config
      - /etc/localtime:/etc/localtime:ro
    network_mode: host # Важно для discovery устройств в сети

WAF (Wife Acceptance Factor)

Самое сложное в умном доме - это не YAML-конфиги писать. Самое сложное - сделать так, чтобы жена (девушка, мама, кот) не убили вас за то, что свет теперь включается только с телефона.

Золотое правило инженера: физический выключатель должен работать всегда.

Я использовал zigbee-реле, которые ставятся в подрозетник ЗА обычный выключатель. Выключатель щелкает - реле меняет состояние.

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

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

Автоматизация без GUI

Home Assistant предлагает визуальный редактор автоматизаций. Но мы же не ради кликанья мышкой тут собрались.

YAML дает гибкость.

Пример автоматизации: если датчик протечки сработал, перекрываем кран, шлем уведомление в телеграм и включаем красную подсветку в коридоре (чтобы было страшно).

YAML

alias: Leakage Detected
trigger:
  - platform: state
    entity_id: binary_sensor.water_leak_kitchen
    to: 'on'
action:
  # Закрываем кран (нужен электропривод)
  - service: switch.turn_off
    target:
      entity_id: switch.water_valve_main
  # Шлем панику в телегу
  - service: notify.telegram
    data:
      message: "ПОТОП НА КУХНЕ! Кран перекрыт."
  # Включаем аварийное освещение
  - service: light.turn_on
    target:
      entity_id: light.corridor_strip
    data:
      color_name: red
      brightness: 255

Итого

Цена вопроса - 2000 рублей за стик и пару вечеров на чтение документации.

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

Китайские обла��а идут лесом. Интернет не нужен.

И самое приятное чувство - когда в доме пропадает сеть, а у тебя все продолжает работать, как часы.

В комментариях жду адептов Wiren Board, которые скажут, что беспровод - это ненадежно и надо было штробить стены под витую пару.