[PATCH] FHEMWEB - on-the-fly Änderung des Event-Monitor Filters

Begonnen von Markus Bloch, 24 März 2015, 12:20:10

Vorheriges Thema - Nächstes Thema

Markus Bloch

Hallo zusammen,

den Event-Monitor finde ich persönlich ein sehr praktisches Werkzeug.

In dem Beitrag http://forum.fhem.de/index.php/topic,12398.0.html wurde gefragt, ob es möglich ist, im Event-Monitor mit Filterausdrücken zu arbeiten um nur bestimmte Events zu sehen. Das geht ja aktuell auch bereits und wird z.B. bei update verwendet.

Jetzt wollte ich das ganze etwas intuitiver für Enduser einbauen und habe dazu in der console.js einen jquery-Dialog hinzugefügt, mit dem man einen Filter setzen kann. Die inform-Verbindung wir dann beendet und mit dem neuen Filter wieder aufgemacht.

In der JS-Konsole steht dann folgendes:

12:08:20.487 Console is opening
fhemweb.js:198 12:08:20.607 Longpoll with filter
fhemweb.js:198 12:08:21.534 ERRMSG:<
fhemweb.js:198 12:08:51.949 set new eventMonitor filter regexp: Herd
fhemweb.js:198 12:08:51.959 resetting console connection
fhemweb.js:198 12:08:51.960 ERRMSG:<
fhemweb.js:198 12:10:11.964 set new eventMonitor filter regexp: .*
fhemweb.js:198 12:10:11.974 resetting console connection
fhemweb.js:198 12:10:11.975 ERRMSG:<


Die aktuelle XHR-Verbindung wird sauber geschlossen, der Inhalt des Event-Monitors wird zurückgesetzt (<div>-Inhalt geleert) und anschließend via consFill() eine neue Verbindung aufgebaut.

Anbei der Patch, sowie Bilder zur Verdeutlichung.

Getestet in Chrome, Firefox und IE.

Was haltet ihr davon?

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Dem Code aus FHEMWEB entnehme ich, dass das Filter-Statement eine gültige devspec sein muss. Generell funktionieren Regex-Ausdrücke auf den Devicenamen auch, nur Ausrücke wie "room=Wohnzimmer" oder "room=Wohnzimmer:FILTER=STATE=on" fördern keinerlei Events zu Tage.

Bei einem Event-Monitor der keinerlei Filter aktiviert hat, sieht man die Events zu den entsprechenden Devices, nur eben mit einem aktivierten Room-Filter ist absolute Stille.

Der devspec Ausdruck kommt auch richtig in FHEM an und devspec2array() ermittelt die richtigen Devices und setzt sie in $me->{inform}{devices}. Dennoch kommen keinerlei Events im Event-Monitor, wenn man einen Ausdruck mit "x=y" verwendet.

Es scheint so, das irgendwo das Filterstatement nochmal als regulärer Ausdruck gegen die Devicenamen geprüft wird, ich weis aber nicht wo das sein könnte.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Ich habe den Patch stark ueberarbeitet uebernommen und eingecheckt.

Der Filter fuer type=raw hat auf das meldende device geprueft, beim type=status wird beim Aufruf eine Liste der passenden Geraete via devspec2array erstellt, und deren Nachricht weitergereicht. Ich habe FHEMWEB angepasst, ab jetzt wirkt der Filter fuer type=raw auf die angezeigte Zeile, d.h. man kann nach beliebiges Filtern..

Markus Bloch

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Hallo Rudi,

prinzipiell funktioniert das so, aber die entsprechenden XHR-Verbindungen werden nicht geschlossen und bleiben aktiv (sowohl im Chrome, als auch Firefox). Dadurch kann es im Chrome irgendwann zu einem "Warten auf Sockets..." kommen, wenn zu viele gleichzeitige Verbindungen geöffnet sind.

Daher muss die Verbindung vorm öffnen sauber beendet werden. Dazu muss der Event-Listener für onreadystatechange entfernt werden und dann abort() ausgeführt werden (ansonsten wird mit abort der reconnect-Mechanismus gestartet).

in console.js zwischen Zeile 67 & 68:
consConn.onreadystatechange = undefined;
consConn.abort();


Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Habs geaendert, sicherheitshalber im consFill.
War bisher der Ansicht, dass nicht mehr verwendete Strukturen freigegeben werden, inkl. Verbindung zumachen. onreadystatechange zu entfernen ist vmtl. uebervorsichtig, habs aber mit uebernommen.

Markus Bloch

Hallo Rudi,

mit der aktuellen Implementation funktionieren nun leider keine URL übergebenen Filter, sowie auch das Filtern auf "global" bei einem update.

Wenn man ein update ausführt wird folgender HTML Code ausgeliefert:

<script type="text/javascript" src="/fhem/pgm2/console.js"></script>
<div id="content">
Events (Filter:<a href="#" id="eventFilter">global</a>):<br>

<div id="console"></div>


Wie man sehen kann, fehlt im <div> das Attribut "filter" mit der Regexp, die dann von console.js angezogen wird.

Entweder man nimmt nun den Filter aus dem <a>-Tag oder du müsstest den Filter im <div> zusätztlich mit einbauen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Hab den Filter aus dem a Tag genommen, dann ist es consistent mit dem Rest.