FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Heiner33 am 19 Februar 2023, 11:06:51

Titel: HTTPMOD Vorschlag, wie ich das am besten auslesen könnte?
Beitrag von: Heiner33 am 19 Februar 2023, 11:06:51
Hallo zusammen, ich habe folgende Website, die ich per HTTPMod parsen möchte:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>APCUPSD Full Status Page</title>
</head>
<body>
<blockquote><pre>DATE     : 2023-02-18 20:32:37 +0000 
STATUS   : ONLINE
LINEV    : 234.0 Volts
LOADPCT  : 3.0 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 47.9 Minutes
MBATTCHG : 50 Percent
[...]
</pre></blockquote>
</body></html>


Die Daten liegen also "halbwegs" strukturiert innerhalb des <pre>-Tags vor.
Mit readingXXName und readingXXRegex kann ich auch problemlos an die Werte kommen. Die oben stehende HTML ist aber stark gekürzt, es gibt ca. 50 Werte, die ich jeweils in ein Reading parsen möchte.

Wollte mal nachfragen, ob es da nicht einen "einfacheren" Weg gibt die ganzen Werte zu parsen? Hilfe mir da eventuell die parseFunction1 ?

Titel: Antw:HTTPMOD Vorschlag, wie ich das am besten auslesen könnte?
Beitrag von: betateilchen am 19 Februar 2023, 11:28:11
Man muss nicht alles mit HTTPMOD machen.

Es tun manchmal auch 2 Zeilen Code in einer 99_myUtils.pm


   my ($err,@lines) = FileRead({ FileName => "/tmp/test.html", ForceType => "file" });
   map {Debug "name $1 value: $2" if ($_=~m/(.*):(.*)/)} @lines;


in /tmp/test.html habe ich Deinen HTML-Code gepackt, um das testen zu können.
Als Ergebnis kommt:


2023.02.19 11:23:33 1: DEBUG>name   "http value: //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2023.02.19 11:23:33 1: DEBUG>name <html xmlns="http://www.w3.org/1999/xhtml" xml value: lang="en">
2023.02.19 11:23:33 1: DEBUG>name <blockquote><pre>DATE     : 2023-02-18 20:32 value: 37 +0000 
2023.02.19 11:23:33 1: DEBUG>name STATUS    value:  ONLINE
2023.02.19 11:23:33 1: DEBUG>name LINEV     value:  234.0 Volts
2023.02.19 11:23:33 1: DEBUG>name LOADPCT   value:  3.0 Percent
2023.02.19 11:23:33 1: DEBUG>name BCHARGE   value:  100.0 Percent
2023.02.19 11:23:33 1: DEBUG>name TIMELEFT  value:  47.9 Minutes
2023.02.19 11:23:33 1: DEBUG>name MBATTCHG  value:  50 Percent


Anstatt Debug() könnte man natürlich auch setreading verwenden, um die Werte als reading in ein device zu schreiben.
Titel: Antw:HTTPMOD Vorschlag, wie ich das am besten auslesen könnte?
Beitrag von: betateilchen am 19 Februar 2023, 11:31:52
Hier noch die Variante inklusive des Filterns der nicht benötigten Zeilen.


sub html_test{
   my ($err,@lines) = FileRead({ FileName => "/tmp/test.html", ForceType => "file" });
   foreach my $l (@lines){
      $l =~ s/^<blockquote><pre>//;
      next unless $l =~ m/^[A-Z]/;
      if ( $l =~ m/(.*):(.*)/ ) {Debug "name: $1 value: $2"};
   }
}
Titel: Antw:HTTPMOD Vorschlag, wie ich das am besten auslesen könnte?
Beitrag von: Heiner33 am 19 Februar 2023, 16:23:19
Vielen Dank für die schnelle Antwort. Auf die Idee bin ich gar nicht gekommen... gut, dass ich nachgefragt habe ;)