Hallo Zusammen,
hab ein kleines Problem seit dem Update auf FHEM 5.7 beim ersten Laden einer eigenen HTML-Seite werden die Status der Geräte nicht mehr eingelesen.
In meinem Beitrag http://forum.fhem.de/index.php/topic,23346.msg318156.html#msg318156 hatte ich beschrieben, wie ich es hinbekommen habe, dass in einer "Standalone" Webseite, welche ich für die 3D-Animation habe, der Status der Geräte ausgelesen werden kann.
Hierzu hatte ich das wichtigste aus der damligen fhemweb.js übernommen und die FW_doUpdate noch FW_doUpdate3D umgeändert.
/*************** LONGPOLL START **************/
var FW_pollConn;
var FW_curLine; // Number of the next line in FW_pollConn.responseText to parse
var FW_leaving;
var isIE = (navigator.appVersion.indexOf("MSIE") > 0);
var isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/);
function
log(txt)
{
if(typeof window.console != "undefined") // IE
console.log(txt);
}
function
addcsrf(arg)
{
var csrf = document.body.getAttribute('fwcsrf');
if(csrf && arg.indexOf('fwcsrf') < 0)
arg += '&fwcsrf='+csrf;
return arg;
}
function
FW_doUpdate3D()
{
if(FW_pollConn.readyState == 4 && !FW_leaving) {
FW_errmsg("Connection lost, trying a reconnect every 5 seconds.", 4900);
setTimeout(FW_longpoll, 5000);
return; // some problem connecting
}
if(FW_pollConn.readyState != 3)
return;
var lines = FW_pollConn.responseText.split("\n");
//Pop the last (maybe empty) line after the last "\n"
//We wait until it is complete, i.e. terminated by "\n"
lines.pop();
var devs = new Array();
for(var i=FW_curLine; i < lines.length; i++) {
var l = lines[i];
var d = l.split("<<", 3); // Complete arg
if(d.length != 3)
continue;
//objectList wird in der HTML-Datei mit den 3D-Objecte gefüllt
//<sensorID> : <3D-Object>
//Bsp: objectList["HMW_LC_Sw2_DR_LEQ0116953_04"] = lampe;
if(objectList[d[0]])
{
if (d[1] == 'on')
objectList[d[0]].visible = false;
if (d[1] == 'off')
objectList[d[0]].visible = true;
}
}
// reset the connection to avoid memory problems
if(FW_pollConn.responseText.length > 300*1024)
FW_longpoll();
}
function
FW_longpoll()
{
log("Connecting...");
FW_curLine = 0;
if(FW_pollConn) {
FW_leaving = 1;
FW_pollConn.abort();
}
FW_pollConn = new XMLHttpRequest();
FW_leaving = 0;
//Wenn die HTML-Datei direkt im Floorplan integriert ist, kann
//der Pfad der Geräte dynamisch aus top.document.location.pathname
//gebildet werden.
//Lesen des Pfades über top.document, falls die JavaScript in einer
//eingebetter Webseite gerufen wird.
var query = top.document.location.pathname+"?XHR=1&inform=type=status;filter=.*;×tamp="+new Date().getTime();
//Fest codiert für den Test, wenn HTML-Seite "standalone"
//query = "/fhem/floorplan/LCARS_EG?XHR=1&inform=type=status;filter=.*;×tamp="+new Date().getTime();
query = addcsrf(query);
FW_pollConn.open("GET", query, true);
//FW_doUpdate3D: JavaScript-Function, welche bei Änderung gerufen wird.
FW_pollConn.onreadystatechange = FW_doUpdate3D;
FW_pollConn.send(null);
}
window.onbeforeunload = function(e)
{
FW_leaving = 1;
return undefined;
}
Bis zu meinem Update auf FHEM 5.7 wurde der Status wie folgt bestimmt:
var lines = FW_pollConn.responseText.split("\n");
//Pop the last (maybe empty) line after the last "\n"
//We wait until it is complete, i.e. terminated by "\n"
lines.pop();
var devs = new Array();
for(var i=FW_curLine; i < lines.length; i++) {
var l = lines[i];
var d = l.split("<<", 3); // Complete arg
Siehe auch: http://forum.fhem.de/index.php/topic,12460.msg75555.html#msg75555
Dies klappt auch weiterhin, wenn man im Browser einen Schalter betätigt. Dann wird die FW_doUpdate-Methode angesprungen.
ABER, beim ersten Aufruf der Seite stehen auf der Variablen FW_pollConn.responseText die Status der Schalter nicht mehr drauf.
z.B. "HMW_LC_Sw2_DR_LEQ0116953_04<<off<<<div id="HMW_LC_Sw2_DR_LEQ0116953_04" class="col2">
1. Warum? (Vermutlich der Optimierung schuldet...)
2. Was gibt es für ein Alternative bzw. wie kann ich per JavaScript oder auf dem FHEM-Server die Status der Schalter lesen?
Die aktuelle Optimierung, welche vermutlich aus http://forum.fhem.de/index.php/topic,23774.msg173038.html#msg173038 resultiert habe ich
noch nicht in den eigenen Code übernommen. Dies scheint aber nicht die Ursache zu sein, denn mit der Standard-fhemweb.js sind
Ein Status der Geraete wird nicht mitgeschickt, da das ja beim Seitenaufbau schon der Fall war. Es werden aber die Stati aller Geraete seit dem since Parameter (oder now()-5, falls since niht gesetzt ist), gesendet, damit keine Luecke zwischen Seitengenerierung und Longpoll-Verbindungsaufbau entsteht. Du kannst das missbrauchen fuer deinen Zweck, indem du since auf 0 setzt.
Um Status abzufragen gibt es viele Wege, z.Bsp. JsonList2/XmlList/list mit deviceName als Argument oder ohne, { Value(device) }, und evtl. noch weitere.
Ah, ok danke für den Stichpunkt jsonlist2.
Dann kann ich mit http://fhem:8083/fhem?XHR=1&cmd=jsonlist2+HMW_LC_Sw2_DR_LEQ0116953_04 den Status beim ersten Aufruf abfragen:
{
"Arg":"HMW_LC_Sw2_DR_LEQ0116953_04",
"Results": [
{
"Name":"HMW_LC_Sw2_DR_LEQ0116953_04",
"PossibleSets":" config inhibit install_test off on toggle ",
"PossibleAttrs":"verbose:0,1,2,3,4,5 room group comment:textField-long alias eventMap userReadings:textField-long do_not_notify:0,1 ignore:1,0 dummy:1,0 showtime:1,0 serialNr model:HMW_IO_12_Sw14_DR,HMW_IO_12_FM,HMW_LC_Bl1_DR,HMW_IO_12_Sw7_DR,HMW_Sen_SC_12_FM,HMW_LC_Dim1L_DR,HMW_LC_Sw2_DR,HMW_IO_SR_FM,HMW_IO_4_FM,HMW_Sen_SC_12_DR subType stateFormat firmwareVersion setList event-min-interval cmdIcon devStateIcon devStateStyle fp_LCAR fp_LCARS_EG fp_LCARS_GARTEN fp_LCARS_OG fp_LCARS_STATUS fp_fp_default icon sortby webCmd widgetOverride userattr",
"Internals": {
"CHANGED": "null",
"DEF": "0000B84F_04",
"FW_VERSION": "3.06",
"MODEL": "HMW_LC_Sw2_DR",
"NAME": "HMW_LC_Sw2_DR_LEQ0116953_04",
"NR": "48",
[b] "STATE": "off",[/b]
"TYPE": "HM485",
"chanNo": "04",
"device": "HMW_LC_Sw2_DR_LEQ0116953"
},
"Readings": { "state": { "Value":"off", "Time":"2016-02-14 20:22:59" } },
"Attributes": {
"alias": "kue_lampe_2",
"devStateIcon": "off:switch_off:on on:switch_on:off",
"firmwareVersion": "3.06",
"fp_LCARS_EG": "295,1500,0,",
"model": "HMW_LC_Sw2_DR",
"room": "hidden",
"serialNr": "LEQ0116953",
"subType": "switch"
}
} ],
"totalResultsReturned":1
}
Wie ich die ganzen Infos noch sinnvoll verarbeite, finde ich selbst...
Für die Änderungen der Status nehme ich dann wieder FW_doUpdate().
Danke