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

Захотелось мне сделать простую вещь: чтобы в девять утра плавно включалось интернет-радио, моя любимая станция Relax FM, а в десять все выключалось. Оказалось — встроенной функции радиобудильника у приставки нет. Нет ее и в ресивере. Таймер сна и еще миллиард функций есть, а банального будильника — нет.
Начал копать API Yamaha Extended Control. Устройство управляется по HTTP, команды понятные: setPower, setVolume, recallPreset. Казалось бы — дело на пятнадцать минут: завести крон, пробросить порты на роутере и стукнуть приставку. Оказалось, не все так просто.
Что понадобится
Минимальный набор:
- Ресивер Yamaha / устройство MusicCast с поддержкой API (Yamaha Extended Control).
- Роутер с возможностью проброса портов (у меня Keenetic Hopper).
- Белый IP-адрес от провайдера. Без него ничего не выйдет.
- Внешний сервер с cron (подойдет VPS и даже виртуальный).
- Немного 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:
- Включаем питание.
- Сбрасываем громкость в 0.
- Ждем, пока устройство проснется.
- Запускаем воспроизведение.
- Плавно поднимаем громкость до 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.

Хотел ограничить доступ по IP только для сервера прямо в переадресации, но пока оставил доступ как есть. Понимаю риски, но для тестового сценария этого достаточно. В идеале — VPN или более жесткая схема доступа.
В моем случае правило не заработало из-за того, что интернет подключен по PPPoE. Это значит, что внешний IP висит не на обычном WAN-порту, а на виртуальном PPPoE-интерфейсе. Я повесил ограничение по IP «не туда» — на другой интерфейс. В результате правило просто не применялось. Трафик проходил мимо фильтра, и порт оставался доступным всем. Когда работаешь с PPPoE, важно проверять, к какому интерфейсу реально привязан интернет. Иначе кажется, что всё настроено правильно, а по факту ограничение не работает вообще.
Вывод
Yamaha ❤️
Автоматизация — на уровне «если очень захотеть».
Радиобудильник собрать можно, но не настройка в меню, а:
- белый IP,
- проброс портов,
- сервер,
- cron,
- curl,
- тесты и терпение.
Зато теперь в 9:00 играет любимое радио, громкость растет плавно, а в 10:00 все выключается. Работает. И это главное.
Как будет время — доведу до более безопасной схемы через VPN.
Но как эксперимент — результатом доволен.
Прошу прощения за сумбур. Здесь фиксирую, чтобы не забыть. Возможно кому-то пригодится.