[erledigt] Mehrere Matches bei HTTPMOD und RegOpt

Begonnen von andies, 23 April 2017, 19:26:41

Vorheriges Thema - Nächstes Thema

andies

Guten Abend, ich schaffe es leider nicht. Ich habe ein HTTPMOD, das mir Abfahrtszeiten eines Busunternehmens anzeigt. Beispiel eines Readings ist
defmod BVG HTTPMOD none 0
attr BVG userattr get01Name get01OExpr get01Regex get01URL reading01Regex
attr BVG get01Name Uni
attr BVG get01OExpr $val
attr BVG get01Regex (\[\[.*\]\]).*
attr BVG get01URL http://transportrest-sbiermann.rhcloud.com/departureFHEM?from=9051371&provider=Bvg
attr BVG group BVG
attr BVG room Unsorted
attr BVG timeout 30

setstate BVG 2017-04-23 18:52:41 Uni [["285","S+U Rathaus Steglitz","0"],["X10","Zehlendorf, Andréezeile","0"],["285","Dahlem Waldfriedhof","1"],["115","Düppel-Süd, Neuruppiner Str.","3"],["X10","S+U Zoologischer Garten","11"],["115","U Fehrbelliner Platz","15"],["285","S+U Rathaus Steglitz","20"],["285","Dahlem Waldfriedhof","21"],["115","Düppel-Süd, Neuruppiner Str.","23"],["X10","Zehlendorf, Andréezeile","24"]]

in dem Reading Uni stehen dann also die unten genannten Abfahrtszeiten. Ich will aber nur die Zeiten des Busses X10 anzeigen, wenn er in mehr als 10 Minuten fährt. Ich habe dafür auch ein Regex und sogar eine eigene Perl-Funktion (das mit den zehn Minuten fehlt noch, weil es ja mehrere Einträge geben könnte) geschrieben
# Enter you functions below _this_ line.
sub BVGFormat($) {
my ($liste) = @_;
if ( $liste =~ /\[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d\d+)\"\]/g )
{
return $1
}
}

aber ich schaffe es nicht, diese Dinge auf einfache Art und Weise in dem device BVG selbst anzuzeigen. Gibt es hier einen speziellen Trick, den ich übersehe?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

viegener

Ich konnte aus den gegebenen Informationen nicht wirklich viel ableiten, aber prinzipiell sollte doch userReadings helfen um perl-code im Device für neue Readings auszuführen.

Ansonsten wäre es vielleicht gut nochmals etwas genauer zu beschreiben, was genau Du wie verbinden willst?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

Das eigentliche Ziel: Ich möchte gern wissen, wann der Bus X10 in eine bestimmte Richtung ab einer bestimmten Station jetzt fährt.

Idee: Ich nutze HTTPMOD (devicename: BVG) und rufe mir alle Linien an dieser Station ab und filtere dann X10 sowie die Richtung, die ich brauche. Den ersten Schritt (Aufruf BVG.neuladen) kriege ich hin, ich kann auch alle Busse an der Station erkennen. Auch das filtern sollte ich hinkriegen. Nur weiß ich nicht, wie ich diese Information jetzt in FHEM "einbinde". Welches Objekt/welchen dummy/welches Reading kann ich hier nehmen? Zwar könnte ich mehrere weitere dummies und ReadingsGroup definieren, ich habe aber das Gefühl, dass das irgendwie überdimensioniert ist. Kann man nicht "irgendwie" dafür sorgen, dass die Information, wann nun der nächste X10 in die Richtung fährt  (formal ist das ja nur eine Zahl) auch dem device BVG unmittelbar als Reading/Attribut o.Ä. hinzugefügt wird? So dass ich es in BVG selbst ablesen kann?

PS: Danke!
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

viegener

Hast Du Dir userReadings angeschaut?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

Nee, "darf" ich das bei einem vorgefertigten Modul? Und wird das dann bei einem update zerstört?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

viegener

Dann schau sie dir doch mal - ich empfehle die commandref oder die Suche oder fhemwiki
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

Mach ich, versprochen. Dennoch meine Nachfrage, die weder im Wiki noch in der commandref beantwortet wird: Löscht sich userreading nach einem FHEM-update?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

CoolTux

Nein. Userreadings sind wie das Wort schon sagt Readings welche über das globale Attribut userReadings in ein Device geschrieben werden. So lange Du das Device nicht löschst bleibt auch das Reading erhalten.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

viegener

und ganz grundsätzlich - wie kommst Du auf die Vermutung?

Attribute (und auch Readings) werden beim update eigentlich nie gelöscht, deshalb steht das so auch nicht explizit da. Wenn Du es gelesen hättest, wäre Dir aufgefallen, dass userReadings ein Attribut ist und darauf basierend Readings erzeugt werden. Warum die gelöscht werden sollten - keine Ahnung?

In der Doku steht aber auch nicht, dass Devices beim update nicht gelöscht werden  - sollen wir das noch hinzufügen ;)

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

CoolTux

Zitat von: viegener am 24 April 2017, 08:46:25
Attribute (und auch Readings) werden beim update eigentlich nie gelöscht, deshalb steht das so auch nicht explizit da. Wenn Du es gelesen hättest, wäre Dir aufgefallen, dass userReadings ein Attribut ist und darauf basierend Readings erzeugt werden. Warum die gelöscht werden sollten - keine Ahnung?

Da möchte ganz kurz relativieren. Es kann vorkommen das Attribute oder Readings vom Modul gelöscht werden. Dies sollte aber vom Modulauthor im CHANGELOG erwähnt werden.
So zum Beispiel wenn es ein bestimmtes Attribut nicht mehr gibt, oder ein Reading keinen Sinn macht da man es nicht verwendet. Beispiel beim LGTV_WebOS Modul das presence Reading. Das wird entfernt wenn man nicht das entsprechende Attribut stehen hat.

Dies sollte aber eine Ausnahme sein. Im Normalfall ist Viegeners Aussage korrekt.

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andies

Ich bin darauf gekommen, weil ich SVG, die ich angepasst hatte, überschrieben wurde. Damit hatte ich nicht gerechnet und das stand mW auch nicht in der Nähe der Beschreibung (irgendwo wird es schon stehen). Ich dachte halt, beim update könnte es eine Art Konsistenzprüfung geben und was nicht konsistent scheint, naja, keine Ahnung. Mir passiert als Anfänger noch zu viel, mit dem ich nicht gerechnet habe.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

StefanStrobel

hallo andies,

um Werte per Regex und Perl-Expression aus einem per HTTPMOD gelesenen Text zu extrahieren benötigst Du weder eigene externe Perl-Funktionen noch userReadings. Das sind eigentlich alles Grundfunktionen von HTTPMOD.
Deine Regex aus BVGFormat könnte auch gleich in get01Regex stehen oder in weiteren Readings, die per reading01Regex oder reading02Regex angegeben werden.
in get01Expr könnte auch noch Perl-Code zur weiteren Verarbeitung stehen (wenn > 10 min ...)
Ein get01Expr $val ist dagegen völlig überflüssig.

evt. brauchst Du dabei auch
Zitat
get[0-9]*CheckAllReadings
this attribute modifies the behavior of HTTPMOD when the HTTP Response of a get command is parsed.
If this attribute is set to 1, then additionally to the matching of get specific regexes (get[0-9]*Regex), XPath or JSON also all the reading names and parse definitions defined in Reading[0-9]+Name and Reading[0-9]+Regex, XPath or JSON attributes are checked and if they match, the coresponding Readings are assigned as well.
This is automatically done if a get or set command is defined without its own parse attributes.

oder falls Du mehrere Treffer suchst:
Zitat
(get|set|reading)[0-9]+RegOpt
Lets the user specify regular expression modifiers. For example if the same regular expression should be matched as often as possible in the HTTP response, then you can specify RegOpt g which will case the matching to be done as /regex/g
The results will be trated the same way as multiple capture groups so the reading name will be extended with -number.
For other possible regular expression modifiers see http://perldoc.perl.org/perlre.html#Modifiers

Gruss
   Stefan

andies

Danke, das muss ich genauer lesen!
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

andies

Hallo Stefan, nochmal danke für den Hinweis! Ich habe bei HTTPMOD den "Fehler" begangen und mir nur die commandref angeschaut. Die habe ich, ehrlich gesagt, nicht verstanden. Aufgrund Deiner Meldung habe ich mir nun den Wiki-Eintrag angeschaut und der ist nicht nur sehr ausführlich, sondern mit Beispielen versehen und wirklich gut nachvollziehbar. Ich bin ja normalerweise ein Fan vom Wiki aber ganz oft fehlen diese oder sie kopieren nur die commandref - daher schaue ich da einfach zu selten ein. Vielen Dank dafür, inzwischen habe ich das Problem ganz gut im Griff.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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

andies

#14
Jetzt habe ich doch noch eine Frage und ich vermute, dass das eher was mit RegEx als HTTPMOD zu tun hat. Ich hole mir via http eine Liste von ÖPNV-Abfahrten, zum Beispiel
[["X10","S+U Zoologischer Garten","2"],["115","U Fehrbelliner Platz","7"],["X10","Rammrath-Brücke","8"],["X10","S+U Zoologischer Garten","10"],["285","Dahlem Waldfriedhof","13"],["285","S+U Rathaus Steglitz","14"],["115","Düppel-Süd, Neuruppiner Str.","15"],["X10","S Teltow Stadt","18"],["X10","S+U Zoologischer Garten","20"],["X10","Rammrath-Brücke","23"]]
Mich interessieren dabei die Abfahrten des X10 zum Zoo. Dazu nehme ich den folgenden RegEx
\[.*\[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d+)\"\].*\]
und der RegEx holt nun nicht alle, sondern nur die letzte Abfahrt. Ich komme nun nicht weiter, wie ich die beiden anderen Zeiten lesen kann? Die Variante mit
\[.*(\[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d+)\"\]){1,}.*\]
liefert auch kein anderes Ergebnis. Was mache ich falsch?

(PS Ich verstehe nicht, wie ich RegOpt einsetzen kann - wenn es so geht.)
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
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