[HTTPMOD] XPath-Erweiterung

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

Vorheriges Thema - Nächstes Thema

BKSolo

Ich habe mit der neusten Version HTTPMOD (siehe http://forum.fhem.de/index.php?topic=45176.new;topicseen#new meine Alpha2 Implementierung angepasst.
Dabei verwende ich die neue Möglichkeit der mehrfachen XML-Werte.
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,

ich habe die neue Version HTTPMOD gern eingespielt und die ALPHA2-Abfrage gleich entsprechend vereinfacht.
Sieht viel übersichtlicher aus.

Mein memory-leak Problem ist leider noch da, allerdings steigt der Speicherverbrauch nicht mehr so schnell.
FHEM macht aktuell nichts anderes, als alle 10min insgesamt 10 ALPHA2-Reglerwerte abholen und per dblog sichern.
FHEM läuft jetzt etwa 24h
Speicher benutzt zu Anfang: 64 MB (sysmon-Wert)
Speicher benutzt nach 24h: 142 MB (sysmon-Wert)

Hat jemand eine Idee?
@ Stefan: was könnte ich zu Diagnose-Zwecken noch prüfen ?

Ich poste mal den Teil aus der CFG:

# Fussboden oben
define EZR_oben HTTPMOD http://192.168.2.22/data/dynamic.xml 600
attr EZR_oben userattr comment enableXPath-Strict reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict stateFormat
attr EZR_oben comment Fussbodenheizung
attr EZR_oben enableXPath-Strict 1
attr EZR_oben group Fussbodenheizung
attr EZR_oben reading01Name Ist-Temperatur
attr EZR_oben reading01XPath-Strict //Devices/Device/HEATAREA/T_ACTUAL/text()
attr EZR_oben reading02Name Soll-Temperatur
attr EZR_oben reading02XPath-Strict //Devices/Device/HEATAREA/T_TARGET/text()
attr EZR_oben stateFormat {sprintf("Ist-Temperatur-1: %.1f, Soll-Temperatur-1: %.1f , Ist-Temperatur-2: %.1f , Soll-Temperatur-2: %.1f , Ist-Temperatur-3: %.1f , Soll-Temperatur-3: %.1f  , Ist-Temperatur-4: %.1f , Soll-Temperatur-4: %.1f  ",  ReadingsNum($name,"Ist-Temperatur-1",0), ReadingsNum($name,"Soll-Temperatur-1",0), ReadingsNum($name,"Ist-Temperatur-2",0), ReadingsNum($name,"Soll-Temperatur-2",0),ReadingsNum($name,"Ist-Temperatur-3",0), ReadingsNum($name,"Soll-Temperatur-3",0), ReadingsNum($name,"Ist-Temperatur-4",0), ReadingsNum($name,"Soll-Temperatur-4",0))}

# Fussboden unten
define EZR_unten HTTPMOD http://192.168.2.21/data/dynamic.xml 600
attr EZR_unten userattr comment disable enableXPath-Strict reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict stateFormat
attr EZR_unten comment Fussbodenheizung
attr EZR_unten enableXPath-Strict 1
attr EZR_unten group Fussbodenheizung
attr EZR_unten reading01Name Ist-Temp
attr EZR_unten reading01XPath-Strict //Devices/Device/HEATAREA/T_ACTUAL/text()
attr EZR_unten reading02Name Soll-Temp
attr EZR_unten reading02XPath-Strict //Devices/Device/HEATAREA/T_TARGET/text()
attr EZR_unten stateFormat {sprintf("Ist-Temp-1: %.1f, Soll-Temp-1: %.1f , Ist-Temp-2: %.1f , Soll-Temp-2: %.1f , Ist-Temp-3: %.1f , Soll-Temp-3: %.1f  , Ist-Temp-4: %.1f , Soll-Temp-4: %.1f  , Ist-Temp-5: %.1f , Soll-Temp-5: %.1f  , Ist-Temp-6: %.1f , Soll-Temp-6: %.1f ",  ReadingsNum($name,"Ist-Temp-1",0), ReadingsNum($name,"Soll-Temp-1",0), ReadingsNum($name,"Ist-Temp-2",0), ReadingsNum($name,"Soll-Temp-2",0),ReadingsNum($name,"Ist-Temp-3",0), ReadingsNum($name,"Soll-Temp-3",0), ReadingsNum($name,"Ist-Temp-4",0), ReadingsNum($name,"Soll-Temp-4",0),ReadingsNum($name,"Ist-Temp-5",0), ReadingsNum($name,"Soll-Temp-5",0),ReadingsNum($name,"Ist-Temp-6",0), ReadingsNum($name,"Soll-Temp-6",0))}

StefanStrobel

Hallo pwfhem,

Bitte beobachte den Prozess doch mal mit einem anderen Tool. Ich kann bei meinen Tests keinen Anstieg der Speichernutzung feststellen (mit top den Prozess ausgewählt und und in fhem ein XML alle 10 Sekunden abgeholt).
Es könnte natürlich auch an den XML Libs liegen, die ggf. in eine bestimmten Version ein Leak haben ...
Wie groß sind denn die XML-Daten? Kannst Du mal ein File zum Testen posten? Vielleicht ist es ja auch von den Daten abhängig.

Gruss
    Stefan

pwfhem

bei mir werden von 2-ALPHA-Fussbodenregelungen XMLs abgefragt.
die beiden XML sind exemplarisch in der Anlage.
die gesamte HTTP-Antwort sieht (passend zu "alpha_2") so aus:

HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" Date: Tue, 08 Dec 2015 19:39:32 GMT Content-Length: 5134 <?xml version="1.0" encoding="UTF-8"?> <Devices> <Device> <ERRORCOUNT>0</ERRORCOUNT> <DATETIME>2015-12-08T19:39:32</DATETIME> <DAYOFWEEK>2</DAYOFWEEK> <TIMEZONE>1</TIMEZONE> <TPS>0</TPS> <LIMITER>0</LIMITER> <CHANGEOVER>0</CHANGEOVER> <COOLING>0</COOLING> <MODE>2</MODE> <ANTIFREEZE_TEMP>8.0</ANTIFREEZE_TEMP> <ECO_INPUT_STATE>0</ECO_INPUT_STATE> <T_HEAT_VACATION>16.0</T_HEAT_VACATION> <VACATION> <VACATION_STATE>0</VACATION_STATE> <START_DATE>2015-00-00</START_DATE> <START_TIME>12:00:00</START_TIME> <END_DATE>2015-00-00</END_DATE> <END_TIME>12:00:00</END_TIME> </VACATION> <CLOUD> <M2MSTATE>Online</M2MSTATE> </CLOUD> <HEATAREA nr="1"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>22.3</T_ACTUAL> <T_ACTUAL_EXT>22.3</T_ACTUAL_EXT> <T_TARGET>22.0</T_TARGET> <T_TARGET_BASE>22.0</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>2</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <HEATAREA nr="2"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>21.7</T_ACTUAL> <T_ACTUAL_EXT>21.7</T_ACTUAL_EXT> <T_TARGET>22.4</T_TARGET> <T_TARGET_BASE>22.4</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>2</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <HEATAREA nr="4"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>22.4</T_ACTUAL> <T_ACTUAL_EXT>22.4</T_ACTUAL_EXT> <T_TARGET>22.2</T_TARGET> <T_TARGET_BASE>22.2</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>2</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <HEATAREA nr="5"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>21.5</T_ACTUAL> <T_ACTUAL_EXT>21.5</T_ACTUAL_EXT> <T_TARGET>21.4</T_TARGET> <T_TARGET_BASE>21.4</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>2</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <HEATAREA nr="6"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>20.5</T_ACTUAL> <T_ACTUAL_EXT>20.5</T_ACTUAL_EXT> <T_TARGET>20.0</T_TARGET> <T_TARGET_BASE>20.0</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>2</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <HEATAREA nr="7"> <HEATAREA_MODE>1</HEATAREA_MODE> <T_ACTUAL>22.1</T_ACTUAL> <T_ACTUAL_EXT>22.1</T_ACTUAL_EXT> <T_TARGET>22.0</T_TARGET> <T_TARGET_BASE>22.0</T_TARGET_BASE> <HEATAREA_STATE>0</HEATAREA_STATE> <PROGRAM_SOURCE>0</PROGRAM_SOURCE> <PROGRAM_WEEK>0</PROGRAM_WEEK> <PROGRAM_WEEKEND>0</PROGRAM_WEEKEND> <PARTY>0</PARTY> <PARTY_REMAININGTIME>0</PARTY_REMAININGTIME> <PRESENCE>0</PRESENCE> <RPM_MOTOR>0</RPM_MOTOR> <BLOCK_HC>0</BLOCK_HC> <ISLOCKED>0</ISLOCKED> <LOCK_AVAILABLE>0</LOCK_AVAILABLE> <SENSOR_EXT>0</SENSOR_EXT> </HEATAREA> <IODEVICE nr="1"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> <IODEVICE nr="2"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> <IODEVICE nr="3"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> <IODEVICE nr="4"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> <IODEVICE nr="5"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> <IODEVICE nr="6"> <SIGNALSTRENGTH>2</SIGNALSTRENGTH> <BATTERY>2</BATTERY> <IODEVICE_STATE>0</IODEVICE_STATE> <IODEVICE_COMERROR>0</IODEVICE_COMERROR> <ISON>1</ISON> </IODEVICE> </Device> </Devices>

pwfhem

ich habe den Speicherverbrauch noch einmal mit "top" und einem kürzeren Intervall beobachtet:

- alle 10s 2 XMLs abholen:

top -p"perl-PID"

time            VIRT         RES
19:07   33452   28060
19:08   35216   30072
19:09   37380   32036
19:10   39756   34392
19:11   42136   36756
19:12   44512   39128
19:13   46888   41484
19:14   49264   43852
19:15   51568   46228
19:16   53948   48572
19:17   56324   50952

StefanStrobel

Hallo pwfhem,

ich habe versucht Dein Szenario bei mir nachzustellen und beide XML Dateien alle 10 Sekunden mit Deiner Konfiguration gelesen (per file:// statt http://, aber das ändert nichts an der Verarbeitung). Der Speicher ist absolut konstant.
Das Attribut EnableXpath-Strict ist inzwischen übrigens überflüssig. Das war nur für die alte Syntax nötig.
Bei Reading01XPath-Strict etc. geht es ohne, es schadet aber auch nichts.

Könntest Du es mal auf einem Raspi oder in einer anderen Linux VM testen? Nicht dass es an Perl oder an den XML Libraries für Deinen cubietruck liegt ...

Gruss
    Stefan

pwfhem

#21
Hallo Stefan,

danke für's Testen.
raspi geht (kernel 4.1.7), auf dem cubi muss es wegen "boot von nand, root auf sata" 3.4.110 sein.
Vielleicht muss ich NAND aufgeben und den neuen Kernel auf dem cubi versuchen.

Gruss
Peter

update 13.12., 14:10:
- cubietruck neu installiert (boot SD, root auf SATA)
- Kernel 4.2.6.sunxi
- perl: 5.20.2-3+deb8u1
- mini fhem.cfg, nur alle 10s xml abholen (geht noch falsch "didn't match any reading" wegen fehlender libxml)
- noch alles perfekt: stabiler, nicht steigender Speicherverbrauch
- apt-get install libxml-parser-perl libxml-xpath-perl
- jetzt klappt das decodieren
- jetzt steigt allerdings wieder im 10s-Takt der Speicherverbrauch

bin etwas ratlos.
Peter

StefanStrobel

Hallo,

sieht für mich so aus, als ob die Perl-XML Libs auf der Plattform ein Leak haben ...
Ist das eine andere Version?

Gruss
    Stefan

pwfhem

ich glaube, es sind identische Versionen -- andere Plattform (ARM) allerdings
libxml-parser-perl: 2.41-3
libxml-xpath-perl: 1.13-7

Peter

BKSolo

Ich habe das FileLog auf DbLog geändert, verwende dazu SQLite. Zusätzlich habe ich das Plot auf ein einzelnes GPlot File mit Parametern angepasst.
Zu lesen unter http://forum.fhem.de/index.php/topic,42040.msg375369.html#msg375369
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

jnewton957

Hallo,

ich würde gerne aus einer Seite meines Radiosenders den aktuellen Song auslesen.

www.radiobonn.de bzw. http://www.radiobonn.de/bonn/rb/53226/mp3-livestream

und da eben auf der rechten Seite die aktuelle Playlist.

Wie mache ich das am besten ???


Ich würde gerne den aktuellen Titel und wenn möglich das Bild/Cover als reading haben.

Grüße

Jörg
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

Bytechanger

Hallo,

hier noch eine aktuelle Frage zum XPath, ich habe folgendes Phänomen:

Ich möchte von WeatherUnderground aktuelle Wetterdaten ziehen. Nun scheint es, dass neuerdings in dem gesendeten XML der Verlauf angezeigt wird, also Daten des Tages.
Daher würde mir der letzte Temperatureintrag reichen...

Habe versucht mit nachfolgendem Code das letzte Element zu bekommen.
Die [] wird jedoch ignoriert. Selbst ein //temp_c[1]/text() brachte das selbe Ergebnis, es wird ignoriert und als Ergebnis bekommt man
jeden Eintrag als separaten Reading , also temperature-1, temperature-2,...,temperature-64

define wetter_test HTTPMOD http://api.wunderground.com/weatherstation/WXDailyHistory.asp?ID=INORDRHE357&format=XML 600
attr wetter_test reading01Name Zeitpunkt
attr wetter_test reading01XPath-Strict //observation_time_rfc822[last()]/text()
attr wetter_test reading02Name temperature
attr wetter_test reading02XPath-Strict //temp_c[last()]/text()
attr wetter_test room Wettervorhersage


Mache ich etwas falsch, warum wird die Klammer ignoriert??


Greets

Byte

Prof. Dr. Peter Henning

#27

Bytechanger

Genau, und noch mal Sorry, hatte Bretter vor den Augen. Das XML war anders als gedacht aufgebaut!!

Greets

Byte

Prof. Dr. Peter Henning

Tipp: Eine kostenlose 4-Wochen-Lizenz für oXygen XML Editor. Oder zu mir in die Vorlesung kommen.

LG

pah