Frage zu HTTPMOD und regex

Begonnen von Groej, 29 Dezember 2016, 16:23:54

Vorheriges Thema - Nächstes Thema

Groej

Hallo an alle,

ich hoffe Ihr hattet eine schöne Weihnachtszeit.

Ich habe hier im Forum ein Thema offen wegen mein Anel IP Steckdose (https://forum.fhem.de/index.php/topic,58673.0.html).
Funktioniert auch soweit alles bis auf eine Sache.

Ich lese nicht nur den Status der Leiste aus sondern auch die Namen der Dosen um diese als Alias zu übernehmen. Durch Hilfe hier im Forum zähle ich die Semikolons und lese danach die Daten aus die ich brauche. Nun ist es so das ein Teil den ich brauche vor dem ersten Semikolon steht und irgendwie auch der HTTP Header mit einbezogen wird der aber so von der Leiste nicht mitgesendet wird wenn ich das richtig sehe.

Was gleich hier steht steht um Buffer des Device.Ich splitte das hier mal auf:

HTTP/1.1 200 OK Access-Control-Allow-Origin: * Connection: keep-alive Content-Type: text/plain Cache-Control: no-store Zaun rechts;0;0;28;T;Wiese klein;0;0;28;T;Wiese gross;0;0;28;T;Zaun links;0;0;28;T;Regensensor;0;0;28;;Wiese vorne;0;0;28;T;Einfahrt rechts;0;0;28;T;Nr.8;0;0;28;;end

Der dunkelblaue Teil kommt so nicht von der Leiste. Den roten Teil muß ich auslesen. Der rote und grüne Teil zusammen kommt von der Leiste.

Hat jemand eine Idee wie ich mit regex nur den roten Teil auslese? Kann man den HTTP Header vorm regex komplett wegnehmen und dann alles vor den ersten Semikolon auslesen?

Danke schon mal.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

StefanStrobel

Hallo Groej,

poste doch mal Deine aktuelle Konfiguration und die HTTP-Response (inklusive der HTTP-Header, die Deine Steckdose sendet) als Datei-Anhang.
In den Daten, die Fhemweb anzeigt und die Du gepostet hast, fehlen die Zeilenumbrüche.
Das kannst Du z.B. mit wget --save-headers machen.

Gruss
    Stefan

Groej

Hallo Stefan,

danke schon mal für die Antwort aber ich steh gerade etwas auf dem Schlauch was Du meinst.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

StefanStrobel

Hallo Groej,

Zitat von: Groej am 29 Dezember 2016, 16:23:54
HTTP/1.1 200 OK Access-Control-Allow-Origin: * Connection: keep-alive Content-Type: text/plain Cache-Control: no-store Zaun rechts;0;0;28;T;Wiese klein;0;0;28;T;Wiese gross;0;0;28;T;Zaun links;0;0;28;T;Regensensor;0;0;28;;Wiese vorne;0;0;28;T;Einfahrt rechts;0;0;28;T;Nr.8;0;0;28;;end

das ist die Antwort, die Deine Steckdose an Fhem zurücksendet inklusiver der HTTP-Header, die Deine Steckdose sendet. Allerdings fehlen in dieser Darstellung die Zeilenumbrüche. Vermutlich hast Du das aus Fhemweb herauskopiert und Fhemweb stellt die Zeilenumbrüche von internals ja nicht dar.
Für das Extrahieren von Werten aus einem Text sind die Zeilenumbrüche jedoch wichtig, da reguläre Ausdrücke im Normalfall zeilenorientiert arbeiten.
Daher meine Bitte das nochmals vollständig zu posten.

Gruss
   Stefan

Groej

Hallo Stefan,

die Leiste wird mit folgenden Befehl im FHEM angesprochen:

define anel_bln_rel1 HTTPMOD http://192.168.10.4/strg.cfg?Auth:udpudp 8

Dann kommt von der Dose nur die Datei strg.cfg zurück. Dort steht nur dieser String drin in einer einzigen Zeile. Keine Header. Wenn Du den URL in einen Browser eingibt kommt nur der Download der Datei und keine Anzeige einer Webseite.

Zaun rechts;0;0;28;T;Wiese klein;0;0;28;T;Wiese gross;0;0;28;T;Zaun links;0;0;28;T;Regensensor;0;0;28;;Wiese vorne;0;0;28;T;Einfahrt rechts;0;0;28;T;Nr.8;0;0;28;;end

Den Header packt FHEM dazu durch das HTTPMOD Modul nehme ich mal an.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

StefanStrobel

Zitat von: Groej am 01 Januar 2017, 09:03:09
Dann kommt von der Dose nur die Datei strg.cfg zurück. Dort steht nur dieser String drin in einer einzigen Zeile. Keine Header. Wenn Du den URL in einen Browser eingibt kommt nur der Download der Datei und keine Anzeige einer Webseite.

Zaun rechts;0;0;28;T;Wiese klein;0;0;28;T;Wiese gross;0;0;28;T;Zaun links;0;0;28;T;Regensensor;0;0;28;;Wiese vorne;0;0;28;T;Einfahrt rechts;0;0;28;T;Nr.8;0;0;28;;end

Den Header packt FHEM dazu durch das HTTPMOD Modul nehme ich mal an.

Hallo Jörg,

die Header kommen von Deiner Steckdosenleiste. Ein normaler Browser zeigt die Header nur nicht an.
Siehe https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Wichtiger ist aber die Frage nach den Zeilenumbrüchen. Mit wget o.ä. kannst Du die Daten tatsächlich als Datei speichern und dabei die Zeilenumbrüche behalten. Für das Parsen mit regulären Ausdrücken wäre das hilfreich.
Siehe http://perldoc.perl.org/perlrequick.html

Gruss
    Stefan

Groej

Hallo Stefan,

hier die Datei mit wget:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: text/plain
Cache-Control: no-store

Zaun rechts;0;0;0;T;Wiese klein;0;0;0;T;Wiese gross;0;0;0;T;Zaun links;0;0;0;T;Regensensor;0;0;0;;Wiese vorne;0;0;0;T;Einfahrt rechts;0;0;0;T;Nr.8;0;0;0;;end


Danke für die Hilfe.

Gruß

Jörg

FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

StefanStrobel

Hallo Jörg,

ich hab Dir mal ein paar Variationen zusammen gestellt. Zum Testen habe ich Deine Daten in eine Datei geschrieben und diese per file: URL in HTTPMOD geöffnet:

define regTest HTTPMOD file://testdata/regex1.txt 0
attr regTest enableControlSet 1
attr regTest verbose 5

enableControlSet erlaubt es mir dann mit set regTest reread eine Auswertung zu starten. Im Fhem Log sieht man dann schön was passiert.

Variante 1:

attr regTest reading01Name Variante1
attr regTest reading01RegOpt m
attr regTest reading01Regex ^([A-Za-z ]+);;


Erzeugt das Reading
Variante1 Zaun rechts

Zu beachten ist dabei das mit dem Semikolon. Bei Fhem trennt ein Semikolon zwei Befehle. Wenn man deshalb in der Befehlseingabe oder in der fhem.cfg ein Semikolon benötigt, muss man es doppelt schreiben. Der Befehlsparser erkennt das und trennt dann keine Befehle sondern macht daraus ein einzelnes Semikolon. Das gleiche passiert in der Fhemweb Befehlseingabe (ganz oben). Anders ist es aber wenn man ein bestehendes Attribut anklickt und dann nur dieses Attribut im Fhemweb editiert (weiter unten), Hier ist klar dass man keine Befehle trennen möchte und deshalb sind hier keine doppelten Semikolons nötig.
Ich verwende es hier verdoppelt, so wie e sin der fhem.cfg stehen würde.

RegOpt m sorgt dafür, dass die Regex zeilenweise ausgewertet wird und damit ^ für den Anfang der Zeile und nicht für den Anfang der Zeichenkette steht. ([A-Za-z ]+) nimmt dann einen Teilstring, der aus Buchstaben und Blanks bestehen kann. Danach kommt ein Semikolon.

Variante 2:

attr regTest reading02Name Variante2
attr regTest reading02RegOpt m
attr regTest reading02Regex ^([ [:alpha:]]+);;

Hier habe ich eine Posix character class verwendet. Siehe http://perldoc.perl.org/perlrecharclass.html#Bracketed-Character-Classes. Diese Konfiguration erzeugt wieder ein einzelnes Reading:
Variante2 Zaun rechts

Variante 3:

attr regTest reading03Name Variante3
attr regTest reading03RegOpt m
attr regTest reading03Regex ^([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+)

Hier hat die Regex mehrerer Capture Groups (das in den Klammern). Entsprechend werden mehrere Readings erzeugt:

Variante3-1 Zaun rechts
Variante3-2 0
Variante3-3 0
Variante3-4 0
Variante3-5 T


Variante 5:

attr regTest reading04Name Variante4
attr regTest reading04RegOpt m
attr regTest reading04Regex ^(?:[^;;]*;;){5}([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+);;([ [:alnum:]]+)

Hier kommt noch ein Vorspann, der bedeutet, dass vorher noch 5 mal ein Semikolon und ggf etwas anderes davor kommt.

Das Ergebnis sind dann wieder mehrere Readings:

Variante4-1 Wiese klein
Variante4-2 0
Variante4-3 0
Variante4-4 0
Variante4-5 T


Ich hoffe das erklärt die Sache verständlich.

Gruss
    Stefan

Groej

Hallo Stefan,

da kann ich nur WOW und Danke sagen. Das Du es so ausführlich machst hätte ich jetzt nicht gedacht. Ich werde das am Wochenende alles mal ausprobieren wenn ich dazu komme.

Trotzdem erstmal ein dickes Danke.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Groej

Hallo Stefan,

danke nochmal und entschuldige das ich mich heute erst melde. Hat super geklappt mit Deinen sehr ausführlichen Beschreibung.

Danke.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280