Hallo,
bei mir hat das mit dem Modul YAMAHA_MC leider nicht gut funktioniert. Wenn das Modul in FHEM aktiv war, konnte ich bereits nach wenigen Tagen meine Box WX-021 nicht mehr erreichen, weder über FHEM noch über die Musicast App auf dem Handy. Nur ein Reset hat geholfen.
Woran das liegt, habe ich nicht weiter untersucht, da mir dafür ein Ansatz fehlt.
Da ich die Box aber weiterhin im Schlafzimmer als Berieselung morgens und abends einsetzen wollte, habe ich mir eine kleine Funktionssammlung zusammengestellt und diese über einen Dummy mit passendem Notofy nutzbar gemacht.
Um die Funktionen erstellen zu können, habe ich einige Infos und URLs aus einem Dokument mit dem Namen "Yamaha_Extended_Control_API_Specification_(Basic).pdf" entnommen. Wenn ihr das hier für euch erweitern wollt, einfach nach diesem Namen googlen.
Um die Perl-Funktionen einzubinden, muss die angehängte 99_myUtils_mc.pm im Ordner /opt/fhem/FHEM abgelegt und FHEM neu gestartet werden.
Dem Dummy habe ich einige User Attribute gegönnt:
HOST: IP des Musicast Geräts
zone: Die zu steuerende Zone (bei mir gibt es nur main).
defaultVolume: Die Lautstärke, die nach dem Einschalten aktiv sein soll.
defaultFavorite: Name des Favoriten, der nach dem Einschalten aktiv sein soll. Das Mapping zwischen den Namen von Favoriten und der internen Nummer muss händisch im Notify erfolgen.
Die Namen der im Gerät gespeicherten Favoriten sind im Attribut setList beim Dummy fest hinterlegt und muss von euch manuell gepflegt werden.
Einen automatischen Abgleich mit der Box gibt es hier nicht.
Der Dummy ist bei mir auch über das Handy über die Homebridge ansprechbar. Dafür sind die Attribute genericDeviceType und homebridgeMapping hier gepflegt.
Folgende Befehle können abgesetzt werden:
set <Name> on|off Gerät ein- oder ausschalten
set <Name> volume <Zahl> Lautstärke auf einen bestimmten Wert setzen
set <Name> volumeStep up|down Lautstärke einen Schritt erhöhen/reduzieren
set <Name> favorite <...> Favorit wechseln auf ...
set <Name> dimmer 0|1|2 LED Licht auf den Wert 0, 1 oder 2 setzen
Hier mein Dummy (als RAW Definition):
defmod SchlafzimmerBox dummy
attr SchlafzimmerBox userattr HOST zone defaultVolume defaultFavorite
attr SchlafzimmerBox HOST 192.168.168.20
attr SchlafzimmerBox defaultFavorite SWR3
attr SchlafzimmerBox defaultVolume 10
attr SchlafzimmerBox devStateIcon on:audio_volume_high@green off:audio_volume_low@red
attr SchlafzimmerBox event-on-change-reading .*
attr SchlafzimmerBox event-on-update-reading volumeStep
attr SchlafzimmerBox genericDeviceType media
attr SchlafzimmerBox homebridgeMapping clear\
Mute=state,valueOn=off,cmdOn=off,cmdOff=on\
On=state,valueOn=on,cmdOn=on,cmdOff=off\
Volume=volume::volume,minValue=10,maxValue=33,delay=1
attr SchlafzimmerBox icon audio_volume_high
attr SchlafzimmerBox readingList volumeStep volume favorite dimmer
attr SchlafzimmerBox room Homekit,Schlafzimmer
attr SchlafzimmerBox setList state:uzsuToggle,on,off volumeStep:down,up volume:slider,10,1,40 favorite:SWR3,1live,Meeresrauschen,Naturgeraeusche,Vogelstimmen,KleinerBach,Wasserplätschern dimmer:0,1,2
attr SchlafzimmerBox webCmd state:volumeStep:volume:favorite:dimmer
attr SchlafzimmerBox webCmdLabel State:VolumeStep:Volume:Favorite:Dimmer
attr SchlafzimmerBox zone main
Beim Notify und auch bei den Perl-Funktionen habe ich versucht, den Namen des Geräts selbst intern zu vermeiden. Somit ist die Anpassung an euren eigenen Namen hoffentlich sehr einfach machbar.
Und hier das Notify (ebenfalls als RAW Definition):
defmod ntSchlafzimmerBox notify SchlafzimmerBox:.* {\
my $status = ReadingsVal($NAME,"mute","off");;\
if ($EVENT eq "on") {\
fhem("cancel idVolumeTimerFor".$NAME." quiet");;\
fhem("cancel idOff".$NAME." quiet");;\
fhem("setreading ".$NAME." mute on");;\
mcSetPower($NAME, "on");;\
fhem("sleep 4;;set ".$NAME." dimmer 1;;sleep 0.5;;set ".$NAME." favorite ".ReadingsVal($NAME,"defaultFavorite","SWR3"));;\
} elsif ($EVENT eq "standby" || $EVENT eq "off") {\
fhem("cancel idVolumeTimerFor".$NAME." quiet");;\
fhem("cancel idOff".$NAME." quiet");;\
fhem("sleep 0.2;;set ".$NAME." favorite ".ReadingsVal($NAME,"defaultFavorite","SWR3").";;sleep 1;;set ".$NAME." volume ".AttrVal($NAME, "defaultVolume", 10).";;sleep 4;;{mcSetPower(\"".$NAME."\",\"standby\")};;setreading ".$NAME." mute off");;\
} elsif ($EVENT =~ /volumeStep/) {\
my @array = split(/ /,$EVENT);;\
if ($array[1] eq "up") {\
my $vol = ReadingsNum($NAME,"volume",10);;\
my $newvol = $vol + 1;;\
fhem("sleep 0.1;;set ".$NAME." volume ".$newvol);;\
} elsif ($array[1] eq "down") {\
my $vol = ReadingsNum($NAME,"volume",10);;\
my $newvol = $vol - 1;;\
fhem("sleep 0.1;;set ".$NAME." volume ".$newvol);;\
}\
} elsif ($EVENT =~ /volume/) {\
my @array = split(/ /,$EVENT);;\
mcSetVolume($NAME,$array[1]);;\
} elsif ($EVENT =~ /dimmer/) {\
my @array = split(/ /,$EVENT);;\
mcSetDimmer($NAME,$array[1]);;\
} elsif ($EVENT =~ /favorite/) {\
fhem("cancel idOff".$NAME." quiet");;\
my @array = split(/ /,$EVENT);;\
# Hier wird dem Namen eines Favoriten zum einen die interne Nummer im Gerät zugewiesen (die Liste beginnt immer bei 1)\
# weiterhin die zu setzende Lautstärke und eine Zeitdauer, die ein Timer in Sekunden zum Ausschalten haben soll (0 ist aus).\
# Die letzte Angabe steuert, mit welchem Abstand bei einem Timer die Lautstärke reduziert werden soll.\
my %favToNumber = (\
"SWR3"=>"1,24,0,0",\
"1live"=>"2,24,0,0",\
"Meeresrauschen"=>"3,17,1200,30",\
"Naturgeraeusche"=>"4,17,1200,30",\
"Vogelstimmen"=>"5,20,1200,30",\
"KleinerBach"=>"8,23,1200,30",\
"Wasserplätschern"=>"9,20,1200,30",\
);;\
my $value = $favToNumber{$array[1]};;\
my ($index,$lautstaerke,$timer,$pause) = split(/,/,$value);;\
if ($timer > 0 && $pause > 0) {\
fhem("sleep ".$timer." idOff".$NAME.";;set ".$NAME." dimmer 0;;sleep 0.5;;{mcVolumeDown(\"".$NAME."\", 1, 10, ".$pause.")}");;\
}\
mcSetFavorite($NAME, $index);;\
fhem("sleep 0.5;;set ".$NAME." volume ".$lautstaerke);;\
}\
}
Wenn die Perl-Funktionen das Gerät erreichen können, wird in FHEM am Dummy ein Reading namens lastupdate aktualisiert. Das entspricht dann dem Wert von time (aktuelle Zeit als ganze Zahl).
Damit kann dann auch geprüft werden, ob eventuell die Verbindung abgebrochen ist.
Im Fehlerfall setzen die Perl-Funktionen den Dummy auf den state off.
Der Dummy hat den Nachteil, dass seine Readings quasi immer zuerst geändert werden, bevor das Notify die Funktion wirklich ausführt.
Beispiel: Gerät ist aus, aber die Lautstärke wird am Dummy verändert. Das Reading volume wird geändert, aber am Gerät selbst passiert nichts. Das kann also auseinander laufen!
Neben den reinen Perl-Funktionen zum Steuern habe ich noch zwei gesonderte Funktionen eingebaut. Damit kann die Lautstärke langsam erhöht werden. Das Gerät wird eingeschaltet, falls es vorher aus war.
Oder die Lautstärke wird langsam reduziert und das Gerät bei Erreichen einer Minimallautstärke ausgeschaltet.
Beispiel:
{mcVolumeUp("SchlafzimmerBox", 1, 22, 3)}
Gerät einschalten, falls aus. Dann in 1er Schritten die Lautstärke erhöhen bis 22 erreicht ist. Zwischen den Erhöhungen immer 3 Sekunden Pause.
{mcVolumeDown("SchlafzimmerBox", 1, 10, 30)}
Lautstärke am Gerät in 1er Schritten reduzieren bis 10 erreicht ist, dann ausschalten. Zwischen den Reduzierungen immer 30 Sekunden Pause. Wenn das Gerät aus war, passiert nichts weiter.