Знаете, чего в этом мире и так хватает? Людей, которые рассказывают о том, что когда-нибудь сделают. Мечтатели, сидящие сложа руки, ждущие идеального момента, идеальной настройки, идеального чего-то там. А тем временем жизнь продолжает тикать.
«Я снова почувствовал, как проста и скромна вещь по имени счастье: бокал вина, жареный каштан, убогая жаровня, шум моря. Ничего больше.» Никос Казандзакис, «Грек Зорба»
Зорба не ждал. Зорба танцевал. Зорба терпел грандиозные неудачи и смеялся над ними. Когда его великая горнодобывающая операция рухнула, буквально рухнула, он схватил бутылку вина и начал танцевать на пляже. Лучше потерпеть неудачу как Зорба, чем сидеть сложа руки.
Так что сегодня мы с сыном действуем. План готов. Оборудование подготовлено. Большая часть протестирована по отдельности: автоматизации работают, сенсоры обнаруживают, код компилируется. Теперь посмотрим, работает ли всё вместе. Что-то пойдёт не так? Скорее всего. Мы готовы к трудностям? Безусловно. В этом и весь кайф.
Без плана нет пути. Только люди, говорящие ради звука собственного голоса. Только мечты. Это не мечта. Это операционный инструктаж.
Миссия
К тому моменту, когда мы будем жарить ужин на гриле сегодня вечером, этот дом будет:
- Включать свет в комнате, куда вы входите, и плавно гасить за вами, когда выходите
- Запирать все двери, когда кровать почувствует, что мы заснули
- Закрывать гараж автоматически, когда мы (опять) забудем
- Регулировать климат на основе того, какие комнаты реально заняты
- Генерировать WiFi-шум, чтобы никто снаружи не мог использовать ту же технологию sensing против нас
И Amazon ничего об этом не узнает. Всё работает локально. Без облака. Без подписок. Без сбора данных.
Арсенал (Уже на позициях)
Мозг: Raspberry Pi 5 - ГОТОВ
Эта штука две недели стоит на моём столе, полностью настроенная, ждёт сегодняшнего дня. Pi 5 - это перебор для базовой домашней автоматизации. Я люблю перебор. На нём крутится Raspberry Pi OS Lite, Docker установлен, Portainer работает. Всё, что нужно, это подключить его на постоянное место.
Я выбрал комплект Argon ONE V3 M.2 NVME PCIE Case. Уже собран:
- M.2 SSD с прошитой ОС (никаких отказов SD-карт)
- Docker + Portainer установлены и протестированы
- Контейнер Home Assistant готов к развёртыванию
- Статический IP назначен в сети
Предполётный чеклист - ВЫПОЛНЕН
- ☑ Raspberry Pi OS Lite прошит на SSD
- ☑ SSH включён, учётные данные настроены
- ☑ Сеть настроена со статическим IP
- ☑ Docker + Portainer работают
- ☑ Конфигурационные файлы Home Assistant подготовлены
Сенсоры: Платы ESP32 - ПРОШИТЫ И ПРОТЕСТИРОВАНЫ
Эти маленькие платы ESP32 были самой весёлой частью. В прошлые выходные мы с сыном их прошивали и наблюдали, как данные WiFi-сигнала текут на экран. Работают. Подтверждено.
- Блок WiFi Sensing - Обнаруживает движение, измеряя возмущение WiFi-сигнала. Проверено ходьбой по гостиной: улавливает движение сквозь стены на расстоянии 4,5-6 метров.
- Блок WiFi Fog - Генерирует шум, чтобы ослепить любой внешний WiFi sensing. Работает в изоляции, создавая прекрасный хаос в пространстве сигналов.
Сегодня интегрируем их в Home Assistant и посмотрим, правильно ли срабатывают автоматизации. Код работает в тестах. Вопрос: работает ли он, когда всё подключено?
(Если хотите понять, почему это важно, читайте мои статьи про WiFi sensing и контрмеры WiFi.)
Существующая инфраструктура - УЖЕ НА МЕСТЕ
Мы не начинаем с нуля. В доме уже есть умные штуки, просто они работают в отдельных приложениях, как куча разрозненных островов. Сегодня мы объединяем королевство:
- Лампы Philips Hue - Уже установлены по всему дому. Сейчас управляются через приложение Hue. Сегодня: Home Assistant берёт управление.
- Термостат Ecobee - Уже знает, какие комнаты заняты, через свои сенсоры. Сегодня: интегрируем эти данные.
- Кровать Eight Sleep - Уже отслеживает, когда я сплю. Сегодня: запускает автоматизацию блокировки.
- Замки Kwikset (Z-Wave) - Уже на дверях. Сегодня: научатся запираться сами.
- Гараж MyQ - Уже установлен. Сегодня: больше не нужно возвращаться домой, потому что забыл закрыть.
Суть в том: У вас, вероятно, уже больше умного оборудования, чем вы думаете. Оно просто ещё не общается друг с другом.
Фаза 1: Инфраструктура (ГОТОВО)
Это работа прошлых выходных. Если следуете за нами позже, вот что мы сделали. Если читали мою статью про Docker, вы знаете, почему мы всё контейнеризировали.
bash# Docker + Portainer - Already running
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-cePortainer работает на http://raspberrypi.local:9000. Красивый GUI для управления контейнерами. Проверено.
Фаза 2: Home Assistant (ПЕРВАЯ ЗАДАЧА НА СЕГОДНЯ)
Файл docker-compose написан. Директория конфигурации подготовлена. Сегодня запускаем по-настоящему и начинаем подключать устройства.
yaml# docker-compose.yml - ready to deploy
version: '3'
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- /home/pi/homeassistant:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: hostПлан: Запустить docker-compose up -d, пройти мастер настройки и подключить интеграции одну за другой:
- Philips Hue - Должен автоматически обнаружиться в сети
- Ecobee - OAuth-процесс, нужно держать приложение под рукой
- Eight Sleep - API-интеграция, учётные данные готовы
- Z-Wave - Вот тут может быть весело, замки бывают капризными
- MyQ - Просто, уже делал раньше
- ESPHome - Для устройств ESP32, которые мы прошили в прошлые выходные
Ожидаемая проблема: Z-Wave. У замков всегда характер. Посмотрим.
Фаза 3: Интеграция WiFi Sensing (САМАЯ ИНТЕРЕСНАЯ ЧАСТЬ)
Блок сенсинга - ГОТОВ К ПОДКЛЮЧЕНИЮ
В прошлые выходные сын наблюдал за серийным монитором, когда эта штука обнаружила, как я хожу по гостиной. Его точные слова: «Пап, это жутко и потрясающе.»
ESP32 уже прошит с ESPHome. Он уже обнаруживает движение через WiFi CSI (Channel State Information). Сегодня подключаем его к Home Assistant и даём имя: binary_sensor.living_room_occupied
Тест: Войти в гостиную. Home Assistant видит это? Если да, мы в деле.
Блок тумана - УРОВЕНЬ ПРИВАТНОСТИ ГОТОВ
Второй ESP32 запускает генератор шума из моей статьи о контрмерах. Он работает на моём стенде уже неделю, создавая прекрасный хаос в WiFi-спектре.
Да, мы используем WiFi sensing для собственной автоматизации, одновременно защищаясь от тех, кто может делать то же самое против нас. Это не лицемерие. Это операционная безопасность. А сын считает, что это самая крутая вещь на свете.
Будущее расширение: 3+3
Цель сегодня - доказать концепцию с одним сенсором и одним устройством тумана. Когда убедимся:
- 3 устройства сенсинга: Гостиная, кухня, спальня
- 3 устройства тумана: Распределены по дому для полного покрытия
Это примерно $50 на платы ESP32 для апгрейда всего дома. Но сначала давайте убедимся, что сегодня всё работает.
Фаза 4: Автоматизации (РАДИ ЧЕГО ВСЁ ЭТО)
Вот к чему всё шло. Эти YAML-файлы написаны, протестированы в голове сотню раз и готовы к вставке. Сработают с первого раза? Давайте выясним.
Автоматизация 1: Свет следует за мной (ГВОЗДЬ ПРОГРАММЫ)
Видение: Входите в комнату, свет поднимается, встречая вас. Уходите, и он гаснет за вами, как почтительный дворецкий. Дом Тони Старка. Вот цель.
Нюанс: Если вы включили свет вручную, система его не трогает. Ваш выбор уважается. Мы отслеживаем это с помощью хелперов input_boolean. Потому что нет ничего хуже автоматизации, которая воюет с тобой.
yaml# configuration.yaml additions
input_text:
last_occupied_room:
name: "Last Occupied Room"
initial: "none"
input_boolean:
living_room_auto_triggered:
name: "Living Room Auto Triggered"
kitchen_auto_triggered:
name: "Kitchen Auto Triggered"
bedroom_auto_triggered:
name: "Bedroom Auto Triggered"Теперь автоматизация:
yaml# automations.yaml
- alias: "Follow Me - Living Room Entry"
trigger:
- platform: state
entity_id: binary_sensor.living_room_occupied
to: "on"
condition:
- condition: state
entity_id: light.living_room
state: "off"
action:
# Dim the previous room if it was auto-triggered
- choose:
- conditions:
- condition: template
value_template: "{{ states('input_text.last_occupied_room') == 'kitchen' }}"
- condition: state
entity_id: input_boolean.kitchen_auto_triggered
state: "on"
sequence:
- service: light.turn_on
target:
entity_id: light.kitchen
data:
brightness_pct: 20
transition: 3
# Turn on current room
- service: light.turn_on
target:
entity_id: light.living_room
data:
brightness_pct: 100
- service: input_boolean.turn_on
target:
entity_id: input_boolean.living_room_auto_triggered
- service: input_text.set_value
target:
entity_id: input_text.last_occupied_room
data:
value: "living_room"
- alias: "Follow Me - Living Room Vacancy"
trigger:
- platform: state
entity_id: binary_sensor.living_room_occupied
to: "off"
for:
minutes: 2
condition:
- condition: state
entity_id: input_boolean.living_room_auto_triggered
state: "on"
action:
- service: light.turn_off
target:
entity_id: light.living_room
data:
transition: 5
- service: input_boolean.turn_off
target:
entity_id: input_boolean.living_room_auto_triggeredТест: После развёртывания мы с сыном пойдём по дому и посмотрим, следует ли свет за нами. Если сработает, будем чувствовать себя как в кино. Если нет, будем дебажить за пиццей.
Автоматизация 2: Ночная блокировка (СПОКОЙСТВИЕ)
Сценарий: 22:00. Я ложусь в кровать. Через пять минут Eight Sleep подтверждает, что я действительно сплю (а не просто лежу и листаю ленту). Дом реагирует: все двери запираются, гараж закрывается, если я забыл (опять), термостат переходит в ночной режим, автоматически включённые светильники плавно гаснут.
yaml- alias: "Bedtime - Eight Sleep Triggered Lockdown"
trigger:
- platform: state
entity_id: binary_sensor.eight_sleep_bed_presence
to: "on"
for:
minutes: 5
condition:
- condition: time
after: "21:00:00"
before: "06:00:00"
action:
# Lock all doors
- service: lock.lock
target:
entity_id:
- lock.front_door
- lock.back_door
# Close garage if open
- service: cover.close_cover
target:
entity_id: cover.garage_door
# Set Ecobee to sleep mode
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Sleep"
# Turn off auto-triggered lights
- service: light.turn_off
target:
entity_id:
- light.living_room
- light.kitchen
data:
transition: 5Нет Eight Sleep? Замените триггером по времени (22:30) или обнаружением зарядки телефона. Логика та же.
Автоматизация 3: Автозакрытие гаража (СПАСИТЕЛЬ БРАКА)
Проблема: «Ты закрыл гараж?» Вопрос, который задаётся 3 раза в неделю в этом доме. Больше нет. После 10 минут в открытом состоянии он закрывается сам и присылает уведомление.
yaml- alias: "Garage - Auto Close After 10 Minutes"
trigger:
- platform: state
entity_id: cover.garage_door
to: "open"
for:
minutes: 10
action:
- service: cover.close_cover
target:
entity_id: cover.garage_door
- service: notify.mobile_app_your_phone
data:
title: "Garage Secured"
message: "Garage was open for 10 minutes. Auto-closed."
data:
tag: "garage-closed"Автоматизация 4: Умный климат (ЭКОНОМИЯ ЭНЕРГИИ)
Логика: Зачем отапливать пустой дом? Когда наши WiFi-сенсоры говорят, что никого нет дома 30 минут, Ecobee переходит в режим «Отсутствие». Когда кто-то входит, он просыпается.
yaml- alias: "Ecobee - Away When House Empty"
trigger:
- platform: state
entity_id: binary_sensor.home_occupied
to: "off"
for:
minutes: 30
action:
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Away"
- alias: "Ecobee - Home When Occupied"
trigger:
- platform: state
entity_id: binary_sensor.home_occupied
to: "on"
condition:
- condition: state
entity_id: climate.ecobee
attribute: preset_mode
state: "Away"
action:
- service: climate.set_preset_mode
target:
entity_id: climate.ecobee
data:
preset_mode: "Home"Создание агрегатного сенсора
binary_sensor.home_occupied - это шаблонный сенсор, объединяющий все комнатные сенсоры:
yamltemplate:
- binary_sensor:
- name: "Home Occupied"
state: >
{{ is_state('binary_sensor.living_room_occupied', 'on')
or is_state('binary_sensor.kitchen_occupied', 'on')
or is_state('binary_sensor.bedroom_occupied', 'on') }}Что может пойти не так? (Весёлая часть)
Вот в чём дело: что-то ОБЯЗАТЕЛЬНО пойдёт не так сегодня. Это не пессимизм, это реальность. И это нормально. В этом весь смысл.
Вероятные кандидаты на сегодняшнее приключение:
- Замки Z-Wave - У этих штук характер. Сопряжение может потребовать нескольких попыток.
- Калибровка WiFi-сенсора - На стенде работает, но как будет на рабочем месте?
- Граничные случаи автоматизации - Что, если кто-то пройдёт через комнату за 2 секунды?
- Проблема «вчера работало» - Любимая шутка технологий.
Но именно поэтому мы делаем это вместе. Отец и сын, устраняющие неполадки, учащиеся, наверняка спорящие о том, почему YAML не парсится. Вот как на самом деле учишься: строишь что-то реальное, смотришь, как оно ломается, и чинишь.
Шахта Зорбы рухнула. Его реакция? Танцевать на пляже. Что бы ни сломалось сегодня, мы разберёмся. А если не сможем, у нас будет отличная история за ужином.
Философия
Вот что отделяет деятелей от мечтателей:
Мечтатели исследуют месяцами. Читают каждую статью. Ждут «правильное» оборудование. Оптимизируют план, пока он не станет идеальным. Никогда не начинают.
Деятели записывают план, собирают необходимое и действуют. Они ожидают трудностей. Адаптируются на ходу. Терпят неудачи, двигаясь вперёд.
Без плана нет пути. Только люди, говорящие ради звука собственного голоса. Но план без исполнения - это просто мечта с дополнительными шагами.
Критерии успеха на сегодня
- ☐ Home Assistant работает со всеми подключёнными устройствами
- ☐ WiFi-сенсор обнаруживает движение в гостиной
- ☐ Следящее освещение работает хотя бы в одной комнате
- ☐ Автоматизация ночной блокировки активирована
- ☐ Сын говорит «это как дом Тони Старка»
Что дальше (после сегодняшнего успеха)
Если всё получится, а получится, даже если займёт больше времени, чем ожидалось:
- Полное развёртывание ESP32 3+3 - Сенсинг в каждой основной комнате, покрытие туманом по всему дому
- Настенный планшет с панелью управления - Всегда включённая панель в коридоре
- Локальное голосовое управление - Wyoming/Piper для голосовых команд, не покидающих дом
- Датчики протечек - Под каждой раковиной и рядом с водонагревателем
Но сначала: сегодня. Сначала: исполнение. Сначала: доказать, что всё это планирование действительно работает.
«Жизнь - это то, что с тобой происходит, пока ты строишь другие планы.» Джон Леннон
Неправильно. Жизнь - это то, что происходит, когда ты перестаёшь планировать и начинаешь действовать. Увидимся на другой стороне. Пора идти строить.