[gelöst] Hilfe bei getFN - funktion bzw. deren Darstellung

Begonnen von Byte09, 25 Dezember 2017, 10:14:56

Vorheriges Thema - Nächstes Thema

Byte09

Hi zusammen,

ich habe mal einen Frage zur darstellung bei Aufruf der getFN funktion.

Ich habe in einem Modul bzw dessen Webansicht einen Button der die Get funktion aufruft , wenn ich diesen benutze , wird die Funktion zwar korrekt aufgerufen, aber es erfolgt ein Reload der Seite und es wird nur die erwartete Antwort dargestellt.

wenn ich den gleichen Befehl , der dem Button hinterlegt ist im webcmd eingebe erfolgt die Darstellung des Ergebnisses ohne das er die komplette Seite nachlädt im .. ich denke ... Inline-Popup.

ich würde gerne erreichen, das bei Nutzung des Buttons das Ergebniss ebenso in diesem Inline-Popup dargestelt wird ohne erneutes laden der Seite , werde aber leider nicht fündig wie ich das bezwecke. Gibt es hier ein entsprechenden Parameter , der mitgegeben werden muss , oder wie muss ich das lösen .


EDIT: bzw. muss die Frage wohl sein, wie ich bereits vorhandene Scriptfunktion für Get aus einem externen Script aufrufen kann/muss, um dieses zu bezwecken ( hoffe ich ) .

Danke und sorry, .... aber bin hier mit wiki, forum etc nicht weitergekommen.

Gruss Byte09

CoolTux


my $ret = '<html><table width=100%><tr><td>';
        $ret .= '<table class="block wide">';
       
        foreach my $logs (@{$decode_json}) {
            $ret .= '<tr class="odd">';
           
            if($logs->{timestamp}) {
                $ret .= "<td><b>timestamp:</b> </td>";
                $ret .= "<td>$logs->{timestamp}</td>";
                $ret .= '<td> </td>';
            }
           
            if($logs->{type}) {
                $ret .= "<td><b>type:</b> </td>";
                $ret .= "<td>$logs->{type}</td>";
                $ret .= '<td> </td>';
            }
           
            foreach my $d (reverse sort keys %{$logs}) {
                next if( $d eq "type" );
                next if( $d eq "timestamp" );
               
                $ret .= "<td><b>$d:</b> </td>";
                $ret .= "<td>$logs->{$d}</td>";
                $ret .= '<td> </td>';
            }
           
            $ret .= '</tr>';
        }
   
        $ret .= '</table></td></tr>';
        $ret .= '</table></html>';
     
        return $ret;
[code]

Du musst einfach nur etwas in HTML zusammenbauen und das dann als return auf Deinen Aufruf zurück geben.
Das ist der leichte Teil. Sollte Dein get blockierend sein ist es etwas schwieriger  ;D
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

Byte09

#2
Hi Cooltux,

danke erstmal.

ich glaube ich habe mich falsch ausgedrückt . wie ich den inhalt der ausgabe generiere ist klar, es geht um die Art der Darstellung ( somit wohl letztendlich um die fhemweb.js ) mit der ich nicht klarkomme.

ich muss den get - aufruf aus einem eigenen script starten . geht soweit und ich bekomme auch die gewünschte rückgabe , aber auf einer neu geladenen seite, nicht mehr die Seite "?detail=$Name" , sondern eine leere Seite mit dem Ergebniss der Abfrage.

rufe ich get über die webcmd auf, bekomme ich die gleiche rückgabe, aber im Inline-Popup.

daher ist die Frage , wie ich aus einem eigenen script , die funktion "get XXX XXX" aufrufen kann, und das ergebniss in eben diesem Popup dargestellt wird .  ich glaube , ich müsste eine entsprechende function der fhemweb.ks mit eigenen Parametern ( get XXX $arg ) aufgrufen um das zu bezwecken ? , finde aber dazu irgendwie keine Dokumentation bzw. tue mich sehr schwer mit der vorhandenen Doku zur fhemweb.js.

gruss Byte09

CoolTux

Zitat von: Byte09 am 25 Dezember 2017, 10:45:14
Hi Cooltux,

danke erstmal.

ich glaube ich habe mich falsch ausgedrückt . wie ich den inhalt der ausgabe generiere ist klar, es geht um die Art der Darstellung ( somit wohl letztendlich um die fhemweb.js ) mit der ich nicht klarkomme.

ich muss den get - aufruf aus einem eigenen script starten . geht soweit und ich bekomme auch die gewünschte rückgabe , aber auf einer neu geladenen seite, nicht mehr die Seite "?detail=$Name" , sondern eine leere Seite mit dem Ergebniss der Abfrage.

rufe ich get über die webcmd auf, bekomme ich die gleiche rückgabe, aber im Inline-Popup.

daher ist die Frage , wie ich aus einem eigenen script , die funktion "get XXX XXX" aufrufen kann, und das ergebniss in eben diesem Popup dargestellt wird .  ich glaube , ich müsste eine entsprechende function der fhemweb.ks mit eigenen Parametern ( get XXX $arg ) aufgrufen um das zu bezwecken ? , finde aber dazu irgendwie keine Dokumentation bzw. tue mich sehr schwer mit der vorhandenen Doku zur fhemweb.js.

gruss Byte09

Ah jetzt verstehe ich. Du hast ein Skript was ein CommandGet() auf ruft und das Ergebnis soll in ein Pop-up. Sowas habe ich bisher noch nie gebraucht, da müssen wir mal bitte auf Wissende warten  :)


Grüße
Leon
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

Byte09

Zitat von: CoolTux am 25 Dezember 2017, 11:49:20
Ah jetzt verstehe ich. Du hast ein Skript was ein CommandGet() auf ruft und das Ergebnis soll in ein Pop-up. Sowas habe ich bisher noch nie gebraucht, da müssen wir mal bitte auf Wissende warten  :)


Grüße
Leon

das trifft es auf den Punkt  ;). Ich danke dir trotzdem.

gruss Byte09

DS_Starter

Hallo zusammen,

sowas geht ganz prima mit asyncOutput (siehe Wiki DevelopmentModuleAPI).
Rudi hatte mich unlängst darauf aufmerksam gemacht und ich setze es in meinem 49_SSCam ein.
Klappt prima sowohl mit get als auch mit set.

LG,
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

Byte09

Zitat von: DS_Starter am 25 Dezember 2017, 13:34:36
Hallo zusammen,

sowas geht ganz prima mit asyncOutput (siehe Wiki DevelopmentModuleAPI).
Rudi hatte mich unlängst darauf aufmerksam gemacht und ich setze es in meinem 49_SSCam ein.
Klappt prima sowohl mit get als auch mit set.

LG,
Heiko
Super,  schaue ich mir nachher mal , wenn die Bude wieder leer ist.

Danke und Gruss Byte99

Gesendet von meinem SM-G900F mit Tapatalk


CoolTux

Zitat von: DS_Starter am 25 Dezember 2017, 13:34:36
Hallo zusammen,

sowas geht ganz prima mit asyncOutput (siehe Wiki DevelopmentModuleAPI).
Rudi hatte mich unlängst darauf aufmerksam gemacht und ich setze es in meinem 49_SSCam ein.
Klappt prima sowohl mit get als auch mit set.

LG,
Heiko

Dazu muss das Ausgabemittel aber AsyncOutput unterstützen. Also FHEMWEB oder Telnet zum jetzigen Zeitpunkt.
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

Byte09

#8
Zitat von: DS_Starter am 25 Dezember 2017, 13:34:36
Hallo zusammen,

sowas geht ganz prima mit asyncOutput (siehe Wiki DevelopmentModuleAPI).
Rudi hatte mich unlängst darauf aufmerksam gemacht und ich setze es in meinem 49_SSCam ein.
Klappt prima sowohl mit get als auch mit set.

LG,
Heiko

Ich habe mir das eben mal angeschaut und probiert. Grundsätzlich geht es und ich bekomme die daten angezeigt - aber mit selber Problematik - ich löse mit der get abfrage schon ein reload der seite aus und genau dass will ich vermeiden ( was ja offensichtlich möglich ist , da der reload nicht erfolgt, wenn ich das get über die  über das Webcmd auslöse oder das SELECT auslöse ) .

die frage reduziert sich also darauf, wie ich aus einem eigenen script , ein "get NAME ARG" auslösen kann, ohne gleichzeitig ein reload der Seite auszulösen.


(Hintergrund: ich habe zum Zeitpunkt der Get Abfrage noch ungespeicherte Daten in einem Textfeld , die erhalten bleiben sollen, was sie bei einem Reload natürlich nicht tuen. )
Gruss Byte09

rudolfkoenig

Zitatdie frage reduziert sich also darauf, wie ich aus einem eigenen script , ein "get NAME ARG" auslösen kann, ohne gleichzeitig ein reload der Seite auszulösen.
Indem du das get mit FW_cmd (oder Vergleichbares) an FHEM sendest, siehe fhemweb.js. Also sowas wie

FW_cmd(FW_root+"?"+encodeURIComponent(cmd)+"&XHR=1", function(resp){
  FW_okDialog(resp);
});

Byte09

Zitat von: rudolfkoenig am 25 Dezember 2017, 19:18:03
Indem du das get mit FW_cmd (oder Vergleichbares) an FHEM sendest, siehe fhemweb.js. Also sowas wie

FW_cmd(FW_root+"?"+encodeURIComponent(cmd)+"&XHR=1", function(resp){
  FW_okDialog(resp);
});



erstmal danke, ich bekomme es aber nicht ans laufen .
Gibt es denn irgendwo eine Doku über die fhemweb.js , in der entsprechende Funktionen und deren Aufrufe ( parameter etc. ) beschrieben sind , und ich stelle mich nur zu dusselig an, sie zu finden ?

im Augenblick muss ich ja raten und / oder probieren  wie die Variablen cmd, resp etc. belegt sein müssen .
resp = Text in dem Popup
cmd = comand ( get NAME ARG ) ... ist das richtig ?

Aufruf erfolgt testweise also einfach so :
cmd ='get Test test';
//resp='resp';
//alert(encodeURIComponent(cmd));
FW_cmd(FW_root+'?'+encodeURIComponent(cmd)+'&XHR=1', function(resp){FW_okDialog(resp);});


wenn ich entsprechend aufrufe, bekomme ich ein leere Popup zurück , sehe aber schon im LOG, das irgendwas so wohl nicht stimmt , da die GetFN zwar aufggerufen wird, aber keine argumente übergeben werden , ausser modulname und hash .

2017.12.25 20:26:25 1: Test_get in: hash -> HASH(0x192f848), name -> Test, opt ->?, ARGS ->  L:121

wie muss denn die rückgabe aus der getFN sein , im augenblick beende ich Sie mit ' return "text"; ',  bekomme aber , wie gesagt , ein leeres Popup.

Gruss Byte09

Ich habe jetzt erstmal eine Möglichkeit gefunden, wenn auch wirklich hässlich irgendwie, indem ich das ganze als formular an entsprechende funktion weitergebe, an die auch daten der cmd-line weitergegeben werden. Funktioniert soweit - ist aber eher nicht so toll .

Nichtsdestotrotz würde ich die fhemweb.js aufrufe ja ganz gerne mal verstehen und würde mich freuen , wenn sich nochmal jemand entsprechende Zeit nimmt.

Byte09

ich habe die dokumentation gefunden und es funktioniert nun .

danke für die Hilfe , Gruss Byte09

Byte09

#12
hi,

ich muss den thread leider nochmal hochholen.

jetzt habe ich ein Problem mit 'FW_okDialog'.
Bei schliessen des Fensters mit OK , möchte ich gerne ein eigenes Script ausführen . Laut https://wiki.fhem.de/wiki/DevelopmentFHEMWEB-API#FW_okDialog soll dieses ja auch möglich sein , wobei ich glaube, das im wiki was durcheinander geht. Das dritte Parameter bei der Übergabe ist hier 'removeFn' . In der Parameterbeschreibung taucht nur 'returnFn' auf, und im Beispiel ' FW_okDialog('Hello world!',10000); ' taucht hier ein numerischer wert auf, der in der Parameterbeschreibung gar nicht da ist ,sondern bei 'FW_errmsg' als timeout auftaucht. Oder habe ich hier nur ein Verständnissproblem ?

Wie dem auch sei , ich bekomme es nicht geregelt, eine Funktion bei schliessen des Fensters aufzurufen . egal was ich als 3. parameter übergebe - ich erhalte immer folgende Fehlermeldung : 'TypeError: removeFn is not a function'

Kann mir hier bitte mal jemand auf die sprünge helfen, wie ich eine eigene Funktion ( z.B. funtion test() ) aufrufe ? , bzw. was ich hier als drittes Parameter übergeben muss ?

Danke und Gruss Byte09

rudolfkoenig

Die Parameter sind
- text (wird dargestellt)
- parent (wird rechts daneben dargestellt, siehe Save config Fragezeichen)
- removeFn (wird aufgerufen, falls das Fenster geschlossen wird).

Warum schaust du nicht die Implementierung oder die Aufrufe in fhemweb.js an?
Denk dran: FHEM ist OpenSource.

Byte09

danke,

ich denke ein Fehler in dem Wiki hat mich hier auf eine falsche fährte geschickt .

gruss Byte09