HTTPMOD Regex für einfache plain/text Antwort

Begonnen von docolli, 22 Oktober 2022, 10:07:54

Vorheriges Thema - Nächstes Thema

docolli

Hallo,

jetzt beschäftige ich mich schon seit vielen Jahren mit FHEM, aber hier komme ich beim Anlegen der Regex-Abfrage einfach nicht drauf, was ich eintragen soll.

Ich habe einen ESP32 mit Feuchtesensor gebaut und programmiert, der per WLAN und einer simplen URL seine Werte zur Verfügung stellt.
z.B.: http//192.168.1.155/humidity oder http//192.168.1.155/temperature

Zurück kommt als plain/text nur die jeweilige Feuchte bzw. Temperatur.

Klappt prima über den Browser, aber als HTTPMOD Device wird das Reading nicht mit dem Wert gefüllt, der übertragen wird.

defmod WLANFeuchteSensor1 HTTPMOD http://192.168.1.155/humidity 10
attr WLANFeuchteSensor1 reading01Name abshumidity
attr WLANFeuchteSensor1 reading01Regex (.*)


Ich habe schon einiges als Regex getestet (bin aber Regex DAU), entweder ich bekomme kein Reading, oder nur eine "1", oder (das beste, was ich hinbekommen habe) mit (.*) die Header-Antwort des HTTP-Get.

HTTP/1.0 200 OK

Falls sich jemand auch mit dem ESP32 auskennt, hier der Code, der die Server-Antwort erzeugt:
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readDHTHumidity().c_str());
  });



Kann mir bitte jemand hier kurz helfen, der eine Idee hat, wie das Regex für meinen Fall aussehen muss?

MadMax-FHEM

#1
Was spricht dagegen sowas vor/nach der Antwort einzufügen:


// Prepare the response
sResponse = "<!DOCTYPE HTML>\r\n<html>\r\n";
sResponse += "Measured depth: ";
sResponse += flDepth;
sResponse += "</br>Measured pressure: ";
sResponse += dPressure;
sResponse += "</br>Measured temperature: ";
sResponse += dTemperature;
sResponse += "</html>\n";

sHeader  = "HTTP/1.1 200 OK\r\n";
sHeader += "Content-Length: ";
sHeader += sResponse.length();
sHeader += "\r\n";
sHeader += "Content-Type: text/html\r\n";
sHeader += "Connection: close\r\n";
sHeader += "\r\n";


client.print(sHeader);
client.print(sResponse);


So mache ich das und habe mit dem HTTPMOD keine Probleme...
Gut meine jeweilige RegEx geht dann auf "temperature", "pressure" bzw. "depth"...

EDIT: ok, nutze einen ESP8266. Ich habe das WebServer-Beispiel umgebaut. Ich nutze folgende Lib: #include "ESP8266WiFi.h" / Aber ich denke es sollte schon reichen DOCTYPE und <html> Inhalt </html> in die Antwort einzufügen...

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)

frank

wahrscheinlich sind zeilenümbrüche dein problem.
schreibe "(?s)" vor deine regex
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

docolli

Zitat von: frank am 22 Oktober 2022, 11:30:15
wahrscheinlich sind zeilenümbrüche dein problem.
schreibe "(?s)" vor deine regex

Danke, das hat mich weiter gebracht, indem ich damit die gesamte Serverantwort sehe und damit auf regex101.com weiter probieren kann.

HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/plain
Connection: close

69


Joachim hat schon auch Recht mit seiner Idee, die Antwort einfach weiter mit Infos anzureichen, auf die man leichter per regex filter kann. Aber das kann ich nicht, da die simple Antwort benutzt wird, damit der ESP32 einen asynchronen Webserver darstellen kann, der sich per Javascript alle 10s die neuen Werte von dieser URL holt. So müsste ich den kompletten Webcode umbauen, das ist mir für das was ich mit dem ESP32 tun will zu aufwendig. Aber vielleicht mache ich das später mal.

Nachdem ich jetzt die Antwort kenne, konnte ich (durch Suche im Web) ein Regex finden, das mir einfach die Zeile 5 filtert.

\A(?:^.*$\n){5}\K^.*$

Zumindest klappt das bei regex101.com, aber nicht in FHEM. Warum? :(


frank

da fehlt wieder "(?s)" am anfang.

dies funktioniert nicht?
(?s)(/d+)$
eventuell braucht es noch etwas mehr
(?s).*?(/d+)$
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

docolli

Zitat von: frank am 22 Oktober 2022, 15:07:00
da fehlt wieder "(?s)" am anfang.

dies funktioniert nicht?
(?s)(/d+)$
eventuell braucht es noch etwas mehr
(?s).*?(/d+)$

Regex und ich werden in diesem Leben keine Freunde mehr!  ;)

Deine Beispiele haben geholfen (es muss \d sein und nicht /d)!
Ich habe es (hoffentlich einigermaßen korrekt) erweitert auf Werte mit einer Nachkommastelle, die auch vorkommen können:

(?s).*?(\d+\.?\d+)$

Vielen Dank für die Unterstützung!