Две предыдущие части:

Как обычно, предисловие

Кроме IOT есть у меня более дорогое хобби - HiFi. Хобби само по себе вроде как самодостаточное, но поскольку IOT это вроде как про все - грех не поиграться в межвидовые гибриды. 

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

Предмет автоматизации

Есть у меня замечательный самодельный (может когда-то и распишу howto) музыкальный hifi плейер-стример на базе распределенной экосистемы Logitech Squueezebox и не менее замечательный старичок интегральный усилитель в А-классе Marantz. Оба устройства меня устраивают и служат верой и правдой, но есть одно но. Музыку на этом комплекте я слушаю от случая к случаю, а усилитель в А-классе хорошо кушать хочет всегда. Постоянное потребление усилителя даже без сигнала не падает никогда меньше 200вт, никаких режимов автоматического слипа у него не предусмотрено, это же HiFi, есть только механическая кнопка включить/выключить, но нажимать ее постоянно это не наш путь, нужно автоматизировать.


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

Что хочется - при включении музыки усилитель включать, при выключении - выключать.

По счастливому совпадению, на экосистему Logitech Squueezebox для openhab есть абсолютно шикарный bounding, покрывающий практически все аспекты работы системы. На усилителе Marantz же есть проприетарный проводной интерфейс для управления НО как я не гуглил, ничего похожего на спецификацию не нашел, все-же тогда еще и интернета толком не существовало. Потому понадобится любая совместимая с openhab управляемая розетка. Я решил, по устоявшейся традиции, взять копеечный sonoff pow, и mqtt прошивку Sonoff-Tasmota, получилась управляемая по wifi через mqtt "розетка", с дополнительной плюшкой в виде измерения потребления/напряжения. Осталось научить розетку реагировать на музыку.

Мой проигрыватель физически в сети squeezebox выступает в двух ролях - сервер и рендер/плейер, обвязка в опенхабе есть на обе роли но для задачи достаточно будет слушать события плейера.

squeezebox.things:

Bridge squeezebox:squeezeboxserver:music [ ipAddress="192.168.1.50", webport=9000, cliport=9090 ]
{
    Thing squeezeboxplayer amp_player[ mac="c0:3f:d5:65:3b:2f" ]
}
Thing network:servicedevice:squeezeboxserver_music [ hostname="192.168.1.50", port=9000, refreshInterval=6000 ]

Тут объявляется бридж на squeezebox, все танцы начинаются от сервера, потому ipAddress тут именно адрес сервера (в моем случае там-же и плейер но это не принципиально). Далее определяется связь с подключенным к серверу плейером (или несколькими плейерами), mac плейеров можно посмотреть в вебморде squeezebox сервера.

Также, по сложившейся традиции, я на все сетевые устройства делаю по дополнительному Thing network-бондинга, который просто пингует устройство и я всегда могу убедиться что устройство в сети, это полезно и просто.

music.items

Group gOffice_Music  "Home office music" <player> (OfficeRoom)
Group gOffice_MusicPlayer <player> (gOffice_Music)

Player Music_gOffice_Player "Home office music" (gOffice_Music, gOffice_MusicPlayer) {channel="squeezebox:squeezeboxplayer:music:amp_player:control"
String Music_gOffice_Player_Title "Title [%s]" (gOffice_Music) {channel="squeezebox:squeezeboxplayer:music:amp_player:title"}
String Music_gOffice_Player_Artist "Artist [%s]" (gOffice_Music) {channel="squeezebox:squeezeboxplayer:music:amp_player:artist"}
String Music_gOffice_Player_Album "Album [%s]" (gOffice_Music) {channel="squeezebox:squeezeboxplayer:music:amp_player:album"}
String  Music_gOffice_Player_Cover "Cover" (gOffice_Music) {channel="squeezebox:squeezeboxplayer:music:amp_player:coverartdata"}

Switch Music_gOffice_Amp_Auto "Music AMP automanage" <switch> (gOffice_Music)
Switch Music_gOffice_Player_Online (gOffice_Music, gService) { channel="network:servicedevice:squeezeboxserver_music:online" }
Number Music_gOffice_Player_ResponseTime (gOffice_Music, gService) { channel="network:servicedevice:squeezeboxserver_music:latency" }


Switch Music_gOffice_Amp_On "Music AMP power" <switch> (gOffice_Music)
    { mqtt=">[local:cmnd/sonoff/POWER:command:*:default],
            <[local:stat/sonoff/POWER:state:default]" }

String Music_gOffice_Amp_Power_Status "Music AMP power" <switch> (gOffice_Music)
    { mqtt="<[local:stat/sonoff/POWER:state:default]" }

Number Music_gOffice_Amp_Power "Sonoff Power [%.1f W]" <energy> (gOffice_Music,energy,power)
    { mqtt="<[local:tele/sonoff/ENERGY:state:JSONPATH($.Power)]" }

Number Music_gOffice_Amp_Power_V "Sonoff Voltage [%.1f V]" <energy> (gOffice_Music,energy,voltag)
    { mqtt="<[local:tele/sonoff/ENERGY:state:JSONPATH($.Voltage)]" }

Number Music_gOffice_Amp_Power_A "Sonoff Currency [%.1f A]" <energy> (gOffice_Music,energy,currency)
    { mqtt="<[local:tele/sonoff/ENERGY:state:JSONPATH($.Current)]" }

Number Music_gOffice_Amp_Power_Pf "Sonoff power factor [%.1f]" <energy> (gOffice_Music,energy,powerfactor)
    { mqtt="<[local:tele/sonoff/ENERGY:state:JSONPATH($.Factor)]" }

Тут на почти все доступные каналы squeezebox плейра и sonoff розетки я создал Items. Для непосредственно решения задачи достаточно трех (Switch Music_gOffice_Amp_Auto, Player Music_gOffice_Player, Switch Music_gOffice_Amp_On) на них и навешено правило.

media.rules:

import org.joda.time.*
import org.openhab.model.script.actions.Timer


var Timer ampTimer = null
rule "media amp"
when
    Item Music_gOffice_Player changed
then
    if (Music_gOffice_Amp_Auto.state == ON) {
    if (ampTimer != null) {
        ampTimer.cancel();
    }

    switch (Music_gOffice_Player.state) {
        case PAUSE: {
            ampTimer = createTimer(now.plusSeconds(30)) [|
                Music_gOffice_Amp_On.sendCommand(OFF);
                logInfo("media_rule","off")
            ]
        }
        case PLAY: {
            ampTimer = createTimer(now.plusSeconds(1)) [|
                Music_gOffice_Amp_On.sendCommand(ON);
                logInfo("media_rule","on")
            ]
        }
        case STOP: {
            ampTimer = createTimer(now.plusSeconds(10)) [|
                Music_gOffice_Amp_On.sendCommand(OFF);
                logInfo("media_rule","off")
            ]
        }
        default: { 
            logInfo("music","incorrect state: {}",secureState.state)
        }
    }
    } else {
        logInfo("media_rule","auto disabled")
    }
end

Логика правила достаточно простая, если мастер-переключатель "автоматическое управление"(Music_gOffice_Amp_Auto) включен то при изменении состояния плеера на PLAY через секундный таймер включаем розетку, если состояние плейера стало PAUSE то через 50 секунд розетка выключается, если STOP то через 30 секунд.

Вся логика реализована через таймер, для того что-бы лишний раз не клацать туда-сюда нежный и не дешевый усилитель если возникла потребность прервать музыку на короткое время. При любом включении музыки на плейере (c диска/радио не важно) усилитель включается, при выключении - автоматом выключается через некоторое время, если за это время музыка опять включилась то естественно усилитель не выключится. Такая небольшая и простая автоматизация работает у меня уже много месяцев и экономит условно 100квт*ч  в месяц.