Slider: Werte zuweisen und im Frontend aktualisieren

Begonnen von gibacht, 28 Dezember 2013, 13:05:04

Vorheriges Thema - Nächstes Thema

gibacht

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
HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.

gibacht

Ein Gedankenanstoß wäre toll, oder auch eine Info, wenn das einfach nicht funktioniert...

HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.

ChrisD

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

gibacht

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!






HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.

gibacht

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
HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.

ChrisD

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

gibacht

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
HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.

ChrisD

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

gibacht

Und das ungetestet?
Ich habs reinkopiert und es funktioniert!!!
Vielen Dank!
HMLAN, TVserver Headless YAVDR mit LMS und FHEM, Rasperry PI Openelec als Clients.