[gelöst] doif mit Teil aus reading

Begonnen von australien, 07 März 2018, 09:09:05

Vorheriges Thema - Nächstes Thema

australien

Hallo zusammen,

wie kann ich aus einem reading

[["R1214","Richtung Hbf","21"],["REX2315","Richtung 2","54"],["REX1215","Richtung Hbf","79"],["REX2319","Richtung 2","114"],["REX2622","Hbf","139"],["REX2323","Richtung 2","174"],["REX1216","Richtung Hbf","199"]]

eine doif bei einer bestimmten Zeichenfolge (Zugnummer) ausführen?
auslesen der Zugnummer, Richtung und der verbleibenden Zeit

danke für Eure Hilfe

Robert
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Ellert

([<Gerätename>:<Readingname>] =~ "<Suchzeichenkette>")

Mehr dazu steht gleich am Anfang der deutschsprachigen Befehlsreferenz zum DOIF, Stichwort Teilausdrücke abfragen.

australien

ups, danke.

dürfte ich übersehen haben.. :(
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

australien

 ich bekomme es aber trotzdem irgendwie nicht hin.

mein reading ist "Bahnhof"

[["REX5800","Hbf","273"],["R5802","Steindorf b.Straßwalchen Bahnhof","308"],["870","Braunau/Inn Stadtplatz","356"],["870","Braunau/Inn Stadtplatz","357"],["REX5854","Freilassing","358"],["R5801","Braunau/Inn Bahnhof","376"],["REX5856","Freilassing","389"],["REX5803","Braunau/Inn Bahnhof","421"],["R5834","Steindorf b.Straßwalchen Bahnhof","431"]]


nun soll bei zb um 06:15-06:19 der Wert von Linie R5801 ausgelesen werden, hier 376. wenn dieser <2 ist die Linie pünktlich -> alles gut, wenn nicht -> message an telegrambot
planabfahrt von R5801 ist um 06:17

gibt es dazu einen Lösungsansatz?
Danke
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Ellert

Zitatich bekomme es aber trotzdem irgendwie nicht hin.

Was ist Dein bester Ansatz?

<Suchzeichenkette> darf auch ein regulärer Ausdruck sein.

australien

mein Ansatz wäre


DOIF

([07:14-07:18] and [myDoki_Zug:Bahnhof] =~ "R5801" )


reading Bahnhof
[["REX5800","Hbf","273"],["R5802","Steindorf b.Straßwalchen Bahnhof","308"],["870","Braunau/Inn Stadtplatz","356"],["870","Braunau/Inn Stadtplatz","357"],["REX5854","Freilassing","358"],["R5801","Braunau/Inn Bahnhof","376"],["REX5856","Freilassing","389"],["REX5803","Braunau/Inn Bahnhof","421"],["R5834","Steindorf b.Straßwalchen Bahnhof","431"]]

aber wie bekomme ich aus dem reading "myDoki_Zug:Bahnhof" vom String ["ZugNr","Ziel","CountZeit"] den Wert "CountZeit" für den bestimmten Wert "ZugNr"?  Dieser String ist ja im reading immer an einer anderen Stelle.

Verstehst du was ich meine?

Diese Abfrage soll eine Verspätung des Zuges auf mein Handy bringen.

Entweder sehe ich den Wald vor lauter Bäumen nicht oder ich bin am Holzweg?!?!?!?
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Ellert

Dann könntest Du die gefilterte Ausgabeformatierung nutzen. https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen

[myDoki_Zug:Bahnhof:"R5802\",\".*?\",\"(.*?)\"":$1]

australien

das kannte ich nicht, und brauchte etwas zeit um das auch zu verstehen.

nun habe ich folgendes gemacht

([myDoki_Zug:Bahnhof] =~ "R7805" ) (set mydummy [myDoki_Zug:Bahnhof:"R7805\",\".*?\",\"(.*?)\"":$1])

leider kann ich die doif nicht abschließen, fehler
DOIF: no round brackets in regular expression: R7805\

hab schon mit [] und () gespielt, leider bekomme ich es nicht hin.


raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Ellert

#8
Bist Du Dir sicher, dass die Ausgabeformatierung auch im Ausführungsteil des DOIF funktioniert?

Mein Vorschlag bezog sich auf den Bedingungsteil, also etwa so

([myDoki_Zug:Bahnhof:"R7805\",\".*?\",\"(.*?)\"":$1] < 2) (<Befehl>)

Die Regexp könntest Du in der FHEM Befehlszeile testen mit
{ReadingsVal("myDoki_Zug","Bahnhof","nix") =~ "R7805\",\".*?\",\"(.*?)\"";;$1}

Auf diese Weise könntest Du es auch im Befehlsteil nutzen --> Commandref: set; DOIF, Angaben Ausführungsteil

Edit: Die Ausgabeformatierung funktioniert grundsätzlich auch im Befehlsteil. Hast Du eine aktuelle DOIF-Version?

australien

#9
das glaub ich ist das Problem.
Das Regexp gibt mir den richtigen Minutenwert aus.
Aber jetzt verstehe ich das ganze schon besser, nur wenn ich das DOIF neu anlege, kommt trotzdem dieser Fehler:

zug DOIF: no round brackets in regular expression: REX2611\

define zug DOIF ([06:58] and [myDoki_Zug:Bahnhof:"REX2611\",\".*?\",\"(.*?)\"":$1] < 22) ((set teleBot message @iphone Zug REX2611 kommt um [{ReadingsVal("myDoki_Zug","Bahnhof","nix") =~ "REX2611\",\".*?\",\"(.*?)\"";;$1}-18] später))

Danke für deine Geduld und Hilfe!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Ellert

Ich weiss auch nicht warum es die Meldung gibt. Du könntest auf unnötige Klammern im Befehl verzichten oder in der Bedingung auch ReadingsVal verwenden, da Du einen Zeittrigger hast.

([06:58] and ReadingsVal("myDoki_Zug","Bahnhof","nix") =~ "REX2611\",\".*?\",\"(.*?)\"" and $1 < 22)

    (set teleBot message @iphone Zug REX2611 kommt um {(ReadingsVal("myDoki_Zug","Bahnhof","nix") =~ "REX2611\",\".*?\",\"(.*?)\"";;$1-18)} später)

australien

#11
jetzt hab ich es mit Hilfe von @Ellert geschaft! Danke

letztlich war noch die Klammerproblematik.

funktionierender code:
([14:20] and (ReadingsVal("myDoki_Zug","Bahnhof","nix") =~ "R7852\",\".*?\",\"(.*?)\"" and $1 < 176)) (set |commando>)

wichtig war noch die () vor dem ReadingsVal, ohne ist es eine Zeitabfrage (steht auch sicher wo so, nur hab ich es nicht gewußt)

Hab es aber trotzdem anders gelöst:
Es wird nun mit der Abfrage des ReadingsVal ein userattr beschrieben und dieser Wert mehrfach verwenden.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"