Умный съемный дом
В этом посте я расскажу, как работает моя домашняя инфраструктура, на чем крутятся сервисы, как они между собой связаны и зачем нужны
Предусловия
Я меняю дома и квартиры в среднем раз в два года и все они, разумеется, съемные
Поэтому у меня нет желания оборудовать полноценную серверную комнату, охлаждать ее отдельным кондиционером и связывать все девайсы стагигабитной оптикой
Вся моя домашняя экосистема сервисов и железяк должны
Умещаться в один небольшой чемодан в случае очередного переезда
Собираться на новом месте за вечер при помощи 5 метров Ethernet кабеля, скотча, WiFi на одном роутере и конфигания доступа методом «пробрось порты, дальше оно само»
Работать в любом месте независимо от наличия внешней сетки и при этом автоматически подключаться к сервисам снаружи
Не требовать от меня усилий по поддержанию сети. Я не хочу проводить больше времени за починкой инфры, чем за ее использованием
При этом, я хочу
Управлять домашней автоматизацией и отслеживать состояние дома в плане температуры, климат-контроля и прочих штук, которые попадают под понятие «умный дом»
Иметь локальную независимую медиа-библиотеку. Это музыка, фильмы и сериалы, облачное хранилище и прочий контент, который лежит на SSD и доступен из локалки и, если есть, внешнего Интернета
Хостить свои сайд-проекты, которым не нужен 99.9 uptime, вроде dev-окружений телеграм-ботов и графаны для собирания метрик
Иметь возможность менеджить учетные записи, чтобы все что описано выше работало для нескольких пользователей
Теперь я покажу, как всего этого достичь с помощью трех одноплатников, пяти метра провода и базового роутера от провайдера
Умный дом
Для того, чтобы автоматизировать домашние мелочи, вроде ежедневной уборки и нагревания воды, я использую Home Assistant
Это, в последние пять лет, самый популярный способ построить домашнюю автоматизацию, и я откровенно говоря, горд тем что успел поконтрибьюитить в развитие сервиса еще до того как с ним случился успех
Выглядит мой «дом» как набор метрик и переключателей
Железки и датчики разделены по комнатам, чтобы удобно было понимать где что происходит, при этом все, чем я не пользуюсь (а это еще примерно два таких экрана) вынесено со стартового дашборда в автоматизации
Пример работы автоматизации можно посмотреть здесь
Этот выключатель управляет бойлером: он греет воду ночью и не греет днем, чтобы не перегревать квартиру паразитным теплом и, при этом, чутка экономить на ночном тарифе
Поскольку, я говорил что все устройства должны быть съемными и легкими, никакого полноценного умного выключателя, который устанавливается прямо в стену, я заводить не хочу. Вместо этого, я использую Switch Bot
Эта нашлепка умеет нажимать кнопку и отжимать ее обратно по команде через Bluetooth, а так же поддерживает расписания
Особенно удобно, что такая имитация нажатия, не влечет необходимости сертифицироваться по электробезопасности, что в большинстве мест где я жил, обязательно при любых изменениях электрической разводки
Половина IoT-штук, которые у меня есть работают через Bluetooth LE, как и SwitchBot выше, причем они от разных производителей. Это приводит меня к трем разным вариантам огранизации управления
Использовать кучу нативных приложений, которые устанавливаются на мобилку и не использовать единый интерфейс вообще
Завести официальные гейтвеи, которые будут прокидывать трафик от IoT-штук в публичный интернет и настроить сбор данных через Google Home / Alexa / Yandex / Apple — не важно какой, они как правило все поддерживаются
Научиться перехватывать BLE трафик и уминать его сразу в Home Assistant без петли «до Сан-Франциско и обратно»
Очевидно, я выбираю третье, поскольку зависеть от серверов Яндекса или Google Home я не очень хочу, а терять возможность управлять чайником потому что провайдер сломал мне оптику — это перебор
Поэтому на отдельной, собранной на коленочке ESP-32 у меня крутится ESPHome с настроенным BLE Proxy
Задача этого сервиса — собирать весь BLE трафик и, как есть, форвардить его в домашнюю LAN, чтобы Home Assistant мог получить данные и красиво их отобразить
Рядом, на той же задней дверце шкафа, у меня крутится Pi Zero, которая запитывает ESP32 и является хабом для CO2-датчика и дозиметра (не спрашивайте) в спальне
Сам же Home Assistant развернут на Rasbperry Pi 4, которая Ethernet-кабелем подключена к домашнему роутеру
И здесь же лежит Zigbee гейтвей для второй половины домашних датчиков, которые используют этот протокол вместо BLE для обмена данными
Кроме умного дома на этой Rasbperry крутится еще Grafana, с помощью которой я отслеживаю метрики своих проектов
Медиасервер
Для того, чтобы слушать музыку, смотреть фильмы и не зависеть от подписок на всякие спотифаи и тидалы, у меня развернута другая Rasbperry Pi 5 поскольку мощностей более старых поколений здесь уже не хватает
Она связана с тем же домашним роутером и к ней же подключен SSD на два терабайта, который и является моим файлохранилищем
Причин, почему я взял дорогой SSD вместо обычного жесткого диска, три:
Он меньше шумит и не занимает много места
Его можно отцепить от малинки и взять с собой в поездку туда, где доступа к домашней сети не будет
Я не хочу решать вопросы бекапов и строить отказоустойчивые RAID-массивы, а топовые SSD работают настолько стабильно, что скорее со мной что-то случится, чем железка сломается
Так же к малинке по HDMI подключен домашний 4K TV и это ответ на вопрос, почему малинка не стоит в шкафу там же где и первая
Чтобы смотреть фильмы и слушать музыку локально, у меня поднят Kodi, который работает изумительно для домашнего использования, и который не нужно пытаться использовать для чего-то еще
Для удаленного доступа к той же медиатеке из любой точки мира, где есть Интернет, у меня развернут Plex с вечной подпиской на Plex Pass, который заменяет мне стриминги, с которыми в последние пять лет больше проблем, чем пользы
При этом Plex достаточно умен, чтобы транскодировать поток из lossless FLAC в OPUS 256 в случае, если я подключен через LTE с низкой скоростью или ограничениями по трафику
Фильмы оно играет ничуть не хуже, чем музыку, при этом адаптивный транскодинг настолько незначительно нагружает 4 ядра малинки, что одновременное проигрывание трех 4К видео по сети и вывод другой картинки на экран через Kodi, суммарно, дает примерно 50% утилизации и позволяет нагрузить Rasbperry чем-нибудь еще
Файловое хранилище
Статистически, у меня получается что облако на 2 терабайта, которое я покупаю Apple, переживает уже третье локальное хранилище, поэтому все важные файлы, я стараюсь хранить там, и просто держать локальные рабочие копии синхронизированными
Поэтому, домашняя файлопомойка для меня, это или способ наполнять медиатеку, или хранить приватные файлы, которые никогда не должны попадать в Интернет
Так что я просто поднял Samba Server и в целом мне этого достаточно
Внешний доступ
Если с локальным доступом все понятно и устройства просто доступны по адресу pi.local или pi5.local, а в большинстве случаев, вообще умеют в auto-discovery, то с доступом к домашней инфраструктуре «извне» приходится заморачиваться отдельно
Мне уже 12 лет принадлежит домен grakovne.org, который сейчас используется, чтобы обеспечивать мне доступ к домашним серверам, где бы я ни был
Традиционно, я арендую статичный IP адрес у провайдера, но в случае с текущим домом, у меня такое не вышло
Поэтому я перенес DNS записи к Cloudflare и настроил Home Assistant обновлять A-записи раз в час так, чтобы они всегда указывали на адрес моего роутера
Иногда у меня бывают проблемы с доступом, но длятся они недолго и проходят самостоятельно. Это все еще хуже, чем нормальный постоянный IP, но лучше чем ничего
Так внешний трафик попадает ко мне домой. Дальше домашний роутер пробрасывает все с портов 80 и 443 на ту малинку, где развернут умный дом, а nginx на ней по поддомену определяет, куда я хотел попасть, и с помощью реверс-прокси, роутит меня на сервис, который слушает нужный порт
Правильнее было бы сделать это прямо на роутере, но я не хочу зависеть от инфраструктуры провайдера и каждый раз настраивать маршрутизацию заново, да еще и разными способами
Чтобы достучаться до Plex и Samba, которые находятся на другом Rasbperry, я просто пробросил с роутера стандартные порты для этих сервисов напрямую и пользуюсь нативными клиентами MacOS / iOS, которые умеют к ним подключаться
Наличие собственного домена, кстати, еще и решает проблему с push-нотификациями от Дома, избавляя меня от необходимости арендовать платный сервис от NabuCasa, который мне не очень нравится
Что до адреса grakovne.org без поддоменов, то я попросил нейросетку написать для меня небольшую заглушку
Безопасность
В среде разработчиков интернета вещей, откуда я в общем-то вышел, как инженер, есть шутка о том что в аббревиатуре IoT буква S обозначает «Secure»
За последние несколько лет ситуация с утечками несколько улучшилась и из абсурдной начала быть просто ужасной так что поводов для беспокойства достаточно
SSL
Для доступа извне у меня, как я говорил, настроен Nginx. Это дает мне возможность получить SSL сертификат и настроить принудительный https для каждого поддомена в отдельности
Let’s Encrypt это, конечно, не миллион евро в кармане, но по крайней мере он решает проблему перехвата пакета и успокаивает браузеры, которые в последние пять лет откровенно утомительны в своих требованиях к наличию валидного SSL чтобы отрисовать страничку за пределами .local доменной зоны
Доступы к IoT-вещам
Все мои домашние датчики и прочие пылесосы, так или иначе управляются из Home Assistant, который расположен в той же сети, поэтому внешний Интернет им самим не нужен, даже если они не согласны
Каждому такому устройству я назначил статичный IP адрес и запретил доступ к WAN на стороне роутера, поэтому если вдруг датчик влажности для комнатного цветка соберется обновить прошивку и, после этого, сломаться в три часа ночи, этого не произойдет
Исключение, к сожалению, составляют кондиционеры. Я не нашел готовой интеграции для локальной работы, и мне, откровенно говоря, лень написать свою, поэтому они торчат напрямую в Интернет и зарегистрированы в Hisence облаке
!
В остальном, настройки безопасности базовые: сервисы закрыты аутентификацией, лишние порты роутера недоступны снаружи, на случай если нужно подключиться к чему-то напрямую из внешней сети, на одном из хабов Raspberry на нестандартном порту поднята SSH с авторизацией RSA-ключом
Производительность
Самая нагруженная часть всей домашней инфры, это роутер
После приблизительного подсчета выяснилось, что он собирает в сеть только из бытовой техники
Четыре Macbook (два комплекта из рабочего и личного ноута)
Два телефона
Две читалки Kindle, которые постоянно подключены к WiFi
Пятую PS и еще несколько мелких игровых гаджетов
Три кондиционера, которые развернуты в интернет
Дозиметр (не спрашивайте, читайте)
Кроме этого, он обслуживает три Rasbperry (четверка, пятерка и Zero), а так же все IoT-штуки, которые подключены по WiFi и является проксей для BLE-трафика, в который вкладываются не только термометры и наушники, но и всякие там стиральные машинки с чайниками
При этом, я не влияю на конфиг роутера и его модель
Пока что, мне везет и коробочки от Huawei достаточно хороши, чтобы справляться этим технопокалипсисом, но в случае если мощности не хватит, я смогу поднять более быстрый и мощный Keenetic, а стоковый роутер от провайдера превратить в GPON терминал
Для отслеживания нагрузки на малинки, у меня на каждой из них поднят rpimonitor, который показывает насколько железки готовы обслуживать мои запросы
Я считаю, что верхняя планка постоянной утилизации ресурсов не должна превышать 40%, а в пике использования — 80%
Именно поэтому, я разнес медиацентр и сервер с IoT по разным железкам и больше не думаю о том, что если я вдруг решу посмотреть кино в поезде, то у меня может не сработать скрипт ежедневной уборки дома или отвалиться датчик протечки в ванной
Автономность
Будем честны, если Интернет пропадет совсем, то у меня будут другие задачи чем выяснять почему кофеварка не приготовила мне кофе к завтраку, поэтому я хочу чтобы моя сеть могла переживать кратковременные перебои со внешней сеткой, которые связаны с инфраструктурой провайдера или перебитыми кабелями в парадной
За счет того, что все сервера и устройства находятся в одной подсети, Интернет для ее работы мне особо не нужен
Я старательно избегаю использовать интеграции с популярными сервисами вроде Alexa чтобы не оказаться в ситуации, когда сервер в шкафу не может отправить команду бойлеру в соседнем шкафу из-за того, что на другом конце мира порвалась оптическая линия
Сейчас, если я просто сижу в кресле с чашкой кофе и смотрю кино, после отключения внешней сети, ничего не произойдет: мои устройства продолжат обмениваться данными друг с другом через роутер, а данные все еще будут храниться на SSD и моментально доступны
Разумеется, пропадет доступ к кондиционерам, которые не интегрированы в домашнюю сеть, и это проблема, которую я когда-нибудь решу, причем скорее всего, очередным переездом
Расширение
Когда я работал в Arrival (и это больше не под NDA), основная идея фабрики состояла в том, что всегда можно принести любой механизм в цех сборки и он должен начать работать без донастройки и программирования
Этой же идеи я придерживаюсь у себя дома. Я хочу, чтобы любой гаджет который я достал из коробки и подключил к интернету, требовал от меня скачать нужную интеграцию и после этого бы просто работал
Сначала это было сложно, но в последние три года, стандартизация IoT работает так хорошо, что, например, датчики полива для растений, я действительно просто забрал из доставки Amazon, вытащил из заводского блиcтера, создал новый дашбор в Home Assistant и, после этого, ни разу не вспоминал о них
И я очень горд тем, что это не заслуга Xiaomi, которые сделали эти датчики, а моя персональная победа, потому что датчик отправил BLE пакет, который моя Bluetooth-proxy коробочка, спаянная на коленке, умяла в Home Assistant, а тот распознал этот сигнал и предложил мне скачать нужную интеграцию в один клик
Что касается медиацентра, там то же самое: если файл с контентом попадет в нужную папку, то в течение пары минут Kodi и Plex проиндексируют файл независимо друг от друга, вытянут из Интернета недостающие обложки, описания и рейтинги, и предложат посмотреть мне фильм в отличном качестве безо всяких подписок
Итого
Я говорил, что хочу умный дом, который делает мою жизнь проще, не требует особой настройки, монтируется в мире физических вещей на полоски скотча и проволоку и не стоит для меня ежемесячных денег
Эту конфигурацию, не считая кондиционеров, которые всегда прикручены к своим стенам, я таскаю за собой уже довольно давно. Как минимум она пережила переезд из Питера на Кипр, и потом в Белграде приросла еще одним хабом на пятой малинке, потому что 4K видео сами себя на лету не транскодируют, знаете ли
И это, определенно успех
Теперь, когда вы прочитали этот пост, вы можете поднять у себя примерно то же самое с похожим результатом. Для этого вам нужно методично прокликать по ссылкам, которые я оставил по тексту на сервисы и платформы, или найти их же все в следующем абзаце
https://www.samba.org/
https://www.plex.tv/
https://kodi.tv/
https://www.home-assistant.io/
https://www.switch-bot.com/
https://grafana.com/
https://www.mijia-shop.com/product/xiaomi-smart-home-gateway-3/
https://www.raspberrypi.com/products/raspberry-pi-zero/
https://esphome.io/components/bluetooth_proxy.html
https://www.cloudflare.com/
https://www.home-assistant.io/integrations/cloudflare/
https://github.com/XavierBerger/RPi-Monitor
Я искренне считаю, что все что может быть упрощено автоматизацией, должно быть упрощено автоматизацией и я не думаю, что все, что я сделал — действительно сложно и требует какой-то специальной подготовки