Hallo,
ich möchte meinem Slider (0-100) einen Wert zuweisen. Aktuell mache ich das mit
Setreading <dev> state 20.
Wenn ich den Befehl mit einem Schalter (on/off) im Webfrontend verbinde funktioniert das,
aber wenn ich den Befehl von einer "presence function" aus ausführe, habe ich keine Änderung des Sliders.
Eine Idee wie man das hinbekommt?
Vielen Dank! Viele Grüße Dirk
Ein Gedankenanstoß wäre toll, oder auch eine Info, wenn das einfach nicht funktioniert...
Hallo,
Mit einem notify kann man das machen. Poste bitte den Code für
Zitatwenn ich den Befehl von einer "presence function" aus ausführe, habe ich keine Änderung des Sliders
Grüße,
ChrisD
Hallo Chris,
soeben nach dem 1000sten Versuch habe ich es hinbekommen. Als Anfänger lassen die Erfolgserlebnisse eben auf sich warten ;-).
Außerdem habe ich noch ein Problem den Dummywert, den ich in der Funktion zum Abfragen der aktuellen Webradiolautstärke setze nicht in den notify reinbekomme. Der Rückgabewert des Dummy ist immer: ???.
99_myUtils
#########
sub radio_garten_volume()
{
# Create a socket object for the communication with the radio
my $Host = '192.168.178.2';
my $id = "00:04:20:2d:0e:d8";
my $Befehl = 'mixer volume ?';
my ($response);
my $sock_radio = new IO::Socket::INET(
PeerHost =>$Host,
PeerPort =>9090,
Type =>SOCK_STREAM,
Timeout =>5,
) or die "Fehler $!\n";
my $i = 1; ### Do Schleifende zur Sicherheit
$sock_radio->syswrite("$id $Befehl\n");
do { $sock_radio->recv($response, 30 + (length($Befehl)));
$i=$i+1;
} until (length($response) == 44 || $i == 9);
$response = substr($response,27 + (length($Befehl)));
{fhem "set tempvol $response"};
Log 1, Value("tempvol"); ### Hier wird der Wert korrekt angezeigt
$sock_radio->close();
return (1);
}
##########
FHEM.cfg
define tempvol dummy
define SB_Garten_Vol PRESENCE function {radio_garten_volume()} 5 5
define vol_notify notify SB_Garten_Vol { \
my $temp = Value("tempvol");; \
fhem "setreading SB_Garten_Slider state $temp";; \ ### $temp ist ???
}
Herzlichen Dank im Voraus!
Ups, die Smilies sind hier falsch interpretiert und sollten 3 Fragezeichen darstellen.
Mittlerweile kann ich meine Frage auch vereinfachen:
Der Dummy (tempvol) wird aus der Funktion heraus nicht gesetzt. Sämtliche Infos aus dem Forum deuten eigentlich daraufhin, dass
set <dev> <Wert> funktionieren sollte. Der Dummy den ich jetzt auch per webCmd definiert habe ändert aber seinen Wert nicht.
99_myutils
{ fhem ("set tempvol 20") };
Log 1, Value("tempvol"); ### ist korrekt
fhem.cfg
Log 1, Value("tempvol"); ### ist nicht der aktuelle wert
Hallo,
Der Dummy wird von der Funktion gesetzt, wie der Log-Aufruf auch dokumentiert. Durch das Verwenden des PRESENCE-Moduls passiert dies aber in der Child-Instanz. Das Presence-Modul forkt den FHEM-Prozess und ruft innerhalb des Child-Prozesses deine Funktion radio_garten_volume auf. Diese setzt tempvol auf den korrekten Wert und gibt 1 an das PRESENCE-Modul zurück. Dieses meldet diesen Wert über Telnet an den Parent-Prozess zurück und beendet sich wodurch dein eben gesetzter tempvol Wert verschwindet. Die Variable tempvol im Parent-Prozess wurde also nie gesetzt/geändert.
Grüße,
ChrisD
Hallo Chris,
vielen Dank für Deine Antort. Ich habe dann auch verstanden warum es nicht geht. Mit welcher Methode könnte man das Problem lösen? Zum Einen könnte man den Wert in einer Datei speichern und anschließend wieder auslesen, aber da mehrere Radios habe, wird das wohl die Resourcen zu stark belasten. Zum Anderen evtl. mit einer anderen Funktion. Ich denke gerade an watchdog, bin mir aber nicht sicher , ob diese auch im Parent/Child-Modus läuft.
Viele Grüße Dirk
Hallo,
Die Datenübergabe könntest du über Telnet machen. Anstelle von{fhem "set tempvol $response"};
sollte
my $telnetClient = IO::Socket::INET->new(PeerAddr => "localhost:7072");
syswrite($telnetClient, "set tempvol $response\n");
$telnetClient->close();
funktionieren (ungetestet).
Watchdog benutzt kein fork, ich sehe auch nicht wie du es für deine Funktion verwenden könntest. Ein Alternative wäre BlockingCall aus blocking.pm direkt zu verwenden.
Grüße,
ChrisD
Und das ungetestet?
Ich habs reinkopiert und es funktioniert!!!
Vielen Dank!