Anwendungsbeispiel JsonMod / Covid / 7-Tage-Inzidenz

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

Vorheriges Thema - Nächstes Thema

yersinia

Ist das ein Doppelpost weil du im anderen Thread eine ähnliche Frage gestellt hast -> https://forum.fhem.de/index.php/topic,109413.msg1095291.html#msg1095291?

Tipps kann man viele geben, warum es bei dir nicht gehen könnte.
Ein list des Devices und etwaige Log-Auszüge hilft.
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

Ist kein Doppelpost in meinen Augen. Hier geht es um die Inzidenz und im anderen Thread geht es um die Daten für Welt und Bundesländer.

Das hier hat sich auch seit wenigen Minuten erledigt, auf einmal kommen die Daten an, ich kann mir nur nicht erklären warum. Ich habe nichts am System geändert.

Gisbert

#17
Hallo hermannj,
hallo yersinia,

mittlerweile gibt es ja soviele Städte/Landkreise mit einem 7-Tage-Inzidenzwert > 50, so dass diese Zahl alleine nicht ausreicht.
Kann man aus dem vorhandenen Datensatz auch mehrere Berechnungen zur Anzahl, z.B. > 100, > 150, > 200, > 300 durchführen lassen?

Mit dem Attribut readingList könnte ich ja mehere Abfragen machen, > 100 usw., aber das ist von mir nur geraten.
Wie aber würde ich die Anzahl > 50, 100 usw. aus den Readings herausfiltern?

Könnt ihr mir weiterhelfen? (Edit: Fragezeichen vergessen)

Hier ist meine derzeitige, funktionierende Definition:
defmod 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
attr RKI7 comment https://forum.fhem.de/index.php/topic,97471.msg907044.html#msg907044
attr RKI7 readingList multi(jsonPath('$.features[?(@.attributes.cases7_per_100k > 50)]'), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));;
attr RKI7 room Corona
attr RKI7 sortby 1
attr RKI7 stateFormat {"Zahl der Landkreise/Städte</br>\
mit 7-Tage-Inzidenz > 50: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl','-')."</font>"}
attr RKI7 userReadings _Anzahl {my $anz = grep( m/.*/, ( keys %{$hash->{READINGS}} ));; return $anz;;}


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Gisbert

Hallo hermannj,
hallo yersinia,

die Ermittelung der Anzahl der Städte/Landkreise mit RKI7 > 50 habe ich wohl aus einer anderen Quelle kopiert.
attr RKI7 userReadings _Anzahl {my $anz = grep( m/.*/, ( keys %{$hash->{READINGS}} ));; return $anz;;}

Habt ihr eine Idee, wie die Information > 100, etc. in einem Device erzeugt werden kann? Oder muss ich dafür jeweils ein eigenes Device anlegen? Hoffentlich letzteres nicht.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

herrmannj

Du kannst im Filter die 25 gegen die 100 tauschen, dann zeigt er nur die mit mehr als hundert an.

Gisbert

Zitat von: herrmannj am 11 November 2020, 19:18:30
Du kannst im Filter die 25 gegen die 100 tauschen, dann zeigt er nur die mit mehr als hundert an.

Hallo herrmannj,

klar das geht, dann mach ich einen Screenshot und schreibe den Wert zur Sicherheit noch per Hand in eine Tabelle auf Papier 8) 8) 8)
Ich dachte da eher an was automatischeres  :'( ??? :-X

Ich bin ja auf die Programmierer angewiesen, also auf dich, und hoffe deshalb auf deine Unterstützung. Wenn du der Meinung bist, dass es keine oder keine einfache, automatisierte Lösung gibt, dann respektiere ich dies natürlich.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

yersinia

#21
Ich glaube nicht, dass JsonMod Ranges oder kombinierte (AND) Bedingungen akzeptiert. Man möge mich korrigieren.

Man könnte allerdings mehrere JsonMod Devices (>50, >100, >150, >200 usw) anlegen mit einem user-reading und dann eine readingsgroup drauflassen.

Oder man schränkt die Inzidenz nicht ein und generiert sich mehrere user-readings, die die anzahl entsprechend auswertet. Wie dies gehen sollte, kann ich mir jetzt noch nicht vorstellen.

Mit etwas rumspielen fand ich diese -sicher nicht optimale- Lösung:
attr RKI7 readingList multi(jsonPath('$.features..attributes'), property('GEN'), sprintf('%.1f', property('cases7_per_100k')));;
attr RKI7 stateFormat { my $ret = "<div style=\"text-align:left;;\">Zahl der Landkreise/Städte<br />";;\
$ret .= "mit 7-Tage-Inzidenz < 50: <font style=\"color:yellow;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_50','-')."</font><br />";;\
$ret .= "mit 7-Tage-Inzidenz > 50 & < 100: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_100','-')."</font><br />";;\
$ret .= "mit 7-Tage-Inzidenz > 100 & < 150: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_150','-')."</font><br />";;\
$ret .= "mit 7-Tage-Inzidenz > 150 & < 200: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_200','-')."</font><br />";;\
$ret .= "mit 7-Tage-Inzidenz > 200 & < 250: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_250','-')."</font><br />";;\
$ret .= "mit 7-Tage-Inzidenz > 250: <font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,'_Anzahl_u250','-')."</font></div>";;\
return $ret;;\
}
attr RKI7 userReadings _Anzahl_50 { my $anz = grep {ReadingsNum($NAME,$_,0) < 50.1;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
},\
_Anzahl_100 { my $anz = grep {ReadingsNum($NAME,$_,0) > 50 && ReadingsNum($NAME,$_,0) < 100.1;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
},\
_Anzahl_150 { my $anz = grep {ReadingsNum($NAME,$_,0) > 100 && ReadingsNum($NAME,$_,0) < 150.1;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
},\
_Anzahl_200 { my $anz = grep {ReadingsNum($NAME,$_,0) > 150 && ReadingsNum($NAME,$_,0) < 200.1;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
},\
_Anzahl_250 { my $anz = grep {ReadingsNum($NAME,$_,0) > 200 && ReadingsNum($NAME,$_,0) < 250.1;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
},\
_Anzahl_u250 { my $anz = grep {ReadingsNum($NAME,$_,0) > 250;;} (keys %{$hash->{READINGS}});;\
return $anz;;\
}

Generiert sechs User-Readings (<50, 50-100, 100-150, 150-200, 200-250, >250), die wahrscheinlich mitgezählt werden.
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

Gisbert

Hallo yersinia,

funktioniert super, vielen Dank !!
Die Übersicht hilft etwas, das Desaster zu verstehen, ohne dass man daran etwas ändern könnte.
Beim Googlen ist mir aufgefallen, dass es ganz viele Seiten gibt, die Fallzahlen angeben, wobei es anscheinend aber kleinere Unterschiede gibt. Vermutlich ist es schwer den Zahlensalat unter Kontrolle zu bringen.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

yersinia

Zitat von: Gisbert am 12 November 2020, 18:52:44Beim Googlen ist mir aufgefallen, dass es ganz viele Seiten gibt, die Fallzahlen angeben, wobei es anscheinend aber kleinere Unterschiede gibt. Vermutlich ist es schwer den Zahlensalat unter Kontrolle zu bringen.
Viele verschiedene Quellen ergeben verschiedene Zahlen, auch die Berechnungsmodelle sind je nach Quelle unterschiedlich. Selbst die tagesaktuellen Zahlen des RKIs sind für mich erstmal nur grobe Richtwerte, je mehr Zeit vergangen ist, umso -gefühlter- valider die Zahlen.
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

wendeling

#24
Hallo,
habe mich an das RKI7 gehalten .
Doch ich bekomme als Reading alle Eintragungen , also alle Städte?
Was mache ich falsch ?



multi(jsonPath('$.features[?(@.attributes.cases7_per_100k > 25)]'), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));;\
multi(jsonPath("\$.features[?(\@.attributes.GEN in ['Forchheim', 'Bamberg', 'Erlangen', 'Neustadt a.d. Waldnaab'])]"), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));;



Mit freundlichen Grüßen
Wendelin

rudolfkoenig

Mit folgenden FHEM "Hausmitteln" kriegt man auch die gewuenschten Daten:

define rki7 at *07:00 {\
  HttpUtils_NonblockingGet({ \
    url=>'https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=cases7_per_100k,county&returnGeometry=false&outSR=4326&f=json',\
    callback=>sub{\
      json2reading($defs{rki7},$_[2],'',undef,\
        'hashKeyRename($ret,"features_(.*)_attributes_county:(.*(Forchheim|Bamberg|Erlangen|Neustadt a.d.Waldnaab))","features_(.*)_attributes_cases7_per_100k")'\
      )\
    }\
  })\
}


Nach "set rki7 execNow" hat man folgende Readings/Events:
   READINGS:
     2020-11-15 22:14:09   LK_Bamberg      137.262763058649
     2020-11-15 22:14:09   LK_Erlangen     163.920094417974
     2020-11-15 22:14:09   LK_Forchheim    124.781632143748
     2020-11-15 22:14:09   LK_Neustadt_a.d.Waldnaab 130.227633668608
     2020-11-15 22:14:09   SK_Bamberg      113.734765357424
     2020-11-15 22:14:09   SK_Erlangen     123.524811602446
     2020-11-15 22:14:02   state           Next: 07:00:00

herrmannj

#26
Danke für Deinen Beitrag Rudi, zurück zur Frage wendeling.

Das Beispiel im ersten Post liefert Landkreise mit einem 7-Tage-Inzidenz > 25 _plus_ einige fest definierte SK/LK.
Zitatich bekomme als Reading alle Eintragungen , also alle Städte?
7-Tage-Inzidenz > 25 sind (leider) fast alle Städte/LK :(.

Also entweder höher setzen (> 250):

Bamberg 137.3 15.11.2020 23:39
Bautzen 299.2 15.11.2020 23:39
Berlin_Mitte 359.8 15.11.2020 23:39
Berlin_Neukolln 265.9 15.11.2020 23:39
Berlin_Tempelhof-Schoneberg 266.3 15.11.2020 23:39
Duisburg 288.2 15.11.2020 23:39
Duren 277.4 15.11.2020 23:39
Erlangen 123.5 15.11.2020 23:39
Erzgebirgskreis 252.9 15.11.2020 23:39
Forchheim 124.8 15.11.2020 23:39
Frankfurt_am_Main 254.5 15.11.2020 23:39
Freyung-Grafenau 404.5 15.11.2020 23:39
Furth 250.6 15.11.2020 23:39
Herne 317.7 15.11.2020 23:39
Hildburghausen 261.1 15.11.2020 23:39
Kaiserslautern 264.2 15.11.2020 23:39
Ludwigshafen_am_Rhein 279.2 15.11.2020 23:39
Merzig-Wadern 272.2 15.11.2020 23:39
Neustadt_a.d._Waldnaab 130.2 15.11.2020 23:39
Nurnberg 267.0 15.11.2020 23:39
Offenbach_am_Main 296.3 15.11.2020 23:39
Salzgitter 327.9 15.11.2020 23:39
Speyer 269.0 15.11.2020 23:39
Traunstein 340.6 15.11.2020 23:39
Weiden_i.d._OPf. 264.4 15.11.2020 23:39


oder nur die Referenz LK. Dann ist die dies (der erste multi() entfällt komplett):
multi(jsonPath("\$.features[?(\@.attributes.GEN in ['Forchheim', 'Bamberg', 'Erlangen', 'Neustadt a.d. Waldnaab'])]"), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));

Auf diese Art schick formatiert (eine Nachkommastelle), einfach zu warten, deutlich leichter anzupassen wenn sich der Aufbau der Json Source ändert, Passwörter und Keys werden verwaltet, Fehlerbehandlung und retry werden von JsonMod übernommen, bei JSON Quellen mit variablen Mengen werden bei Bedarf readings aus der Liste entfernt (und vAm).

wendeling

Hallo ,
vielen Dank rudolfKönig hat super funktioniert 😊

Kitt

#28
Hallo,

bei mir wird im STATE nur "? ? ?" angezeigt. Kann mir jemand sagen, woran das liegen könnte?

Danke und LG

jkriegl

Zeig ein list oder mind. Dein stateFormat. Ohne Info ist keine Hilfe möglich.
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly