Anwendungsbeispiel JsonMod / Covid / 7-Tage-Inzidenz

Begonnen von herrmannj, 24 August 2020, 18:44:17

Vorheriges Thema - Nächstes Thema

herrmannj

Hallo zusammen,

folgende def erstellt ein Device welches alle Landkreise/Städte mit einem 7-Tage-Inzidenz > 25 (erstes multi) sowie zusätzlich ausgewählte Landkreise/Städte (zweites multi) anzeigt. Ein aktuelles JsonMod ist erforderlich.

define RKI7 JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=last_update,cases7_per_100k,BEZ,BEM,GEN,BL,county&returnGeometry=false&outSR=4326&f=json

Readinglist:
multi(jsonPath('$.features[?(@.attributes.cases7_per_100k > 25)]'), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.GEN in ['Hamburg', 'Stormarn', 'Harburg'])]"), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));


update morgens um 7:00
interval   0 7 * * *

Ausgabe:
   READINGS:
     2020-08-24 18:34:51   Dachau          26.6
     2020-08-24 18:34:51   Ebersberg       37.3
     2020-08-24 18:34:51   Frankfurt_Oder  27.6
     2020-08-24 18:34:51   Frankfurt_am_Main 34.0
     2020-08-24 18:34:51   Germersheim     27.9
     2020-08-24 18:34:51   Gro-Gerau       29.5
     2020-08-24 18:34:51   Hamburg         7.5
     2020-08-24 18:34:51   Hamm            27.4
     2020-08-24 18:34:51   Harburg         3.6
     2020-08-24 18:34:51   Heilbronn       38.9
     2020-08-24 18:34:51   Ingolstadt      31.4
     2020-08-24 18:34:51   Kelheim         29.4
     2020-08-24 18:34:51   Munchen         27.9
     2020-08-24 18:34:51   Neu-Ulm         27.6
     2020-08-24 18:34:51   Offenbach_am_Main 55.1
     2020-08-24 18:34:51   Rosenheim       45.8
     2020-08-24 18:34:51   Stormarn        4.9
     2020-08-24 18:34:51   Ulm             28.5
     2020-08-24 18:34:51   Wiesbaden       34.8


vg
Joerg

olvis

#1
Hi, danke. Nette Idee.
Habe das ganze in eine ReadingsGroup gepackt und die Ausgabe farbcodiert (>50 = rot, >25 = orange, darunter grün).
Dazu noch die Timestamps entfernt (notime) und die einzelnen Zeilen nicht klickbar (nolinks)

defmod COVID readingsGroup RKI7
attr COVID nolinks 1
attr COVID notime 1
attr COVID valueStyle { if($VALUE > 50) {'style="color:red"'} elsif($VALUE > 25) {'style="color:orange"'} else{'style="color:green"'}}


Und noch ein Kommentar für die Auswahl von Städten:
Umlaute kann man im multi angeben, in der Ausgabe sind es dann nur die "reinen" Vokale: Köln --> Koln

vg
Oliver

herrmannj

Moin,

ZitatUmlaute kann man im multi angeben, in der Ausgabe sind es dann nur die "reinen" Vokale: Köln --> Koln

Yepp, blöde Beschränkung bei den Namen für Readings innerhalb fhem. Umlaute sind verboten, die Korrektur erfolgt in JsonMod "minimal invasiv", aus 'ö' wird 'o'

Parador

#3
Hallo Joerg,

erstmal danke fürs Teilen dieses sehr aktuellen Beispiels!
Nachdem ich heute ein Update gefahren habe, erhalte einen Fehler im Log angezeigt:
Zitaterror: wrong filter expression in JsonPath filter:   (#1398) in multi(jsonPath('$.features[?(@.attributes.cases7_per_100k > 25)]'), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')))

was kann passiert sein? Habe den Part 1:1 per Copy & Paste eingefügt...


Kann es auch sein, dass mit der Quelle etwas nicht passt? Bei Deinem Beispiel "Stormarn" wird aktuell ein Wert von 14,3 angezeigt über die Webseite: https://www.kreis-stormarn.de/aktuelles/pressemeldungen/2020/zahl-der-bestaetigten-corona-faelle-in-stormarn.html wird aber ein Wert von 23,4 gemeldet (gestern 19,3). Auch bei uns hier weicht der Wert deutlich ab... +20 in etwa...

Danke & viele Grüße

herrmannj

Moin

Zur Quelle: ist das rki, sind deren Zahlen.

Der Fehler ist ein Bug. Komme allerdings erst Anfang der Woche dazu, wird beseitigt.

Vg
Jörg

Parador

Hallo Joerg,

danke für die schnelle Antwort & die Fehlerbeseitigung ;-)
Zur Quelle: komisch, habe vorhin die Zahlen über https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0/data?geometry=-30.805%2C46.211%2C52.823%2C55.839&orderBy=GEN&selectedAttribute=cases7_per_100k abgerufen, und da kommen für uns ganz andere Zahlen raus.
Stormarn stimmt mit den 14,3 überein... sind auch RKI Zahlen

VG

herrmannj

Wenn du eine andere Quelle kennst kannst du die problemlos nehmen, das ist ja der Zweck von jsonmod.

Vg
Joerg

Parador

#7
Hallo Joerg,

alles klar, habe mich an die andere Quelle angehängt und lerne gerade wie ich mit JsonMod umgehen muss...
darf ich hier meine Fragen dazu stellen?

Mit der Abfrage:
Zitathttps://opendata.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0.geojson?where=GEN%20%3D%20'Augsburg'
die komischerweise nicht direkt funktioniert...
deshalb noch mal der Weg dorthin:
Aufruf von: https://hub.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0
dann Aufruf der Daten, dann Einschränkung selbiger in Spalte "GEN" auf Stadt hier Augsburg, dann kommen Werte für Stadt und Landkreis, dann auf der rechten Seite bei "API's" das GEOJSON für das gefilterte Datenset.. dann kommt: https://opendata.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0.geojson?where=GEN%20%3D%20'Augsburg'
Nun kommt man zu einer JSON Datei die sich abrufen lässt...

Daraus habe ich mir Werte nun folgendermaßen dem erhaltenen JSON ausgelesen:

single(jsonPath('$.features.0.properties.EWZ'), 'Stadt_Einwohner', 'leer');
single(jsonPath('$.features.0.properties.cases7_per_100k'), 'Stadt_Faelle7_pro_100k', 'leer');
single(jsonPath('$.features.0.properties.deaths'), 'Stadt_Tote', 'leer');
single(jsonPath('$.features.0.properties.cases'), 'Stadt_Faelle', 'leer');
single(jsonPath('$.features.0.properties.recovered'), 'Stadt_Genesene', 'nicht gemeldet');
single(jsonPath('$.features.0.properties.last_update'), 'Stadt_Stand', 'leer');
single(jsonPath('$.features.1.properties.EWZ'), 'Landkreis_Einwohner', 'leer');
single(jsonPath('$.features.1.properties.cases7_per_100k'), 'Landkreis_Faelle7_pro_100k', 'leer');
single(jsonPath('$.features.1.properties.deaths'), 'Landkreis_Tote', 'leer');
single(jsonPath('$.features.1.properties.cases'), 'Landkreis_Faelle', 'leer');
single(jsonPath('$.features.1.properties.recovered'), 'Landkreis_Genesene', 'nicht gemeldet');
single(jsonPath('$.features.1.properties.last_update'), 'Landkreis_Stand', 'leer');


Nun habe ich noch eine Frage

b) ich würde gerne die cases7_per_100k gleich auf eine/zwei Stellen hinter dem Punkt/Komma runden bekomme das aber nicht hin..
Bisher habe ich es mit folgendem probiert:
single(jsonPath('$.features.0.properties.cases7_per_100k', '%0.2f'), 'Stadt_Faelle7_pro_100k', 'leer');


Vielen Dank für Deine Unterstützung schon jetzt

herrmannj

Moin,

Bug aus Post #3 https://forum.fhem.de/index.php/topic,113798.msg1092984.html#msg1092984 ist gefixed. Die neue Version ist im svn und wird ab morgen Vormittag per fhem update verteilt.

Die Liste (>35) ist erschreckend lang...  ???

Zu den Abweichungen bei den Zahlen (Landkreis selber vs RKI): soweit ich verstehe gibt es einen zeitlichen Versatz.

Das Beispiel aus dem letzten post kann ich nicht nachvollziehen, die Quelle liefert bei mir keine Daten.

vg
Joerg

Parador

Habe gerade den Weg zu den Daten nochmal beschrieben, falls Zeit und Interesse besteht. bei der Quelle scheinen die Daten aktueller...
Kannst Du mir noch einen Tipp für's Runden geben?

VG

herrmannj


Parador

#11
Hallo,

super das klappt schon alles perfekt - DANKE.
Allerdings kriege ich immer noch einen Fehler im Log, hast Du da vielleicht auch einen Tipp?

Vielen Dank

RockFan

Hallo Joerg,

ich bin gerade zufällig auf den Post gestoßen und habe es gleich mal umgesetzt, da das ja momentan DAS Kriterium für Regulierungen ist.
Vielen Dank!

Hierbei ist mir aufgefallen, dass die Verwendung des Feldes "GEN" in einigen Fällen (z.B. Augsburg, München, uvm.) zu dem Problem führt, dass sowohl die Städte, als auch die Landkreise im Feld GEN den exakt gleichen Namen haben ("Augsburg", "München", ...) und somit nur eines von Beiden herausgefiltert wird.

Das kann man allerdings relativ leicht beheben, indem man "county" statt "GEN" verwendet. Im Ergebnis sind zwar die unschönen "_", die die Leerzeichen ersetzen ("SK_Munchen", "LK_Munchen", ...), aber dafür ist das Ergebnis vollständig.

Viele Grüße
Dieter
Raspbian (Buster) auf Raspberry Pi 4 /  CUL + RFXTRX + TCM / FS20, FHT 80B, S300TH, Intertechno, DMX, Milight, EnOcean, Homematic, AMAD, Home Connect, MiSmartHome, Yeelight, ...

yersinia

#13
Zitat von: RockFan am 19 Oktober 2020, 22:03:00Das kann man allerdings relativ leicht beheben, indem man "county" statt "GEN" verwendet. Im Ergebnis sind zwar die unschönen "_", die die Leerzeichen ersetzen ("SK_Munchen", "LK_Munchen", ...), aber dafür ist das Ergebnis vollständig.
Man kann aber auch über OBJECTID gehen (welchen man sich aus der Quelle erst relativ mühsam raussuchen muss) und diesen Wert als Identifier der Readings nehmen und die Beschreibung als Readingswert. Ein Beispiel ist hier->https://forum.fhem.de/index.php/topic,109413.msg1093720.html#msg1093720 aufgeführt.

Für SK München wäre es 224, LK München ist 239:
defmod coronaSpreadCounties JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=death_rate,cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadCounties event-on-update-reading .computedReadings
attr coronaSpreadCounties interval 10 */3 * * *
attr coronaSpreadCounties readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['224', '239'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['224', '239'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.cases'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['224', '239'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.deaths'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['224', '239'])]"), concat(property('attributes.OBJECTID'),'_cases7_per_100k'), property('attributes.cases7_per_100k'));;
attr coronaSpreadCounties room CoViD-19
attr coronaSpreadCounties stateFormat { my $ret = "<div style=\"text-align: left;;\">";;\
$ret .= "last <a href=\"https://corona.rki.de\" title=\"RKI CoViD19\" rel=\"noopener noreferrer\" target=\"_blank\">RKI CoViD-19</a> check => ";;\
$ret .= POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
$ret .= "<br \/>";;\
$ret .= ReadingsVal($name,"224_name","-").": ";;\
$ret .= "<font style=\"font-weight:bold;;color:";;\
if(ReadingsNum($name,"224_cases7_per_100k",0) < 35) {\
$ret .= "green";;\
} elsif (ReadingsNum($name,"224_cases7_per_100k",0) < 50) {\
$ret .= "orange";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\">".sprintf("%.1f", ReadingsNum($name,"224_cases7_per_100k",0))."</font>&nbsp;;&amp;;&nbsp;;";;\
$ret .= "<font style=\"color:orange;;\">".ReadingsVal($name,"224_cases","-")." F&auml;;lle</font>&nbsp;;&amp;;&nbsp;;";;\
$ret .= "<font style=\"color:red;;\">".ReadingsVal($name,"224_deaths","-")." Tote</font><br \/>";;\
$ret .= ReadingsVal($name,"239_name","-").": ";;\
$ret .= "<font style=\"font-weight:bold;;color:";;\
if(ReadingsNum($name,"239_cases7_per_100k",0) < 35) {\
$ret .= "green";;\
} elsif (ReadingsNum($name,"239_cases7_per_100k",0) < 50) {\
$ret .= "orange";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\">".sprintf("%.1f", ReadingsNum($name,"239_cases7_per_100k",0))."</font>&nbsp;;&amp;;&nbsp;;";;\
$ret .= "<font style=\"color:orange;;\">".ReadingsVal($name,"239_cases","-")." F&auml;;lle</font>&nbsp;;&amp;;&nbsp;;";;\
$ret .= "<font style=\"color:red;;\">".ReadingsVal($name,"239_deaths","-")." Tote</font>";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadCounties update-on-start 1
attr coronaSpreadCounties webCmd reread
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

ErzGabriel

Hallo zusammen.
Ich habe versucht, das Beispiel nachzubauen, über copy & paste. Aber seit 3 Tagen erhalte ich keine Daten vom RKI. Fhem ist auf dem neusten Stand und neu gestartet habe ich es auch.
Hat jemand von Euch einen Tipp für mich, warum nichts ankommt?

Danke.