FHEM 5.7: Keine Status für Schalter beim ersten Laden der Seite

Begonnen von msfox, 14 Februar 2016, 16:58:01

Vorheriges Thema - Nächstes Thema

msfox

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=.*;&timestamp="+new Date().getTime();
  //Fest codiert für den Test, wenn HTML-Seite "standalone"
  //query = "/fhem/floorplan/LCARS_EG?XHR=1&inform=type=status;filter=.*;&timestamp="+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

rudolfkoenig

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.

msfox

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