Anwendungsbeispiel JsonMod #2: CORONA Verbreitung

Begonnen von herrmannj, 22 März 2020, 21:11:18

Vorheriges Thema - Nächstes Thema

yersinia

#90
Wer lesen kann ist im Vorteil, hier stand Mist. -.-
Bitte weiter scrollen. Danke.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | 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 Jörg,

ich kriege immer noch keine updates, deshalb ein list meiner Definition.

Das Attribut interval habe ich auf 15 gesetzt, weiter oben im list steht 1. Die Definition ist über Fhem save ordnungsgemäß gespeichert.

Internals:
   API_LAST_RES 1585276980.59709
   API__LAST_MSG 200
   CFGFN     
   DEF        https://corona.lmao.ninja/countries
   FUUID      5e7cc4cb-f33f-e986-47cf-86181b0589fa719f
   NAME       coronaSpread
   NEXT       2020-03-27 10:30:00
   NR         960
   NTFY_ORDER 50-coronaSpread
   SOURCE     https://corona.lmao.ninja/countries (200)
   STATE      ???
   SVN        21517 2020-03-25 23:14:35 UTC
   TYPE       JsonMod
   CONFIG:
     IN_REQUEST 1
     SOURCE     https://corona.lmao.ninja/countries
     SECRET:
   READINGS:
     2020-03-26 17:00:01   France_active   20002
     2020-03-26 17:00:01   France_cases    25233
     2020-03-26 17:00:01   France_todayCases 0
     2020-03-26 17:00:01   Germany_active  35509
     2020-03-26 17:00:01   Germany_cases   41414
     2020-03-26 17:00:01   Germany_todayCases 4091
     2020-03-26 17:00:01   Italy_active    57521
     2020-03-26 17:00:01   Italy_cases     74386
     2020-03-26 17:00:01   Italy_todayCases 0
     2020-03-26 17:00:01   Spain_active    45037
     2020-03-26 17:00:01   Spain_cases     56197
     2020-03-26 17:00:01   Spain_todayCases 6682
     2020-03-26 17:00:01   USA_active      70772
     2020-03-26 17:00:01   USA_cases       73670
     2020-03-26 17:00:01   USA_todayCases  5459
   helper:
     bm:
       JsonMod_Attr:
         cnt        13
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        27.03. 03:35:21
         max        0.0030360221862793
         tot        0.0192067623138428
         mAr:
           set
           coronaSpread
           interval
           */1 * * * *
       JsonMod_Define:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        27.03. 03:43:14
         max        0.000322103500366211
         tot        0.000322103500366211
         mAr:
           HASH(0x55c6f50d7dc8)
           coronaSpread JsonMod https://corona.lmao.ninja/countries
       JsonMod_Notify:
         cnt        105662
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        27.03. 08:35:33
         max        0.0202682018280029
         tot        25.8302681446075
         mAr:
           HASH(0x55c6f50d7dc8)
           HASH(0x55c6f20d6108)
       JsonMod_Set:
         cnt        184
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        27.03. 03:44:53
         max        0.000125885009765625
         tot        0.00396203994750977
         mAr:
           HASH(0x55c6f50d7dc8)
           coronaSpread
           ?
Attributes:
   interval   */15 * * * *
   readingList multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_todayCases'), property('todayCases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_active'), property('active'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_deaths'), property('deaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_deathstoday'), property('todayDeaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_recovered'), property('recovered'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_critical'), property('critical'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'UK', 'USA'])]"), concat(property('country'), '_cpm'), property('casesPerOneMillion'));


Wie bereits geschildert, keine log-Einträge.

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

Gisbert

Hallo Jörg,

ein Fhem shutdown restart hat zur Lösung geführt. Ist das die richtige, bzw. beabsichtigte Vorgehensweise. Ich kenne das aus Markus' (KölnSolar) Modulen, dort muss es zwingend gemacht werden.

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

herrmannj

wollte ich Dir vorschlagen. Nein, das ist nicht notwendig aber in Deinem List sah das ganz wild aus. Da hat Dir irgendein anderes Modul rein geschossen.

eurofinder

Ist es auch möglich die Fallzahlen je Bundesland in einem readingsGroup darzustellen? Also alle Bundesländer alphabetisch sortiert untereinander mit den jeweiligen Zahlen in Spalten daneben? Ich komme damit irgendwie nicht klar.

Gruß und bleibt gesund
eurofinder
RPI3+; Raspbian Buster Lite; RPI-RF-MOD; piVCCU3, HMIP-eTRV-2, HmIP-SWDO, HmIP-SRH, HmIP-STHO, HmIP-SLO

herrmannj

zur readingGroup bitte einen neuen post im entsprechenden Bereich öffnen.

@Andy: Iran haben die mittlerweile wieder umbenannt. Ich konnte das aber vorher noch testen, bei mir hat es ohne Probleme funktioniert.

Für die Sonderzeichen habe ich eben die Revision 21527 ins SVN geladen, ab morgen im Update. Die Unterstüzung ist vollständig.

Im Reading Namen wird die optisch und phonetisch beste Entsprechung verwendet:

Baden-Württemberg -> Baden-Wurttemberg
Réunion -> Reunion

Das funktioniert auch mit 'Exoten' (Nordeuropäische-, Griechische Alphabete usw). Bei Hindu oder Runen gehts dann irgendwann nicht mehr weil im ASCII nichts gibt was ähnlich genug ist.

Sollte jemand, geplagt von shutdown Langeweile, testen können und wollen dann würde ich mich sehr freuen. Je exotischer der JSON desto besser.

Andy89

danke =) jetzt wird als Wert des Readings "Baden-Wurttemberg_name" "Baden-Württemberg" angezeigt  8) Funktioniret also bestens :)

da @yersinia die ISO Variante vorgestellt hat, habe ich meine Readings auch darauf umgebaut, um nicht alle paar Tage nachziehen zu müssen. Hat sich scheinbar jetzt schon gelohnt.

Danke für Modul  :) :) :)
FHEM 6.0 auf rPi4 docker (mit Alexa & Siri); dbLog, FTUI, Sonos, XiaomiMapCreator auf rPi4 docker;
raspimatic auf rPi3+ > diverse Aktoren und Sensoren;
LGW > (PCA301),EC3000,LaCrosse; MQTT2 > WLAN-Steckdosen,Xiaomi Map;
Harmony Hub;Sonos;Onkyo AVR;RGB WLAN Controller;Netatmo;Withings;Unifi;AMAD

herrmannj

#97
Moin,

hier eine weitere Möglichkeit die Zahlen des Robert Koch Instituts darzustellen (mir geht es hier immer darum den Syntax von JsonMod bekannt zu machen).

Durch die Verwendung von concat() und propertyf() (wie property aber mit format string) erzeuge ich pro Bundesland nur einzige Zeile. Damit verbinde und formatiere ich zwei unterschiedliche Felder aus dem JSON zu einem gemeinsamen reading Inhalt.
multi(jsonPath('$.features[*].attributes'), property('LAN_ew_GEN'), concat(property('Fallzahl'), propertyf('Death', '', ' (%d)')));

Screenshot im Anhand.

sash.sc

Hast du mal deine ganze definition wo und wie du dann die funktion aufrufst und in welchem Atrribut du die setzt ?

Danke !
Gruß
Sascha

Zitat von: Jamo am 25 März 2020, 21:11:07
Hallo Herrmann,
Ich habe eine Sub "myCoronaStoreOld", die ich um 23:59 anstosse, und die die heutigen Werte nach "_yesterday" kopiert.

Um das ganze dann als Tabelle in FHEMWEB darzustellen, gibts die "sub CoronaStateFormat2($name)" die aus dem ganzen eine HTML tabelle generiert.
Sieht dann so wie im Bild aus. Die Tabelle stimmt natürlich nicht, weil wie gesagt die Readings überschrieben werden.

Das "attr stateformat CoronaStateFormat2($name)" hatte ich im vorherigen listing weggelassen, war ja auch nicht von Bedeutung. Ausserdem habe ich im vergleich zu vorher, auch schon das array der Länderliste erweitert (will sagen passst nicht mehr zu der readinglist von den vorherigen listings.

my @countryList  = ("Italy", "USA", "Spain", "Germany", "France", "Switzerland", "UK", "Austria", "Sweden", "Israel", "Russia");


sub myCoronaStoreOld () {
  my $name2 = "coronaSpread";
  for my $countries (@countryList) {
    my $CasesAll      = ReadingsNum($name2, $countries."_cases",0);
    my $CasesTdy      = ReadingsNum($name2, $countries."_casestoday",0);
    my $DeathTdy      = ReadingsNum($name2, $countries."_deathstoday",0);
    my $readingAllYtd = $countries."_casesyesterday";
    my $readingNewYtd = $countries."_casesnewyesterday";
    my $readingDthYtd = $countries."_deathsyesterday";
    fhem ("setreading $name2 $readingAllYtd $CasesAll;setreading $name2 $readingNewYtd $CasesTdy;setreading $name2 $readingDthYtd $DeathTdy");
  }
}


sub CoronaStateFormat2($) {
  my ($name) = @_;
  my $sub    = "CoronaStateFormat";
  my $state  = "<style type=\"text/css\">                                                                                                                                           
</style>                                                                                                                                                                             
<table width=\"100\" border=\"1\">                                                                                                                                                   
  <tr>
    <th align=\"left\">Land  </th>
    <th style=\"text-align:right\"> Cases</th>
    <th style=\"text-align:right\"> Old</th>
    <th style=\"text-align:right\"> NewTdy</th>
    <th style=\"text-align:right\"> NewYdy</th>
    <th style=\"text-align:right\"> Crit</th>
    <th style=\"text-align:right\"> Recov</th>
    <th style=\"text-align:right\"> Growth</th>
    <th style=\"text-align:right\"> Death</th>
    <th style=\"text-align:right\"> NewTdy</th>
    <th style=\"text-align:right\"> NewYtd</th>
    <th style=\"text-align:right\"> Rate</th>
  </tr>";
    #print("@CCList\n");
    for my $CC (@countryList) {
        #print("$CC\n");
        my $CasesAll       = ReadingsNum($name, $CC."_cases",1);
        my $CasesNew       = ReadingsNum($name, $CC."_casestoday",0);
        my $CasesNewOld    = ReadingsNum($name, $CC."_casesnewyesterday",0);
        my $Casescrt       = ReadingsNum($name, $CC."_critical",0);
        my $DeathAll       = ReadingsNum($name, $CC."_deaths",0);
        my $DeathNew       = ReadingsNum($name, $CC."_deathstoday",0);
        my $DeathNewOld    = ReadingsNum($name, $CC."_deathsyesterday",0);
        my $Recovered      = ReadingsNum($name, $CC."_recovered",0);
        my $CasesAllOld    = ReadingsNum($name, $CC."_casesyesterday",1);
        my $CasesPct       = (($CasesAll/$CasesAllOld)-1)*100;
        my $DeathPct       = ($DeathAll/$CasesAll)*100;
        my $DeathRte       = sprintf("%.1f"."%",$DeathPct);
        my $CasesRte       = sprintf("%.1f"."%",$CasesPct);
        #Log 3, "[$sub] CasesAlln=$CasesAlln, CasesAllOld=CasesAllOld, CasesRte=$CasesRte";
        $state = $state . "<tr>
    <td align=\"left\">$CC</td>
    <td align=\"right\"> $CasesAll</td>
    <td align=\"right\"> $CasesAllOld</td>
    <td align=\"right\"> $CasesNew</td>
    <td align=\"right\"> $CasesNewOld</td>
    <td align=\"right\"> $Casescrt</td>
    <td align=\"right\"> $Recovered</td>
    <td align=\"right\"> $CasesRte</td>
    <td align=\"right\"> $DeathAll</td>
    <td align=\"right\"> $DeathNew</td>
    <td align=\"right\"> $DeathNewOld</td>
    <td align=\"right\"> $DeathRte</td>
  </tr>"

    }
    $state = $state ."</table>                                                                                                                                                       
      <span ></a></span>";

    return $state;

}


Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

Zitat von: Jamo
Ich habe eine Sub "myCoronaStoreOld", die ich um 23:59 anstosse, und die die heutigen Werte nach "_yesterday" kopiert.

Hätte ich auch so "vorgeschlagen"...
...aber so ist es "amtlich" ;)

Also ein at zum Ende des Tages ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Jamo

#100
ZitatHast du mal deine ganze definition wo und wie du dann die funktion aufrufst und in welchem Atrribut du die setzt ?

Aufruf der myCoronaStoreOld sub um die alten Werte zu kopierenmit einem zusätzlichen at:
defmod set_defaults_23Uhr59 at *23:59:59 {fhem ("{myCoronaStoreOld()}")}


DieCoronaStateFormat2 Sub mit der formatierung für die Tabelle wir dann im Device selber mit dem attr Stateformat gesetzt:
attr Corona stateFormat {CoronaStateFormat2($name)}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

jnewton957

Zitat von: fh168 am 26 März 2020, 22:27:33
Ich habe darüber 2 Blog-Beiträge geschrieben:

https://blog.moneybag.de/fhem-coronavirus-faelle-deutschland-nach-staedten-und-bundeslaender-anzeigen-lassen/

https://blog.moneybag.de/fhem-corona-faelle-coronavirus-cases-in-fhem-anzeigen/

liebe Grüsse
robin

Mich würde nun als Eingrenzung natürlich genau das Thema Stadt/Landkreis interessieren.

Die Infos oben von robin gehen leider so nicht mehr. Trotzdem vielen Dank.

Wir würde denn eine Umsetzung der Landkreise aussehen ?

Danke Jörg
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

herrmannj

Such und finde eine JSON Quelle wo die Daten drin sind, dann helfe ich dir bei der Umsetzung. Robert Koch vielleicht?

Andy89

Zitat von: jnewton957 am 29 März 2020, 12:25:48
Wir würde denn eine Umsetzung der Landkreise aussehen ?
dort habe ich relativ ausführlich beschrieben, wie ich Bundesländer integriert habe: https://forum.fhem.de/index.php/topic,109490.msg1035351.html#msg1035351

Mittlerweile habe ich für mich zwei persönliche interesannte Landkreise integriert:
defmod coronaSpreadBnHs JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=EWZ,death_rate,cases,deaths,cases_per_100k,cases_per_population,county,OBJECTID&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadBnHs event-on-change-reading .*
attr coronaSpreadBnHs interval 3 0 * * *
attr coronaSpreadBnHs readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_name'), property('attributes.county'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_cases'), property('attributes.cases'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_deaths'), property('attributes.deaths'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_cp100k'), (property('attributes.cases_per_100k')));;
attr coronaSpreadBnHs room Corona


Die Object IDs habe ich vorher aus der Quelle rausgesucht:
https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=EWZ,death_rate,cases,deaths,cases_per_100k,cases_per_population,county,OBJECTID&returnGeometry=false&outSR=4326&f=json
FHEM 6.0 auf rPi4 docker (mit Alexa & Siri); dbLog, FTUI, Sonos, XiaomiMapCreator auf rPi4 docker;
raspimatic auf rPi3+ > diverse Aktoren und Sensoren;
LGW > (PCA301),EC3000,LaCrosse; MQTT2 > WLAN-Steckdosen,Xiaomi Map;
Harmony Hub;Sonos;Onkyo AVR;RGB WLAN Controller;Netatmo;Withings;Unifi;AMAD

jnewton957

Zitat von: Andy89 am 29 März 2020, 12:34:17
Mittlerweile habe ich für mich zwei persönliche interesannte Landkreise integriert:
defmod coronaSpreadBnHs JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=EWZ,death_rate,cases,deaths,cases_per_100k,cases_per_population,county,OBJECTID&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadBnHs event-on-change-reading .*
attr coronaSpreadBnHs interval 3 0 * * *
attr coronaSpreadBnHs readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_name'), property('attributes.county'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_cases'), property('attributes.cases'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_deaths'), property('attributes.deaths'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['79', '86'])]"), concat(property('attributes.county'),'_cp100k'), (property('attributes.cases_per_100k')));;
attr coronaSpreadBnHs room Corona



Danke für die schnelle Antwort und die Lösung.

Konnte das als BnSU und 79, 89 schnell anpassen.
Allerdings hat es mir mit dem defmod zuerst das System lahmgelegt, da er so wohl alle Landkreise versucht hat einzulesen.
Habe es dann in einer corona.cfg als include eingebunden

FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP