gelöst: HTTPMOD Readings aus einfacher PlainText-Webseite erstellen

Begonnen von howy-1, 10 September 2019, 23:11:23

Vorheriges Thema - Nächstes Thema

howy-1

Hallo zusammen,

ich plage mich heute schon den ganzen Tag damit, aus einer einfachen Webseite, die nur 4 Zeilen Text enthält, die entsprechenden Readings herauszukriegen.

Der Code sieht folgendermaßen aus:

<html>
<head>
<link rel="stylesheet" href="resource://content-accessible/plaintext.css">
</head>
<body>
<pre>
vol: 118
num: 0
stn: Rockantenne-Rock'n'Roll
tit: Chubby Checker - Limbo rock
sts: 1
</pre>
</body>
</html>


Es sollen die Werte hinter "stn" und "tit" als Readings erfasst werden.

Ich habe schon versucht, es mit HTTPMOD hinzubekommen, scheitere aber vermutlich an den richtigen Regex.

Oder irgendwas, was alles andere "wegschneidet" und nur die Werte als "Sender" und "Titel" in Readings schreibt

Das Versuchs-Listing dazu:

Internals:
   BUSY       0
   CFGFN     
   DEF        http://192.168.1.92/?infos 10
   FUUID      5d7801c5-f33f-2ba6-7766-4f737e88d4d68f35
   Interval   10
   LASTSEND   1568149544.27841
   MainURL    http://192.168.1.92/?infos
   ModuleVersion 3.5.9 - 13.2.2019
   NAME       h_KaRadio2
   NOTIFYDEV  global
   NR         21251
   NTFY_ORDER 50-h_KaRadio2
   STATE      ???
   TRIGGERTIME 1568149554.27729
   TRIGGERTIME_FMT 2019-09-10 23:05:54
   TYPE       HTTPMOD
   addr       http://192.168.1.92:80
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl http://192.168.1.92/?infos
   header     
   host       192.168.1.92
   httpbody   vol: 160
num: 0
stn: Rockantenne-Rock'n'Roll
tit: McCoys - Hang on sloopy
sts: 1

   httpheader HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 81
Connection: keep-alive
   httpversion 1.0
   hu_blocking 0
   hu_filecount 2
   hu_port    80
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /?infos
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.1.92/?infos
   value      0
   QUEUE:
   READINGS:
     2019-09-10 23:05:44   stn             1
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.1.92/?infos
     value      0
   defptr:
     readingBase:
       stn        reading
     readingNum:
       stn        01
     readingOutdated:
     requestReadings:
       update:
         stn        reading 01
   sslargs:
Attributes:
   enableControlSet 1
   reading01Name stn
   reading01RegOpt s
   reading01Regex (?s)stn:.*?(\d+)
   showBody   1
   userattr   reading01Name reading01RegOpt reading01Regex



Ich habe mich schon quer durchs Forum gelesen, dass mir der Kopf raucht, aber etwas für meine einfachen Zwecke passendes habe ich noch nicht gefunden. Die Sache mit den Regex werde ich wohl nie verstehen...

Gruß
Dirk

MadMax-FHEM

Hallo Dirk,

ich bin jetzt auch kein RegEx-Experte...

Aber folgendes sollte doch tun:


   reading01Name Station
   reading01Regex stn:.(.*)
   reading02Name Title
   reading02Regex tit:.(.*)


Getestet mit: https://regex101.com/

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

#2
https://regex101.com/ ist dein Freund

So wie deine Regex geschrieben ist: capturing group = (\d+)
Die sucht auf mehrere Zeilen die erste Zahlenfolge nach stn:
Ergebnis: die 1 nach sts:

Mit Joachims Regex:
Kein (?s) => wird nicht auf mehrere Zeilen matchen
stn:. => matcht "stn:" + das erste Leerzeichen
(.*) => capture was danach kommt, bis zu Ende der Zeile

EDIT: und lösche dein attr regOpt s sonst wirst Du wieder auf mehrere Zeilen matchen (genauso wie (?s))
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

howy-1

Na bitte, kaum macht man es richtig, geht es.  ;D

Vielen Dank ihr beiden, auch für die Erläuterungen. Meine Regex waren nur mehrfach zusammengeklautes und erfolglos ausprobiertes Zeug  :-[ .

Grüße, Dirk