Гид по технологиям

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

8 min read Домашняя автоматизация Обновлено 30 Dec 2025
Siri + Sonos: романтическая сцена через HAP-NodeJS
Siri + Sonos: романтическая сцена через HAP-NodeJS

романтическая сцена с Siri и освещением

Вчера мы показали, как сделать 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.

интерфейс sonos-http-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/pause

API умеет и произносить текст (функция 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 &

Сохраните и закройте.

add to rc-local

Важно: убедитесь, что 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 с реле

Короткая структура решения:

  • 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, включи романтическую сцену” без явного упоминания «установить сцену». Название сцены выбирайте короткое и понятное.

создание сцены в HomeKit

Как это работает (коротко и технически)

  • HAP‑NodeJS эмулирует аксессуары HomeKit и отвечает на запросы от iOS‑устройств.
  • Когда вы через HomeKit включаете «лампу», HAP‑NodeJS получает команду setPowerOn и запускает заданный код JavaScript.
  • Этот код делает HTTP‑запрос к локальному Sonos HTTP API, который управляет Sonos: плейлист, пауза, say и т.д.
  • Остальные аксессуары (Hue, розетки) управляются стандартными командами HomeKit.

Практические советы и отладка

  1. Убедитесь, что Raspberry Pi и Sonos находятся в одной локальной сети. Разделённые VLAN или гостевая сеть могут блокировать соединение.
  2. Для стабильности назначьте статический IP или резервирование через DHCP на роутере.
  3. Если HAP‑NodeJS не видит аксессуар, проверьте логи и выключите другие процессы, использующие те же порты.
  4. При проблемах с Sonos HTTP API проверьте, что порт 5005 слушается и нет ошибок при запуске npm start.
  5. Если 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

Мини‑методология при создании сцен

  1. Определите устройства, которые будут участвовать в сцене (лампы, розетки, Sonos).
  2. Создайте/скачайте соответствующие аксессуары в HAP‑NodeJS.
  3. Протестируйте каждый аксессуар по отдельности (вкл/выкл, яркость).
  4. Создайте сцену в приложении Home и протестируйте с Siri.
  5. Отладьте задержки: если 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

Спасибо за внимание — удачи с созданием вашей сцены.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Развёртывание React на GitHub Pages
Dev

Развёртывание React на GitHub Pages

Как посмотреть историю дружбы в Facebook
Социальные сети

Как посмотреть историю дружбы в Facebook

Установка WordPress на Bluehost — полный гид
Хостинг

Установка WordPress на Bluehost — полный гид

Восстановить удалённые сообщения на Mac
macOS

Восстановить удалённые сообщения на Mac

Удалённый выход из соцсетей — Facebook, Instagram, Twitter
Безопасность

Удалённый выход из соцсетей — Facebook, Instagram, Twitter

Bing Travel — как ловить дешёвые авиабилеты
Путешествия

Bing Travel — как ловить дешёвые авиабилеты