Как стать автором
Обновить

Скотч, кабель, Интернет: умный съемный дом

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров18K

В этом посте я расскажу как работает моя домашняя инфраструктура, на чем крутятся сервисы, как они между собой связаны и зачем нужны

Предусловия

Я меняю дома и квартиры в среднем раз в два года и все они, разумеется, съемные

Поэтому у меня нет желания оборудовать полноценную серверную комнату, охлаждать ее отдельным кондиционером и связывать все девайсы стагигабитной оптикой

Вся моя домашняя экосистема сервисов и железяк должны

  • Умещаться в один небольшой чемодан в случае очередного переезда

  • Собираться на новом месте за вечер при помощи 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

Я искренне считаю, что все что может быть упрощено автоматизацией, должно быть упрощено автоматизацией и я не думаю, что все, что я сделал - действительно сложно и требует какой-то специальной подготовки

Теги:
Хабы:
Всего голосов 55: ↑51 и ↓4+59
Комментарии64

Публикации