У меня дома AV-ресивер Yamaha и несколько стареньких приставок MusicCast (WXAD-10), одна из которых стоит в спальне. MusicCast — невероятно удобная система. Я давно ей пользуюсь, она мне очень нравится, и я не променяю ее ни на какую Алису и прочие аналоги.

Yamaha Musiccast
Yamaha Musiccast

Захотелось мне сделать простую вещь: чтобы в девять утра плавно включалось интернет-радио, моя любимая станция Relax FM, а в десять все выключалось. Оказалось — встроенной функции радиобудильника у приставки нет. Нет ее и в ресивере. Таймер сна и еще миллиард функций есть, а банального будильника — нет.

Начал копать API Yamaha Extended Control. Устройство управляется по HTTP, команды понятные: setPower, setVolume, recallPreset. Казалось бы — дело на пятнадцать минут: завести крон, пробросить порты на роутере и стукнуть приставку. Оказалось, не все так просто.

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

Минимальный набор:

  1. Ресивер Yamaha / устройство MusicCast с поддержкой API (Yamaha Extended Control).
  2. Роутер с возможностью проброса портов (у меня Keenetic Hopper).
  3. Белый IP-адрес от провайдера. Без него ничего не выйдет.
  4. Внешний сервер с cron (подойдет VPS и даже виртуальный).
  5. Немного bash и curl.

Белый IP — обязательный пункт. Если у вас серый адрес за NAT провайдера, до устройства из интернета не достучаться. Тогда только VPN или другая схема. Внешний сервер может не понадобиться, если на Keenetic накатить OpenWRT и использовать его планировщик. В стоковой прошивке его нет.

Документация Yamaha MusicCast HTTP simplified API

Как это работает

Yamaha управляется по HTTP. Есть API:

  • setPower
  • setVolume
  • recallPreset
  • setPlayback
  • getStatus

Сервер по расписанию дергает эти URL через curl. Все.

Чтобы не напугать себя утром, порядок действий такой:

  • сначала mute,
  • громкость в 0,
  • задержка,
  • запуск,
  • потом плавный фейд.

Цикл с шагом 1 и паузой 0.3 секунды дает аккуратный рост без скачка.

В 9:00:

  1. Включаем питание.
  2. Сбрасываем громкость в 0.
  3. Ждем, пока устройство проснется.
  4. Запускаем воспроизведение.
  5. Плавно поднимаем громкость до 20.
#!/bin/bash

IP="XXX.XXX.XXX.XXX"
PRESET_NUM=1
MAX_VOLUME=20

DELAY_AFTER_POWER=3
DELAY_AFTER_PRESET=8
DELAY_BEFORE_FADE=5

echo "Power ON"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setPower?power=on"

sleep $DELAY_AFTER_POWER

echo "Mute + volume 0"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setMute?enable=true"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setVolume?volume=0"

echo "Recall preset $PRESET_NUM"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/netusb/recallPreset?zone=main&num=$PRESET_NUM"

sleep $DELAY_AFTER_PRESET

echo "Force PLAY"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/netusb/setPlayback?playback=play"

sleep $DELAY_BEFORE_FADE

echo "Unmute"
curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setMute?enable=false"

echo "Fade in volume"
for vol in $(seq 1 $MAX_VOLUME); do
    curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setVolume?volume=$vol"
    sleep 0.3
done

echo "OK: preset started, volume $MAX_VOLUME"

В 10:00:

  • Отправляем setPower=standby.

wxad_shutdown.sh

#!/bin/bash

IP="XXX.XXX.XXX.XXX";

echo "Power OFF WXAD-10";
curl -s "http://$IP:8080/YamahaExtendedControl/v1/main/setPower?power=standby";

echo "OK: WXAD-10 выключен"

Работает стабильно. Главное — правильно расставить задержки. Единственная проблема с recallPreset. Изучив форумы, выяснилось, что старт воспроизведения именно Net Radio не гарантируется. Устройство может только воспроизвести последнюю выбранную станцию.

Про Keenetic и фильтр по IP

Устройству MusicCast нужно задать постоянный IP-адрес в локальной сети.

Порт 8080 пробрасываем наружу, чтобы сервер мог дергать API.

Делаю радиобудильник на Yamaha MusicCast
Keenetic Hopper: проброс портов

Хотел ограничить доступ по IP только для сервера прямо в переадресации, но пока оставил доступ как есть. Понимаю риски, но для тестового сценария этого достаточно. В идеале — VPN или более жесткая схема доступа.

В моем случае правило не заработало из-за того, что интернет подключен по PPPoE. Это значит, что внешний IP висит не на обычном WAN-порту, а на виртуальном PPPoE-интерфейсе. Я повесил ограничение по IP «не туда» — на другой интерфейс. В результате правило просто не применялось. Трафик проходил мимо фильтра, и порт оставался доступным всем. Когда работаешь с PPPoE, важно проверять, к какому интерфейсу реально привязан интернет. Иначе кажется, что всё настроено правильно, а по факту ограничение не работает вообще.

Вывод

Yamaha ❤️

Автоматизация — на уровне «если очень захотеть».
Радиобудильник собрать можно, но не настройка в меню, а:

  • белый IP,
  • проброс портов,
  • сервер,
  • cron,
  • curl,
  • тесты и терпение.

Зато теперь в 9:00 играет любимое радио, громкость растет плавно, а в 10:00 все выключается. Работает. И это главное.

Как будет время — доведу до более безопасной схемы через VPN.

Но как эксперимент — результатом доволен.

Прошу прощения за сумбур. Здесь фиксирую, чтобы не забыть. Возможно кому-то пригодится.