HTTPMOD - Regex-Ausdruck für WeatherLink Website

Begonnen von Stargazer, 25 Mai 2017, 22:35:55

Vorheriges Thema - Nächstes Thema

Stargazer

Hi,

so. Verbose auf 5 mit folgendem Eintrag:


2017.06.01 13:14:32 5: WeatherLink: ExtractSid called, context reading, num
2017.06.01 13:14:32 4: WeatherLink: CheckAuth decided no authentication required
2017.06.01 13:14:32 5: WeatherLink: Read starts parsing response to update with defined readings: 01
2017.06.01 13:14:32 5: WeatherLink: ExtractReading Barometer with regex /Barometer...............................................([\d\.]+)/...
2017.06.01 13:14:32 5: WeatherLink: ExtractReading Barometer did not match
2017.06.01 13:14:32 3: WeatherLink: Read response to update didn't match any Reading
2017.06.01 13:14:32 5: WeatherLink: HandleSendQueue called, qlen = 0

Das kam nach dem Aufführen des buffers im Log.
Hatte jetzt vor dem Log die Passage mit dem Barometer noch angepasst. Warum er im Log hinter ([\d\.]+) noch die Punkte macht, weiß ich nicht. Die stehen da so im Modul nicht hinter.

VG und besten Dank

André

amenomade

Die "/" und "/..." sind nw da, um die gesamte Regex in Standardform darzustellen: nw. ist eine vollständige Regex nicht nur Barometer..(blabla) sondern
/Barometer..(blabla)/s wo "s" die Regopt ist

Was genau in unserem Fall passiert muss ich noch im Modul  investigieren.

Es interessiert mich aber, ob Fhem die {} in der Regex versteht.

Kannst Du wieder bitte ein Test machen?
Barometer.{43,49}([\d.]+)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Anscheinend hat er regopt nicht mitberücksichtigt da im Modul folgendes steht:
            if ($regopt) {
                Log3 $name, 5, "$name: ExtractReading $reading with regex /$regex/$regopt ...";


Hast Du es korrigiert wie oben gesagt?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ares

Hallo Stargazer,

der Buffer wird nicht 1:1 beim Regex im Modul verwendet. Im Buffer fehlen z.B. Zeilenumbrüche und damit passt das ".{43}" wahrscheinlich nicht. Nimm besser den Quelltext der Webseite für den regex tester wie regex101.com, den Du direkt aus dem Browser kopierst. Verbose 5 funktioniert auch, allerdings musst Du dann die Seite in fhem einmal laden.

Ohne den tatsächlichen Inhalt zu kennen würde ich es so versuchen:
(?s)Barometer.+?>([\d\.]+)

Viele Grüße
Manfred

Stargazer

Hallo zusammen,

ich habe noch beide Expressions getestet. Manfred seine
läuft perfekt.
Alles sehr interessant... .

Trotzdem erstmal vielen Dank für eure Hilfe !!
Ich hatte das letztens schonmal, dass bei 101regex alles gut war und FHEM das nicht akzeptierte.

Nun kann ich die anderen Werte auch noch versuchen zu extrahieren.

VG

André

amenomade

Danke @ares! Das "lazy" vergesse ich immer. Ich muss noch mit Regex üben ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

(?s) sollte aber ähnlich sein wie regopt "s", oder?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ares

Zitat von: Stargazer am 01 Juni 2017, 15:52:53
Ich hatte das letztens schonmal, dass bei 101regex alles gut war und FHEM das nicht akzeptierte.

101regex unterstützt leider kein PERL, HTTPMOD dagegen nur PERL.

Ersetze mal
(?s)Barometer.+?>([\d\.]+)
in fhem durch
Barometer\p{Any}+?>([\d\.]+)
und wenn es funktioniert versuch Dein Glück danach mal mit 101regex. Und nach dem Test vergisst Du das "\p{Any}" statt dem "." sofort wieder, das sollte nur als Gegenbeweis dienen dass fhem auch Sachen kann die 101regex nicht versteht. Nicht alles das funktioniert muss man auch verwenden, Stellen abzählen gehört meiner Meinung nach dazu. Besser ist die erste Anweisung, die sprachunabhängiger ist.

Und bleib trotzdem bei 101regex!. Öffne aber die gewünschte Seite (z.B. http://www.weatherlink.com/user/stargazer/index.php?view=summary&headers=1) aber im Browser und kopier den Quelltext der Seite von dort (Rechtklick - Seitenquelltext anzeigen) und nicht aus dem buf von fhem, da der nicht 1:1 gespeichert werden kann. Und sobald ein Zeilenumbruch im Text ist setzt Du meist einfach ein (?s) davor, dann deckst Du die allermeisten Fälle ab.

Viele Grüße
Manfred

andies

Darf ich nochmal fragen, wieso Ihr nicht
([\d\.]*)hPa</td>
nehmt? HektoPascal kommt nur zweimal vor und es geht doch um die Höhe des Luftdrucks, oder?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

amenomade

#24
Aus Performance Gründe ist es immer besser vorwährst als rückwährst zu suchen.

([\d\.]*)hPa<\/td>
3 matches, 57183 steps, 36ms

Barometer<\/td> <td width="170" class="summary_data">([\d\.]*)
1 match, 100 steps, < 1ms
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

andies

FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

KernSani

@Stargazer: Wenn deine Frage damit beantwortet ist, bitte noch [Gelöst] vor das Subject des ersten Posts
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Stargazer

Hallo zusammen,

ich melde mich trotzdem noch einmal, da es noch ein kleines Problem gibt.
Ich habe den Rat von Manfred befolgt und habe den direkten Quelltext in 101regex.com eingesetzt und dann das Barometer-Argument daran getestet. Da findet er nix. Nutze ich den Buffer des HTTPMOD-Moduls, so wird alles korrekt angezeigt *kopfkratz*.

Nun wollte ich gerne noch die Windrichtung anzeigen lassen. Wenn es ginge, mit dem Ausdruck der dann z.B. das "ENE" und die Gradzahl anzeigt.
Hier nochmal ein Mitschnitt des Buffers:

class="summary_data">Wind Direction</td> <td width="170" class="summary_data">ENE&nbsp;72&deg;</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> </tr> <tr><td colspan="6"><hr class="ThinLine"></td></tr> <tr> <td width="190" class="summary_data">12 Hour Forecast</td> <td width="570" class="summary_data" colspan="5">Increasing clouds with little temperature change. </td> </tr> <tr><td colspan="6"><hr class="ThinLine"></td></tr> <tr><td colspan="6"><img src="/images/spacer.gif" width="10" height="11" border="0" alt=""></td></tr> <tr> <td width="190" class="summary_header_label">Wind</td> <td width="170" class="summary_header">2 Minute</td> <td width="100" class="summary_header">10 Minute</td> <td width="100" class="summary_header">&nbsp;</td> <td width="100" class="summary_header">&nbsp;</td> <td width="100" class="summary_header">&nbsp;</td> </tr> <tr><td colspan="6"><hr class="ThinLine"></td></tr> <tr> <td width="190" class="summary_data">Average Wind Speed</td> <td width="170" class="summary_data">3.5 m/s</td> <td width="100" class="summary_data">3.6 m/s</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> </tr> <tr> <td width="190" class="summary_data">Wind Gust Speed</td> <td width="170" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">4.5 m/s</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> <td width="100" class="summary_data">&nbsp;</td> </tr> <tr><td colspan="6"><hr class="ThinLine"></td></tr> <tr><td colspan="6"><img src="/images/spacer.gif" width="10" height="11" border="0" alt=""></td></tr> <tr> <td width="190" class="summary_header_label">Rain</td>

Bei dem regulären Code nimmt er die 12, von "12 Stunden Vorhersage".
Man man...mittlerweile habe ich den Eindruck, ich hätte es nie gemacht... :-[

Viele Grüße

André

amenomade

#28
ZitatBei dem regulären Code
Welches?

(?s)Wind Direction.*?data\">(.*?)&
(?s)Wind Direction.*?data\">.*?([\d]+)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Für die erste (Direction) kann man auch spezifischer sein:
(?s)Wind Direction.*?data\">([NWES]+)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus