В последние несколько лет тема построения умного дома обрела значительную популярность, благо на рынке появилось множество подходящих под это дело устройств и ПО. Не обошла она и меня — в 2019 г. я сделал нечто подобное у себя, и этим опытом хочу поделиться.
Напомню, что умный дом — это совокупность связанных между собой устройств, обеспечивающих автоматизацию рутинных процессов в доме. К устройствам относятся 1) датчики (температуры, света, движения, газа и др.), 2) управляемые устройства (колонки, осветительные приборы, климатическая техника), и 3) хаб, собирающий данные с первых и посылающий команды вторым под управлением некоторого софта.
Основная цель такой системы — облегчение жизни через автоматизацию рутинных действий. Например, если каждый раз проходя через тёмный коридор вы включаете свет, то почему бы не поставить туда датчик движения и вкрутить управляемую лампу, чтобы это происходило автоматически. Сюда же можно отнести включение кондиционера или отопления при достижении определённой температуры, включение света и музыки для пробуждения, выключение всех приборов при уходе из дома и так далее. Владельцы больших квартир с тёплыми полами и загородных домов при помощи умнификации дома могут значительно сократить расход электроэнергии, а, следовательно, и денег.
Другая функция умного дома — не только автоматизация того, что можно сделать и самому, но и добавление новых возможностей. К ним я отнесу медиа-систему, удалённую загрузку данных и доступ к ним.
Ну и самое важное: построение умного дома — это примерно как игра в конструктор для взрослых. Скорее всего вы не будете использовать большинство возможностей, вполне вероятно, что в итоге из всех автоматизаций останется только включаюшаяся по датчику движения лампочка в корридоре, но в любом случае, если вам нравится обустраивать своё жилище и копаться в технике, вы неплохо проведёте время, собирая это лего из разных устройств.
В этом посте я постараюсь максимально подробно описать, как самостоятельно построить простой и мобильный вариант такой системы. Для начала очерчу основные развилки в выборе построения вариантов умного дома.
Как известно, вес — это надёжность, поэтому если вы человек старой закалки, который не приемлет все эти новые беспроводные технологии, поскольку «а что если интернет отключат/сеть взломают/электромагнитную бомбу сбросят», то вы наверняка закупите несколько килограмм медного провода и начнёте штробить каждую стену, чтобы провести его по квартире и подключить к устройствам. Щупальца получившегося спрута вы заботливо протянете к электрическому щитку, размером с небольшой холодильник, а управление всем этим делом будет осуществляться при помощи десятков реле и контроллера с простой, но надёжной логикой. В итоге получится что-то вроде такого.
В моём случае этот вариант отпадал хотя бы той причине, что я не психживу на съёмной квартире, где никто не разрешит издеваться над стенами. В этой ситуации единственный выход — использовать беспроводное соединение для связи хаба и устройств.
Под готовыми решениями я понимаю системы умного дома от Xiaomi, Philips, Ikea и разных других производителей, которые позволяют купить в соседнем магазине все компоненты системы, за полчаса подключить их и настроить все автоматизации, а бонусом ещё предоставляют возможность удалённо управлять всем хозяйством, находясь вне домашней сети, поскольку пропускают все запросы через свой сервер.
Плюсы существенные, но и минусы весьма весомые, по крайней мере для меня. Во-первых, это ограниченные возможности кастомизации. В большинстве случаев вы не сможете добавить функциональность, непредусмотренную производителем, а ведь именно в возможнсти соединить что угодно с чем угодно и заключется самый смак умного дома. Особо умелые граждане могут расширять самодельный умный дом самодельными же устройствами. Второй минус — это цена. Брендовые компоненты обычно дороже безымянных аналогов с алиэкспресса. Третий недостаток — зависимость от производителя, который, во-первых, может исчезнуть и остановить свои сервера, из-за чего система потеряет часть функциональности, а во-вторых, будет следить за вами.
Самодельная система не имеет этих минусов, но требует времени и навыков для настройки. Более подробно возможные варианты устройства умного дома описал Вастрик, рекомендую ознакомиться. Этот же пост является руководством по настройке одного из вариантов такой системы, больше других приглянувшихся лично мне.
Но вначале определим список функций, которые хотелось бы видеть в нашей платформе для умного дома.
Во-первых, он должен выступать в роли хаба, управляющего умными устройствами. В свою очередь самые важные характеристики хаба — это 1) наличие интерфейса для гибкого задания сценариев автоматизации, желательно без необходимости владения языком программирования, 2) возможность коммуникации с устройствами и датчиками по всем основным протоколам (WI-FI, ZigBee, ZWave).
Во-вторых, я бы хотел использовать эту платформу для создания медиацентра, которую можно подключить к телевизору и потреблять медиаконтент. То есть речь идёт о функциональности, которая заложена в умные телевизоры (SmartTV) или устройства, полключаемые к обычным телевизорам, типа Xiaomi Mi TV Stick. Они позволяют проигрывать заранее загруженные файлы, подключаться к онлайн видеосервисами, типа Okko, и провайдерами IPTV. В эту же группу хотелок можно записать желание организовать на базе нашей платформы свою электронною библиотеку, где можно было бы хранить и читать книги, и добавить адаптивную подсветку экрана телевизора, при помощи, например Hyperion Ambilight.
В-третьих, было бы классно, если нашу платформу можно было бы использовать как NAS, т.е. сетевое хранилище информации. Эти хранилища представляют собой компьютер с некоторым, часто весьма значительным дисковым массивом, к которому можно получить доступ через сеть. На основе NAS можно создать свой собственный аналог Google Drive или любого подобного облачного хранилища.
В-чётвертых, раз уж мы решили организовать на платформе хранилище информации, следует озаботиться развертыванием на ней торрент-клиента, для загрузки этой самой информации. Загруженные с торрентов файлы можно будет сразу воспроизвести в медиацентре или предотавить к ним доступ через NAS.
Конкретный список устройств зависит от ваших личных предпочтений, я перечислю лишь самые основные.
На этом минимальный набор устройств заканчивается, но для полного счастья нужно ещё прикупить:
Передатчики для коммуникации по беспроводным протоколам ZigBee и/или ZWave. Это практически обязательная штука, т.к. примерно половина устройств на рынке работают через Wi-Fi, который в Raspberry Pi уже есть, процентов 35 — через ZigBee, 10 — через ZWave и 5 через BlueTooth, который также уже встроен в RPi. Хороший обзор ZigBee передатчиков смотрите в статье или обратите внимение на этот список. В последнее время я использую SONOFF Zigbee 3.0 USB Dongle Plus, до этого был CC2531.
Диски для хранения информации. Это может быть обычный внешний HDD или док-станция, куда можно вставлять несколько дисков разных форматов. И в том и другом случае подключение будет происходить через USB 3.
Собственно устройства, которые будут участвовать в автоматизациях: лампочки, термометры, колонки, телевизоры, датчики освещения, температуры, движения и т.д. вплоть до умной сидушки унитаза (да-да, и такое есть).
Всякие специфичные штуки, например антена, которую можно припаять к ZigBee передатчику для усиления сигнала, или адресные светодиодные ленты для создания адаптивной подсветки экрана телевизора.
К этому моменту у вас на руках имеются большинство вышупомянутых вещей. Теперь можно приступать к настройки программного обеспечения. В качестве сервера умного дома мы будем использовать Home Assistant, сценарии автоматизации будем задавать в среде визуального программирования Node-RED, в роли ПО для медиа-центра выступит Kodi или Plex, NAS будет организован при помощи NextCloud, для скачивания торрентов будем использовать Transmission, а для чтения книг — Ubooquity.
Теперь разберёмся, каким из двух основных способов это всё установить. В качестве основной OC я беру LibreELEC — операционную систему для медиацентра, на основе Kodi. Она заточена для потребления медиаконтента и содержит множество оптизиаций, благодаря чему даже малыш RPI3 может без проблем проигрывать 4k видео. Добиться такой производительности при установке обычного Linux у меня не получалось. Помимо этого LibreELEC обладает множеством других полезных функций — адаптированный для телевизора интерфейс, настроенный HDMI CEC, который позволяет взаимодействовать с этим интерфейсом при помощи обычного пульта, возможность также взаимодействовать с интерфейсом с мобильного телефона при помощи приложения, встроенная поддержкка Samba для доступа к файлам с подключённых дисков с любых устройств в локальной сети, поддержка множества плагинов, автообновление и другое.
Минус по большому счёту ровно один — эта система практически не кастомизируема. В неё нельзя устанавливать любые линуксовские приложения, за исключением ограниченного списка плагинов из специального репозитория. Впрочем, нам будет этого достаточно, поскольку в этом списке есть Docker, который позволяет запускать образы с любыми программами в изолированных контейнерах. Вообще говоря, так даже лучше, поскольку этот подход практически лишает пользователя возможности "убить" систему неосторожными действиями. В крайнем случае можно запустить новый контейнер.
Для установки LibreELEC можно воспользовать стандартным установщиком PRI или их собственным. После установки подключите к малинке мышь или клавиатуру и в приветственном меню активируйте подключение по SSH (а потом можно также включить управление при помощи телефона).
Следующее, что нужно сделать — найти в списке плагинов Docker и установить его. После этого подключитесь к PRI через интерфес командной строки при помощи команды ssh root@192.168.1.86
и пароля, который вы задали при активации SSH.
Далее ставим docker-compose, который позволить поднять множество контейнеров одной командой на основе файла с описанием их конфигурации. Т.к. ничего ставить в систему мы не можем, то docker-compose тоже устанавливаем как контейнер.
mkdir local-exec curl https://nagornyy.me/docker-compose.sh -o /storage/local-exec/docker-compose chmod +x /storage/local-exec/docker-compose.sh touch ~/.bashrc && echo "export PATH="/storage/local-exec:$PATH"" > ~/.bashrc && source ~/.bashrc
Для использования docker-compose нужно создать файл с конфигурацией, выполнив команду nano docker-compose.yml
и скопировав туда строки, лежащие ниже.
version: "3.7" services: raspberrypi4-homeassistant: network_mode: host container_name: home-assistant environment: - TZ=Europe/Moscow volumes: - /storage/ha:/config - /media/seagate:/media image: 'homeassistant/raspberrypi4-homeassistant:stable' restart: always node-red: user: root:root network_mode: host volumes: - /storage/nodered:/data environment: - TZ=Europe/Moscow - PUID=0 image: nodered/node-red:latest restart: always transmission: image: linuxserver/transmission container_name: transmission environment: - PUID=0 - PGID=0 - TZ=Europe/Moscow - TRANSMISSION_WEB_HOME=/combustion-release/ #optional volumes: - /storage/transmission/config:/config # закачиваем торренты прямиком в наше хранилище - /media/seagate:/downloads - /storage/transmission/watch:/watch ports: - 9091:9091 - 51413:51413 - 51413:51413/udp restart: unless-stopped plex: image: jaymoulin/plex container_name: plex network_mode: "host" # restart: always volumes: - /media/seagate:/media - /media/seagate:/root/Library portainer: ports: # - '8000:8000' - '9000:9443' container_name: portainer restart: always volumes: - '/var/run/docker.sock:/var/run/docker.sock' image: 'cr.portainer.io/portainer/portainer-ce:latest' restart: always ubooquity: image: linuxserver/ubooquity container_name: ubooquity environment: - PUID=0 - PGID=0 - TZ=Europe/Moscow - MAXMEM=768 volumes: #- path to data:/config - /media/seagate/books:/books #- path to comics:/comics - /media/seagate/books:/files ports: - 2202:2202 # admin access :2202/ubooquity - 2203:2203 # user's access :2203/ubooquity/admin restart: unless-stopped nextcloud: image: nextcloud restart: unless-stopped ports: - 8181:80 volumes: - /media/seagate:/seagate - /storage/nextcloud:/var/www/html environment: - NEXTCLOUD_ADMIN_USER= # - NEXTCLOUD_ADMIN_PASSWORD= # emux: image: emqx/emqx:4.3.10-alpine-arm64v8 container_name: emux network_mode: host environment: - EMQX_LISTENER__TCP__EXTERNAL=1883 - EMQX_LISTENER__WS__EXTERNAL=8083 restart: unless-stopped zigbee2mqtt: network_mode: host container_name: zigbee2mqtt image: koenkk/zigbee2mqtt volumes: - /storage/zigbee2mqtt:/app/data - /run/udev:/run/udev:ro devices: - /dev/ttyUSB0:/dev/ttyUSB0 restart: unless-stopped environment: - TZ=Europe/Moscow
Наконец, поднимаем контейнеры командой docker-compose up -d
. После окончания выполнения команды в вашей сети станут доступны новые сервисы со следующими адресами:
Для полноценной работы Home Assistant и Zigbee2mqtt их надо настроить, задав конфигурацию в файлах ~/ha/configuration.yaml
и ~/zigbee2mqtt/configuration.yaml
соответственно. О конфигурации этих программ много написано на их сайтах (1, 2).
Также могут возникнуть проблемы с Node Red. Хоть это и среда для визуального программирования, которая создана для максимального упрощения процесса автоматизации, к ней нужно привыкнуть. Можно начать погружение с анализа примеров автомазтизаций, созданных другими — flows.nodered.org, или посмотреть на мой пример, который изменяет яркость освещения при повороте кубика Xiaomi Magic Cube в горизонтальной плоскости в зависимости от градуса поворота, меняет цвет освещения на случайный при встряхивание куба, и включает/выключает подсветку при повороте куба на 90 градусов. Не забудьте установить плагин, с готовыми блоками для работы с Home Assistant.
Для доступа к сетевому хранилищу через Samba в Windows надо задать пароль для Samba в настройких LibreELEC, а затем в Windows выбрать пунтк Add network location и ввести адрес вида \\<адрес вашего сервера в локальной сети><нужнаядиректория> (\\192.168.1.86\seagate, например).
Вообще, разного рода тонкостей немало, всё и не опишешь (например, про использование RClone для периодического бэкапа данных с ваших облачных аккаунтов на свой сервер), но основы, кажется, покрыть удалось.
Комментарии