Прошивка WLED для адресных светодиодных лент почему-то не предусматривает режим случайного перебора эффектов. Да, можно настроить кучу пресетов и плейлистов. Но дело это долгое и муторное, да и всё равно надоест однообразный перебор и захочется снова всё переделать.
Для своей гирлянды на адресных светодиодах я решил организовать случайный перебор эффектов и палитр с помощью Home Assistant.
Очевидно, что проще всего это сделать с помощью интеграции WLED, и именно с этого я и начал.
Вроде бы всё получилось, но работало оно как-то не так. Во-первых, интеграция WLED в Home Assistant вообще не умеет управлять цветами бэкграунда, таких сущностей просто нет, этот функционал не реализован. А это минус половина цветовых решений. Во-вторых оказалось, что списки эффектов и палитр в интеграции не в полной мере соответствуют реальным спискам эффектов и палитр прошивки контроллера ленты.
В итоге часто возникали ошибки в попытках запуска несуществующего эффекта, по факту при этом эффект просто не менялся или сбрасывался на дефолтный. А некоторые эффекты не возникали вовсе никогда, так как их в списке не было. Вывод был печальным - интеграция WLED в Home Assistant неюзабельна.
Тогда я пошёл другим путём, обратившись в документации WLED. И попробовал другой способ управления контроллером - через веб-сервис RESTful (REST API). И это сработало лучше.
Принципиальная разница в управлении эффектами и палитрами между WLED-интеграцией в Home Assistant и RESTful в том, что интеграция оперирует текстовыми наименованиями эффектов и палитр, а управление через REST API производится с помощью их числовых идентификаторов.
Для выбора конкретного эффекта или палитры использовать наименование, конечно же, удобнее. Но вот для случайного выбора из диапазона удобнее именно идентификаторы.
Тут правда есть небольшое неудобство. Вместе с обновлениями прошивки WLED не только появляются новые эффекты, но и исчезают некоторые старые. К тому же, эффекты для лент и матриц свалены в одну кучу, общим списком. Всё это нужно вначале разобрать по полочкам и оставить перечень только нужных идентификаторов, поэтому простым {{ range(150) | random }} результата не добиться.
Каким путём шёл я для вычленения только лишь нужных идентификаторов.
Для начала идём в документацию на страницу эффектов, прямо на странице мышкой выделяем всю таблицу эффектов и копируем её в Excel. Получается что-то такое:
Далее меняем всей таблице цвет шрифта на чёрный, отменяем объединение ячеек и отсортировываем таблицу по четвёртому столбцу (D):
Теперь мы точно видим, что эффектов для лент 112 и ещё 6 штук, подходящих для лент и для матриц. Начиная со 119 позиции идут музыкальные эффекты. Удаляем все строки, начиная со 119-ой и сортируем таблицу по первому столбцу:
Теперь нам нужно из первой колонки получить список чисел через запятую. Я не большой специалист в Excel, и, возможно, это делается быстрее и проще, но я делаю так.
Выделяем первый столбец (не весь, а ровно наш диапазон), копируем, и тут же ниже делаем "Специальная вставка - Транспонировать":
Копируем полученную строку и вставляем в блокнот:
Выделяем один промежуток между числами (не обращая внимания на то, что там - пробелы или табуляция) и делаем замену по всему списку этого выделенного куска на запятую:
Всё. У нас есть список идентификаторов эффектов, которые точно существуют, и нет ничего лишнего.
Со списком палитр проще - в нём нет дыр, он сплошной, поэтому будет вполне достаточно шаблона {{ range(2,71) | random }}.
Таким же шаблоном сделаем случайными цвета бэкграунда. Для одного RGB-цвета это будет так (я сделал в HEX, но можно сделать и в DEC):
{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random }}
Ну а случайную скорость эффекта и случайную его интенсивность я не стал делать через RESTful, так как они и в интеграции WLED представлены числовыми значениями.
Собрав всё это в кучу и запустив автоматизацию, мне захотелось некоторые эффекты исключить. Я прошёлся по всему списку эффектов вручную, вызывая в браузере ссылки локального доступа к ленте вида http://172.16.0.2/win&FX=12, где менял ручками номер эффекта. Не понравившиеся из списка удалял.
Что в итоге у меня осталось
В файле configuration.yaml несколько вызовов REST API:
rest_command:
wled_send_colors:
url: "http://172.16.0.2/win&CL=H{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random }}&C2=H{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random }}&C3=H{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random}}{{'%02X'%range(255)|random }}"
wled_send_effect:
url: "http://172.16.0.2/win&FX={{ [2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,27,28,29,31,32,33,34,35,36,37,38,39,40,41,44,45,46,47,49,50,51,52,54,55,56,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,80,81,86,87,88,89,91,92,93,94,95,96,97,101,102,103,104,105,106,107,108,109,110,111,112,113,115,117,147,184]|random }}"
wled_send_pallete:
url: "http://172.16.0.2/win&FP={{range(2,71)|random}}"
И автоматизация.
Логика её работы сейчас такова - эффект меняется случайно каждую минуту, и внутри минуты каждые 12 секунд (пять раз) случайно меняются палитра, цвета бэкграунда, скорость и интенсивность эффекта. У некоторых эффектов настроек больше, это, к сожалению, теряется.
Смену эффекта можно поставить на паузу вспомогательным переключателем input_boolean.pauza_perebora_effektov_girliandy_400. Включение этого переключателя я вывел на панель Home Assistant и прокинул в Яндекс Алису, чтобы управлять голосом.
А также можно принудительно инициировать случайную смену эффекта, для этого я создал отдельный скрипт с вызовом трёх RESTful команд, и тоже прокинул его в Алису для голосового управления:
Результат всей этой возни - никогда не повторяющийся перебор комбинаций всех настроек, а значит и никогда не надоедающие эффекты. Одних только комбинаций эффект-палитра получилось более 8-ми тысяч. А если сюда добавить ещё скорость и интенсивность - около полумиллиарда. А если ещё и цвета бэкграундов, то примерно вот столько: ))