Все началось с того, что я хотел включить свет в туалете, а он включился через три секунды.
У меня стоял шлюз 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, которые скажут, что беспровод - это ненадежно и надо было штробить стены под витую пару.
