Все началось с того, что я хотел включить свет в туалете, а он включился через три секунды.
У меня стоял шлюз 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.
Софт: Зоопарк в контейнерах
Вся магия строится на связке трех китов:
Zigbee2MQTT (z2m). Эта штука общается со свистком и переводит сигналы zigbee в понятный протокол MQTT.
Mosquitto. Брокер сообщений. Почтальон, который носит письма между сервисами.
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, которые скажут, что беспровод - это ненадежно и надо было штробить стены под витую пару.
