Управление Sonos через Siri: романтическая сцена с HAP-NodeJS

Вчера мы показали, как сделать DIY Wi‑Fi лампу, управляемую Siri. Сегодня мы расширим ту идею: научим Siri запускать плейлист на Sonos и соберём всё вместе в одну романтическую сцену.
Суть: Sonos официально не поддерживается HomeKit, но с помощью HAP-NodeJS и простого HTTP API для Sonos мы создаём «фейковое» HomeKit‑устройство (например, лампу). Включение этой лампы будет посылать HTTP‑запросы на Sonos, чтобы начать/остановить плейлист. Дополнительно можно связать розетки и свет для полной сцены.
Important: этот метод не требует джейлбрейка iOS, но требует базовых навыков в командной строке, настройке Raspberry Pi и понимании сети.
Что потребуется
- Raspberry Pi с установленным Node.js (и правами для запуска HAP-NodeJS)
- iOS‑устройство с Siri
- Цветные лампы, совместимые с HomeKit (например, Philips Hue 2-го поколения) или DIY Wi‑Fi лампа из предыдущего руководства
- Sonos (или другое устройство воспроизведения с HTTP API)
- (Опционально) NodeMCU/ESP8266, реле и силовая розетка для DIY‑розетки, или коммерческая HomeKit‑розетка
Примечание: если вы ещё не сделали DIY Wi‑Fi лампу, сначала пройдите соответствующий урок — там объяснён запуск HAP‑NodeJS и создание базового «фейкового» аксессуара.
Ключевая идея и в чём сложность
Apple HomeKit — закрытая экосистема. Sonos не поддерживается прямо. Но HAP‑NodeJS позволяет эмулировать аксессуары HomeKit (например, лампу). На Raspberry Pi мы запускаем HAP‑NodeJS, добавляем «фейковую» лампу и прописываем, чтобы при включении лампы выполнялся HTTP‑запрос к Sonos HTTP API, который стартует плейлист.
Это даёт Siri возможность: сказать «Включи романтическую сцену», iOS распознаёт сцену и отправит команды на все аксессуары HomeKit: лампы, розетки и наш фейковый аксессуар, который влечёт за собой запуск Sonos.
Настройка Sonos HTTP API на Raspberry Pi
На Raspberry Pi (или другом сервере в вашей сети, где запущен HAP‑NodeJS) установите простой HTTP API для Sonos, который даст вам веб‑URL для управления воспроизведением:
git clone https://github.com/jishi/node-sonos-http-api.git sonos
cd sonos
npm install production
npm install basic-auth sonos-discovery require-fu request-promise node-static async
npm startЕсли при npm install появится сообщение о нехватке какого‑то модуля, выполните npm install <имя_модуля> и повторите npm start.
При корректном запуске в логе вы увидите подтверждение работы API.
Формат URL для управления Sonos:
http://[IP_СЕРВЕРА]:5005/[ИМЯ_КОМНАТЫ]/[ДЕЙСТВИЕ]Например, чтобы воспроизвести плейлист “romantic” в комнате “Master Bedroom”:
http://192.168.1.99:5005/master%20bedroom/playlist/romanticЧтобы поставить на паузу:
http://192.168.1.99:5005/master%20bedroom/pauseAPI умеет и произносить текст (функция say), что полезно для уведомлений:
http://192.168.1.99:5005/master%20bedroom/say/make%20use%20of%20is%20awesome/en-gbПервый вызов функции say обычно потребует регистрации ключа на VoiceRSS (или другой TTS‑службе). Если вы используете VoiceRSS, добавьте ключ в файл settings.json:
{
"voicerss": "YOURAPIKEY"
}После этого перезапустите сервер и попробуйте сказать фразу через API. Можно выбрать локализацию, например en-us для американского английского.
Чтобы API запускался автоматически при загрузке Raspberry Pi, добавьте запуск в /etc/rc.local (перед exit 0):
sudo node /home/pi/sonos/server.js < /dev/null &Сохраните и закройте.
Важно: убедитесь, что IP сервера статический в локальной сети или закреплён через DHCP‑резервацию в роутере.
Создание HomeKit‑аксессуара для Sonos (фейковая лампа)
В каталоге HAP-NodeJS установите модуль request:
sudo npm install requestПерейдите в папку accessories/ и скачайте готовый аксессуар (пример):
wget https://gist.githubusercontent.com/jamesabruce/72bd250fbcf054acaa25/raw/8272d4b9a4ef76db752cab2ddd9bdc47d09a65f1/Romantic_accessory.jsОткройте файл и при необходимости поменяйте имя комнаты/строку master%20bedroom на ту, что используется в вашем Sonos API. Этот файл реализует поведение: при включении лампы посылается HTTP‑запрос на воспроизведение плейлиста, при выключении — на паузу.
Ключевая часть кода (без изменений логики):
setPowerOn: function(on) {
console.log("Turning the light %s!", on ? "on" : "off");
FAKELIGHT.powerOn = on;
console.log(on);
if(on){
request('http://localhost:5005/master%20bedroom/playlist/romantic', function (error, response, body) {
console.log("Sent play request");
})
}
else{
request('http://localhost:5005/master%20bedroom/pause', function (error, response, body) {
console.log("Sent pause request");
})
}
},Перезапустите HAP‑NodeJS и добавьте аксессуар в приложение Home (или Elgato Eve) на iOS, используя код пары 031-45-154, если в файле задан именно он. После этого вы увидите «Romantic Playlist» как лампу в HomeKit.
Совет: если вы хотите, чтобы регулировка яркости — brightness — управляла громкостью Sonos, можно сопоставить значение brightness в коде с вызовом API регулировки громкости. Это хорошее упражнение для практики JavaScript и API.
(Опционально) DIY‑розетки и гирлянды на NodeMCU
Если вам нужны дополнительные эффекты (гирлянды, подсветка розетки), можно собрать простой контроллер на NodeMCU/ESP8266 и реле. Я подключал реле к D2 (GPIO4) и использовал MQTT для команд.
Короткая структура решения:
- NodeMCU подключается к Wi‑Fi и MQTT-брокеру
- При получении сообщения на канале
bedroomplugпереключает пин реле - HAP‑NodeJS аксессуар управляет MQTT (через HTTP или локально), чтобы включать/выключать розетку
Не встраивайте самостоятельно высокое напряжение в розетку, если вы не уверены в технике безопасности. Вместо этого используйте готовые HomeKit‑розетки или доверьте работу квалифицированному электрику.
Создание сцен в HomeKit
Сцены HomeKit состоят из наборов команд для аксессуаров. Мы создадим две простые сцены, которые можно запускать голосом.
Примеры сцен:
“the kids are in bed”
- Выключить одну из ламп
- Поставить вторую лампу в розовый цвет
- Включить аксессуар “Romantic Playlist” (запускает Sonos)
- Включить гирлянду (розетка)
“let’s get serious now”
- Вернуть основные лампы в белый цвет
- Поставить аксессуар “Romantic Playlist” в состояние выкл (pausa Sonos)
Siri обычно понимает команды типа “Привет Siri, включи романтическую сцену” без явного упоминания «установить сцену». Название сцены выбирайте короткое и понятное.
Как это работает (коротко и технически)
- HAP‑NodeJS эмулирует аксессуары HomeKit и отвечает на запросы от iOS‑устройств.
- Когда вы через HomeKit включаете «лампу», HAP‑NodeJS получает команду setPowerOn и запускает заданный код JavaScript.
- Этот код делает HTTP‑запрос к локальному Sonos HTTP API, который управляет Sonos: плейлист, пауза, say и т.д.
- Остальные аксессуары (Hue, розетки) управляются стандартными командами HomeKit.
Практические советы и отладка
- Убедитесь, что Raspberry Pi и Sonos находятся в одной локальной сети. Разделённые VLAN или гостевая сеть могут блокировать соединение.
- Для стабильности назначьте статический IP или резервирование через DHCP на роутере.
- Если HAP‑NodeJS не видит аксессуар, проверьте логи и выключите другие процессы, использующие те же порты.
- При проблемах с Sonos HTTP API проверьте, что порт 5005 слушается и нет ошибок при запуске
npm start. - Если TTS (say) не работает — проверьте ключ API и формат settings.json.
Критерии приёмки
- При включении фейковой лампы по HomeKit Sonos стартует воспроизведение плейлиста.
- При выключении фейковой лампы Sonos останавливается (паузится).
- Сцена в HomeKit управляет всеми целевыми аксессуарами одновременно.
Расширения и альтернативные подходы
- Альтернатива Sonos HTTP API: если у вас другое устройство с HTTP интерфейсом, адаптируйте URL в аксессуаре.
- Использовать Homebridge вместо HAP‑NodeJS — у Homebridge широкая база плагинов, включая плагины для Sonos.
- Для TTS можно подключить локальный движок (например, PicoTTS) и избежать внешних ключей.
- Для более точной интеграции звука — сопоставьте яркость лампы с громкостью Sonos.
Когда это не сработает
- Если Sonos и сервер HAP‑NodeJS находятся в разных подсетях без маршрутизации — HTTP запросы не доберутся.
- Если Sonos используется в другом аккаунте или управляется через внешнее облако с ограничениями, локальный HTTP API может не иметь доступа.
Пример: сопоставление яркости лампы с громкостью Sonos
Идея: перехватывать изменение свойства Brightness и отправлять команду на Sonos API для установки громкости:
setBrightness: function(level) {
console.log("Setting brightness to %s", level);
FAKELIGHT.brightness = level;
// Преобразование: HomeKit brightness 0-100 -> Sonos volume 0-100
var volume = Math.max(0, Math.min(100, level));
request('http://localhost:5005/master%20bedroom/volume/' + volume, function (error, response, body) {
console.log("Sent volume request: " + volume);
});
},Это простая реализация. В продакшне можно добавить сглаживание, debounce и проверку наличия активного устройства.
Контроль рисков и безопасность
- Никогда не подключайте неизолированные высоковольтные цепи без опыта. Для DIY‑розеток используйте защитные корпуса и предохранители.
- Ограничьте доступ к HTTP API через локальную сеть и настройте firewall, если сервер доступен вне LAN.
- Регулярно обновляйте Raspberry Pi и npm‑модули, чтобы закрыть известные уязвимости.
Чеклист ролей (быстрый):
Для мастера‑сборщика
- Raspberry Pi с Node.js и доступом SSH
- HAP‑NodeJS установлен и запущен
- Доступ к файлу accessories и права на изменения
Для iOS‑пользователя
- Приложение Дом (Home) или Elgato Eve установлено
- Устройство iOS в той же сети Wi‑Fi
- Пара кода HomeKit для добавления аксессуара
Для администратора сети
- Статический IP или DHCP‑резервация для Pi
- Правила межсети/межсегментной маршрутизации проверены
- Бэкап конфигураций HAP‑NodeJS и Sonos API
Мини‑методология при создании сцен
- Определите устройства, которые будут участвовать в сцене (лампы, розетки, Sonos).
- Создайте/скачайте соответствующие аксессуары в HAP‑NodeJS.
- Протестируйте каждый аксессуар по отдельности (вкл/выкл, яркость).
- Создайте сцену в приложении Home и протестируйте с Siri.
- Отладьте задержки: если Sonos стартует дольше, вставьте небольшой задерживающий HTTP‑вызов или TTS‑сообщение.
Быстрые шаблоны (команды и URL)
- Включить плейлист: /[room]/playlist/[playlist]
- Пауза: /[room]/pause
- Сказать фразу: /[room]/say/[text]/[locale]
- Установить громкость: /[room]/volume/[0-100]
Decision flow (Mermaid)
flowchart TD
A[Сказать Siri 'Включи сцену'] --> B{Сцена найдена?}
B -- Да --> C[HomeKit отправляет команды аксессуарам]
C --> D[Фейковая лампа получает setPowerOn]
D --> E{on?}
E -- Да --> F[HTTP -> Sonos /playlist/romantic]
E -- Нет --> G[HTTP -> Sonos /pause]
B -- Нет --> H[Siri предлагает похожие команды]Заключение
Этот приём даёт вам гибкость: контролировать устройства, не поддерживаемые HomeKit, с помощью Siri и HAP‑NodeJS. Система расширяемая: добавляйте управление громкостью, уведомления TTS и дополнительные аксессуары. Помните про безопасность при работе с электроникой и сетевую конфигурацию.
Notes: поделитесь в комментариях, какие сценарии вы хотите автоматизировать — например, утренний кофе с музыкой, режим кино или сценарий безопасности.
Факт‑бокс:
- Основные компоненты: Raspberry Pi + HAP‑NodeJS + Sonos HTTP API
- Основной порт Sonos HTTP API: 5005
- Пример кода пары HomeKit в HAP‑NodeJS часто используется: 031-45-154
1‑строчный словарь
- HAP‑NodeJS: библиотека для эмуляции HomeKit‑аксессуаров на Node.js
- Sonos HTTP API: локальный HTTP интерфейс для управления Sonos
Спасибо за внимание — удачи с созданием вашей сцены.
Похожие материалы
Развёртывание React на GitHub Pages
Как посмотреть историю дружбы в Facebook
Установка WordPress на Bluehost — полный гид
Восстановить удалённые сообщения на Mac
Удалённый выход из соцсетей — Facebook, Instagram, Twitter