Все проекты

yoRadio Scheduler

Автоматическое управление интернет-радио yoRadio по расписанию

О проекте

Служба для автоматического управления yoRadio по недельному расписанию: включает выбранную станцию, задаёт начальную громкость, останавливает воспроизведение после окончания интервала и при необходимости выполняет плановую перезагрузку приёмника.

Стек
Python · systemd · HTTP · Telnet
Направление
Автоматизация
Год
2026

Задача

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

В разные дни радио может работать по разному графику, часть интервалов может переходить через полночь, а сам приёмник или управляющая служба в нужный момент могут оказаться временно недоступны. При этом автоматика не должна превращаться в назойливого надзирателя: если в течение дня человек остановил воспроизведение, выбрал другую станцию или изменил громкость, это решение нужно оставить в покое до следующего запланированного запуска.

Отдельная задача — плановая перезагрузка yoRadio. Её нельзя выполнять во время активного интервала или просто отправлять команду и считать работу законченной. Нужно остановить воспроизведение, выполнить reboot, дождаться возвращения сетевых интерфейсов и убедиться, что приёмник снова доступен.

В результате требовался не набор команд по времени, а небольшой контроллер состояния, который понимает расписание и при этом не мешает обычному ручному использованию радио.

Реализация

yoRadio Scheduler написан на Python и работает как отдельная systemd-служба. Управляющие команды отправляются через HTTP-интерфейс yoRadio, а текущее состояние приёмника определяется через Telnet. Сторонние Python-модули для работы службы не требуются.

Расписание хранится в TOML. Для каждого дня можно задать собственный интервал, объединить несколько дней общим правилом или полностью отключить автоматический запуск. Поддерживаются и интервалы через полночь — например, с 22:00 до 06:00 следующего дня.

При наступлении времени запуска Scheduler сначала получает состояние приёмника. Затем, если это действительно новый рабочий интервал, устанавливает начальную громкость и запускает выбранную станцию. После этого он не пытается постоянно поддерживать заданные параметры: ручная смена станции, громкости или STOP остаются в силе до следующего планового старта.

Чтобы перезапуск самой службы не выглядел для радио как новое событие расписания, Scheduler сохраняет своё состояние на диске. Это позволяет отличить уже обработанный интервал от нового и не отправлять повторно PLAY, изменение громкости или reboot.

Для плановой перезагрузки используется отдельный сценарий. Она разрешена только вне активного интервала. Перед перезагрузкой Scheduler останавливает воспроизведение, после команды выдерживает необходимую паузу, ждёт готовности Telnet и HTTP и только после этого возвращается к обычной работе.

Результат

Получилась самостоятельная служба, которая превращает обычный yoRadio в приёмник с полноценным недельным расписанием, не вмешиваясь при этом в его повседневное ручное использование.

На рабочем месте радио теперь само включается в нужное время, запускает заданную станцию с начальной громкостью и останавливается после окончания интервала. Если в течение дня кому-то понадобилось выключить его, переключить станцию или изменить громкость, Scheduler не начинает воевать с пользователем и возвращает автоматические параметры только при следующем запланированном запуске.

Плановая перезагрузка также выполняется автоматически и только тогда, когда она не мешает воспроизведению. Перезапуск сервера или самой службы не приводит к повторному выполнению уже завершённых действий.

В итоге вместо нескольких cron-заданий получился небольшой контроллер с собственным состоянием, расписанием и логикой восстановления. Проект работает как systemd-служба, не требует сторонних Python-зависимостей и опубликован под лицензией MIT.