Raspberry Pi в домашней экосистеме: Возможности и примеры (часть 1)

Некоторое время назад я приобрел одноплатный мини-компьютер Raspberry Pi 4 (он же «малинка» в среде любителей), не особо понимая, как и для чего его можно использовать в домашних условиях. Скорее, это была очередная технологичная игрушка, причем за совершенно вменяемые деньги, поэтому можно было позволить себе поэкспериментировать. Забегая вперед, могу сказать, что сейчас у меня на RPi4 крутятся такие сервисы, как network-wide блокировщик рекламы AdGuard Home, система хранения бэкапов Apple Time MachineHomebridge для добавления несертифицированных устройств в экосистему Apple HomeKit, приложение для скачивания торрентов Transmission, медиасервер PLEX и игровая ретро-консоль RetroPie. В планах проэкспериментировать с self-hosted менеджером паролей Bitwarden, open source аналогом знаменитого 1Password. Не так уж мало для такой крошки размером с пачку сигарет, верно?

В этом цикле из двух статей я постараюсь максимально подробно рассказать, как я всё это устанавливал и настраивал.

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

Во второй статье рассмотрим универсальные сервисы, которые могут быть полезны всем без исключения. А продвигаться мы с вами будем, как нормальные люди — от простого к сложному.

Подготовка Raspberry Pi

Нужно заметить, что ранние ревизии Raspberry Pi были довольно слабыми в аппаратном плане, поэтому каждый разработчик программного обеспечения воспринимал этот компьютер как однозадачную машину. Из-за этого любой сервис, который можно запустить на RPi, по умолчанию предлагается скачать в виде готового образа операционной системы. Скачал, записал на SD-карточку, засунул в RPi и включил готовый компьютер с предустановленным сервисом. Но наша задача — запустить одновременно несколько сервисов, благо нынешняя ревизия это позволяет. Поэтому их мы будем устанавливать как приложения.

Предположим, что Raspberry Pi с «чистой» системой Raspbian вы уже подключили к локальной сети. Если вы новичок и не знаете, с чего вообще начать, то начните с официальной инструкции (по ссылке — великолепный пошаговый мастер с массой интерактивных иллюстраций), а затем переходите к следующему этапу.

Шаг 1

Прежде всего, нужно включить доступ по SSH к вашей Raspberry Pi. Для этого нужно выполнить несколько несложных шагов:

    1. Откройте окно «Raspberry Pi Configuration» в меню «Preferences» операционной системы
    2. Нажмите на вкладку «Interfaces»
    3. Выберите «Enable» рядом со строкой SSH
    4. Нажмите на кнопку «ОК», чтобы изменения вступили в силу

Если у вас установлена Raspbian Lite без графического интерфейса, в Terminal на самой Raspberry Pi вбейте следующие команды:

sudo systemctl enable ssh
sudo systemctl start ssh

Доступ включен.

У меня компьютер с macOS, поэтому я могу сразу приступать к дальнейшим шагам, как и владельцы компьютеров с Linux. Пользователи Windows 10 тоже получили в составе своей операционной системы встроенный клиент OpenSSH некоторое время назад, но для его активации может потребоваться проделать некоторые манипуляции.

Откройте командную строку Windows или оболочку PowerShell (кому что нравится) и введите такую команду:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

Если клиент SSH установлен, то ответ на команду будет примерно таким:

Если же OpenSSH.Client в поле State сообщает нам, что он NotPresent, то самым быстрым способом его активации будет ввод такой команды:

Add-WindowsCapability -Online -Name OpenSSH.Client*

На этом первый этап подготовки закончен, в том числе и для пользователей Windows. Учитывая природу Raspberry Pi и тот факт, что OS Raspbian — это фактически еще одна версия Linux, в командной строке нам придется работать довольно много. Для кого-то это может показаться непривычным, но поверьте, ничего сложного или неисправимого в этом нет, так что будьте смелее. Всё получится.

Шаг 2

Теперь необходимо сделать так, чтобы в локальной сети ваша Raspberry Pi всегда получала один и тот же внутренний IP-адрес. Проще всего это сделать в настройках роутера.

Я использую трехкомпонентную MESH-систему ASUS ZenWiFi Mini со стандартным веб-интерфейсом любого роутера этой компании. Для связывания MAC- и IP-адресов нужно выбрать устройство в списке подключенных и во всплывающем окне просто указать нужный IP. В моем случае я выбрал 192.168.50.10 просто для удобства запоминания.

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

Шаг 3

Запускаем на вашем компьютере Терминал (командную строку, PowerShell и т.д.) из стандартного комплекта macOS, Linux или Windows.

Вбиваем команду

ssh pi@<ip address of your server>

(где вместо <ip address of your server> вставляем IP «малинки» из предыдущего шага) и видим примерно такую картину:

Здесь нужно вбить пароль от вашей Raspberry Pi, который вы указывали при первичной настройке.

Важно! В процессе ввода пароль не будет отображаться на экране. И «звездочки» тоже не будут отображаться. Вам нужно ввести пароль буквально «вслепую» и нажать Enter.

При правильном вводе пароля результат будет примерно таким:

Поздравляю, вы внутри вашей Raspberry Pi. Welcome! Можно приступать к настройкам отдельных сервисов. И начнем мы с самого простого.

Установка и настройка AdGuard Home на Raspberry Pi

AdGuard Home, согласно заверениям разработчика — «мощный сетевой инструмент против рекламы и трекинга. С усилением роли интернета вещей становится все более и более важным управлять всей вашей сетью. После настройки, AdGuard Home будет охватывать ВСЕ ваши домашние устройства и для этого вам не понадобится программное обеспечение на стороне клиента».

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

Вернемся в окно Терминала (договоримся, что Windows PowerShell и прочие оболочки для ввода команд, далее по тексту я буду просто называть Терминалом, ладно?), вбиваем следующие команды, которые скачают и распакуют архив AdGuard Home:

cd $HOME
wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_armv6.tar.gz
tar xvf AdGuardHome_linux_armv6.tar.gz

Остается только установить сервис и запустить его:

cd AdGuardHome
sudo ./AdGuardHome -s install

Результат будет выглядеть примерно так:

AdGuard Home уже установлен! Это было просто, не так ли?

Теперь нужно посетить веб-интерфейс свежеустановленного сервиса. Запустите браузер (Safari, Chrome, Firefox или что там у вас — неважно) и в адресной строке вбейте https://<ip address of your server>:3000. В моем случае это, как мы помним, https://192.168.50.10:3000.

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

На третьем шаге вам будет предложено создать пользователя AdGuard Home и придумать ему пароль. На четвертом будет разъяснено, что IP-адрес Raspberry Pi (тот самый 192.168.50.10 в моем случае) нужно прописать в качестве DNS в соответствующем разделе настроек роутера. Сделайте это:

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

Дальше переходим к настройкам самого AdGuard Home, пока еще девственно чистого.

Если у вас есть Smart TV Samsung, LG или аналогичный, зайдите в меню «Фильтры — Добавить черный список» и там «Выбрать из списка». Активируйте соответствующий Blocklist.

Теперь нужно добавить русско/украиноязычные фильтры рекламы вручную. Снова нажмите «Добавить черный список», а затем «Добавить свой список» и последовательно вбейте следующие значения в соответствующие поля:

Имя URL-адрес
AdGuard Base filter https://filters.adtidy.org/extension/chromium/filters/2.txt
AdGuard Russian filter https://filters.adtidy.org/extension/chromium/filters/1.txt
AdGuard Tracking Protection filter https://filters.adtidy.org/extension/chromium/filters/3.txt

Для начала этих фильтров вполне достаточно.

Для сравнения я обычно использую напичканный классическими баннерами сайт exler.ru. Слева — до, справа — после применения фильтров.

Обновление AdGuard Home происходит в ручном режиме, но запускается буквально одной кнопкой и занимает несколько секунд, не требуя вмешательства.

На этом, в общем-то, всё. С этого момента все ваши домашние устройства практически не подвержены рекламному воздействию. Неприятным исключением здесь является клиентское приложение YouTube на приставках Apple TV, но тут вступают в силу ограничения архитектуры tvOS, поэтому AdGuard в этом случае бессилен.

Установка и настройка Time Machine на Raspberry Pi

Согласно Википедии, Time Machine — система резервного копирования, разработанная Apple и встроенная в Mac OS X Leopard и более поздние версии macOS, а также одноименная программа, позволяющая просматривать содержимое резервных копий и восстанавливать как отдельные файлы, так и операционную систему целиком.

Попросту говоря, это система ежечасных бэкапов, встроенная в macOS и требующая наличия совместимого файлового сервера. Именно в такой сервер можно превратить Raspberry Pi, если подключить к нему внешний USB HDD.

Для корректной работы Time Machine подходит только Raspberry Pi 4 или новее, с портами USB 3.0 (в предыдущих моделях порты более медленные) и соответствующий HDD объемом 1-3 терабайта (с внешним питанием, если это диск на 3,5 дюйма).

Важно! Есть два сетевых протокола, по которым macOS может складировать данные Time Machine в локальной сети. Устаревший Netatalk или более современная Samba. Использовать для задач Time Machine, в принципе, можно любой из них. Интернет полон инструкций по организации процесса именно через Netatalk, причем все эти инструкции разной степени вычурности, но моя задача — дать простейший, гарантированно рабочий вариант. А ваша задача — выбрать удобный для себя. Так что в статье рассмотрим оба.

Подготовка HDD

Подключаем HDD в порт USB 3.0 нашей Raspberry Pi, заходим на нее в Терминале по SSH и запускаем команду lsblk, которая выведет в консоли список подключенных дисков. Обращаем внимание на размер диска, чтобы точно убедиться, с каким из них будем работать, на его имя и точку монтирования, в моем случае это просто sda, в вашем будет еще точка монтирования, скорее всего /dev/sda‌. Она то нам и нужна.

Вводим команду ‌sudo fdisk /dev/sda (либо с любой другой точкой монтирования, актуальной в вашем случае), затем нажимаем на клавиатуре m, чтобы увидеть полный список команд. Можете даже скопировать его в отдельный текстовый файл (или воспользоваться подсказкой ниже).

GPT
M   enter protective/hybrid MBR

Generic
d   delete a partition
F   list free unpartitioned space
l   list known partition types
n   add a new partition
p   print the partition table
t   change a partition type
v   verify the partition table
i   print information about a partition

Misc
m   print this menu
x   extra functionality (experts only)

Script
I   load disk layout from sfdisk script file
O   dump disk layout to sfdisk script file

Save & Exit
w   write table to disk and exit
q   quit without saving changes

Create a new label
g   create a new empty GPT partition table
G   create a new empty SGI (IRIX) partition table
o   create a new empty DOS partition table
s   create a new empty Sun partition table

Наша задача сделать delete a partition столько раз, сколько понадобится для полной очистки диска от разделов, а затем создать один новый с помощью add a new partition. Не забываем записать изменения, то есть write table to disk and exit. Справились? Отлично.

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

Вводим команду sudo mkfs.ext4 /dev/sda1. Готово.

Теперь нужно узнать UUID нашего нового раздела.
Вводим ls -lha /dev/disk/by-uuid и видим что-то такое:

Копируем UUID от нашего sda1 в отдельный текстовый файл, если вы не пользуетесь расширенным буфером обмена с историей.

Теперь нужно создать папку, в которую мы будем монтировать наш диск и дать ей соответствующие права доступа.

sudo mkdir /mnt/tm && sudo chmod -R 777 /mnt/tm && sudo chown pi:pi /mnt/tm

Монтируем диск. Для этого редактируем файл конфигурации командой

sudo nano /etc/fstab

nano в данном случае — название предустановленного в системе редактора, которым я предпочитаю пользоваться.

Внесите изменения в открывшийся файл, добавив в него строку вида

UUID=b32c00d8-0aa8-4ec4-b01f-18cbade45e7c /mnt/tm ext4 nofail,defaults 0 2

но с вашим UUID из предыдущего шага. Должно получиться так:

Сохраните изменения, нажав Ctrl+O и Enter, а затем выйдите из редактора, нажав Ctrl+X.

Перезагрузите Rarspberry Pi командой sudo reboot и после перезагрузки снова войдите на нее по SSH.

Вбейте команду df -h и убедитесь, что диск подмонтирован к системе в точке /mnt/tm.

Отлично, диск подготовлен к работе.


Установка и настройка NETATALK (вариант 1)

Устанавливаем:

sudo apt-get install netatalk -y

Конфигурируем все в том же редакторе nano:

sudo nano /etc/netatalk/afp.conf

И делаем содержимое файла конфигурации в точности вот таким:

‌;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
  mimic model = TimeCapsule6,106

[Time Machine]
  path = /mnt/tm
  time machine = yes
  valid users = pi

; [Homes]
; basedir regex = /xxxx

; [My AFP Volume]
; path = /path/to/volume

; [My Time Machine Volume]
; path = /path/to/backup
; time machine = yes`

Не забываем сохранить результат с помощью Ctrl+O → Enter → Ctrl+X

Теперь отредактируем файл nsswitch.conf, добавив в конце строки hosts: дополнительные значения mdns4 mdns.

sudo nano /etc/nsswitch.conf

Результат должен выглядеть так:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files
group:          files
shadow:         files
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Снова сохраняем изменения через Ctrl+O → Enter → Ctrl+X

Далее остается только запустить сервисы:

sudo service avahi-daemon start
sudo service netatalk start

И проверить их работоспособность командами:

sudo service netatalk status

и

sudo service avahi-daemon status

Результат должен выглядеть так:

Остается только зайти в Настройки macOS, выбрать раздел Time Machine и увидеть в доступных дисках нашу Raspberry Pi.

В качестве логина указываем pi, в качестве пароля — тот, который использовали для доступа по SSH.

Готово, общепринятый вариант через Netatalk настроен. Теперь каждый раз, когда ваш Mac окажется в одной локальной Wi-Fi-сети с Raspberry Pi, резервные копии будут автоматически складироваться на ваш диск.

Теперь рассмотрим альтернативу в виде протокола Samba, который считается более надежным.

Установка и настройка SAMBA (вариант 2)

Устанавливаем Samba:

‌sudo apt-get install samba

Задаем пользовательский пароль (для все того же пользователя pi) и редактируем конфигурацию. Сначала пароль:

‌sudo smbpasswd -a pi (можно использовать тот же, что и для SSH).

И затем конфигурация Samba все в том же редакторе nano:

‌sudo nano /etc/samba/smb.conf

Содержимое блока [global] должно в итоге выглядеть так:

[global]
security = user
encrypt passwords = true
map to guest = bad user
guest account = nobody

В самый конец файла конфигурации добавляем новый блок:

[TimeCapsule]
comment = Time Capsule
path = /mnt/tm
browseable = yes
writeable = yes
create mask = 0600
directory mask = 0700
spotlight = no
vfs objects = catia fruit streams_xattr
fruit:aapl = yes
fruit:time machine = yes

И сохраняем результат: Ctrl+O, Enter, Ctrl+X.

Перезапускаем сервис:

‌sudo systemctl restart smb.service

Готово. Остается, как и в случае с Netatalk, найти диск в списке доступных в панели настроек Time Machine.

Установка и настройка Homebridge на Raspberry Pi

Что ж, мы успешно добрались до самого массивного блока статьи.

Homebridge – это сервер на основе NodeJS, и использующий API Homekit для интеграции устройств без сертификации и изначальной поддержки работы с Apple HomeKit.

Сложность настройки Homebridge в том, что его плагины поддерживают самые разные протоколы и устройства, делая их видимыми и управляемыми из Apple HomeKit. Соответственно, каждый плагин настраивается по-своему, зачастую совершенно не так, как его собрат для другого устройства.

Начнем. Как обычно, заходим на Raspberry Pi по SSH и выполняем несколько шагов.

Установка Node.js

Можно скопировать и вставить в Терминал весь блок кода целиком. В абсолютном большинстве случаев этого достаточно. Но если так вышло, что на каком-то этапе установка засбоила, то введите оставшиеся команды из блока по одной.

# setup repo
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -

# install Node.js
sudo apt install -y nodejs gcc g++ make python net-tools

# test node is working
node -v

# upgrade npm (version 6.13.4 has issues with git dependencies)
sudo npm install -g npm

Установка Homebridge и Homebridge Config UI X

Для начала установим основу следующей командой…

‌sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x

…и запустим в качестве системного сервиса.

‌sudo hb-service install --user homebridge

Настройка Homebridge через веб-интерфейс

В браузере на компьютере перейдите по адресу http://<ip address of your server>:8581 где вместо <ip address of your server> все тот же IP из самого начала статьи, в моем случае

Дефолтные значения пользователя и пароля одинаковые: admin

Рекомендую сразу же перейти в пункт меню «Пользователи» и сменить там дефолтные значения на более безопасные.

Сделали? Отлично, дальше будем настраивать плагины.

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

Мой комплект плагинов на момент написания статьи:

  • Homebridge UI (входит в базовую комплектацию и собственных настроек не имеет)
  • Hue (для управления освещением Philips Hue)
  • Apple TV Remote (для управления приставками Apple TV)
  • Mqttthing (для управления лампой Гайвера с прошивкой от Whilser)
  • Samsung Tizen (для управления Smart TV Samsung с Tizen OS)
  • Weather Plus (для автоматизации умного дома в зависимости от погодных условий)
  • Yeelight WiFi (для управления лампами Xiaomi Yeelight)

Пойдем по порядку.

Настройка плагина Hue

Для установки любого плагина в Homebridge достаточно перейти на соответствующую вкладку веб-интерфейса, вбить в строку поиска название нужной железки и выбрать плагин и списка доступных. Рекомендую обращать внимание на метку «🛡Verified», версию и дату обновления плагина (если автор его уже пару лет не обновлял, велики шансы, что и работать он не будет) и обязательно открывать ссылку на домашнюю страницу плагина, где обычно подробно описан процесс установки.

Нажимаем кнопку «Установить» на плашке нужного плагина и ждем минуту-другую, пока плагин не установится.

Плагин Homebridge Hue достаточно прост в настройках. Нужно всего лишь задать дефолтное имя, которое будет отображаться в логах Homebridge, и выбрать, какой тип совместимых устройств будет обрабатываться плагином. В моем случае это только освещение Philips Hue, причем еще первая версия хаба, круглая.

Заполнив данные и обязательно сохранив результат, нужно только нажать центральную кнопку на хабе Philips Hue и подождать секунд 15, пока плагин распознает хаб. Готово!

Остается только взять в руки iPhone, навести его камеру на QR-код, расположенный на вкладке «Статус» веб-интерфейса Homebridge и добавить его в качестве моста в ваш HomeKit.

Если HomeKit как таковой у вас уже был заранее настроен (выбрана Apple TV или iPad в качестве основного хаба, добавлены комнаты и т. д.), то пошаговый мастер сразу же предложит распределить все найденные осветительные приборы Hue по соответствующим комнатам и дать каждому прибору какое-то имя. У меня в гостиной, к примеру, есть лампочки «Потолок 1», «Потолок 2» и «Потолок 3», но средствами самого HomeKit на iPhone (пункт «Объединить с другими устройствами») я объединил их в логическую группу «Верхний свет», мне так удобнее. При этом в той же гостиной у меня есть «Торшер» и «Ночник» — отдельные устройства, но Siri без всякого дополнительного обучения прекрасно понимает самые разные команды:

  • «Включи свет в гостиной (загораются все лампы в гостиной)»
  • «Включи торшер»
  • «Яркость ночника двадцать процентов»
  • «Включи ночник»
  • «Выключи верхний свет»
  • «Синий цвет на торшер»
  • «Выключи свет в гостиной (выключает все лампочки в гостиной)»
  • «Выключи весь свет (выключает освещение по всей квартире)»

И так далее. Если у вас грамотно настроена Apple-семья, соответствующие и абсолютно логичные команды автоматически становятся доступны всем участникам с внесёнными в вашу семью Apple ID.

Настройка плагина Apple TV Remote

Этот плагин я использую с одной единственной целью: создать дополнительный выключатель для приставки Apple TV. Дело в том, что в Apple HomeKit есть возможность запрограммировать, например, включение воспроизведения альбома или плейлиста по заранее заданному условию, вроде «Когда я прихожу домой». И все бы хорошо, но если приставка в это время спит, то наличие такого сценария не в состоянии её разбудить. А вот дополнительный виртуальный выключатель — может. Поехали:

Шаг 1. Устанавливаем сервис для подхвата учетных данных Apple TV

sudo npm install -g node-appletv-x

Шаг 2. Ищем доступные в локальной сети приставки Apple TV

sudo appletv pair

Шаг 3. Создаем сопряжение с нужной приставкой. В выводе консоли это будет выглядеть примерно так:

% appletv pair        
✔ Connecting to Living Room
✔ Initiating Pairing
? Enter the 4-digit pin that's currently being displayed on Living Room

На шаге ‌? Enter the 4-digit pin that's currently being displayed on... на экране вашей выбранной приставки Apple TV появится стандартный код из четырех цифр для сопряжения с пультом (в нашем примере это будет 1234), который нужно вбить прямо там же в консоли.

% appletv pair
✔ Connecting to Living Room
✔ Initiating Pairing
? Enter the 4-digit pin that's currently being displayed on Living Room 1234
✔ Completing Pairing Credentials: 77346115-ED48-46A8-A288-<snip>

Вместо <snip> будет несколько строк мешанины из букв и цифр, их нужно скопировать в отдельный текстовый файл целиком, начиная от первой цифры в строке Credentials:. Чуть позже эти самые credentials нам очень пригодятся.

Шаг 4. Добавляем на вкладке «Конфигурация» веб-интефейса Homebridge вот такой блок в раздел конфига "platforms": [

{
   "platform": "AppleTvPlatform",
   "name": "Apple TV Platform",
   "devices": [
      {
         "name": "Гостиная",
         "credentials": "77346115-ED48-46A8-A288-<snip>",
         "isOnOffSwitchEnabled": true,
         "onOffSwitchName": "Apple TV"
      }
   ]
},

…и в строку "credentials": как раз и вставляем полное содержимое текстового файла из предыдущего шага.

Имя для приставки выбираем любое, «Гостиная» здесь только для примера.

Шаг 5. Устанавливаем сам плагин.

На вкладке «Плагины» веб-интерфейса Homebridge вбиваем в строку поиска Apple TV Remote и нажимаем кнопку «Установить». После установки плагина будет предложено перезагрузить Homebridge, это делается нажатием на соответствующую кнопку.

Готово, на iPhone в HomeKit появился новый выключатель, который теперь можно добавить во все сценарии, где требуется автоматическое включение приставки.

Голосовые команды, вроде «Siri, включи Apple TV» или «Siri, выключи Apple TV» также автоматически поддерживаются. Причем если настроить несколько приставок в разных комнатах, то Siri также автоматически начнет понимать требование выключить Apple TV в конкретной комнате или же все сразу.

На самом деле, плагин этот стремительно развивается, уже умеет распознавать Bundle ID для запущенных на приставке приложений и вмешиваться в их работу, например, ставить на паузу фильм в Netflix. Но с этим вы уже разберетесь самостоятельно, если будет желание.

Настройка плагина Mqttthing

Этот плагин я использую с упоминавшейся выше лампой Гайвера — самодельным светильником с платой Arduino и матрицей адресных светодиодов 16х16. В саму лампу должна быть залита прошивка от Whilser. Да пребудет с нами сила.

Шаг 1. Установка MQTT брокера

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

sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget 
sudo apt update
sudo apt install mosquitto mosquitto-clients
sudo /etc/init.d/mosquitto stop
sudo nano /etc/mosquitto/mosquitto.conf

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

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

# pid_file /var/run/mosquitto.pid

allow_anonymous true
listener 1883

persistence true
persistence_location /var/lib/mosquitto/

log_dest topic

log_type error
log_type warning
log_type notice
log_type information

connection_messages true
log_timestamp true

include_dir /etc/mosquitto/conf.d

Как обычно, Ctrl+O, Enter, Ctrl+X, а затем перезапускаем брокер командой

‌sudo /etc/init.d/mosquitto start

MQTT брокер установлен.

Шаг 2. Установка плагина Mqttthing

Привычно идем на вкладку «Плагины» в веб-интерфейсе Homebridge, ищем Mqttthing и нажимаем «Установить».

Шаг 3. Конфигурация плагина Mqttthing

Каждая лампа Гайвера обладает собственным ID чипа ESP. Например, ESP-3bd20b. Если вы изготавливали и прошивали лампу сами, то прекрасно об этом осведомлены, если нет, то переведите лампу в режим сопряжения и при подключении к вашей WiFi сети в соответствующем диалоговом окне на iPhone отобразится искомый ID. Запишите его.

  1. Отключите питание лампы;
  2. Отключите роутер;
  3. Включите питание лампы;
  4. На iPhone зайдите в «Настройки → WiFi»
  5. Выберите незащищенную сеть с SSID вроде «ESP12345678» и в открывшемся диалоговом окне нажмите «Configure WiFi»
  6. В самом низу окна конфигурации будет искомый Chip ID

Если лампа уже была сконфигурирована раньше, можно просто её отключить, включить роутер и снова включить лампу — старые настройки подхватятся. Если это первое подключение лампы, включите роутер и выберите в списке настроек свою сеть, а затем вбейте все необходимые данные, вроде пароля домашнего WiFI и IP адреса Raspberry Pi.

Откройте вкладку «Конфигурация» веб-интерфейса Homebridge и в раздел "accessories": [ внесите вот такой огромный кусок кода, заменив предварительно ID с ESP-3bd20b на свой собственный:

{
    "accessory": "mqttthing",
    "type": "lightbulb",
    "name": "Ночник",
    "url": "http://127.0.0.1:1883",
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOn": "homeassistant/light/ESP-3bd20b/status",
        "setOn": "homeassistant/light/ESP-3bd20b/switch",
        "getBrightness": "homeassistant/light/ESP-3bd20b/brightness/status",
        "setBrightness": "homeassistant/light/ESP-3bd20b/brightness/set",
        "getRGB": "homeassistant/light/ESP-3bd20b/rgb/status",
        "setRGB": "homeassistant/light/ESP-3bd20b/rgb/set"
    },
    "onValue": "ON",
    "offValue": "OFF"
},
{
    "accessory": "mqttthing",
    "type": "television",
    "name": "Эффекты ночника",
    "url": "http://127.0.0.1:1883",
    "topics": {
        "setActive": "homeassistant/light/ESP-3bd20b/switch",
        "getActive": "homeassistant/light/ESP-3bd20b/status",
        "setActiveInput": "homeassistant/light/ESP-3bd20b/effect/set",
        "getActiveInput": "homeassistant/light/ESP-3bd20b/effect/status"
    },
    "inputs": [
        {
            "name": "Конфетти",
            "value": "Конфетти"
        },
        {
            "name": "Огонь",
            "value": "Огонь"
        },
        {
            "name": "Радуга верт.",
            "value": "Радуга верт."
        },
        {
            "name": "Радуга гориз.",
            "value": "Радуга гориз."
        },
        {
            "name": "Смена цвета",
            "value": "Смена цвета"
        },
        {
            "name": "Безумие 3D",
            "value": "Безумие 3D"
        },
        {
            "name": "Облака 3D",
            "value": "Облака 3D"
        },
        {
            "name": "Лава 3D",
            "value": "Лава 3D"
        },
        {
            "name": "Плазма 3D",
            "value": "Плазма 3D"
        },
        {
            "name": "Радуга 3D",
            "value": "Радуга 3D"
        },
        {
            "name": "Павлин 3D",
            "value": "Павлин 3D"
        },
        {
            "name": "Зебра 3D",
            "value": "Зебра 3D"
        },
            {
            "name": "Лес 3D",
            "value": "Лес 3D"
            },
        {
            "name": "Океан 3D",
            "value": "Океан 3D"
        },
        {
            "name": "Снегопад",
            "value": "Снегопад"
        },
        {
            "name": "Матрица",
            "value": "Матрица"
        },
        {
            "name": "Светлячки",
            "value": "Светлячки"
        },
            {
            "name": "Аквариум",
            "value": "Аквариум"
        },
        {
            "name": "Звездопад",
            "value": "Звездопад"
        },
        {
            "name": "Пейнтбол",
            "value": "Пейнтбол"
        },
        {
            "name": "Спираль",
            "value": "Спираль"
        },
        {
            "name": "Теплый свет",
            "value": "Теплый свет"
        },
        {
            "name": "Маятник",
            "value": "Маятник"
        },
        {
            "name": "Мерцание",
            "value": "Мерцание"
        },
        {
            "name": "Полицейская сирена",
            "value": "Полицейская сирена"
        },
        {
            "name": "Дрейф",
            "value": "Дрейф"
        },
        {
            "name": "Стая",
            "value": "Стая"
        }
    ],
    "onValue": "ON",
    "offValue": "OFF"
}

Готово. В Apple HomeKit появилось два новых устройства, лампа «Ночник» и «Эффекты ночника». Они взаимосвязаны и их предназначение вполне понятно. При желании можно переименовать их в конфиге.

Настройка плагина Samsung Tizen

Шаг 1. Проверка телевизора на совместимость

В панели управления роутером присвойте телевизору статичный локальный IP, как делали это для Raspberry Pi в самом начале. Например, в моем случае это 192.168.50.100.

В браузере на компьютере перейдите по адресу http://TV_IP:8001/api/v2/, что в моем случае означает http://192.168.50.100:8001/api/v2/

Если вы увидите страницу с кучей служебной информации примерно такого вида…

{"device":{"FrameTVSupport":"false","GamePadSupport":"true","ImeSyncedSupport":"true","OS":"Tizen","TokenAuthSupport":"true","VoiceSupport":"false","countryCode":"UA","description":"Samsung DTV RCR","developerIP":"0.0.0.0","developerMode":"0","duid": ......

…то это означает, что шансы на успех есть. Но нужно понимать, что не все модели телевизоров Samsung совместимы с плагином. Например, требующие идентификации через PIN, работать не будут.

Скопируйте со служебной страницы значение поля "wifiMac": и приготовьте пульт от телевизора, пусть будет под рукой.

Шаг 2. Установка плагина

Ничего нового, ищем плагин по запросу Samsung Tizen, выбираем нужный (авторства @tavicu) и устанавливаем.

После запуска идем в настройки и прописываем там следующие значения:

Названия «Телевизор» вполне достаточно, так как Siri прекрасно понимает просьбу включить телевизор в гостиной, в которой у вас вряд ли 2 телевизора. Так же прекрасно она понимает команду «включи телевизор в спальне», не дергая телек в гостиной лишний раз.

Шаг 3. Сопряжение с телевизором

Тут все просто: возьмите в руки пульт от телевизора и дождитесь появления на экране всплывающего меню с предупреждением о попытке некоего устройства взять контроль над телевизором. Телевизор, естественно, должен быть включён. Когда в верхнем правом углу экрана появится соответствующий запрос, пультом от ТВ выберите кнопку Allow. Готово.

Шаг 4. Добавляем телевизор в Apple HomeKit

Да-да, в отличие от предыдущих случаев, телевизор не появится волшебным способом в списке устройств вашего дома. Поэтому берем в руки iPhone и пошагово:

  1. Запустите Home app и на главной странице нажмите + в верхнем правом углу;
  2. Выберите «Добавить аксессуар»;
  3. Внизу экрана нажмите «Нет кода или нет возможности сканировать»;
  4. На следующем экране выберите ваш ТВ;
  5. На предложение ввода кода настройки HomeKit нажмите «Использовать камеру»;
  6. Наведите камеру на QR-код на вкладке «Статус» Homebridge.

Шаг 5. Настройки плагина

Глубоко покопавшись в документации к плагину, можно заставить Siri запускать на телевизоре конкретные приложения из списка установленных, ставить их на паузу и так далее. Мы же сейчас в качестве тренировки изменим функциональность одной единственной кнопки в виртуальном пульте Apple Remote, встроенном в «шторку» Пункта управления iOS.

Это кнопка ℹ︎ (information), по умолчанию выводящая в верхней части экрана ТВ информацию о текущем режиме изображения. При этом добраться с пульта Apple Remote до списка установленных в телевизоре приложений нет никакой возможности. И мы это сейчас исправим.

Заходим в настройки плагина, раздел «Key Mapping», ищем поле «INFORMATION» и меняем его значение на KEY_HOME. Перезапуск Homebridge и вуаля — кнопочка ℹ︎ в виртуальном пульте вызывает основное меню приложений! Виртуальный пульт обрел смысл.

Настройка плагина Weather Plus

Шаг 1. Создание учетной записи OpenWeather

Идем на сайт https://home.openweathermap.org и регистрируем себе учетную запись, благо это бесплатно.

Шаг 2. Генерация ключей API

Перейдите на соответствующую вкладку личного кабинета OpenWeather и, задав имя ключу, нажмите кнопку «Generate».

Шаг 3. Установка и настройка плагина Weather Plus

Уже привычным методом ищем и устанавливаем нужный плагин, а затем переходим в его настройки. Результат должен выглядеть примерно так:

В прогнозе меня лично интересуют только значения на ближайший час, поэтому остальные попросту отключены:

А чтобы лишние виртуальные датчики погоды не раздражали ненужными срабатываниями, отключаем их в соответствующем разделе Hide Values. Отключить желательно:

  • Air Pressure
  • Cloud Cover
  • Dew Point
  • Temperature Apparent
  • Wind Direction
  • UV Index
  • Wind Speed
  • Wind Speed Max

И нажать «Сохранить» в самом низу окна настроек.

В результате в интерфейсе Apple HomeKit появятся значения температуры и влажности на ближайший час, а заодно два виртуальных датчика «Снег» и «Дождь», которые можно использовать в разнообразных сценариях. Например, у меня запрограммирована автоматизация HomeKit, в которой, при появлении в прогнозе на ближайший час дождя или снега, лампа Гайвера в течение минуты демонстрирует соответствующий эффект лужи или падающих снежинок. При этом включится эффект только в промежутке с 8:00 до 23:00 и только в том случае, если кто-то есть дома. В другое время предупреждения взять зонт или одеться в непромокаемую одежду вряд ли понадобятся.

Настройка плагина Yeelight WiFi

По запросу Yeelight Homebridge предлагает к установке массу плагинов, в том числе один верифицированный. Но я предпочитаю другой, в котором переходы между состояниями сделаны максимально плавно, а не в стиле «на лагерь обрушилась ночь». Кроме того, он поддерживает адаптивное освещение от Apple, а вот стандартное приложение Xiaomi этому так и не обучилось за год с момента появления этой возможности в HomeKit.

Важно! Оставьте включенной только одну лампочку Xiaomi, чтобы избежать путаницы поначалу. С ней и будем работать.

После установки плагина перезагрузите Homebridge и в логе найдите примерно такую строку: ‌[Yeelight] Received advertisement from ab1234. Вот это условное ab1234 и есть ваша лампочка. Возможно, значение будет color-ab1234, тогда будете работать с ним.

Зайдите в настройки плагина и вставьте туда вот такой кусок кода:

{
    "platform": "yeelight",
    "name": "Yeelight",
    "transitions": {
        "power": 400,
        "brightness": 400,
        "color": 1500,
        "temperature": 1500
    },
    "multicast": {
        "interface": "0.0.0.0"
    },
    "defaultValue": {
        "color-ab1234": {
            "name": "Торшер",
            "blacklist": [
                "set_hsv"
            ]
        }
    }
}

Где вместо color-ab1234 должно быть значение из вашего лога, а вместо ‌"name": "Торшер" любое название, отображающее место вкрутки лампы: Ночник, Бра, Потолок и т. д.

Сохраните вставленный код, нажав на кнопку «Сохранить», и перезагрузите Homebridge. Готово, лампочка появилась в HomeKit под выбранным вами названием. Остальные лампочки Yeelight добавляются по одной нажатием кнопки «+ADD PLATFORM» там же в настройках плагина точно таким же способом.

Обновление Homebridge и Node.JS на Raspberry Pi

Обновление (и откат версии) самого Homebridge довольно простое: нужно кликнуть по номеру текущей версии в веб-интерфейсе и в открывшемся диалоговом окне выбрать из выпадающего списка желаемую версию.

А вот с обновлением Node.JS и NPM, которые рано или поздно потребуются при установке обновления какого-нибудь плагина, не так просто. Точнее, команды не совсем те, что описаны в стандартных инструкциях.

Node.JS обновляется командой:

sudo hb-service update-node

А NPM аж двумя последовательными:

sudo npm cache clean -f
sudo npm install -g npm

К сожалению, ни сам Homebridge, ни его плагины, ни «рельсы», на которых он едет, не умеют обновляться автоматически. А заходить каждый день в панель управления и проверять, нет ли чего нового, рано или поздно надоедает. Так что для автоматизации процесса придумали специальный виджет под iOS 14, который отслеживает состояние всех узлов Homebridge и умеет визуально и PUSH-уведомлениями сигнализировать о наличии обновлений или каких-то проблемах.

Установка виджета Homebridge Status

Как видите, виджет показывает массу нужной и не очень информации о вашем Homebridge, но самое ценное в нем — это информация о состоянии самого Homebridge, его плагинов и Node.JS.

Для получения самого виджета сначала нам понадобится его материнское приложение. Установите его на iPhone из App Store.

Developer: Simon B. Støvring
Price: Free+

А теперь начинается довольно длительный, но увлекательный процесс установки виджета. Устанавливать мы его будем с помощью еще одного скрипта с названием ScriptDude внутри приложения Scriptable. ScriptDude хорош тем, что отслеживает изменения в коде массы скриптов, расположенных в галерее по адресу scriptables.net. Возможно, вы найдете там для себя еще что-то полезное, но сейчас у нас одна задача, ее и будем решать.

Шаг 1. Устанавливаем Scriptable.app из App Store.

Шаг 2. Открываем в браузере на iPhone сайт scriptdu.de и нажимаем кнопку Install ScriptDude.

Шаг 3. На открывшейся странице нажимаем на кнопку Copy Installer и, получив уведомление о коде скрипта в нашем буфере обмена, нажимаем кнопку Open Scriptable.

Шаг 4. В пустое поле с заголовком Untitled Script вставляем содержимое буфера обмена и нажимаем кнопку Play ▶️.

Шаг 5. На открывшемся экране нажимаем ссылку Browse scriptables.net и на следующей странице тапаем по тегу (technology). Ура, скрипт Homebridge Status — первый в списке! Смело жмем на кнопку Download with ScriptDude.

Шаг 6. Нажимаем Install и, согласившись аж с двумя предупреждениями, видим в списке Installed вожделенный скрипт. Главный экран Scriptables теперь выглядит так, как на четвертом скриншоте ниже, а мы нажимаем на троеточие в плашке Homebridge Status и переходим к редактированию параметров.

Шаг 7. В первую очередь меняем значение overwritePersistedConfig с false на true

overwritePersistedConfig = true

чтобы сохранить параметры скрипта в iCloud.

Шаг 8. Спустившись чуть ниже, редактируем три поля: IP адрес и порт Homebridge (помните, это уже упоминавшийся http://<ip address of your server>:8581 где вместо <ip address of your server> все тот же IP из самого начала статьи, в моем случае ) и соглашаемся с предупреждением о поиске устройств в локальной сети. Ура, скрипт работает!

Остается только добавить виджет на экран iOS 14 так же, как и любой другой. После добавления нужно зайти в настроки виджета (долгий тап на нём) и указать ряд параметров: выбрать нужный скрипт, указать, что делать при взаимодействии с ним, и в поле Parameter внести такое значение

USE_CONFIG:purple.json

После этого не забудьте вернуться в код скрипта и вернуть значение

overwritePersistedConfig = false

На этом всё. Виджет работает, а при появлении обновлений Node.JS, Homebridge или его плагинов, вы будете получать PUSH-уведомления с соответствующим содержимым.

Заключение

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

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

При выходе из дома последнего члена семьи HomeKit заботливо выключит телевизоры, освещение и вообще всё, что только можно выключить. А если дома есть хотя бы один человек, с наступлением сумерек включится наружное освещение и некоторые лампы внутри.

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

Работают утренние и вечерние музыкальные миксы от Apple, к которым привязаны световые эффекты лампы Гайвера. Можно и остальное освещение заставить работать цветомузыкой, но я не в восторге от эффекта.

В общем, сценарии применения зависят только от вашей фантазии и не сильно напрягут кошелек, так как товары с меткой «Works with Apple HomeKit» больше не являются единственно доступным выбором.

В следующей статье цикла мы с вами немного поразвлекаемся: научим нашу Raspberry Pi качать торренты, превратим в мощный медиацентр и игровую ретро-консоль.

Stay tuned!

Share
Yuri Stanislavsky

SwiftUI разработчик. Коллекционирую винил. Иногда журналист. Владелец Nota Record Store.

Leave a Reply

Your email address will not be published. Required fields are marked*