- PVSM.RU - https://www.pvsm.ru -
В этом посте я расскажу как работает моя домашняя инфраструктура, на чем крутятся сервисы, как они между собой связаны и зачем нужны
Предусловия
Я меняю дома и квартиры в среднем раз в два года и все они, разумеется, съемные
Поэтому у меня нет желания оборудовать полноценную серверную комнату, охлаждать ее отдельным кондиционером и связывать все девайсы стагигабитной оптикой
Вся моя домашняя экосистема сервисов и железяк должны
Умещаться в один небольшой чемодан в случае очередного переезда
Собираться на новом месте за вечер при помощи 5 метров Ethernet кабеля, скотча, WiFi на одном роутере и конфигания доступа методом "пробрось порты, дальше оно само"
Работать в любом месте независимо от наличия внешней сетки и при этом автоматически подключаться к сервисам снаружи
Не требовать от меня усилий по поддержанию сети. Я не хочу проводить больше времени за починкой инфры, чем за ее использованием
При этом, я хочу
Управлять домашней автоматизацией и отслеживать состояние дома в плане температуры, климат-контроля и прочих штук, которые попадают под понятие "умный дом"
Иметь локальную независимую медиа-библиотеку. Это музыка, фильмы и сериалы, облачное хранилище и прочий контент, который лежит на SSD и доступен из локалки и, если есть, внешнего Интернета
Хостить свои сайд-проекты, которым не нужен 99.9 uptime, вроде dev-окружений телеграм-ботов и графаны для собирания метрик
Иметь возможность менеджить учетные записи, чтобы все что описано выше работало для нескольких пользователей
Теперь я покажу, как всего этого достичь с помощью трех одноплатников, пяти метра провода и базового роутера от провайдера
Умный дом
Для того, чтобы автоматизировать домашние мелочи, вроде ежедневной уборки и нагревания воды, я использую Home Assistant [1]
Это, в последние пять лет, самый популярный способ построить домашнюю автоматизацию, и я, откровенно говоря, горд тем, что успел поконтрибьюитить в развитие сервиса еще до того, как с ним случился успех
Выглядит мой "дом" как набор метрик и переключателей

Железки и датчики разделены по комнатам, чтобы удобно было понимать где что происходит. При этом все, чем я не пользуюсь (а это еще примерно два таких экрана) вынесено со стартового дашборда в автоматизации
Пример работы автоматизации можно посмотреть здесь

Этот выключатель управляет бойлером: он греет воду ночью и не греет днем. Это позволяет не перегревать квартиру паразитным теплом и чутка экономить на ночном тарифе
Поскольку, я говорил, что все устройства должны быть съемными и легкими, никакого полноценного умного выключателя, который устанавливается прямо в стену, я заводить не хочу. Вместо этого, я использую Switch Bot [2]

Эта нашлепка умеет нажимать кнопку и отжимать ее обратно по команде через Bluetooth, а также поддерживает расписания
Особенно удобно, что такая имитация нажатия не влечет необходимости сертифицироваться по электробезопасности, что в большинстве мест где я жил обязательно при любых изменениях электрической разводки
Половина IoT-штук, которые у меня есть, работают через Bluetooth LE, как и SwitchBot выше, причем они от разных производителей. Это приводит меня к трем разным вариантам огранизации управления
Использовать кучу нативных приложений, которые устанавливаются на мобилку, и не использовать единый интерфейс вообще
Завести официальные гейтвеи, которые будут прокидывать трафик от IoT-штук в публичный интернет и настроить сбор данных через Google Home / Alexa / Yandex / Apple - не важно какой, они, как правило, все поддерживаются
Научиться перехватывать BLE трафик и уминать его сразу в Home Assistant без петли "до Сан-Франциско и обратно"
Очевидно, я выбираю третье, поскольку зависеть от серверов Яндекса или Google Home я не очень хочу, а терять возможность управлять чайником, потому что провайдер сломал мне оптику - это перебор
Поэтому на отдельной, собранной на коленочке ESP-32, у меня крутится ESPHome с настроенным BLE Proxy [3]

Задача этого сервиса - собирать весь BLE трафик и, как есть, форвардить его в домашнюю LAN, чтобы Home Assistant мог получить данные и красиво их отобразить
Рядом, на той же задней дверце шкафа в спальне, у меня крутится Pi Zero, которая запитывает ESP32 и является хабом для CO2-датчика и дозиметра (не спрашивайте)

Сам же Home Assistant развернут на Rasbperry Pi 4, которая Ethernet-кабелем подключена к домашнему роутеру

И здесь же лежит Zigbee гейтвей [4] для второй половины домашних датчиков, которые используют этот протокол вместо BLE для обмена данными
Кроме умного дома на этой Rasbperry крутится еще Grafana [5], с помощью которой я отслеживаю метрики своих проектов

Медиасервер
Для того, чтобы слушать музыку, смотреть фильмы и не зависеть от подписок на всякие спотифаи и тидалы, у меня развернута другая Rasbperry Pi 5, поскольку мощностей более старых поколений здесь уже не хватает

Она связана с тем же домашним роутером, и к ней же подключен SSD [6] на два терабайта, который и является моим файлохранилищем
Причин, почему я взял дорогой SSD вместо обычного жесткого диска, три:
Он меньше шумит и не занимает много места
Его можно отцепить от малинки и взять с собой в поездку туда, где доступа к домашней сети не будет
Я не хочу решать вопросы бекапов и строить отказоустойчивые RAID-массивы. Топовые SSD работают настолько стабильно, что скорее со мной что-то случится, чем железка сломается
Так же к малинке по HDMI подключен домашний 4K TV и это ответ на вопрос, почему малинка не стоит в шкафу там же где и первая
Чтобы смотреть фильмы и слушать музыку локально, у меня поднят Kodi [7]. Он работает изумительно для домашнего использования, и его не нужно пытаться использовать для чего-то еще

Для удаленного доступа к той же медиатеке из любой точки мира, где есть Интернет, у меня развернут Plex [8] с вечной подпиской на Plex Pass, который заменяет мне стриминги, с которыми в последние пять лет больше проблем, чем пользы

При этом Plex достаточно умен, чтобы транскодировать поток из lossless FLAC в OPUS 256 в случае, если я подключен через LTE с низкой скоростью или ограничениями по трафику

Фильмы оно играет ничуть не хуже, чем музыку, при этом адаптивный транскодинг настолько незначительно нагружает 4 ядра малинки, что одновременное проигрывание трех 4К видео по сети и вывод другой картинки на экран через Kodi, суммарно, дает примерно 50% утилизации и позволяет нагрузить Rasbperry чем-нибудь еще
Файловое хранилище
Статистически, у меня получается что облако на 2 терабайта, которое я покупаю у Apple, переживает уже третье локальное хранилище. Поэтому все важные файлы я стараюсь хранить там, и просто держать локальные рабочие копии синхронизированными
Поэтому домашняя файлопомойка для меня, это или способ наполнять медиатеку, или хранить приватные файлы, которые никогда не должны попадать в Интернет
Так что я просто поднял Samba Server [9] и в целом мне этого достаточно

Внешний доступ
Если с локальным доступом все понятно, и устройства просто доступны по адресу pi.local или pi5.local, а сервисы, в большинстве случаев, вообще умеют в auto-discovery, то с доступом к домашней инфраструктуре "извне" приходится заморачиваться отдельно
Мне уже 12 лет принадлежит домен grakovne.org [10], который сейчас используется, чтобы обеспечивать мне доступ к домашним серверам, где бы я ни был
Традиционно я арендую статичный IP адрес у провайдера, но в случае с текущим домом у меня такое не вышло
Поэтому я перенес DNS записи к Cloudflare [11] и настроил [12] Home Assistant обновлять A-записи раз в час так, чтобы они всегда указывали на адрес моего роутера

Иногда у меня бывают проблемы с доступом, но длятся они недолго и проходят самостоятельно. Это все еще хуже, чем нормальный постоянный IP, но лучше чем ничего
Так внешний трафик попадает ко мне домой. Дальше домашний роутер пробрасывает все с портов 80 и 443 на ту малинку, где развернут умный дом, а nginx на ней по поддомену определяет, куда я хотел попасть, и с помощью реверс-прокси роутит меня на сервис, который слушает нужный порт

Правильнее было бы сделать это прямо на роутере, но я не хочу зависеть от инфраструктуры провайдера и каждый раз настраивать маршрутизацию заново, да еще и разными способами
Чтобы достучаться до Plex и Samba, которые находятся на другом Rasbperry, я просто пробросил с роутера стандартные порты для этих сервисов напрямую и пользуюсь нативными клиентами MacOS / iOS, которые умеют к ним подключаться
Наличие собственного домена, кстати, еще и решает проблему с push-нотификациями от Дома, избавляя меня от необходимости арендовать платный сервис от NabuCasa, который мне не очень нравится

Что до адреса grakovne.org [13] без поддоменов, то я попросил нейросетку написать для меня небольшую заглушку

Безопасность
В среде разработчиков интернета вещей есть шутка о том что в аббревиатуре IoT буква S обозначает "Secure"
За последние несколько лет ситуация с утечками несколько улучшилась и из абсурдной начала быть просто ужасной, так что поводов для беспокойства достаточно
SSL
Для доступа извне у меня, как я говорил, настроен Nginx [14]. Это дает мне возможность получить SSL сертификат и настроить принудительный https для каждого поддомена в отдельности

Let's Encrypt [15] это, конечно, не миллион евро в кармане, но по крайней мере он решает проблему перехвата пакета и успокаивает браузеры, которые в последние пять лет откровенно утомительны в своих требованиях к наличию валидного SSL чтобы отрисовать страничку за пределами .local доменной зоны
Доступы к IoT-вещам
Все мои домашние датчики и прочие пылесосы, так или иначе управляются из Home Assistant, который расположен в той же сети. Поэтому внешний Интернет им самим не нужен, даже если они не согласны
Каждому такому устройству я назначил статичный IP адрес и запретил доступ к WAN на стороне роутера, поэтому, если вдруг датчик влажности для комнатного цветка соберется обновить прошивку и, после этого, сломаться в три часа ночи, этого не произойдет
Исключение, к сожалению, составляют кондиционеры. Я не нашел готовой интеграции для локальной работы, и мне, откровенно говоря, лень написать свою, поэтому они торчат напрямую в Интернет и зарегистрированы в Hisence облаке
!

В остальном настройки безопасности базовые: сервисы закрыты аутентификацией, лишние порты роутера недоступны снаружи, на случай если нужно подключиться к чему-то напрямую из внешней сети, на одном из хабов Raspberry на нестандартном порту поднята SSH с авторизацией RSA-ключом
Производительность
Самая нагруженная часть всей домашней инфры - это роутер
После приблизительного подсчета выяснилось, что он собирает в сеть только из бытовой техники
Четыре Macbook (два комплекта из рабочего и личного ноута)
Два телефона
Две читалки Kindle, которые постоянно подключены к WiFi
Пятую PS и еще несколько мелких игровых гаджетов
Три кондиционера, которые развернуты в интернет
Дозиметр (не спрашивайте, читайте [16])
Кроме этого, роутер обслуживает три Rasbperry (четверка, пятерка и Zero), а так же все IoT-штуки, которые подключены по WiFi и является проксей для BLE-трафика, в который вкладываются не только термометры и наушники, но и всякие там стиральные машинки с чайниками

При этом, я не влияю на конфиг роутера и его модель
Пока что мне везет и коробочки от Huawei достаточно хороши, чтобы справляться этим технопокалипсисом, но в случае если мощности не хватит, я смогу поднять более быстрый и мощный Keenetic, а стоковый роутер от провайдера превратить в GPON терминал
Для отслеживания нагрузки на малинки у меня на каждой из них поднят rpimonitor [17], который показывает насколько железки готовы обслуживать мои запросы
Я считаю, что верхняя планка постоянной утилизации ресурсов не должна превышать 40%, а в пике использования - 80%

Именно поэтому я разнес медиацентр и сервер с IoT по разным железкам и больше не думаю о том, что если я вдруг решу посмотреть кино в поезде, то у меня может не сработать скрипт ежедневной уборки дома или отвалиться датчик протечки в ванной
Автономность
Будем честны, если Интернет пропадет совсем, то у меня будут другие задачи. Поэтому я хочу чтобы моя сеть могла переживать кратковременные перебои со внешней сеткой, которые связаны с инфраструктурой провайдера или перебитыми кабелями в парадной
За счет того, что все сервера и устройства находятся в одной подсети, Интернет им особо не нужен
Я старательно избегаю использовать интеграции с популярными сервисами вроде Alexa. Не хочу оказаться в ситуации, когда сервер шкафу не может отправить команду бойлеру в соседнем шкафу из-за того, что на другом конце мира порвалась оптическая линия
Сейчас, если я просто сижу в кресле с чашкой кофе и смотрю кино, после отключения внешней сети ничего не произойдет: мои устройства продолжат обмениваться данными друг с другом через роутер, а данные все еще будут храниться на SSD и моментально доступны
Разумеется, пропадет доступ к кондиционерам, которые не интегрированы в домашнюю сеть, и это проблема, которую я когда-нибудь решу, причем скорее всего, очередным переездом
Расширение
Когда я работал в Arrival (и это больше не под NDA), основная идея фабрики состояла в том, что всегда можно принести любой механизм в цех сборки, и он должен начать работать без донастройки и программирования
Этой же идеи я придерживаюсь у себя дома. Я хочу, чтобы любой гаджет, который я достал из коробки и подключил к интернету, требовал от меня скачать нужную интеграцию и после этого бы просто работал
Сначала это было сложно, но в последние три года стандартизация IoT работает так хорошо, что, например, датчики полива для растений я действительно просто забрал из доставки Amazon, вытащил из заводского блиcтера, создал новый дашбор в Home Assistant и, после этого, ни разу не вспоминал о них

И я очень горд тем, что это не заслуга Xiaomi, которые сделали эти датчики. Это моя персональная победа. Потому что датчик отправил BLE пакет, моя Bluetooth-proxy коробочка умяла его в Home Assistant, а тот распознал этот сигнал и предложил скачать нужную интеграцию в один клик
Что касается медиацентра, там то же самое: если файл с контентом попадет в нужную папку, то в течение пары минут Kodi и Plex проиндексируют файл независимо друг от друга, вытянут из Интернета недостающие обложки, описания и рейтинги, и предложат посмотреть мне фильм в отличном качестве безо всяких подписок
Итого
Я говорил, что хочу умный дом, который делает мою жизнь проще, не требует особой настройки, монтируется в мире физических вещей на полоски скотча и проволоку и не стоит для меня ежемесячных денег
Эту конфигурацию, не считая кондиционеров, которые всегда прикручены к своим стенам, я таскаю за собой уже довольно давно. Как минимум она пережила переезд из Питера на Кипр, и потом в Белграде приросла еще одним хабом на пятой малинке, потому что 4K видео сами себя на лету не транскодируют, знаете ли
И это, определенно успех
Теперь, когда вы прочитали этот пост, вы можете поднять у себя примерно то же самое с похожим результатом. Для этого вам нужно методично прокликать по ссылкам, которые я оставил по тексту на сервисы и платформы, или найти их же все в следующем абзаце
https://kodi.tv/ [7]
https://www.home-assistant.io/ [1]
https://www.switch-bot.com/ [2]
https://www.mijia-shop.com/product/xiaomi-smart-home-gateway-3/ [4]
https://www.raspberrypi.com/products/raspberry-pi-zero/ [18]
https://esphome.io/components/bluetooth_proxy.html [3]
https://www.cloudflare.com/ [11]
https://www.home-assistant.io/integrations/cloudflare/ [12]
https://github.com/XavierBerger/RPi-Monitor [17]
Я искренне считаю, что все что может быть упрощено автоматизацией, должно быть упрощено автоматизацией и я не думаю, что все, что я сделал - действительно сложно и требует какой-то специальной подготовки
Автор: Макс Граков
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/avtomatizatsiya/391817
Ссылки в тексте:
[1] Home Assistant: https://www.home-assistant.io/
[2] Switch Bot: https://www.switch-bot.com/?sscid=51k8_zupew&
[3] ESPHome с настроенным BLE Proxy: https://esphome.io/components/bluetooth_proxy.html
[4] Zigbee гейтвей: https://www.mijia-shop.com/product/xiaomi-smart-home-gateway-3/
[5] Grafana: https://grafana.com/
[6] SSD: https://www.amazon.com/SAMSUNG-Portable-SSD-1TB-MU-PC1T0T/dp/B0874XN4D8
[7] Kodi: https://kodi.tv/
[8] Plex: https://www.plex.tv/
[9] Samba Server: https://www.samba.org/
[10] grakovne.org: http://grakovne.org
[11] Cloudflare: https://www.cloudflare.com/en-gb/
[12] настроил: https://www.home-assistant.io/integrations/cloudflare/
[13] grakovne.org: http://grakovne.org/
[14] Nginx: https://nginx.org/en/
[15] Let's Encrypt: https://letsencrypt.org/
[16] читайте: https://habr.com/ru/articles/669156/
[17] rpimonitor: https://github.com/XavierBerger/RPi-Monitor
[18] https://www.raspberrypi.com/products/raspberry-pi-zero/: https://www.raspberrypi.com/products/raspberry-pi-zero/
[19] Источник: https://habr.com/ru/articles/818691/?utm_source=habrahabr&utm_medium=rss&utm_campaign=818691
Нажмите здесь для печати.