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

Краткое определение
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.

Основной формат команд 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.

Создаём HomeKit‑аксессуар для Sonos
Идея: эмитировать HomeKit‑лампу (фейковую), у которой при включении отправляется HTTP‑запрос к Sonos API на воспроизведение плейлиста, а при выключении — пауза.
- В каталоге HAP-NodeJS установите модуль request:
sudo npm install request- Перейдите в папку
accessories/вашего HAP-NodeJS и скачайте готовый аксессуар:
wget https://gist.githubusercontent.com/jamesabruce/72bd250fbcf054acaa25/raw/8272d4b9a4ef76db752cab2ddd9bdc47d09a65f1/Romantic_accessory.js- Отредактируйте файл: в строке с адресом
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 лампой из предыдущего руководства.

Собираем сцену в HomeKit
Используйте Elgato Eve или стандартное приложение “Дом” на iOS для создания сцен. Сцена — это набор действий для аксессуаров (вкл/выкл, цвет, яркость и т. д.).
Примеры сцен, которые я сделал:
- “the kids are in bed” — выключает одну лампу, переключает вторую на розовый, включает фейковые “Romantic Playlist” и гирлянды.
- “let’s get serious now” — возвращает лампы в белый цвет и ставит Sonos на паузу (выключает наш фейковый акссессуар).
Siri умеет активировать сцену по короткой фразе без формального слова “активировать сцену” — просто скажите “Привет Siri, давай романтику” (назове сцены по‑русски). Точная фраза определяется тем, как Siri распознаёт наименование сцены.

Отладка и типичные проблемы
- 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)
- Подготовка Pi: обновите систему (
sudo apt update && sudo apt upgrade). - Установите Node.js и npm (рекомендуется LTS‑версия).
- Разверните HAP-NodeJS и убедитесь, что он видим в приложении “Дом”.
- Клонируйте node-sonos-http-api, установите зависимости и запустите.
- Скачайте Romantic_accessory.js в папку
accessories/, отредактируйте имена комнат/плейлистов. - Перезапустите HAP-NodeJS, добавьте аксессуар в iOS.
- Создайте сцены в приложении “Дом” и проверьте голосовые команды.
- Настройте автозапуск сервисов и резервное копирование конфигураций.
Часто задаваемые вопросы
Q: Нужно ли джейлбрейкать iPhone?
A: Нет. Весь проект работает без джейлбрейка — HAP-NodeJS выступает как обычный HomeKit‑аксессуар.
Q: Могу ли я управлять несколькими зонами Sonos?
A: Да — создайте по аксессуару на каждую зону или расширьте логику аксессуара для выбора зоны перед отправкой запроса.
Q: Работает ли это через интернет?
A: По умолчанию всё работает в локальной сети. Для внешнего доступа потребуется проброс портов или VPN, но это повышает риски безопасности.
Итог
С помощью HAP-NodeJS и Sonos HTTP API вполне реально расширить возможности Siri и HomeKit, чтобы управлять тем, что официально не поддерживается. Проект даёт гибкую платформу: фейковые лампы работают как триггеры для произвольных HTTP‑действий, а NodeMCU позволяет интегрировать бытовые розетки. Экспериментируйте с маппингом яркости в громкость, добавляйте уведомления через TTS и создавайте новые сцены.
Понравился гид? Поделитесь своими идеями — какие ещё «специальные» действия для Siri вы хотели бы увидеть? Расскажите в комментариях, как вы используете Siri для автоматизации дома.
Похожие материалы
Подготовка к техническому собеседованию разработчика
Запуск мастера устранения неполадок в Windows
Как создать мем: полное руководство
Как устранить BSOD 0x0000003B в Windows
Clone Stamp в Photoshop — подробное руководство