[98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath

Begonnen von All-Ex, 07 Januar 2021, 22:56:12

Vorheriges Thema - Nächstes Thema

All-Ex

Hallo zusammen,

ich nutze das Modul JsonMod (98_JsonMod.pm 22987 2020-10-18 13:26:05Z herrmannj) und möchte die letzten n Element eines Json auslesen.

Laut Doku (https://support.smartbear.com/alertsite/docs/monitors/api/endpoint/jsonpath.html) geht das so:
Zitat[-n:]   Selects the last n elements of the array. Returns a list.
Also habe ich dies erstellt:

defmod sen.corona.test JsonMod http://www.[URL gelöscht].de/download/test.json
attr sen.corona.test interval * * * * *
attr sen.corona.test readingList multi(jsonPath('$.AFG.data[-2:]'), concat(property('date'),'_new_cases'), property('new_cases'));;\


Es kommt dieser Fehler:
[sen.corona.test] error while evaluating readingList: JsonPath filter property -2: failure at /opt/fhem/FHEM/98_JsonMod.pm line 1260.

Im Jsontester (https://jsonpath.curiousconcept.com/) funktioniert die Syntax.

Mit $.AFG.data[2] funktioniert es auch in FHEM.

Woran kann das liegen?

VG,
Alex

EDIT: Die URL des Testjson habe ich rausgenommen

herrmannj

Für arrays ist derzeit nur der index implementiert. Die Array splices sind aufwendig zu implementieren und man braucht das kaum. (Ausnahmen bestätigen die Regel). Steht auf meiner Liste aber ohne due date. Hast Du irgendwas spezielles vor ?

Ansonsten hier Tagesaktuell https://corona.lmao.ninja/v3/covid-19/countries


All-Ex

Danke für die Antwort!

Ich möchte u.a. die % der geimpften Bevölkerung verschiedener Länder plotten, da habe ich die entsprechenden Daten hier drin gefunden:
https://covid.ourworldindata.org/data/owid-covid-data.json

In dieser Quelle https://corona.lmao.ninja/v3/covid-19/countries ist das noch nicht drin.

Eigentlich brauche ich nur die Readings den jeweils neuesten gültigen Wert der Felder. Die schreibe ich dann in eine LogDB und kann sie plotten. Einige Felder werden aber nur 1x pro Woche oder unregelmäßig aktualisiert.

Aktuell erstelle ich eine riesige ReadingsList:
foreach my $country ("DEU", "DNK", "GBR", "USA", "NDL", "ISR", "AUT", "NZL", "SWE", "ESP") {
    foreach my $value ("new_cases", "new_cases_smoothed_per_million", "new_deaths_smoothed", "new_tests_smoothed", "positive_rate", "total_vaccinations_per_hundred") {
        multi(jsonPath('$.' . $country  . '.data[*]'), concat($country . '_', property('date'),'_' . $value), property($value)); 
   }
}

Das erzeugt aber extrem viele unnötige Readings, von denen ich anschließend nur den letzten gültigen Wert nutze. Deshalb war mein Ansatz, nur die jeweils 30 neuesten Werte in Readings zu schreiben und so die Datenmenge zu reduzieren.

Aber vielleicht geht das ja auch viel eleganter...

herrmannj

Passt - Hacker Style. ;)

Das lässt sich sich wohl erst abkürzen wenn ich da weiteren Syntax für die Arrays implementiere. Der notwendige Zeiteinsatz konkurriert aber mit anderen Projekten ..

All-Ex

Alles klar, dann lass ich das so :-)

Funktioniert ja schließlich und mehr als 640 KB RAM haben wir mittlerweile auch  ;D