Знаете, чего в этом мире и так хватает? Людей, которые рассказывают о том, что когда-нибудь сделают. Мечтатели, сидящие сложа руки, ждущие идеального момента, идеальной настройки, идеального чего-то там. А тем временем жизнь продолжает тикать.
«Я снова почувствовал, как проста и скромна вещь по имени счастье: бокал вина, жареный каштан, убогая жаровня, шум моря. Ничего больше.» Никос Казандзакис, «Грек Зорба»
Зорба не ждал. Зорба танцевал. Зорба терпел грандиозные неудачи и смеялся над ними. Когда его великая горнодобывающая операция рухнула, буквально рухнула, он схватил бутылку вина и начал танцевать на пляже. Лучше потерпеть неудачу как Зорба, чем сидеть сложа руки.
Так что сегодня мы с сыном действуем. План готов. Оборудование подготовлено. Большая часть протестирована по отдельности: автоматизации работают, сенсоры обнаруживают, код компилируется. Теперь посмотрим, работает ли всё вместе. Что-то пойдёт не так? Скорее всего. Мы готовы к трудностям? Безусловно. В этом и весь кайф.
Без плана нет пути. Только люди, говорящие ради звука собственного голоса. Только мечты. Это не мечта. Это операционный инструктаж.
Миссия
К тому моменту, когда мы будем жарить ужин на гриле сегодня вечером, этот дом будет:
- Включать свет в комнате, куда вы входите, и плавно гасить за вами, когда выходите
- Запирать все двери, когда кровать почувствует, что мы заснули
- Закрывать гараж автоматически, когда мы (опять) забудем
- Регулировать климат на основе того, какие комнаты реально заняты
- Генерировать 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, вы знаете, почему мы всё контейнеризировали.
1# Docker + Portainer - Already running
2curl -fsSL https://get.docker.com | sh
3sudo usermod -aG docker $USER
4
5docker volume create portainer_data
6docker run -d -p 9000:9000 --name portainer \
7 --restart=always \
8 -v /var/run/docker.sock:/var/run/docker.sock \
9 -v portainer_data:/data \
10 portainer/portainer-cePortainer работает на http://raspberrypi.local:9000. Красивый GUI для управления контейнерами. Проверено.
Фаза 2: Home Assistant (ПЕРВАЯ ЗАДАЧА НА СЕГОДНЯ)
Файл docker-compose написан. Директория конфигурации подготовлена. Сегодня запускаем по-настоящему и начинаем подключать устройства.
1# docker-compose.yml - ready to deploy
2version: '3'
3services:
4 homeassistant:
5 container_name: homeassistant
6 image: ghcr.io/home-assistant/home-assistant:stable
7 volumes:
8 - /home/pi/homeassistant:/config
9 - /etc/localtime:/etc/localtime:ro
10 restart: unless-stopped
11 privileged: true
12 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. Потому что нет ничего хуже автоматизации, которая воюет с тобой.
1# configuration.yaml additions
2input_text:
3 last_occupied_room:
4 name: "Last Occupied Room"
5 initial: "none"
6
7input_boolean:
8 living_room_auto_triggered:
9 name: "Living Room Auto Triggered"
10 kitchen_auto_triggered:
11 name: "Kitchen Auto Triggered"
12 bedroom_auto_triggered:
13 name: "Bedroom Auto Triggered"Теперь автоматизация:
1# automations.yaml
2- alias: "Follow Me - Living Room Entry"
3 trigger:
4 - platform: state
5 entity_id: binary_sensor.living_room_occupied
6 to: "on"
7 condition:
8 - condition: state
9 entity_id: light.living_room
10 state: "off"
11 action:
12 # Dim the previous room if it was auto-triggered
13 - choose:
14 - conditions:
15 - condition: template
16 value_template: "{{ states('input_text.last_occupied_room') == 'kitchen' }}"
17 - condition: state
18 entity_id: input_boolean.kitchen_auto_triggered
19 state: "on"
20 sequence:
21 - service: light.turn_on
22 target:
23 entity_id: light.kitchen
24 data:
25 brightness_pct: 20
26 transition: 3
27 # Turn on current room
28 - service: light.turn_on
29 target:
30 entity_id: light.living_room
31 data:
32 brightness_pct: 100
33 - service: input_boolean.turn_on
34 target:
35 entity_id: input_boolean.living_room_auto_triggered
36 - service: input_text.set_value
37 target:
38 entity_id: input_text.last_occupied_room
39 data:
40 value: "living_room"
41
42- alias: "Follow Me - Living Room Vacancy"
43 trigger:
44 - platform: state
45 entity_id: binary_sensor.living_room_occupied
46 to: "off"
47 for:
48 minutes: 2
49 condition:
50 - condition: state
51 entity_id: input_boolean.living_room_auto_triggered
52 state: "on"
53 action:
54 - service: light.turn_off
55 target:
56 entity_id: light.living_room
57 data:
58 transition: 5
59 - service: input_boolean.turn_off
60 target:
61 entity_id: input_boolean.living_room_auto_triggeredТест: После развёртывания мы с сыном пойдём по дому и посмотрим, следует ли свет за нами. Если сработает, будем чувствовать себя как в кино. Если нет, будем дебажить за пиццей.
Автоматизация 2: Ночная блокировка (СПОКОЙСТВИЕ)
Сценарий: 22:00. Я ложусь в кровать. Через пять минут Eight Sleep подтверждает, что я действительно сплю (а не просто лежу и листаю ленту). Дом реагирует: все двери запираются, гараж закрывается, если я забыл (опять), термостат переходит в ночной режим, автоматически включённые светильники плавно гаснут.
1- alias: "Bedtime - Eight Sleep Triggered Lockdown"
2 trigger:
3 - platform: state
4 entity_id: binary_sensor.eight_sleep_bed_presence
5 to: "on"
6 for:
7 minutes: 5
8 condition:
9 - condition: time
10 after: "21:00:00"
11 before: "06:00:00"
12 action:
13 # Lock all doors
14 - service: lock.lock
15 target:
16 entity_id:
17 - lock.front_door
18 - lock.back_door
19 # Close garage if open
20 - service: cover.close_cover
21 target:
22 entity_id: cover.garage_door
23 # Set Ecobee to sleep mode
24 - service: climate.set_preset_mode
25 target:
26 entity_id: climate.ecobee
27 data:
28 preset_mode: "Sleep"
29 # Turn off auto-triggered lights
30 - service: light.turn_off
31 target:
32 entity_id:
33 - light.living_room
34 - light.kitchen
35 data:
36 transition: 5Нет Eight Sleep? Замените триггером по времени (22:30) или обнаружением зарядки телефона. Логика та же.
Автоматизация 3: Автозакрытие гаража (СПАСИТЕЛЬ БРАКА)
Проблема: «Ты закрыл гараж?» Вопрос, который задаётся 3 раза в неделю в этом доме. Больше нет. После 10 минут в открытом состоянии он закрывается сам и присылает уведомление.
1- alias: "Garage - Auto Close After 10 Minutes"
2 trigger:
3 - platform: state
4 entity_id: cover.garage_door
5 to: "open"
6 for:
7 minutes: 10
8 action:
9 - service: cover.close_cover
10 target:
11 entity_id: cover.garage_door
12 - service: notify.mobile_app_your_phone
13 data:
14 title: "Garage Secured"
15 message: "Garage was open for 10 minutes. Auto-closed."
16 data:
17 tag: "garage-closed"Автоматизация 4: Умный климат (ЭКОНОМИЯ ЭНЕРГИИ)
Логика: Зачем отапливать пустой дом? Когда наши WiFi-сенсоры говорят, что никого нет дома 30 минут, Ecobee переходит в режим «Отсутствие». Когда кто-то входит, он просыпается.
1- alias: "Ecobee - Away When House Empty"
2 trigger:
3 - platform: state
4 entity_id: binary_sensor.home_occupied
5 to: "off"
6 for:
7 minutes: 30
8 action:
9 - service: climate.set_preset_mode
10 target:
11 entity_id: climate.ecobee
12 data:
13 preset_mode: "Away"
14
15- alias: "Ecobee - Home When Occupied"
16 trigger:
17 - platform: state
18 entity_id: binary_sensor.home_occupied
19 to: "on"
20 condition:
21 - condition: state
22 entity_id: climate.ecobee
23 attribute: preset_mode
24 state: "Away"
25 action:
26 - service: climate.set_preset_mode
27 target:
28 entity_id: climate.ecobee
29 data:
30 preset_mode: "Home"Создание агрегатного сенсора
binary_sensor.home_occupied - это шаблонный сенсор, объединяющий все комнатные сенсоры:
1template:
2 - binary_sensor:
3 - name: "Home Occupied"
4 state: >
5 {{ is_state('binary_sensor.living_room_occupied', 'on')
6 or is_state('binary_sensor.kitchen_occupied', 'on')
7 or is_state('binary_sensor.bedroom_occupied', 'on') }}Что может пойти не так? (Весёлая часть)
Вот в чём дело: что-то ОБЯЗАТЕЛЬНО пойдёт не так сегодня. Это не пессимизм, это реальность. И это нормально. В этом весь смысл.
Вероятные кандидаты на сегодняшнее приключение:
- Замки Z-Wave - У этих штук характер. Сопряжение может потребовать нескольких попыток.
- Калибровка WiFi-сенсора - На стенде работает, но как будет на рабочем месте?
- Граничные случаи автоматизации - Что, если кто-то пройдёт через комнату за 2 секунды?
- Проблема «вчера работало» - Любимая шутка технологий.
Но именно поэтому мы делаем это вместе. Отец и сын, устраняющие неполадки, учащиеся, наверняка спорящие о том, почему YAML не парсится. Вот как на самом деле учишься: строишь что-то реальное, смотришь, как оно ломается, и чинишь.
Шахта Зорбы рухнула. Его реакция? Танцевать на пляже. Что бы ни сломалось сегодня, мы разберёмся. А если не сможем, у нас будет отличная история за ужином.
Философия
Вот что отделяет деятелей от мечтателей:
Мечтатели исследуют месяцами. Читают каждую статью. Ждут «правильное» оборудование. Оптимизируют план, пока он не станет идеальным. Никогда не начинают.
Деятели записывают план, собирают необходимое и действуют. Они ожидают трудностей. Адаптируются на ходу. Терпят неудачи, двигаясь вперёд.
Без плана нет пути. Только люди, говорящие ради звука собственного голоса. Но план без исполнения - это просто мечта с дополнительными шагами.
Критерии успеха на сегодня
- ☐ Home Assistant работает со всеми подключёнными устройствами
- ☐ WiFi-сенсор обнаруживает движение в гостиной
- ☐ Следящее освещение работает хотя бы в одной комнате
- ☐ Автоматизация ночной блокировки активирована
- ☐ Сын говорит «это как дом Тони Старка»
Что дальше (после сегодняшнего успеха)
Если всё получится, а получится, даже если займёт больше времени, чем ожидалось:
- Полное развёртывание ESP32 3+3 - Сенсинг в каждой основной комнате, покрытие туманом по всему дому
- Настенный планшет с панелью управления - Всегда включённая панель в коридоре
- Локальное голосовое управление - Wyoming/Piper для голосовых команд, не покидающих дом
- Датчики протечек - Под каждой раковиной и рядом с водонагревателем
Но сначала: сегодня. Сначала: исполнение. Сначала: доказать, что всё это планирование действительно работает.
«Жизнь - это то, что с тобой происходит, пока ты строишь другие планы.» Джон Леннон
Неправильно. Жизнь - это то, что происходит, когда ты перестаёшь планировать и начинаешь действовать. Увидимся на другой стороне. Пора идти строить.