Hallo zusammen, hoffe der Titel ist aussagekräftig.
Ich bin gerade dabei Squeezebox einzurichten und da einer der Clients (mein Amazon Fire TV) leider kein Volume Control unterstützt, wollte ich den Volume Wert der Squeezebox, wenn sich dieser ändert, direkt dem AV-Receiver zuweisen. Das Problem ist, dass der Wert für die Squeezebox in FHEM nur kurz geändert wird, wenn man diesen über das Webinterface oder eine Remoteapp einstellt. Ca. 1 sek später wird er wieder auf 100 gesetzt. Ich müsste also eine Code Zeile schreiben welche quasi folgendes tut:
If(volume(Squeezeboxdevice) is changed && isnot 100) then set AVR volume to volume(Squeezeboxdevice)
Leider scheitere ich daran momentan noch. Folgende Teile des Codes funktionieren bisher:
{ReadingsVal("SB_PLAYER_be7f1f873a4c","volume","0")}
Gibt den aktuellen Wert von der Squeezebox wieder, falls er nicht ermittelt wird wird 0 gewählt
{fhem ("set AVR volume 20")}
Setzt dem Device AVR ein gewisse Lautsärke (hier 20)
Folgendes funktioniert nicht:
{fhem ("set AVR volume ReadingsVal("SB_PLAYER_be7f1f873a4c","volume","0")")}
Bei der Überprüfung ob sich Volume ändert bin ich leider noch nicht angekommen... denke mal das wird dann über ein notify umgesetzt?
Wäre super wenn mir jemand helfen könnte :)
define nt_SB_Player notify SB_PLAYER_be7f1f873a4c:volume.* {
fhem ("set AVR volume ".ReadingsVal( "SB_PLAYER_be7f1f873a4c", "volume", 0 ));
}
Hey dein Befehl funktioniert :) vielen Dank. Leider habe ich mir davor noch irgendwas zerschossen... Ich habe es vorher mittels:
fhem ("set AVR volume " . (ReadingsVal("SB_PLAYER_be7f1f873a4c","volume",0)))}
versucht. Das hat funktioniert nur leider spamt er den Befehl jetzt durchgehend. Mein Event Monitor wird überflutet von volume set befehlen... In der fhem.cfg steht aber nichts. Jemand ne Idee wo er den Befehl gespeichert hat? oO shutdown restart hat leider auch nichts gebracht
Mach mal ein Neustart. Eventuell hilft es ja.
Alternativ kannst ja mal bitte die Meldungen vom log hier posten
Und schau mal ob Du beim Device SB_PLAYER_be7f1f873a4c event-on-change-reading .* gesetzt hast.
Ein Neustart des AV-Receivers hat die Lösung gebracht ... Etwas merkwürdig aber ok. Leider scheitere ich jetzt schon wieder ... Ich möchte ja dass der volume Wert nur dann gesetzt wird, wenn dieser nicht 100 beträgt. Hätte deinen Code jetzt so angepasst:
SB_PLAYER_be7f1f873a4c:volume.* {
if(ReadingsVal("SB_PLAYER_be7f1f873a4c", "volume", 0) ne 100) fhem ("set AVR volume ".ReadingsVal( "SB_PLAYER_be7f1f873a4c", "volume", 0 ));
}
(Auszug aus der Def, also ohne "define nt_XXX notify)
Das klappt aber leider nicht, bekomme aber im Log auch irgendwie keinen error ...
Den if Teil hinter dem fhem Teil und mathatische Vergleiche immer mit mathematischen Operatoren machen. Also nicht ne oder eq sondern < oder > oder ==
Und so langsam mal über ein bisschen Perl Grundlagen nachdenken bitte.
Grüße
Hey, danke noch mal für die Antwort ;) also mit dem If dahinter wüsste ich nicht warum... aber habe die Syntax jetzt raus, habe es mit einem anderen Device getestet.
Problem scheint aber zu sein, dass der Volume Wert der Squeezebox so schnell wieder überschrieben wird, dass das notify nicht ausgelöst wird... Wenn ich den Volume Befehl über schnelles klicken spamme wird das notify ausgelöst, wird aber lediglich einmal der Wert geändert nicht. Gibt es evtl. eine Möglichkeit die Abtastrate zu erhöhen? Das komische ist, dass die Änderungen der Squeezebox Volumes sogar im Event monitor auftauchen aber das notify trotzdem nicht reagiert.
Bezüglich Perl: Ich bin dabei es mir anzueignen, ich arbeite erst seit kurzem mit fhem und ich denke eigentlich dass learning by doing da ganz gut funktioniert, solange man so ein hilfsbereites Forum hat wie hier ;) Danke! :)
der wert steckt übrigens auch in $EVTPART1. es ist unnötig ReadingsVal aufzurufen. und das auch noch mehrfach.
gruss
andre
Andre hat natürlich Recht. Der Wert ist in der Tat im Eventteil vorhanden und muß nicht extra abgefragt werden.
Gib mal bitte ein list von Deinem Notify.
Also list Notifydevice
Hallo zusammen,
sorry, dass ich mich damals nicht mehr zurückgemeldet habe. Kam einiges dazwischen. Naja habe es auf jeden Fall heute noch mal in Angriff genommen, weil ich Zeit hatte. Hier die Lösung, falls mal jemand ein ähnliches Problem hat.
SB_Wohnzimmer:volume.* {
my $temp=0.45 * $EVTPART1 + 10;;
if ($EVTPART1 <100) {
fhem("set AVR volume $temp")}
}
Denke, das ist soweit ganz gut gelöst.
Achso und Danke für die Hilfe nochmal :)