FHEM Forum

FHEM => Frontends => Thema gestartet von: PsychoD am 01 Februar 2015, 22:48:30

Titel: Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: PsychoD am 01 Februar 2015, 22:48:30
Hallo zusammen,

ich bastele gerade ein übersichtliches Frontend, mit der sich Temperatur der Heizungen und Anwesenheitsstatus simpel steuern lässt. Die desired-temp der Thermostate würde ich also gern per longpolling anbinden. D.h. wenn im FHEMWEB jemand die Temperatur ändert, soll es auch im jQuery UI übernommen werden. Leider bekomme ich es nicht hin, dass der Server mir nur bei Änderungen antwortet. Eine Antwort bekomme ich immer und direkt.

Hier die Codeschnipsel:
       function initiateLongPollingDesiredTempInput(device) {
            executeLongpollingFhemCommand('{Value("'+device+'")}','get',function(udata) {
                var dataArray = udata.split(/[ ]+/);
                var pos = 3;
                //Wenn der Befehl noch nicht gefunkt wurde, gibt value "set_desired-temp xx.x" zurück
                if (dataArray[0]=="set_desired-temp") {
                    pos=1;
                }
                //normalerweise gibt value in der Struktur "T: 19.8 desired: 18.5 valve: 23" zurück
                $("#"+device+"-desired-input").val(dataArray[pos]);
            });
        }

        function executeLongpollingFhemCommand(command,type,callback) {
            (function poll() {
              setTimeout(function() {
                //console.log(FHEMURL+"&XHR=1&inform=1&cmd="+command+"&timestamp="+new Date().getTime());
                    $.ajax({
                        url: FHEMURL,
                        dataType: "text",
                        type: type,
                        data: {
                            XHR: 1,
                            cmd: command
                        },
                        headers: {
                            'Cache-Control': 'no-cache'
                        },
                        error: function (xhr, textStatus, errorThrown) {
                            alert(JSON.stringify(xhr, textStatus, errorThrown));
                        },
                        success: function (data) {
                            //console.log(JSON.stringify(data));
                            callback(data);
                        },
                        complete: poll
                    });
                }, 30000);
            })();
 

Ich vermute, dass ich inform irgendwie verwenden muss. Setze ich inform=1, bekomme ich aber keine Antworten zurück. Hat jemand einen schlauen Rat für mich?
Für FHEMWEB ist es gesetzt:

attr WEB longpoll 1

Danke für jeden Rat!

VG
Titel: Antw:Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: herrmannj am 01 Februar 2015, 22:55:25
Hi,

vielleicht möchtest Du Dir das fronthem Projekt anschauen, da wird smartVISU (basiert komplett auf jquery mobile) per websocket angebunden.
Da findest Du praktisch die komplette Infrastruktur schon vor. fronthem ist nicht an smartVISU gebunden, wenn Du die Anbindung einmal verstanden hast (Vorlage smartVISU) und trotzdem noch ein eigenes frontend erstellen möchtest kannst Du den Datentransport per ws ganz einfach in Dein Projekt übernehmen.

fronthem ist beta aber bereits sehr stabil und wird ständig weiter verbessert.

vg
jörg
Titel: Antw:Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: PsychoD am 02 Februar 2015, 00:15:20
Hallo Jörg,

ich bin gerade nur drübergeflogen, aber das klingt superinteressant!!! Das schaue ich mir auf jeden Fall an, Danke für den Rat!

Bei der Variante die ich gerade bastele geht es wirklich darum lieber weniger als mehr Funktionen bereitzustellen. Zielgruppe sind meine Eltern, die völlig selbsterklärend die Heizung steuern sollen, dabei soll es auf iPad, iPhone und Notebook möglichst gleich aussehen. Das Frontend ist im Prinzip fertig, ich würde nur noch gern etwas mehr Robustheit reinbringen.

VG
Titel: Antw:Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: herrmannj am 02 Februar 2015, 00:40:48
kein Problem - geht. Der use case passt so auch auf smartvisu aber Du bist nicht festgelegt.

Schau es Dir an, wenn Du Unterstützung zur Anbindung Deines FE benötigst helfe ich gern.

Erster Startpunkt:
smartvisu an sich wegen Grundverständnis. 
Anbindung konkret: domotiga.js in /driver

vg
jörg
Titel: Antw:Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: justme1968 am 02 Februar 2015, 12:41:34
longpoll in fhemweb funktioniert nicht als direkte antwort auf das absetzen eines befehls sondern asynchron indem fhemweb auf einer unabhängigen dauernd offenen (zweiten) verbindung nachrichten an den browser sendet wenn es in fhem ein event gegeben hat das bestimmte filter kriterien erfüllt. es wird nicht aktiv vom browser gepollt.

wie in fhemweb diese verbindung vom browser zu fhem hin aufgebaut und offen gehalten wird findest du in FW_longpoll in fhemweb.js.

ein beispiel für das absetzen eines kommandos findest du in FW_cmd in fhemweb.js.

ein beispiel wie du aktiv aus dem js code einen wert synchron in fhem anfragen kannst findest du in FW_queryValue in fhemweb.js.

ansonsten kann man durch aus mit dem bestehenden fhemweb und bordmittel wie dem floorplan oder anderen vorhanden modulen ein einfaches und abgespeckten frontend bauen ohne das rad neu zu erfinden.

gruss
  andre
Titel: Antw:Wie verwende ich Longpolling aus jQuery heraus?
Beitrag von: PsychoD am 03 Februar 2015, 08:58:09
Hey Andre,

1000 Dank für die Codestellen, das werd ich mir am WE mal zu Gemüte führen. Interessanter Mechanismus, da wäre ich nicht so schnell drauf gekommen.

Viele Grüße