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
([<Gerätename>:<Readingname>] =~ "<Suchzeichenkette>")
Mehr dazu steht gleich am Anfang der deutschsprachigen Befehlsreferenz zum DOIF, Stichwort Teilausdrücke abfragen.
ups, danke.
dürfte ich übersehen haben.. :(
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
Zitatich bekomme es aber trotzdem irgendwie nicht hin.
Was ist Dein bester Ansatz?
<Suchzeichenkette> darf auch ein regulärer Ausdruck sein.
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?!?!?!?
Dann könntest Du die gefilterte Ausgabeformatierung nutzen. https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
[myDoki_Zug:Bahnhof:"R5802\",\".*?\",\"(.*?)\"":$1]
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.
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?
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!
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)
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.