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

Сцена «Романтика»: как заставить Siri управлять Sonos и светом через HomeKit

8 min read Умный дом Обновлено 15 Apr 2026
Siri + Sonos: романтическая сцена через HomeKit
Siri + Sonos: романтическая сцена через HomeKit

Сцена романтики с Siri и Sonos

Краткое определение

HomeKit — протокол Apple для домашней автоматизации; HAP-NodeJS — реализация протокола HomeKit Accessory Protocol на Node.js, позволяющая эмулировать аксессуары. Sonos — аудиосистема, у которой нет официальной поддержки HomeKit, но её можно управлять через HTTP API.

Что понадобится

  • Raspberry Pi (рекомендуется последняя модель с Raspbian/ Raspberry Pi OS)
  • iOS устройство (iPhone или iPad с актуальной версией iOS)
  • Siri-совместимое цветное освещение (например, Philips Hue с хабом 2-го поколения) или наш DIY Wi‑Fi Light из предыдущего руководства
  • Sonos (или любое устройство с HTTP API управления воспроизведением)
  • (Опционально) NodeMCU/ESP8266, реле и электрическая розетка для управления гирляндами; либо коммерческая HomeKit-розетка

Важно: если вы уже проделали часть с DIY Wi‑Fi лампой и HAP-NodeJS — этот проект продолжит работу поверх уже запущенного сервера HomeKit.

Почему это кажется сложным

Apple закрыла экосистему HomeKit — официальный список поддерживаемых устройств небольш. Sonos не входит в него. Сообщество реализовало HAP-NodeJS, что позволяет «подделывать» HomeKit‑аксессуары. Мы используем эту возможность: создём фейковую «лампу», которую Siri умеет включать и выключать, а в ответ будет отправляться HTTP‑запрос к Sonos HTTP API.

Важно: «фейковая» лампа лишь имитирует аксессуар HomeKit — она не должна вводить в заблуждение при совместном использовании с другими людьми; используйте в пределах вашей локальной сети.

Сделайте плейлист в Sonos

Создайте в приложении Sonos плейлист с именем “Romantic” (название можно изменить, но тогда в коде нужно править строку с именем плейлиста). Я добавил Marvin Gaye и Sade.

Затем на Raspberry Pi, где у вас уже запущен HAP-NodeJS, установим HTTP API для Sonos. В терминале в домашней директории выполните:

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 пожалуется на отсутствующие модули — выполните npm install <имя‑модуля> и затем снова npm start. В выводе вы должны увидеть строки о веб‑сервере, слушающем порт 5005 и обнаружении комнат Sonos.

Рабочий Sonos HTTP API

Основной формат команд API, который нам пригодится:

http://[IP_СЕРВЕРА]:5005/[ИМЯ_КОМНАТЫ]/[ДЕЙСТВИЕ]

Пример вызова плейлиста (пробелы кодируются как %20):

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 API ключа (там есть бесплатные запросы в сутки). После получения ключа добавьте его в файл настроек settings.json в корне sonos:

{
  "voicerss":"YOURAPIKEY"
}

Перезапустите сервер и протестируйте.

Чтобы автозапускать сервер при старте Pi, добавьте команду в /etc/rc.local перед exit 0:

sudo node /home/pi/sonos/server.js < /dev/null &

На моём Pi этот процесс соседствует с OpenHAB, MQTT присутствием и HAP-NodeJS.

Добавление в rc.local

Создаём HomeKit‑аксессуар для Sonos

Идея: эмитировать HomeKit‑лампу (фейковую), у которой при включении отправляется HTTP‑запрос к Sonos API на воспроизведение плейлиста, а при выключении — пауза.

  1. В каталоге HAP-NodeJS установите модуль request:
sudo npm install request
  1. Перейдите в папку accessories/ вашего HAP-NodeJS и скачайте готовый аксессуар:
wget https://gist.githubusercontent.com/jamesabruce/72bd250fbcf054acaa25/raw/8272d4b9a4ef76db752cab2ddd9bdc47d09a65f1/Romantic_accessory.js
  1. Отредактируйте файл: в строке с адресом master%20bedroom укажите своё имя зоны Sonos (URL‑кодируйте пробелы или используйте %20).

Нижеследующий фрагмент — ключевая часть аксессуара: при получении команды setPowerOn происходит вызов HTTP URL.

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, затем на iOS устройстве добавьте аксессуар “Romantic Playlist” как фейковую лампу (код пары: 031-45-154). Проверьте: включение лампы — играет плейлист, выключение — пауза.

Совет: если у вас несколько зон Sonos, сделайте по одному аксессуару на зону, или добавьте логику выбора зоны по состоянию других аксессуаров.

Как сопоставить яркость лампы с громкостью Sonos (пример)

Идея: перехватывать изменение яркости (значение 0–100) и преобразовывать его в уровень громкости Sonos. Это улучшит UX: пользователи будут просто регулировать «лампу», а Sonos будет менять громкость.

Ниже — примерный блок кода для файла аксессуара (замена обработчика setBrightness):

setBrightness: function(level) {
  console.log("Brightness set to %s", level);
  FAKELIGHT.brightness = level;
  // Преобразуем уровень яркости 0-100 в громкость 0-100 Sonos
  var sonosLevel = Math.max(0, Math.min(100, Math.round(level)));
  var url = 'http://localhost:5005/master%20bedroom/volume/' + sonosLevel;
  request(url, function(error, response, body) {
    if(error) console.error('Error setting Sonos volume:', error);
    else console.log('Sonos volume set to', sonosLevel);
  });
},

Примечание: перед использованием проверьте в документации вашего Sonos HTTP API точный путь для установки громкости (/volume или другой). Если ваш API поддерживает регулировку относительной громкости, возможна реализация с компенсацией текущего уровня.

(Опционально) Гирлянды и другие розетки через NodeMCU

Если вы хотите управлять гирляндами или другими устройствами переменного тока, можно собрать простой контроллер на NodeMCU/ESP8266 и реле. Я использовал реле с триггером на D2 (GPIO4). Устройство подписывается на MQTT‑канал и переключает реле по сообщениям.

Ниже упрощённый пример скетча (Arduino Core for ESP8266). Убедитесь, что вы понимаете, как безопасно работать с сетью 230 В и реле — при сомнениях привлеките электрика.

#include 
#include 

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqtt_server = "192.168.1.10"; // адрес MQTT брокера
const char* topic = "bedroomplug";

WiFiClient espClient;
PubSubClient client(espClient);
const int relayPin = 4; // D2

void callback(char* topic, byte* payload, unsigned int length) {
  String msg;
  for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
  if (msg == "ON") digitalWrite(relayPin, HIGH);
  else digitalWrite(relayPin, LOW);
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("nodemcu_client")) {
      client.subscribe(topic);
    } else {
      delay(5000);
    }
  }
}

void setup() {
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) reconnect();
  client.loop();
}

В HAP-NodeJS вы можете добавить аксессуар «Power Socket», который публикует ON/OFF в MQTT при включении/выключении, и NodeMCU будет управлять реле. Логика похожа на работу с DIY Wi‑Fi лампой из предыдущего руководства.

NodeMCU с реле для управления розеткой

Собираем сцену в HomeKit

Используйте Elgato Eve или стандартное приложение “Дом” на iOS для создания сцен. Сцена — это набор действий для аксессуаров (вкл/выкл, цвет, яркость и т. д.).

Примеры сцен, которые я сделал:

  • “the kids are in bed” — выключает одну лампу, переключает вторую на розовый, включает фейковые “Romantic Playlist” и гирлянды.
  • “let’s get serious now” — возвращает лампы в белый цвет и ставит Sonos на паузу (выключает наш фейковый акссессуар).

Siri умеет активировать сцену по короткой фразе без формального слова “активировать сцену” — просто скажите “Привет Siri, давай романтику” (назове сцены по‑русски). Точная фраза определяется тем, как Siri распознаёт наименование сцены.

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

Отладка и типичные проблемы

  • npm start выдаёт ошибку “module not found”: выполните npm install <имя> и перезапустите.
  • Сервер не слушает порт 5005: проверьте, что другой процесс не занимает порт, или что firewall не блокирует локальные подключения.
  • HAP-NodeJS аксессуар не виден в приложении “Дом”: убедитесь, что сервер запущен от того же пользователя, что и раньше, и что вы правильно сохранили файл аксессуара в папке accessories/. Проверьте логи HAP-NodeJS.
  • Sonos не реагирует на HTTP‑запросы: откройте адрес http://localhost:5005 на Pi и убедитесь, что API отвечает; проверьте корректность имени комнаты.
  • Проблемы с кодом пары: при повторном добавлении аксессуара удалите старые пары в приложении “Дом” и перезапустите HAP-NodeJS, чтобы аксессуар предложил новый код.

Безопасность и конфиденциальность

  • Храните ключ VoiceRSS и другие API‑ключи в локальном settings.json, не выкладывайте его публично.
  • Этот проект работает в локальной сети — убедитесь, что ваш Wi‑Fi защищён надёжным паролем и ваши устройства изолированы от гостевой сети.
  • Если вы публикуете доступ к Sonos API извне (например, пробросом портов), используйте методы аутентификации и шифрование.

Варианты и альтернативы

  • Вместо HAP-NodeJS можно использовать Homebridge — он предлагает множество плагинов и похожую концепцию эмулируемых аксессуаров.
  • Если у Sonos есть официальный обланый API в вашей версии, можно интегрировать напрямую через облако, но это сложнее и может потребовать OAuth.
  • Для розеток можно использовать готовые HomeKit-совместимые Wi‑Fi розетки — тогда NodeMCU не понадобится.
  • Для озвучивания можно подключить альтернативные TTS‑сервисы вместо VoiceRSS (проверьте лицензию и приватность).

Роли и чеклист перед запуском сцены

Для мастера‑сборщика (Maker):

  • Собрал/настроил Raspberry Pi с HAP-NodeJS
  • Установил Sonos HTTP API и проверил его работу
  • Скачал и настроил аксессуар Romantic_accessory.js
  • Опционально: загрузил прошивку NodeMCU и подключил реле

Для пользователя iOS:

  • Добавил аксессуар в приложение “Дом”
  • Создал сцену и дал ей понятное имя
  • Протестировал голосовые команды Siri

Для администратора сети:

  • Проверил права доступа к MQTT/HTTP/SSH
  • Ограничил доступ к Pi из внешних сетей
  • Сохранил резервные копии конфигураций

Критерии приёмки

  • Включение фейковой лампы запускает плейлист Sonos.
  • Выключение фейковой лампы ставит Sonos на паузу.
  • Регулировка яркости от 0 до 100 изменяет уровень громкости Sonos (если реализовано).
  • Сцена в приложении “Дом” активируется голосом через Siri.

Плейбук развертывания (SOP)

  1. Подготовка Pi: обновите систему (sudo apt update && sudo apt upgrade).
  2. Установите Node.js и npm (рекомендуется LTS‑версия).
  3. Разверните HAP-NodeJS и убедитесь, что он видим в приложении “Дом”.
  4. Клонируйте node-sonos-http-api, установите зависимости и запустите.
  5. Скачайте Romantic_accessory.js в папку accessories/, отредактируйте имена комнат/плейлистов.
  6. Перезапустите HAP-NodeJS, добавьте аксессуар в iOS.
  7. Создайте сцены в приложении “Дом” и проверьте голосовые команды.
  8. Настройте автозапуск сервисов и резервное копирование конфигураций.

Часто задаваемые вопросы

Q: Нужно ли джейлбрейкать iPhone?
A: Нет. Весь проект работает без джейлбрейка — HAP-NodeJS выступает как обычный HomeKit‑аксессуар.

Q: Могу ли я управлять несколькими зонами Sonos?
A: Да — создайте по аксессуару на каждую зону или расширьте логику аксессуара для выбора зоны перед отправкой запроса.

Q: Работает ли это через интернет?
A: По умолчанию всё работает в локальной сети. Для внешнего доступа потребуется проброс портов или VPN, но это повышает риски безопасности.

Итог

С помощью HAP-NodeJS и Sonos HTTP API вполне реально расширить возможности Siri и HomeKit, чтобы управлять тем, что официально не поддерживается. Проект даёт гибкую платформу: фейковые лампы работают как триггеры для произвольных HTTP‑действий, а NodeMCU позволяет интегрировать бытовые розетки. Экспериментируйте с маппингом яркости в громкость, добавляйте уведомления через TTS и создавайте новые сцены.

Понравился гид? Поделитесь своими идеями — какие ещё «специальные» действия для Siri вы хотели бы увидеть? Расскажите в комментариях, как вы используете Siri для автоматизации дома.

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

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

Подготовка к техническому собеседованию разработчика
Карьера

Подготовка к техническому собеседованию разработчика

Запуск мастера устранения неполадок в Windows
Windows

Запуск мастера устранения неполадок в Windows

Как создать мем: полное руководство
Социальные сети

Как создать мем: полное руководство

Как устранить BSOD 0x0000003B в Windows
Windows

Как устранить BSOD 0x0000003B в Windows

Clone Stamp в Photoshop — подробное руководство
Графика

Clone Stamp в Photoshop — подробное руководство

Синхронизация звука и видео в After Effects
Видео монтаж

Синхронизация звука и видео в After Effects