[HTTPMOD] XPath-Erweiterung

Begonnen von nesges, 02 Mai 2015, 03:17:48

Vorheriges Thema - Nächstes Thema

nesges

Ich habe HTTPMOD um die Möglichkeit XPath statt regulärer Ausdrücke zu verwenden um Inhalte zu extrahieren, erweitert. Die Änderung in HTTPMOD habe ich minimal gehalten und lediglich HTTPMOD_ExtractReading (Zeile 598ff) um die "Keywords" xpath: und xpath-strict: erweitert. Zwei Beispiele:

attr KINO_PRUEM reading01Regex xpath://div[@class="movie-title"]/a

attr FEED reading01Regex xpath-strict://item/title/text()

Mit xpath: kann HTML gematcht werden, mit xpath-strict nur wellformed XML. Dazu werden die Perl Module HTML::TreeBuilder::XPath bzw. XML::XPath::XMLParser verwendet. Es wird bei Verwendung dynamisch geprüft ob die Module vorhanden sind. D.h. Nutzer, die die Funktion nicht benötigen, müssen die Perl Module nicht nachinstallieren.

Bekanntes Problem: Sollte man einen Regex notieren wollen, der mit einem der Keywords beginnt, muss man den Mechanismus umgehen, zB so:

attr CAVEAT reading01Regex [x]path:

Prof. Dr. Peter Henning


SirUli

Hi nesges,

wirst du diese Änderungen in das reguläre Modul übernehmen lassen?

Viele Grüße,
Uli

nesges

Ich hatte Stefan Strobel, den Maintainer des Moduls, auf die Erweiterung hingewiesen, allerdings keine Antwort erhalten. Evtl. ist's bei ihm untergegangen - von mir aus kann's aber natürlich gerne übernommen werden.

StefanStrobel

Hallo Nesges,

Ich finde die Grundidee der Erweiterung gut und habe sie auch schon testweise eingebaut. Allerdings bin ich gerade dabei noch mehrere andere Kleinigkeiten ins Modul einzubauen und daher kommt eine neue Version erst wenn ich damit einen sinnvollen Stand erreicht habe. Ich bin auch nicht ganz so glücklich mit der Verwendung des Regex Attributes für xpath. Eventuell baue ich es noch so um, dass man ein explizites xpath Attribut verwenden kann. Das fände ich etwas eleganter.
Bis ich eine neue Version poste kann es noch eine Weile dauern, da ich momentan leider nur sehr wenig Zeit fürs Programmieren habe.

Gruß
    Stefan

nesges

Eine Trennung der Attribute fände ich selbst besser. Ich hatte die Idee einfach mit möglichst wenig Aufwand implementiert - saubere Lösungen sind aber natürlich höchst willkommen :) Danke, dass du's übernimmst!

SirUli


BKSolo

Ich verwende die Fussbodenheizungssteuerung Alpha 2 und will diese ins FHEM (auf Raspberry 2B) einbinden. Bereits erfolgreich bin ich mit HTTPMOD und habe die XML-Daten im FHEM Buffer. Nun gelingt es mir mit Regex nur Daten von der ersten Heizzone zu addressieren, ich habe aber vier Heizzonen. Beharrlich in den Foren, Internet etc. gesucht bin ich auf die X-Path Erweiterung gestossen.
Ich bekomme die FHEM Meldung "configfile: Please install XML::XPath and XML::XPath::XMLParser to use the xpath-strict-Option".  Hier komme ich nicht weiter. Die Installation muss sicher auf dem Raspberry OS gemacht werden. Was muss ich laden?


define Alpha2 HTTPMOD http://xxx.xxx.xxx.xxx/data/dynamic.xml 600
attr Alpha2 userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex stateFormat
attr Alpha2 comment Fussbodenheizung
attr Alpha2 group Fussbodenheizung
attr Alpha2 enableXPath-Strict 1
attr Alpha2 reading01Name Ist-Temperatur1
attr Alpha2 reading01Regex xpath-strict://Devices/HEATAREA [@nr="1"]/T_ACTUAL([\d\.]+)
attr Alpha2 reading02Name Soll-Temperatur1
attr Alpha2 reading02Regex <T_TARGET>([\d\.]+)
attr Alpha2 reading03Name Ist-Temperatur2
attr Alpha2 reading03Regex <T_ACTUAL>([\d\.]+)
attr Alpha2 reading04Name Soll-Temperatur2
attr Alpha2 reading04Regex <T_TARGET>([\d\.]+)
attr Alpha2 room Fussbodenheizung


Danke, Bruno
Raspberry PI 2/3 - CUL-433(V3) - CUL-868 (V3) - Jeelink 868 - 433 S/E Eigenbau
TX29DTH-IT - FHT80B - FHT80TF - FS20KSE
FHEMobile 3.7r803 - Fhem2Fhem - Alpha2 - OZW672 - TelegramBot

nesges

Das müssten die Pakete libxml-parser-perl und libxml-xpath-perl sein, also als root:

apt-get install libxml-parser-perl libxml-xpath-perl

BKSolo

Vielen Dank - hat funktioniert. Ich musste folgendes noch installieren:

sudo apt-get install libxml-TreeBuilder-perl


Jetzt konnte ich meine vier Heizzonen auslesen mit:

define Alpha2 HTTPMOD http://xxx.xxx.xx.xxx/data/dynamic.xml 600
attr Alpha2 userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex stateFormat
attr Alpha2 comment Fussbodenheizung
attr Alpha2 group Fussbodenheizung
attr Alpha2 enableXPath-Strict 1
attr Alpha2 reading01Name Ist-Temperatur1
attr Alpha2 reading01Regex xpath-strict://Devices/Device/HEATAREA [@nr="1"]/T_ACTUAL
attr Alpha2 reading02Name Soll-Temperatur1
attr Alpha2 reading02Regex  xpath-strict://Devices/Device/HEATAREA [@nr="1"]/T_TARGET
attr Alpha2 reading03Name Ist-Temperatur2
attr Alpha2 reading03Regex xpath-strict://Devices/Device/HEATAREA [@nr="2"]/T_ACTUAL
attr Alpha2 reading04Name Soll-Temperatur2
attr Alpha2 reading04Regex xpath-strict://Devices/Device/HEATAREA [@nr="2"]/T_TARGET
attr Alpha2 reading05Name Ist-Temperatur3
attr Alpha2 reading05Regex xpath-strict://Devices/Device/HEATAREA [@nr="3"]/T_ACTUAL
attr Alpha2 reading06Name Soll-Temperatur3
attr Alpha2 reading06Regex  xpath-strict://Devices/Device/HEATAREA [@nr="3"]/T_TARGET
attr Alpha2 reading07Name Ist-Temperatur4
attr Alpha2 reading07Regex xpath-strict://Devices/Device/HEATAREA [@nr="4"]/T_ACTUAL
attr Alpha2 reading08Name Soll-Temperatur4
attr Alpha2 reading08Regex xpath-strict://Devices/Device/HEATAREA [@nr="4"]/T_TARGET
attr Alpha2 room Fussbodenheizung
attr Alpha2 stateFormat {sprintf("Ist-Temperatur1: %s , Soll-Temperatur1: %s \n, Ist-Temperatur2: %s , Soll-Temperatur2: %s \n, Ist-Temperatur3: %s , Soll-Temperatur3: %s  \n, Ist-Temperatur4: %s , Soll-Temperatur4: %s  \n",  ReadingsVal($name,"Ist-Temperatur1",0), ReadingsVal($name,"Soll-Temperatur1",0), ReadingsVal($name,"Ist-Temperatur2",0), ReadingsVal($name,"Soll-Temperatur2",0),ReadingsVal($name,"Ist-Temperatur3",0), ReadingsVal($name,"Soll-Temperatur3",0), ReadingsVal($name,"Ist-Temperatur4",0), ReadingsVal($name,"Soll-Temperatur4",0))}


In FHEM bekomme ich nun die jeweils aktuellsten Angaben von Alpha2


Ist-Temperatur1: 22.3 , Soll-Temperatur1: 23.5 , Ist-Temperatur2: 22.5 , Soll-Temperatur2: 23.5 , Ist-Temperatur3: 23.0 , Soll-Temperatur3: 19.0 , Ist-Temperatur4: 22.9 , Soll-Temperatur4: 19.0


Jetzt kann ich noch das Filelog und gplot ergänzen damit ich eine Protokollierung der Raumtemperaturen habe.

Werde mir anschliessend auch noch überlegen wie ich über XML die Soll-Temperaturen im Alpha 2 ändern kann.

Ich bin sehr dankbar für die XPath-Erweiterung.

Bruno

Raspberry PI 2/3 - CUL-433(V3) - CUL-868 (V3) - Jeelink 868 - 433 S/E Eigenbau
TX29DTH-IT - FHT80B - FHT80TF - FS20KSE
FHEMobile 3.7r803 - Fhem2Fhem - Alpha2 - OZW672 - TelegramBot

BKSolo

Habe die Alpha 2 Fussbodenheizungssteuerung ins Fhem http://forum.fhem.de/index.php?topic=42040.0 dokumentiert.
Raspberry PI 2/3 - CUL-433(V3) - CUL-868 (V3) - Jeelink 868 - 433 S/E Eigenbau
TX29DTH-IT - FHT80B - FHT80TF - FS20KSE
FHEMobile 3.7r803 - Fhem2Fhem - Alpha2 - OZW672 - TelegramBot

pwfhem

Hallo zusammen,

(ich hatte die Frage zuerst im ALPHA2-thread -- es scheint aber eher ein XML-Problem zu sein, deshalb hier nochmal)
zuerst vielen Dank für die Anleitung für die ALPHA2-Integration.
Ich habe 2 ALPHA2 (1x 4-Kanal, 1x 8-Kanal) eingebunden. geht zuverlässig.
Allerdings musste ich unbedingt auf dblog wegen plot umstellen.
Danach funktionieren die Grafiken schön schnell.

Soweit die guten Nachrichten.
Die schlechte ist: ich habe irgendwo ein memory leak:
- alle 10min (das ist das XML-Abhol-Intervall) steigt der perl-Speicher (top, free)
- irgendwann ist dann Schluss und lowmemkill beendet perl

Hat jemand eine Idee, wie ich der Sache weiter auf die Spur kommen kann ?
Ich habe im Forum einen einzigen Hinweis auf XML und memory leak gefunden, komme aber nicht weiter.


update 01.12.15
- das reine Abholen des XML per HTTPMOD scheint nicht das Problem zu sein
- solange "enableXPath-Strict 0" ist, wird zwar nix erkannt, aber der Speicher steigt nicht
- erst wenn XML-Erkennung an ist, steigt der Speicherbedarf stetig


Peter

Umgebung:
- cubietruck
- Linux 3.4.110-sun7i on armv7l
- fhem.cfg: nur ALPHA2-XML-Abfrage aktiv (alles andere deaktiviert)
- FHEM - version
fhem.pl             10024 2015-11-28 08:02:51Z rudolfkoenig
98_autocreate.pm     9911 2015-11-16 07:52:18Z rudolfkoenig
93_DbLog.pm          9718 2015-10-29 15:05:52Z rapster
91_eventTypes.pm     8725 2015-06-10 09:50:06Z rudolfkoenig
01_FHEMWEB.pm        9988 2015-11-24 13:45:07Z rudolfkoenig
92_FileLog.pm       10007 2015-11-26 14:05:29Z rudolfkoenig
98_HTTPMOD.pm        9127 2015-08-24 18:43:31Z ststrobel
91_notify.pm         8953 2015-07-13 15:13:06Z rudolfkoenig
33_readingsGroup.pm  9513 2015-10-18 10:25:13Z justme1968
99_SUNRISE_EL.pm     9831 2015-11-08 19:13:09Z rudolfkoenig
98_SVG.pm            9577 2015-10-21 17:45:02Z rudolfkoenig
42_SYSMON.pm         9437 2015-10-11 17:46:08Z hexenmeister
98_telnet.pm         9927 2015-11-18 18:53:43Z rudolfkoenig
99_Utils.pm          7914 2015-02-08 11:14:10Z rudolfkoenig
98_weblink.pm        9861 2015-11-11 18:25:40Z rudolfkoenig

StefanStrobel

Hallo,

ich bin gerade dabei HTTPMOD stark zu überarbeiten und zu erweitern. Die Integration alternativer Parser (XPATH oder auch JSON statt Regex) ändert sich dabei auch und ich hatte beim Überarbeiten auch den Eindruck dass es im bisherigen Code ein Memory-Leak geben könnte.
Die neue Doku ist noch nicht fertig und einzelne Features fehlen noch, aber das meiste funktioniert bereits so dass ich in den nächsten Tagen eine Version zum Testen posten kann.

Gruss
    Stefan

pwfhem

Zitat von: StefanStrobel am 02 Dezember 2015, 07:47:43
Hallo,

ich bin gerade dabei HTTPMOD stark zu überarbeiten und zu erweitern. Die Integration alternativer Parser (XPATH oder auch JSON statt Regex) ändert sich dabei auch und ich hatte beim Überarbeiten auch den Eindruck dass es im bisherigen Code ein Memory-Leak geben könnte.
Die neue Doku ist noch nicht fertig und einzelne Features fehlen noch, aber das meiste funktioniert bereits so dass ich in den nächsten Tagen eine Version zum Testen posten kann.

Gruss
    Stefan

ok. schön.  danke.

StefanStrobel

Hallo,

die neue Version ist jetzt gepostet:
http://forum.fhem.de/index.php/topic,45176.0.html
Bitte schaut doch mal ob Ihr mit der neuen Variante klar kommt. Im Gegensatz zur bisherigen Syntax werden bei der neuen Syntax mehrere Ergebnisse eines XPath nicht mehr einfach zusammengepackt sondern in einzelne Readings gespeichert. Ich hoffe das ist ein Schritt in die richtige Richtung. Bei Bedarf könnte ich auch noch ein "joinMultipleHits" Attribut oder etwas ähnliches einbauen.
Die alte Syntax mit dem "xpath:" in einer Regex würde ich gerne irgendwann wieder rauswerfen.

Gruss
    Stefan