JsonMod Frage zu jsonPath

Begonnen von juidui, 08 Dezember 2023, 14:19:45

Vorheriges Thema - Nächstes Thema

juidui

Gude,

ich habe ein aktuelles Thema. Wenn ich bei meinem Verkehrsverbund (rmv) eine Abfrage zu den Abfahrten an einer bestimmten Haltestelle mache, dann bekomme ich (stark verkürzt) in etwa so eine Json Ausgabe zurück:

{
   "Departure":    [
            {
         "name": "RE60",
         "bla": "hghghg",
         "cancelled": true
      },
            {
         "name": "RE70",
         "bla": "hghghg"
      },
            {
         "name": "RE80",
         "bla": "hghghg",
         "cancelled": true
            }
   ]
}

Die kann ich mit JsonMod in der readingList z.B. so auswerten:
multi(jsonPath('$.Departure[*]'), concat(count(), '1_Linie'), property('name'));
multi(jsonPath('$.Departure[*]'), concat(count(), '2_Ausfall'), property('cancelled'));


Dann kommt so was zurück als Ergebnis in den Readings an:
01_Linie   RB60 2023-12-08 12:56:17
02_Ausfall 1    2023-12-08 12:56:17
11_Linie   RB70 2023-12-08 12:56:17
12_Ausfall      2023-12-08 12:56:17
21_Linie   RB80 2023-12-08 12:56:17
22_Ausfall 1    2023-12-08 12:56:17

Der zweite Zug fällt nicht aus, also hat er zwar das Reading "12_Ausfall" aber ohne Wert.

Der Syntax von JsonPath folgend kann man einen Filter setzen, z.B. für alle Elemente mit dem Attribut "cancelled" und das funktioniert auch. Wenn ich diesen dann negieren will, dann sieht readingList für das Attribut "name" etwa so aus:
multi(jsonPath('$.Departure[?(!@.cancelled)]'), concat(count(), '1_Linie'), property('name'));
bei einem Online JsonPath Explorer kommt auch das richtige raus.
FHEM geht aber in den andauernden Nachdenkmodus und muss von der Command Line aus gestoppt und wieder neu gestartet werden.

Hab ich das Negieren durch Einfügen von "!" vor der Filteranweisung falsch gemacht? Oder ist da was kaputt?

Grüße
Uwe

betateilchen

multi(jsonPath('$.Departure[*]'), concat(count(), '2_Ausfall'), property('cancelled')?1:0);

Sorgt dafür, dass bei nicht ausgefallenen Zügen eine 0 im reading x2_Ausfall steht - damit wäre die Struktur in den readings immer gleich und Du könntest danach sogar weiter auswerten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

juidui

Hm, sieht gut aus.  :) Danke
Dann kann ich die Ausgabe mittels einer readingsGroup auf die nicht ausfallenden Züge beschränken, gelle?

betateilchen

#3
Formuliere doch mal die eigentliche Aufgabe.
Was ist das Ziel Deines Tuns?

Man könnte ja auch sowas bauen:

defmod jtest JsonMod file:///tmp/test.json
attr jtest readingList multi(jsonPath('$.Departure[*]'), concat('Zug_',count()), concat(property('name'), property('cancelled') ? ' entfällt' :  ' fährt'));;

liefert als Ergebnis:

setstate jtest 2023-12-08 15:48:10 .computedReadings Zug_1,Zug_2,Zug_0
setstate jtest 2023-12-08 15:48:10 Zug_0 RE60 entfällt
setstate jtest 2023-12-08 15:48:10 Zug_1 RE70 fährt
setstate jtest 2023-12-08 15:48:10 Zug_2 RE80 entfällt
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

juidui

Ja, genau so was mache ich.
Es geht darum eine Übersicht über die von mir häufig genutzten Haltestellen/Verbindungen zu erzeugen, die ich dann jeweils wie gewünscht mit einem kleinen Knopfdruck updaten kann, anstatt immer in der blöden App des Nahverkehrsanbieters rumfummeln zu müssen.
Heute ist mir aufgefallen, dass die Zugausfälle mir nicht angezeigt wurden, da ich das entsprechende Attribut im Ursprungs Json nicht ausgewertet hatte. Insofern sah es dann so aus, als würden die Züge pünktlich fahren.
Jetzt hab ich das hinzugefügt und es wuppt.
Danke nochmal ;)