FHEM Forum

FHEM => Automatisierung => Thema gestartet von: All-Ex am 07 Januar 2021, 22:56:12

Titel: [98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath
Beitrag von: All-Ex am 07 Januar 2021, 22:56:12
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
Titel: Antw:[98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath
Beitrag von: herrmannj am 07 Januar 2021, 23:17:32
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

Titel: Antw:[98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath
Beitrag von: All-Ex am 07 Januar 2021, 23:43:54
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...
Titel: Antw:[98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath
Beitrag von: herrmannj am 07 Januar 2021, 23:57:25
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 ..
Titel: Antw:[98_JsonMod] Letzte n Elemente zurückgeben funktioniert nicht mit jsonPath
Beitrag von: All-Ex am 08 Januar 2021, 00:00:39
Alles klar, dann lass ich das so :-)

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