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?
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
wahrscheinlich sind zeilenümbrüche dein problem.
schreibe "(?s)" vor deine regex
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? :(
da fehlt wieder "(?s)" am anfang.
dies funktioniert nicht?
(?s)(/d+)$
eventuell braucht es noch etwas mehr
(?s).*?(/d+)$
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!