Corona Fallzahlenübersicht in FTUI (COVID-19)

Begonnen von somansch, 24 März 2020, 23:09:09

Vorheriges Thema - Nächstes Thema

somansch

Aus dem derzeit gegebenen (äußerst kritischen) Anlaß habe ich die aktuellen Fallzahlen in meine FTUI Anzeige eingebaut. Hierzu habe ich das Beispiel vom neuen "JsonMod" - Modul als Datenquelle genutzt:https://forum.fhem.de/index.php/topic,109413.0.html

Hier die Device-Konfig:
defmod coronaSpread JsonMod https://corona.lmao.ninja/countries
attr coronaSpread interval */10 * * * *
attr coronaSpread readingList multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_todayCases'), property('todayCases'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_active'), property('active'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_deaths'), property('deaths'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_todayDeaths'), property('todayDeaths'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_recovered'), property('recovered'));;\
multi(jsonPath("\$.[?(\@.country in ['Germany', 'China', 'Netherlands', 'Denmark', 'UK', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_casesPerOneMillion'), property('casesPerOneMillion'));;
attr coronaSpread room 097_News
attr coronaSpread stateFormat Germany_procent_todayDeaths
attr coronaSpread userReadings Germany_procent_todayDeaths {ReadingsVal("coronaSpread","Germany_todayDeaths","")/ReadingsVal("coronaSpread","Germany_deaths","")*100},\
USA_procent_todayDeaths {ReadingsVal("coronaSpread","USA_todayDeaths","")/ReadingsVal("coronaSpread","USA_deaths","")*100},\
UK_procent_todayDeaths {ReadingsVal("coronaSpread","UK_todayDeaths","")/ReadingsVal("coronaSpread","UK_deaths","")*100},\
Denmark_procent_todayDeaths {ReadingsVal("coronaSpread","Denmark_todayDeaths","")/ReadingsVal("coronaSpread","Denmark_deaths","")*100},\
France_procent_todayDeaths {ReadingsVal("coronaSpread","France_todayDeaths","")/ReadingsVal("coronaSpread","France_deaths","")*100},\
Spain_procent_todayDeaths {ReadingsVal("coronaSpread","Spain_todayDeaths","")/ReadingsVal("coronaSpread","Spain_deaths","")*100},\
Netherlands_procent_todayDeaths {ReadingsVal("coronaSpread","Netherlands_todayDeaths","")/ReadingsVal("coronaSpread","Netherlands_deaths","")*100},\
Italy_procent_todayDeaths {ReadingsVal("coronaSpread","Italy_todayDeaths","")/ReadingsVal("coronaSpread","Italy_deaths","")*100},\
China_procent_todayDeaths {ReadingsVal("coronaSpread","China_todayDeaths","")/ReadingsVal("coronaSpread","China_deaths","")*100},\
Germany_procent_todayCases {ReadingsVal("coronaSpread","Germany_todayCases","")/ReadingsVal("coronaSpread","Germany_cases","")*100},\
USA_procent_todayCases {ReadingsVal("coronaSpread","USA_todayCases","")/ReadingsVal("coronaSpread","USA_cases","")*100},\
UK_procent_todayCases {ReadingsVal("coronaSpread","UK_todayCases","")/ReadingsVal("coronaSpread","UK_cases","")*100},\
Denmark_procent_todayCases {ReadingsVal("coronaSpread","Denmark_todayCases","")/ReadingsVal("coronaSpread","Denmark_cases","")*100},\
France_procent_todayCases {ReadingsVal("coronaSpread","France_todayCases","")/ReadingsVal("coronaSpread","France_cases","")*100},\
Spain_procent_todayCases {ReadingsVal("coronaSpread","Spain_todayCases","")/ReadingsVal("coronaSpread","Spain_cases","")*100},\
Netherlands_procent_todayCases {ReadingsVal("coronaSpread","Netherlands_todayCases","")/ReadingsVal("coronaSpread","Netherlands_cases","")*100},\
Italy_procent_todayCases {ReadingsVal("coronaSpread","Italy_todayCases","")/ReadingsVal("coronaSpread","Italy_cases","")*100},\
China_procent_todayCases {ReadingsVal("coronaSpread","China_todayCases","")/ReadingsVal("coronaSpread","China_cases","")*100}\


Der FTUI Code ist im Anhang.

Viele Grüße und bleibt gesund!
Andreas

Dracolein

#1
Könntest Du mir auf die Sprünge helfen, wie Deine Vorlage richtig eingebunden wird in ein laufendes FTUI?
Dein Beispiel sieht toll aus, aber ich habe noch nie mit Templates gearbeitet.

Das Device ist 1:1 entsprechend Deinem Beispiel bei mir angelegt und läuft.
Die Datei "template_news_corona.html" habe ich 1:1 im Ordner opt/fhem/www/tablet/ abgespeichert (dort liegen alle meine html Dateien, die ich nutze).
Nun möchte ich das Ganze in mein Layout einbinden, das in dem Fall aus einer weitgehend leeren HTML Seite auf Gridster-Basis besteht (rechts die Menüleiste, links eine freie, riesige Zelle).

Wenn ich folgenden Code-Schnipsel aus Deinem Beispiel dort einfüge
<div class="hbox">
<div class="vbox phone-width">
<div class="card lift">
<header>Land - Gesamt - Gesamt pro Mio - Neu - Erkrankt - &dagger; - neu &dagger; - Geheilt</header>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Germany"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"USA"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"UK"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Denmark"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"France"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Spain"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Netherlands"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Italy"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"China"}'></div>
</section>
</div>
</div>
</div>

läuft es zwar inhaltlich, indem die Daten und Icons dargestellt werden, jedoch sind sie alle vertikal untereinander ohne Farbe darbestellt und nicht tabellarisch schön gelistet.
Bevor ich mir ein eigenes Layout bastel, bin ich neugierig, was ich falsch mache.

Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

somansch

Zitat von: Dracolein am 25 März 2020, 10:18:20
Könntest Du mir auf die Sprünge helfen, wie Deine Vorlage richtig eingebunden wird in ein laufendes FTUI?
Dein Beispiel sieht toll aus, aber ich habe noch nie mit Templates gearbeitet.

Das Device ist 1:1 entsprechend Deinem Beispiel bei mir angelegt und läuft.
Die Datei "template_news_corona.html" habe ich 1:1 im Ordner opt/fhem/www/tablet/ abgespeichert (dort liegen alle meine html Dateien, die ich nutze).
Nun möchte ich das Ganze in mein Layout einbinden, das in dem Fall aus einer weitgehend leeren HTML Seite auf Gridster-Basis besteht (rechts die Menüleiste, links eine freie, riesige Zelle).

Wenn ich folgenden Code-Schnipsel aus Deinem Beispiel dort einfüge
<div class="hbox">
<div class="vbox phone-width">
<div class="card lift">
<header>Land - Gesamt - Gesamt pro Mio - Neu - Erkrankt - &dagger; - neu &dagger; - Geheilt</header>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Germany"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"USA"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"UK"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Denmark"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"France"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Spain"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Netherlands"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"Italy"}'></div>
</section>
<section>
<div data-template="template_news_corona.html" data-parameter='{"var_country":"China"}'></div>
</section>
</div>
</div>
</div>

läuft es zwar inhaltlich, indem die Daten und Icons dargestellt werden, jedoch sind sie alle vertikal untereinander ohne Farbe darbestellt und nicht tabellarisch schön gelistet.
Bevor ich mir ein eigenes Layout bastel, bin ich neugierig, was ich falsch mache.

Ich nutze das Flex-Layout. Weitere Templates und die Konfig hatte ich letztes Jahr in diesem Post bereitgestellt:https://forum.fhem.de/index.php/topic,37378.msg885401.html#msg885401

Ich hoffe, das hilft dir  ;)

TWART016

Ich habe das ganze bei mir ohne pagebutton umgesetzt. Allerdings stimmen bei mir die Abstände nicht.

Ich vermute das liegt an den Flex-attributen. Auch habe die von dir in meine eigene css übernommen.


herrmannj

Falls es von Interesse ist: User Andy89 hat eine Daten Quelle für die (deutschen) Bundesländer beim RKI aufgetan. Fhem Umsetzung ab hier https://forum.fhem.de/index.php/topic,109413.msg1035075.html#msg1035075
Braucht ein aktuelles JsonMod (ab morgen im update).

somansch

Zitat von: TWART016 am 25 März 2020, 23:43:49
Ich habe das ganze bei mir ohne pagebutton umgesetzt. Allerdings stimmen bei mir die Abstände nicht.

Ich vermute das liegt an den Flex-attributen. Auch habe die von dir in meine eigene css übernommen.
Hier meine aktuelle css.

TWART016

Zitat von: somansch am 26 März 2020, 00:04:46
Hier meine aktuelle css.

Ich habe hdm-flexbox-item-10, hdm-flexbox-item-70 und hdm-flexbox-container genauso in meiner css. Trotzdem scheint das nicht zu greifen.

Der Fehler heißt:
ZitatInvalid property value

Andy89

#7
so ich habe die Vorlage von Andreas genommen und minimal angepasst, damit ich die Welt Daten auch angezeigt bekomme.

Hier meine Definitionen für die Weltanzeige:
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval 1/10 * * * *
attr coronaSpreadWorld readingList single(jsonPathf('$.deaths', '%s'), 'world_deaths', 'N/A');;\
single(jsonPathf('$.cases', '%s'), 'world_cases', 'N/A');;\
single(jsonPathf('$.recovered', '%s'), 'world_recovered', 'N/A');;\
single(jsonPathf('$.updated', '%s'), 'world_updated', 'N/A');;
attr coronaSpreadWorld room Status
attr coronaSpreadWorld stateFormat Welt Fälle: world_active
attr coronaSpreadWorld userReadings updated_human  {setlocale(LC_TIME,"de_DE.utf8");; POSIX::strftime ("%Y-%m-%d %H:%M:00", localtime(ReadingsVal("coronaSpreadWorld","world_updated",0)/1000))},\
world_active {ReadingsVal("coronaSpreadWorld","world_cases",0)-ReadingsVal("coronaSpreadWorld","world_deaths",0)-ReadingsVal("coronaSpreadWorld","world_recovered",0)},\
world_casesPerOneMillion {ReadingsVal("coronaSpreadWorld","world_cases",0)/7773.452460},\
world_todayCases {ReadingsVal("coronaSpreadWorld","world_cases",0)-ReadingsVal("coronaSpreadWorld","world_cases_yesterday",0)},\
world_todayDeaths {ReadingsVal("coronaSpreadWorld","world_deaths",0)-ReadingsVal("coronaSpreadWorld","world_deaths_yesterday",0)},\
world_todayRecovered {ReadingsVal("coronaSpreadWorld","world_recovered",0)-ReadingsVal("coronaSpreadWorld","world_recovered_yesterday",0)},\
world_name {"Welt"}


hier meine Länderdaten:
defmod coronaSpread JsonMod https://corona.lmao.ninja/countries
attr coronaSpread event-on-change-reading .*
attr coronaSpread event-on-update-reading Germany_todayDeaths
attr coronaSpread interval 1/10 * * * *
attr coronaSpread readingList multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_name'), property('country'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_cases'), property('cases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayCases'), property('todayCases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_active'), property('active'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_deaths'), property('deaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayDeaths'), property('todayDeaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_recovered'), property('recovered'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_casesPerOneMillion'), property('casesPerOneMillion'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_critical'), property('critical'));;
attr coronaSpread room Status
attr coronaSpread stateFormat Heutige deutsche Fälle: DEU_todayCases
attr coronaSpread userReadings DEU_procent_todayDeaths {ReadingsVal("coronaSpread","DEU_todayDeaths","")/ReadingsVal("coronaSpread","DEU_deaths","")*100},\
USA_procent_todayDeaths {ReadingsVal("coronaSpread","USA_todayDeaths","")/ReadingsVal("coronaSpread","USA_deaths","")*100},\
GBR_procent_todayDeaths {ReadingsVal("coronaSpread","GBR_todayDeaths","")/ReadingsVal("coronaSpread","GBR_deaths","")*100},\
FRA_procent_todayDeaths {ReadingsVal("coronaSpread","FRA_todayDeaths","")/ReadingsVal("coronaSpread","FRA_deaths","")*100},\
ESP_procent_todayDeaths {ReadingsVal("coronaSpread","ESP_todayDeaths","")/ReadingsVal("coronaSpread","ESP_deaths","")*100},\
NLD_procent_todayDeaths {ReadingsVal("coronaSpread","NLD_todayDeaths","")/ReadingsVal("coronaSpread","NLD_deaths","")*100},\
ITA_procent_todayDeaths {ReadingsVal("coronaSpread","ITA_todayDeaths","")/ReadingsVal("coronaSpread","ITA_deaths","")*100},\
CHN_procent_todayDeaths {ReadingsVal("coronaSpread","CHN_todayDeaths","")/ReadingsVal("coronaSpread","CHN_deaths","")*100},\
IRN_procent_todayDeaths {ReadingsVal("coronaSpread","IRN_todayDeaths","")/ReadingsVal("coronaSpread","IRN_deaths","")*100},\
DEU_procent_todayCases {ReadingsVal("coronaSpread","DEU_todayCases","")/ReadingsVal("coronaSpread","DEU_cases","")*100},\
USA_procent_todayCases {ReadingsVal("coronaSpread","USA_todayCases","")/ReadingsVal("coronaSpread","USA_cases","")*100},\
GBR_procent_todayCases {ReadingsVal("coronaSpread","GBR_todayCases","")/ReadingsVal("coronaSpread","GBR_cases","")*100},\
FRA_procent_todayCases {ReadingsVal("coronaSpread","FRA_todayCases","")/ReadingsVal("coronaSpread","FRA_cases","")*100},\
ESP_procent_todayCases {ReadingsVal("coronaSpread","ESP_todayCases","")/ReadingsVal("coronaSpread","ESP_cases","")*100},\
NLD_procent_todayCases {ReadingsVal("coronaSpread","NLD_todayCases","")/ReadingsVal("coronaSpread","NLD_cases","")*100},\
ITA_procent_todayCases {ReadingsVal("coronaSpread","ITA_todayCases","")/ReadingsVal("coronaSpread","ITA_cases","")*100},\
CHN_procent_todayCases {ReadingsVal("coronaSpread","CHN_todayCases","")/ReadingsVal("coronaSpread","CHN_cases","")*100},\
IRN_procent_todayCases {ReadingsVal("coronaSpread","IRN_todayCases","")/ReadingsVal("coronaSpread","IRN_cases","")*100}


zusätzlich ist noch ein Notifiy notwendig, um die Vortageszahlen kurz vor 0 Uhr abzuspeichern:
defmod di_coronaStats DOIF ([23:52])(setreading coronaSpreadWorld world_deaths_yesterday [coronaSpreadWorld:world_deaths])\
(setreading coronaSpreadWorld world_cases_yesterday [coronaSpreadWorld:world_cases])\
(setreading coronaSpreadWorld world_recovered_yesterday [coronaSpreadWorld:world_recovered])
attr di_coronaStats do always


Zusätzlich habe ich eine zweite Seite angelegt mit den Bundesland-Daten. Leider sind die RKI-Daten nur tagesaktuell und haben keine Zahl für die Geheilten. Somit kann man auch keine Aktiven Fälle berechnen. Um die fehlenden Werte zu Berechnen, lohnt es sich sicher ein Perl Script zu erzeugen. Dazu bin ich noch nicht gekommen, weswegen es auch keine Differenz zum Vortag gibt.

Hier die Bundesland-Daten:
defmod coronaSpreadDe JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/Coronaf%C3%A4lle_in_den_Bundesl%C3%A4ndern/FeatureServer/0/query?where=1%3D1&outFields=LAN_ew_GEN,Fallzahl,Aktualisierung,faelle_100000_EW,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadDe event-on-update-reading .*
attr coronaSpreadDe interval 3 0 * * *
attr coronaSpreadDe readingList multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_deaths'), property('attributes.Death'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_lastUpdate'), property('attributes.Aktualisierung'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cp100k'), (property('attributes.faelle_100000_EW')));;
attr coronaSpreadDe room Status
attr coronaSpreadDe stateFormat NRW Fälle: Nordrhein-Westfalen_cases Tote: Nordrhein-Westfalen_deaths
attr coronaSpreadDe userReadings updated_human {POSIX::strftime ("%d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadDe","Nordrhein-Westfalen_lastUpdate",0)/1000))}


wie auch Andreas habe ich mein template und die zwei HTML Seiten unten angehängt unten angehängt. Die Flaggen habe ich an zwei verschiedenen Stellen als zip heruntergeladen und die Namen angepasst, damit es passt.

Beste Grüße
Andreas

edit: @hermann, du liest ja sicher mit. Könntest du die "Umformatierung" von Umlauten auch bei den Readings übernehmen? Dann passiert sowas nicht:
Baden-Wurttemberg_name Baden-W�rttemberg

das passiert mit diesem Teil des readingList:
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_name'), property('attributes.LAN_ew_GEN'));
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

somansch

Zitat von: Andy89 am 26 März 2020, 15:48:42
so ich habe die Vorlage von Andreas genommen und minimal angepasst, damit ich die Welt Daten auch angezeigt bekomme.

Hier meine Definitionen für die Weltanzeige:
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval 1/10 * * * *
attr coronaSpreadWorld readingList single(jsonPathf('$.deaths', '%s'), 'world_deaths', 'N/A');;\
single(jsonPathf('$.cases', '%s'), 'world_cases', 'N/A');;\
single(jsonPathf('$.recovered', '%s'), 'world_recovered', 'N/A');;\
single(jsonPathf('$.updated', '%s'), 'world_updated', 'N/A');;
attr coronaSpreadWorld room Status
attr coronaSpreadWorld stateFormat Welt Fälle: world_active
attr coronaSpreadWorld userReadings updated_human  {setlocale(LC_TIME,"de_DE.utf8");; POSIX::strftime ("%Y-%m-%d %H:%M:00", localtime(ReadingsVal("coronaSpreadWorld","world_updated",0)/1000))},\
world_active {ReadingsVal("coronaSpreadWorld","world_cases",0)-ReadingsVal("coronaSpreadWorld","world_deaths",0)-ReadingsVal("coronaSpreadWorld","world_recovered",0)},\
world_casesPerOneMillion {ReadingsVal("coronaSpreadWorld","world_cases",0)/7773.452460},\
world_todayCases {ReadingsVal("coronaSpreadWorld","world_cases",0)-ReadingsVal("coronaSpreadWorld","world_cases_yesterday",0)},\
world_todayDeaths {ReadingsVal("coronaSpreadWorld","world_deaths",0)-ReadingsVal("coronaSpreadWorld","world_deaths_yesterday",0)},\
world_todayRecovered {ReadingsVal("coronaSpreadWorld","world_recovered",0)-ReadingsVal("coronaSpreadWorld","world_recovered_yesterday",0)},\
world_name {"Welt"}


hier meine Länderdaten:
defmod coronaSpread JsonMod https://corona.lmao.ninja/countries
attr coronaSpread event-on-change-reading .*
attr coronaSpread event-on-update-reading Germany_todayDeaths
attr coronaSpread interval 1/10 * * * *
attr coronaSpread readingList multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_name'), property('country'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_cases'), property('cases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayCases'), property('todayCases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_active'), property('active'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_deaths'), property('deaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayDeaths'), property('todayDeaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_recovered'), property('recovered'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_casesPerOneMillion'), property('casesPerOneMillion'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA','IRN', 'USA'])]"), concat(property('countryInfo.iso3'), '_critical'), property('critical'));;
attr coronaSpread room Status
attr coronaSpread stateFormat Heutige deutsche Fälle: DEU_todayCases
attr coronaSpread userReadings DEU_procent_todayDeaths {ReadingsVal("coronaSpread","DEU_todayDeaths","")/ReadingsVal("coronaSpread","DEU_deaths","")*100},\
USA_procent_todayDeaths {ReadingsVal("coronaSpread","USA_todayDeaths","")/ReadingsVal("coronaSpread","USA_deaths","")*100},\
GBR_procent_todayDeaths {ReadingsVal("coronaSpread","GBR_todayDeaths","")/ReadingsVal("coronaSpread","GBR_deaths","")*100},\
FRA_procent_todayDeaths {ReadingsVal("coronaSpread","FRA_todayDeaths","")/ReadingsVal("coronaSpread","FRA_deaths","")*100},\
ESP_procent_todayDeaths {ReadingsVal("coronaSpread","ESP_todayDeaths","")/ReadingsVal("coronaSpread","ESP_deaths","")*100},\
NLD_procent_todayDeaths {ReadingsVal("coronaSpread","NLD_todayDeaths","")/ReadingsVal("coronaSpread","NLD_deaths","")*100},\
ITA_procent_todayDeaths {ReadingsVal("coronaSpread","ITA_todayDeaths","")/ReadingsVal("coronaSpread","ITA_deaths","")*100},\
CHN_procent_todayDeaths {ReadingsVal("coronaSpread","CHN_todayDeaths","")/ReadingsVal("coronaSpread","CHN_deaths","")*100},\
IRN_procent_todayDeaths {ReadingsVal("coronaSpread","IRN_todayDeaths","")/ReadingsVal("coronaSpread","IRN_deaths","")*100},\
DEU_procent_todayCases {ReadingsVal("coronaSpread","DEU_todayCases","")/ReadingsVal("coronaSpread","DEU_cases","")*100},\
USA_procent_todayCases {ReadingsVal("coronaSpread","USA_todayCases","")/ReadingsVal("coronaSpread","USA_cases","")*100},\
GBR_procent_todayCases {ReadingsVal("coronaSpread","GBR_todayCases","")/ReadingsVal("coronaSpread","GBR_cases","")*100},\
FRA_procent_todayCases {ReadingsVal("coronaSpread","FRA_todayCases","")/ReadingsVal("coronaSpread","FRA_cases","")*100},\
ESP_procent_todayCases {ReadingsVal("coronaSpread","ESP_todayCases","")/ReadingsVal("coronaSpread","ESP_cases","")*100},\
NLD_procent_todayCases {ReadingsVal("coronaSpread","NLD_todayCases","")/ReadingsVal("coronaSpread","NLD_cases","")*100},\
ITA_procent_todayCases {ReadingsVal("coronaSpread","ITA_todayCases","")/ReadingsVal("coronaSpread","ITA_cases","")*100},\
CHN_procent_todayCases {ReadingsVal("coronaSpread","CHN_todayCases","")/ReadingsVal("coronaSpread","CHN_cases","")*100},\
IRN_procent_todayCases {ReadingsVal("coronaSpread","IRN_todayCases","")/ReadingsVal("coronaSpread","IRN_cases","")*100}


zusätzlich ist noch ein Notifiy notwendig, um die Vortageszahlen kurz vor 0 Uhr abzuspeichern:
defmod di_coronaStats DOIF ([23:52])(setreading coronaSpreadWorld world_deaths_yesterday [coronaSpreadWorld:world_deaths])\
(setreading coronaSpreadWorld world_cases_yesterday [coronaSpreadWorld:world_cases])\
(setreading coronaSpreadWorld world_recovered_yesterday [coronaSpreadWorld:world_recovered])
attr di_coronaStats do always


Zusätzlich habe ich eine zweite Seite angelegt mit den Bundesland-Daten. Leider sind die RKI-Daten nur tagesaktuell und haben keine Zahl für die Geheilten. Somit kann man auch keine Aktiven Fälle berechnen. Um die fehlenden Werte zu Berechnen, lohnt es sich sicher ein Perl Script zu erzeugen. Dazu bin ich noch nicht gekommen, weswegen es auch keine Differenz zum Vortag gibt.

Hier die Bundesland-Daten:
defmod coronaSpreadDe JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/Coronaf%C3%A4lle_in_den_Bundesl%C3%A4ndern/FeatureServer/0/query?where=1%3D1&outFields=LAN_ew_GEN,Fallzahl,Aktualisierung,faelle_100000_EW,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadDe event-on-update-reading .*
attr coronaSpreadDe interval 3 0 * * *
attr coronaSpreadDe readingList multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_deaths'), property('attributes.Death'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_lastUpdate'), property('attributes.Aktualisierung'));;\
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cp100k'), (property('attributes.faelle_100000_EW')));;
attr coronaSpreadDe room Status
attr coronaSpreadDe stateFormat NRW Fälle: Nordrhein-Westfalen_cases Tote: Nordrhein-Westfalen_deaths
attr coronaSpreadDe userReadings updated_human {POSIX::strftime ("%d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadDe","Nordrhein-Westfalen_lastUpdate",0)/1000))}


wie auch Andreas habe ich mein template und die zwei HTML Seiten unten angehängt unten angehängt. Die Flaggen habe ich an zwei verschiedenen Stellen als zip heruntergeladen und die Namen angepasst, damit es passt.

Beste Grüße
Andreas

edit: @hermann, du liest ja sicher mit. Könntest du die "Umformatierung" von Umlauten auch bei den Readings übernehmen? Dann passiert sowas nicht:
Baden-Wurttemberg_name Baden-W�rttemberg

das passiert mit diesem Teil des readingList:
multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_name'), property('attributes.LAN_ew_GEN'));

Danke für deine Arbeit. Was hälst du davon die deutschen Zahlen von pro 100k auf pro 1 Mio umzurechnen?

Andy89

Zitat von: somansch am 26 März 2020, 16:00:18
Danke für deine Arbeit. Was hälst du davon die deutschen Zahlen von pro 100k auf pro 1 Mio umzurechnen?
ging ja nur so gut, weil du super Vorarbeit geleistet hast  :)

das würde ich genau wie die Berechnungen mit den Vortageszahlen eher in nem Script auslagern. Ich will nicht 3 Userreadings pro Bundesland anlegen. Oder geht das einfacher? Aber ja, ist auf jeden Fall sinnvoll
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

Andy89

#10
so ich hab mal eben was versucht zu programmieren. Im Anhang ist eine utils. In den ersten Zeilen kann man die Länder, Bundesländer und die entsprechenden Devices dafür anpassen.
In den Methoden dadrunter sollte man auf jeden Fall mal die Readings kontrollieren, ob die richtig sind. Diese sind natürlich auf meine Readings ausgelegt. aber ich hoffe, dass eindeutig ist, was wofür ist.

Zusätzlich habe ich mein DOIF angepasst:
defmod di_coronaStats DOIF ([23:52])(setreading coronaSpreadWorld world_deaths_yesterday [coronaSpreadWorld:world_deaths])\
(setreading coronaSpreadWorld world_cases_yesterday [coronaSpreadWorld:world_cases])\
(setreading coronaSpreadWorld world_recovered_yesterday [coronaSpreadWorld:world_recovered])\
({createStatesYesterdayValues()})\
({createCountriesYesterdayValues()})\
\
DOELSEIF ([coronaSpreadDe:Nordrhein-Westfalen_cases])({calcStatesDiffBetweenYesterdayAndToday()})\
DOELSEIF ([coronaSpread:DEU_todayDeaths])({calcCountriesDiffBetweenYesterdayAndToday()})
attr di_coronaStats do always
attr di_coronaStats room Corona
attr di_coronaStats wait 0:30:30


um 23:52 werden jeden Tag die "Gestern" Werte für Welt, Bundesländer und Länder Daten erstellt.

Sobald "coronaSpreadDe:Nordrhein-Westfalen_cases" ein Event auslöst (bei Änderung oder Update) werden 30 Sekunden später die "Tageswerte" berechnet. Die Tageswerte sind in dem Fall ja Vortageswerte, so muss aber am Template nichts verändert werden. => das passiert nur einmal am Tag gegen 0:03 (bei mir)

Das gleiche passiert auch bei einem Update von "coronaSpread:Germany_todayDeaths" => dies passiert natürlich häufiger am Tag

Vielleicht nutzt es jemanden.

Beste Grüße und bleibt Gesund,
Andy

p.s.: ich bin mir noch nicht ganz sicher, ob das DOIF alles korrekt erledigt. Beim manuellen Ausführen der Befehel aus der utils wurden bei mir keine Fehler geworfen und die Werte für Yesterday/Today und Cases per Million wurden sauber erstellt.


Edit: ich habe das DOIF angepasst. Es gibt kein "Germany_todayDeaths" mehr, dafür aber "DEU_todayDeaths"
Edit2: man sieht im Anhang "schön", dass die neuen Zahlen tatsächlich funktioniert haben und so die Anzeige voller, als vorher ist
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

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

yersinia

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

jnewton957

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

Gisbert

Hallo zusammen,

ich lade Daten für die mich interessierenden Land- bzw. Stadtkreise runter. Es werden die Gesamtzahl an Infizierten angezeigt, die ja kontinuierlich zunimmt.
Gibt es auch die Möglichkeit sich die Anzahl der täglich neu Infizierten downzuloaden, bzw. notfalls sich selbst zu errechnen?

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