Hallo zusammen,
wenn man dem Return des Get-Aufrufes einen Rückkehrwert mitgibt wird dieser ja als Popup im FHEMWEB ausgegeben.
Ich bin dabei bei 49_SSCam eine kleine Schnappschußgalerie aufpoppen zu lassen mit "get ... snapGallery".
Die Routine in Get sieht so aus:
} elsif ($opt eq "snapGallery") {
$hash->{HELPER}{GETSNAPGALLERY} = 1;
getsnapinfo("$name:2:2");
my $attr = AttrVal($name, "htmlattr", " ");
my $allsnaps = $hash->{HELPER}{SNAPHASH}; # = \%allsnaps
my @as = sort{$a <=>$b}keys%{$allsnaps};
foreach my $key (@as) {
Log3($name,3, "$name - Snap '$key' for gallery: ID => $allsnaps->{$key}{snapid}, File => $allsnaps->{$key}{fileName}, Created => $allsnaps->{$key}{createdTm}");
}
my $ret;
$ret = "<html>";
$ret .= "<img $attr src='data:image/jpeg;base64,$allsnaps->{0}{imageData}'><br>";
$ret .= "</html>";
return $ret;
}
Das funktioniert so auch. Allerdings gibt es das Problem dass die aktuellen Schnappschußdaten erst dann vorhanden sind wenn die Sub "getsnapinfo("$name:2:2")" durchgelaufen ist. Die Sub ist aber ein nichblockierender HttpUtils_NonblockingGet, was bedeutet dass die aktuellen Snaps erst beim zweiten Aufruf vorliegen.
Nun habe ich probiert am Ende von "getsnapinfo("$name:2:2")" wiederholt die Get-Funktion mit einem Flag aufzurufen (ready = Snap-Daten liegen vor). Liegt diese Flag vor, werden die Bilddaten zusammngestellt und dem Return übergeben. In diesem Fall wird aber kein Popup erzeugt ... wäre ja auch zu einfach.
Nun sehe ich die eine Möglichkeit in eine Schleife zu springen und diese (mit InternalTimer) auszuführen bis "ready" gesetzt wurde (nicht so schick), oder es gibt ein Konstrukt in FHEMWEB was ich direkt aufrufen könnte um die erzeugten Snapinfos dieser Routine zu übergeben und das Poup aufzublenden (besser).
In FHEMWEB habe ich entsprechendes gesucht, aber sehe den Wald vor Bäumen nicht komme da nicht weiter.
Ich würde mich über einen Tipp freuen und danke für eure Zeit. Vielleicht gibt es auch eine andere Möglichkeit an die ich momentan nicht denke und kann mir irgendwo etwas abschauen....
VG und einen schönen Sonntag,
Heiko
Schau Dir mal das Plex Modul von Andre an, da ist ein nicht blockierendes get drin verarbeitet. Alternativ kannst Dir auch HEOSPlayer an schauen. Da wurde vom Plex Modul abgekuckt auch ein verzögertes get drin verarbeitet.
Grüße
Hi Leon,
danke für den schnellen Tipp :). Ich schau mal ...
Grüße
Heiko
Kurz: man moechte in get FHEM nicht blockieren, und trotzdem Daten zurueckliefern. Dafuer sollte man asyncOutput($cl, "TEXT") verwenden, wobei $cl der Client Handle ist, was man in GetFn als $hash->{CL} ueberreicht bekommt.
Danke Rudi,
Heiko schaust Du
https://forum.fhem.de/index.php?topic=43771.0
https://wiki.fhem.de/wiki/DevelopmentModuleAPI
unter asyncOutput
ZitatDafuer sollte man asyncOutput($cl, "TEXT") verwenden, wobei $cl der Client Handle ist, was man in GetFn als $hash->{CL} ueberreicht bekommt.
Perfekt :) . Genau das was ich gesucht habe. Danke Rudi und Cooltux.
Ganz glücklich bin ich nun doch noch nicht geworden.
Kann es sein dass diese API nur für (Html)Text geeignet ist ?
Ich habe Bilddaten base64 kodiert vorliegen. Wenn ich die Daten mit
asyncOutput($hash->{CL}, "<html><img $attr src='data:image/jpeg;base64,$allsnaps->{$key}{imageData}'><br></html>");
zurückgebe werden sie mir als base64-Text im Popup angezeigt.
Ein direkter Return in der Get-Funktion:
my $ret = "<html><img $attr src='data:image/jpeg;base64,$allsnaps->{$key}{imageData}'><br></html>";
return $ret;
zeigt mir das entsprechende Bild ordentlich an.
Möglicherweise wird eine andere Aufrufsyntax benötigt, aber da in der Funktiosbeschreibung explizit "TEXT" ausgeführt ist, vermute ich dass auch nur (Htnl)Text übergeben werden kann.
Mein eigentliches Problem habe ich jetzt anders gelöst, aber es würde mich generell interessieren.
VG,
Heiko
asyncOutput war eigentlich nicht fuer Bilder gedacht, und ich werde mich weigern, darueber Videos zu streamen.
Ich habe gerade fuer Testzwecke die Rueckgabe in ZWave etwas angepasst:
asyncOutput($tHash->{CL}, "<html><a href=\"http://forum.fhem.de\">Forum</a>Timeout reading answer for $cmd</html>");
und erhalte dabei das unten angehaengte Bild, will sagen, HTML via asyncOutput funktioniert. Ich musste fuer href " verwenden, mit ' hatte ich auch Probleme.
Hallo Rudi,
ja, mit \" funktioniert es auch bei mir und sogar auch ohne in der Form:
$ret .= "<img $attr src=data:image/jpeg;base64,$allsnaps->{$key}{imageData}><br>";
asyncOutput($hash->{CL}, "$ret");
Prima, jetzt bin ich (vorerst) glücklich :D ... Danke !
VG
Heiko