Wie verwende ich Longpolling aus jQuery heraus?

Begonnen von PsychoD, 01 Februar 2015, 22:48:30

Vorheriges Thema - Nächstes Thema

PsychoD

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

herrmannj

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

PsychoD

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

herrmannj

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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

PsychoD

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