Autor Thema: Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig  (Gelesen 678 mal)

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1805
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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 8 64 Bit  (Jessie) & Synology iSCSI-LUNs,
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 11730
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #1 am: 30 Juli 2017, 09:37:28 »
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1805
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #2 am: 30 Juli 2017, 09:38:34 »
Hi Leon,

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

Grüße
Heiko
ESXi 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 8 64 Bit  (Jessie) & Synology iSCSI-LUNs,
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17262
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #3 am: 30 Juli 2017, 15:54:10 »
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.

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 11730
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1805
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #5 am: 30 Juli 2017, 16:38:50 »
Zitat
Dafuer 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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 8 64 Bit  (Jessie) & Synology iSCSI-LUNs,
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1805
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #6 am: 30 Juli 2017, 22:31:11 »
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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 8 64 Bit  (Jessie) & Synology iSCSI-LUNs,
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17262
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #7 am: 31 Juli 2017, 10:21:42 »
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.

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1805
Antw:Popup bei Get-Funktion erst ausgeben wenn Subroutine fertig
« Antwort #8 am: 31 Juli 2017, 19:28:04 »
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 6.5 auf NUC6i5SYH mit FHEM Gastsystemen auf Debian 8 64 Bit  (Jessie) & Synology iSCSI-LUNs,
DbLog/DbRep mit MariaDB auf Synology 415+,
Homematic, IT, FS20, Cams in Synology Surveillance Station (SSCAM), CUL 433, CUL 868, HM-CFG-LAN
Gefällt mir Gefällt mir x 1 Liste anzeigen