Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig

Begonnen von DS_Starter, 30 Juli 2017, 09:27:18

Vorheriges Thema - Nächstes Thema

DS_Starter

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
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DS_Starter

Hi Leon,

danke für den schnellen Tipp  :). Ich schau mal ...

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

rudolfkoenig

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.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DS_Starter

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.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

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
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

rudolfkoenig

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.

DS_Starter

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
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter