Умный съемный дом

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

Предусловия

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

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

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

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

  • Собираться на новом месте за вечер при помощи 5 метров Ethernet кабеля, скотча, WiFi на одном роутере и конфигания доступа методом «пробрось порты, дальше оно само»

  • Работать в любом месте независимо от наличия внешней сетки и при этом автоматически подключаться к сервисам снаружи

  • Не требовать от меня усилий по поддержанию сети. Я не хочу проводить больше времени за починкой инфры, чем за ее использованием

При этом, я хочу

  • Управлять домашней автоматизацией и отслеживать состояние дома в плане температуры, климат-контроля и прочих штук, которые попадают под понятие «умный дом»

  • Иметь локальную независимую медиа-библиотеку. Это музыка, фильмы и сериалы, облачное хранилище и прочий контент, который лежит на SSD и доступен из локалки и, если есть, внешнего Интернета

  • Хостить свои сайд-проекты, которым не нужен 99.9 uptime, вроде dev-окружений телеграм-ботов и графаны для собирания метрик

  • Иметь возможность менеджить учетные записи, чтобы все что описано выше работало для нескольких пользователей

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

Умный дом

Для того, чтобы автоматизировать домашние мелочи, вроде ежедневной уборки и нагревания воды, я использую Home Assistant

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

Выглядит мой «дом» как набор метрик и переключателей

aeeknkzvqafiujowevdl0gikx1u.png

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

Пример работы автоматизации можно посмотреть здесь

d5vpbk3uv_vcdfm9r2pvjevh-s4.png

Этот выключатель управляет бойлером: он греет воду ночью и не греет днем, чтобы не перегревать квартиру паразитным теплом и, при этом, чутка экономить на ночном тарифе

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

pltjvorkzspnxwik3frhwnswgzs.jpeg

Эта нашлепка умеет нажимать кнопку и отжимать ее обратно по команде через Bluetooth, а так же поддерживает расписания

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

Половина IoT-штук, которые у меня есть работают через Bluetooth LE, как и SwitchBot выше, причем они от разных производителей. Это приводит меня к трем разным вариантам огранизации управления

  • Использовать кучу нативных приложений, которые устанавливаются на мобилку и не использовать единый интерфейс вообще

  • Завести официальные гейтвеи, которые будут прокидывать трафик от IoT-штук в публичный интернет и настроить сбор данных через Google Home / Alexa / Yandex / Apple — не важно какой, они как правило все поддерживаются

  • Научиться перехватывать BLE трафик и уминать его сразу в Home Assistant без петли «до Сан-Франциско и обратно»

Очевидно, я выбираю третье, поскольку зависеть от серверов Яндекса или Google Home я не очень хочу, а терять возможность управлять чайником потому что провайдер сломал мне оптику — это перебор

Поэтому на отдельной, собранной на коленочке ESP-32 у меня крутится ESPHome с настроенным BLE Proxy

uibat858bar2lvfdv0cudlzurqw.jpeg

Задача этого сервиса — собирать весь BLE трафик и, как есть, форвардить его в домашнюю LAN, чтобы Home Assistant мог получить данные и красиво их отобразить

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

yuih7lpnzgw6ga7gfhy8j7ctdmm.jpeg

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

ibbsakoxdriic3sikn8f0jwt5cy.jpeg

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

Кроме умного дома на этой Rasbperry крутится еще Grafana, с помощью которой я отслеживаю метрики своих проектов

lgcvdkcqgca5ijrkm9thrmf1_0a.png

Медиасервер

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

egp3nqeqdvmzvtjp6_e_tqrnzdq.jpeg

Она связана с тем же домашним роутером и к ней же подключен SSD на два терабайта, который и является моим файлохранилищем

Причин, почему я взял дорогой SSD вместо обычного жесткого диска, три:

  • Он меньше шумит и не занимает много места

  • Его можно отцепить от малинки и взять с собой в поездку туда, где доступа к домашней сети не будет

  • Я не хочу решать вопросы бекапов и строить отказоустойчивые RAID-массивы, а топовые SSD работают настолько стабильно, что скорее со мной что-то случится, чем железка сломается

Так же к малинке по HDMI подключен домашний 4K TV и это ответ на вопрос, почему малинка не стоит в шкафу там же где и первая

Чтобы смотреть фильмы и слушать музыку локально, у меня поднят Kodi, который работает изумительно для домашнего использования, и который не нужно пытаться использовать для чего-то еще

mefzr72sfhm4ijlvte43uga2yvy.jpeg

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

-2gnpi1hb5im9wylhnmspfi_02g.jpeg

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

l0bjzhkoqe--g9c8ceotxdiqh0w.png

Фильмы оно играет ничуть не хуже, чем музыку, при этом адаптивный транскодинг настолько незначительно нагружает 4 ядра малинки, что одновременное проигрывание трех 4К видео по сети и вывод другой картинки на экран через Kodi, суммарно, дает примерно 50% утилизации и позволяет нагрузить Rasbperry чем-нибудь еще

Файловое хранилище

Статистически, у меня получается что облако на 2 терабайта, которое я покупаю Apple, переживает уже третье локальное хранилище, поэтому все важные файлы, я стараюсь хранить там, и просто держать локальные рабочие копии синхронизированными

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

Так что я просто поднял Samba Server и в целом мне этого достаточно

mpg4skj9cialy0kyenefcgpupsg.png

Внешний доступ

Если с локальным доступом все понятно и устройства просто доступны по адресу pi.local или pi5.local, а в большинстве случаев, вообще умеют в auto-discovery, то с доступом к домашней инфраструктуре «извне» приходится заморачиваться отдельно

Мне уже 12 лет принадлежит домен grakovne.org, который сейчас используется, чтобы обеспечивать мне доступ к домашним серверам, где бы я ни был

Традиционно, я арендую статичный IP адрес у провайдера, но в случае с текущим домом, у меня такое не вышло

Поэтому я перенес DNS записи к Cloudflare и настроил Home Assistant обновлять A-записи раз в час так, чтобы они всегда указывали на адрес моего роутера

lduvkpd_jgiqqranw71vysqsi0i.png

Иногда у меня бывают проблемы с доступом, но длятся они недолго и проходят самостоятельно. Это все еще хуже, чем нормальный постоянный IP, но лучше чем ничего

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

oexkp1al5es-grdg05jcdlt4ezc.png

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

Чтобы достучаться до Plex и Samba, которые находятся на другом Rasbperry, я просто пробросил с роутера стандартные порты для этих сервисов напрямую и пользуюсь нативными клиентами MacOS / iOS, которые умеют к ним подключаться

Наличие собственного домена, кстати, еще и решает проблему с push-нотификациями от Дома, избавляя меня от необходимости арендовать платный сервис от NabuCasa, который мне не очень нравится

51f9zv0pthigdbolb66qvoddrwa.jpeg

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

-qwyoq7wyq82ubcsnzkefs5maeo.png

Безопасность

В среде разработчиков интернета вещей, откуда я в общем-то вышел, как инженер, есть шутка о том что в аббревиатуре IoT буква S обозначает «Secure»

За последние несколько лет ситуация с утечками несколько улучшилась и из абсурдной начала быть просто ужасной так что поводов для беспокойства достаточно

SSL

Для доступа извне у меня, как я говорил, настроен Nginx. Это дает мне возможность получить SSL сертификат и настроить принудительный https для каждого поддомена в отдельности

o9fs_fckfroch7zz8-k7lbi2y24.png

Let’s Encrypt это, конечно, не миллион евро в кармане, но по крайней мере он решает проблему перехвата пакета и успокаивает браузеры, которые в последние пять лет откровенно утомительны в своих требованиях к наличию валидного SSL чтобы отрисовать страничку за пределами .local доменной зоны

Доступы к IoT-вещам

Все мои домашние датчики и прочие пылесосы, так или иначе управляются из Home Assistant, который расположен в той же сети, поэтому внешний Интернет им самим не нужен, даже если они не согласны

Каждому такому устройству я назначил статичный IP адрес и запретил доступ к WAN на стороне роутера, поэтому если вдруг датчик влажности для комнатного цветка соберется обновить прошивку и, после этого, сломаться в три часа ночи, этого не произойдет

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

!

b0mj6jsdlyjga2b8cyj1ic5yvre.jpeg

В остальном, настройки безопасности базовые: сервисы закрыты аутентификацией, лишние порты роутера недоступны снаружи, на случай если нужно подключиться к чему-то напрямую из внешней сети, на одном из хабов Raspberry на нестандартном порту поднята SSH с авторизацией RSA-ключом

Производительность

Самая нагруженная часть всей домашней инфры, это роутер

После приблизительного подсчета выяснилось, что он собирает в сеть только из бытовой техники

  • Четыре Macbook (два комплекта из рабочего и личного ноута)

  • Два телефона

  • Две читалки Kindle, которые постоянно подключены к WiFi

  • Пятую PS и еще несколько мелких игровых гаджетов

  • Три кондиционера, которые развернуты в интернет

  • Дозиметр (не спрашивайте, читайте)

Кроме этого, он обслуживает три Rasbperry (четверка, пятерка и Zero), а так же все IoT-штуки, которые подключены по WiFi и является проксей для BLE-трафика, в который вкладываются не только термометры и наушники, но и всякие там стиральные машинки с чайниками

lpduzq5cwtbvizvlbihxxnzjdl4.jpeg

При этом, я не влияю на конфиг роутера и его модель

Пока что, мне везет и коробочки от Huawei достаточно хороши, чтобы справляться этим технопокалипсисом, но в случае если мощности не хватит, я смогу поднять более быстрый и мощный Keenetic, а стоковый роутер от провайдера превратить в GPON терминал

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

Я считаю, что верхняя планка постоянной утилизации ресурсов не должна превышать 40%, а в пике использования — 80%

zdcg4d0j7rsxcrc6persupneito.png

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

Автономность

Будем честны, если Интернет пропадет совсем, то у меня будут другие задачи чем выяснять почему кофеварка не приготовила мне кофе к завтраку, поэтому я хочу чтобы моя сеть могла переживать кратковременные перебои со внешней сеткой, которые связаны с инфраструктурой провайдера или перебитыми кабелями в парадной

За счет того, что все сервера и устройства находятся в одной подсети, Интернет для ее работы мне особо не нужен

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

Сейчас, если я просто сижу в кресле с чашкой кофе и смотрю кино, после отключения внешней сети, ничего не произойдет: мои устройства продолжат обмениваться данными друг с другом через роутер, а данные все еще будут храниться на SSD и моментально доступны

Разумеется, пропадет доступ к кондиционерам, которые не интегрированы в домашнюю сеть, и это проблема, которую я когда-нибудь решу, причем скорее всего, очередным переездом

Расширение

Когда я работал в Arrival (и это больше не под NDA), основная идея фабрики состояла в том, что всегда можно принести любой механизм в цех сборки и он должен начать работать без донастройки и программирования

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

Сначала это было сложно, но в последние три года, стандартизация IoT работает так хорошо, что, например, датчики полива для растений, я действительно просто забрал из доставки Amazon, вытащил из заводского блиcтера, создал новый дашбор в Home Assistant и, после этого, ни разу не вспоминал о них

x2efnkrndawa-hkvpjz52lvsbfe.jpeg

И я очень горд тем, что это не заслуга 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

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

© Habrahabr.ru