FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: chunter1 am 06 Oktober 2020, 13:59:17

Titel: [gelöst] Hilfe bei RegEx für HTTPMOD und Mikrotik Gaphs Page Werte
Beitrag von: chunter1 am 06 Oktober 2020, 13:59:17
Hallo,

ich bräuchte bitte Hilfe bei der Erstellung einer RegEx für das HTTPMOD Modul.
Aus dem HTTP code anbei soll der fett markierte "Datendurchsatz"-Wert extrahiert werden.
Das Problem dabei ist, dass die Einheit des Wertes zwischen "b", "Kb" und "Mb" wechseln kann.
Ist es möglich alle 3 Fälle mit einer RegEx-Zeile zu einem einheitlichen Ausgabewert umzuwandeln?

Danke!
ch

...</ul>
<div class="box">
  <h3>"Daily" Graph (5 Minute Average)</h3>
  <img src='daily.gif' alt="Daily Graph" /><br />
  <p><em>Max <font color="#00cc00">In</font>: 0b; Average <font color="#00cc00">In</font>: 0b; Current <font color="#00cc00">In</font>: 0b; </em>
    <br>
<em>Max <font color="#0000cc">Out</font>: 0b; Average <font color="#0000cc">Out</font>: 0b; Current <font color="#0000cc">Out</font>: 0b; </em>
  </p>
</div>....
Titel: Antw:Hilfe bei RegEx für HTTPMOD
Beitrag von: h002 am 06 Oktober 2020, 14:10:31
So was wie das?
\d+(b|Kb|Mb)

Kannst du über https://www.regextester.com gut testen.

Titel: Antw:Hilfe bei RegEx für HTTPMOD
Beitrag von: chunter1 am 06 Oktober 2020, 16:15:09
Super Danke - und toller Link! :)
Was ich auch noch entdeckt habe ist, dass manchmal eine Zahlen mit Punkt angezeigt wird. Also z.B. "14.3Kb".
Ist dann diese Version den Wert alleine zu extrahieren in Ordnung?
\d+.\d+
Titel: Antw:Hilfe bei RegEx für HTTPMOD
Beitrag von: Beta-User am 06 Oktober 2020, 16:24:15
Die Seite kannte ich noch nicht, finde die aber nicht so gut wie www.regex101.com (oder www.regexr.com). Bei diesen beiden sieht man besser, wie die interne Logik ist.

Würde mal das hier ins Rennen werfen (matcht nur auf arabische Ziffern und nicht auf andere Zahlen, was hier vermutlich gewollt ist):
(([0-9]+[.])?[0-9]+)([kMb]+)?
Titel: Antw:Hilfe bei RegEx für HTTPMOD
Beitrag von: chunter1 am 07 Oktober 2020, 08:20:08
Der Vollständigkeit halber und für alle die aus der Mikrotik graphs Webpage ihres Routers die aktuellen up-/downlink Bandbreitenwerte auslesen wollen, hier meine Implementierung via HTTPMOD-Modul...
Gibt sicher elegantere Umsetzungen aber die hier funktioniert zumindest soweit für mich. ;)

Zitatreading1Name Current_download_value
reading1Regex Current <font color="#00cc00">In<\/font>: (\d+)
reading2Name Current_download_unit
reading2Regex Current <font color="#00cc00">In<\/font>:.*\d(Mb|Kb|b); </em>
reading3Name Current_upload_value
reading3Regex Current <font color="#0000cc">Out<\/font>: (\d+)
reading4Name Current_upload_unit
reading4Regex Current <font color="#0000cc">Out<\/font>:.*\d(Mb|Kb|b); </em>

userReadings Current_download {
my $a = ReadingsVal("myMikrotikTest","Current_download_unit","0"); return
ReadingsVal("myMikrotikTest","Current_download_value","0")/1000 if ($a eq "b"); return
ReadingsVal("myMikrotikTest","Current_download_value","0") if ($a eq "Kb"); return
ReadingsVal("myMikrotikTest","Current_download_value","0")*1000 if ($a eq "Mb"); return 0;},
Current_upload { my $a = ReadingsVal("myMikrotikTest","Current_upload_unit","0"); return
ReadingsVal("myMikrotikTest","Current_upload_value","0")/1000 if ($a eq "b"); return 
ReadingsVal("myMikrotikTest","Current_upload_value","0") if ($a eq "Kb"); return   
ReadingsVal("myMikrotikTest","Current_upload_value","0")*1000 if ($a eq "Mb"); return 0;
}
Titel: Antw:[gelöst] Hilfe bei RegEx für HTTPMOD und Mikrotik Gaphs Page Werte
Beitrag von: Beta-User am 07 Oktober 2020, 10:15:00
...falls du an der Eleganz noch was ändern willst, zwei Ansatzpunkte (eigentich brauchst du nur den 2., dann hat sich der 1. erledigt):

- userReadings sollte man immer mit Trigger versehen (hier einfach aus hygienischen, sonst aus Performance-Gründen):userReadings Current_download:Current_download_value.* {
my $unit = ReadingsVal("myMikrotikTest","Current_download_unit","0"); my $factor = $unit eq "b" ? 0.001 : $unit eq "Mb" ? 1000 : 1; return  ReadingsNum("myMikrotikTest","Current_download_value",0) * $factor; },
Current_upload:Current_upload_value.* { my $a = ReadingsVal("myMikrotikTest","Current_upload_unit","0"); return
ReadingsVal("myMikrotikTest","Current_upload_value","0")/1000 if ($a eq "b"); return 
ReadingsVal("myMikrotikTest","Current_upload_value","0") if ($a eq "Kb"); return   
ReadingsVal("myMikrotikTest","Current_upload_value","0")*1000 if ($a eq "Mb"); return 0;
}
(Und man könnte den Faktor in eine Variable packen, siehe erste Variante).

Der eigentliche Trick wäre aber, die Berechnung gleich in die Nachbearbeitung einzuarbeiten ;) . Hierzu kein fertiger Code, aber mal ein Beispiel, wie man aus zwei Regex-Elementen was basteln kann:
readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{\A[\d]+,[\d]+ *\z};$val