FHEM Forum

FHEM => Frontends => FHEMWEB => Thema gestartet von: msfox am 14 Februar 2016, 16:58:01

Titel: FHEM 5.7: Keine Status für Schalter beim ersten Laden der Seite
Beitrag von: msfox am 14 Februar 2016, 16:58:01
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
Titel: Antw:FHEM 5.7: Keine Status für Schalter beim ersten Laden der Seite
Beitrag von: rudolfkoenig am 15 Februar 2016, 11:44:26
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.
Titel: [gelöst]:FHEM 5.7: Keine Status für Schalter beim ersten Laden der Seite
Beitrag von: msfox am 15 Februar 2016, 17:20:00
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