Anwendungsbeispiel JsonMod #2: CORONA Verbreitung

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

Vorheriges Thema - Nächstes Thema

herrmannj

Ab heute ist 98_JsonMod.pm verfügber. Das Modul lädt und verarbeitet JSON files zu Readings.
https://forum.fhem.de/index.php/topic,109398.0.html

Um die Verwendung zu beschreiben und nachvollziehbar zu gestalten liefere ich Anwendungsbeispiele.

Aktuell ist die Verbreitung des CORONA Virus alles bestimmend. Mit JsonMod lässt sich schnell ein FHEM Device erstellen um Daten zur Verbreitung des Virus anzuzeigen, auszuwerten und zu loggen.

Erster Schritt ist die Auswahl einer geeigneten Quelle. Es gibt einige, ich habe mich für https://corona.lmao.ninja/countries entschieden. Das genaue Format der JSON Datei hat sich in den vergangenen Tage einige Male geändert, aber der Trick an JsonMod ist hier das man das sehr schnell anpassen kann.

Im ersten Schritt wird ein Device erstellt:
define coronaSpread JsonMod https://corona.lmao.ninja/countries

Die Daten werden kontinuierlich aktualisiert. Ich wähle ein Aktualisierungsintervall von 15 Minuten.
attr coronaSpread interval */15 * * * *

Die Daten werden als Liste von Objekten geliefert. Ich möchte mich, der Übersicht halber, auf die Anzeige von 'cases', 'todayCases' und 'active' aus einer Liste von ausgewählten Ländern beschränken. Das Atrribut readingList wird daher wie folgt aufgebaut:

multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(...); erzeugt aus einer Liste eine variable Anzahl von Readings.
jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]") jsonPath(..) beschreibt via JSONPath Expression die Elemente in der JSON. Die JSONPath Anweisung verwendet den Listen Filter 'in' mit den Strings der gesuchten Länder. Strings müssen in ein einfaches Hochkomma gesetzt werden. Der Filter ist Teil der gesamten JSONPath Anweisung die ebenfalls in Hochkommas stehen muss. Daher muss die JSONPath Anweisung in doppelte Hochkommas gesetzt werden und '$' und '@' müssen maskiert werden. (Filter gehören zu den seltenen Fällen bei denen die JSONPath in doppelten Hochkommas angegeben werden muss. Wenn das nicht zutrifft kann man zwar beide Varianten verwenden. Um das escapen zu vermeiden nimmt man ohne Zwang daher immer das einfache Hochkomma.)
concat(property('country'), '_cases'), erstellt den Reading Namen. Hier wird an das Land der String '_cases' gehängt. Aus 'Germany' wird das Reading 'Germany_cases'.
property('cases')beschreibt den Inhalt des Readings. In diesem Fall also das Element 'cases' (per Country)

Auf die gleiche Art werden die beiden anderen Felder weiter ergänzt zu:

multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_todayCases'), property('todayCases'));
multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_active'), property('active'));


Auf diese Art lassen sich sowohl die Länder als auch die angezeigten Felder einfach anpassen.

Hier das komplette list inklusive der erzeugten Readings.
Internals:
   API_LAST_RES 1584907536.70367
   CFGFN     
   DEF        https://corona.lmao.ninja/countries
   FUUID      5e77c01a-f33f-a6e8-0786-252df26331a76472
   NAME       coronaSpread
   NEXT       2020-03-22 21:15:00
   NR         107
   NTFY_ORDER 50-coronaSpread
   SOURCE     https://corona.lmao.ninja/countries (200)
   STATE      ???
   TYPE       JsonMod
   CONFIG:
     IN_REQUEST 0
     SOURCE     https://corona.lmao.ninja/countries
     SECRET:
   READINGS:
     2020-03-22 21:05:36   France_active   13144
     2020-03-22 21:05:36   France_cases    16018
     2020-03-22 21:05:36   France_todayCases 1559
     2020-03-22 21:05:36   Germany_active  24492
     2020-03-22 21:05:36   Germany_cases   24852
     2020-03-22 21:05:36   Germany_todayCases 2488
     2020-03-22 21:05:36   Italy_active    46638
     2020-03-22 21:05:36   Italy_cases     59138
     2020-03-22 21:05:36   Italy_todayCases 5560
     2020-03-22 21:05:36   Spain_active    24722
     2020-03-22 21:05:36   Spain_cases     28603
     2020-03-22 21:05:36   Spain_todayCases 3107
     2020-03-22 21:05:36   USA_active      31764
     2020-03-22 21:05:36   USA_cases       32356
     2020-03-22 21:05:36   USA_todayCases  8149
Attributes:
   interval   */15 * * * *
   readingList multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_todayCases'), property('todayCases'));
multi(jsonPath("\$.[?(\@.country in ['Germany', 'Italy', 'Spain', 'France', 'USA'])]"), concat(property('country'), '_active'), property('active'));

sash.sc

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

Otto123

Hallo Jörg,

ich habe mal versucht das Beispiel "nachzukochen"
Ich habe update gemacht und mir die Datei 98_JsonMod.pm aus dem SVN geholt.

Ich scheitere dann sofort beim define:
2020.03.22 23:13:51 0: Unknown warnings category 'redundant' at ./FHEM/98_JsonMod.pm line 274.
BEGIN failed--compilation aborted at ./FHEM/98_JsonMod.pm line 274.

Fehlt was?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

herrmannj

Zitat von: Otto123 am 22 März 2020, 23:18:09
Hallo Jörg,

ich habe mal versucht das Beispiel "nachzukochen"
Ich habe update gemacht und mir die Datei 98_JsonMod.pm aus dem SVN geholt.

Ich scheitere dann sofort beim define:
2020.03.22 23:13:51 0: Unknown warnings category 'redundant' at ./FHEM/98_JsonMod.pm line 274.
BEGIN failed--compilation aborted at ./FHEM/98_JsonMod.pm line 274.

Fehlt was?

Gruß Otto
Ja, das richtige perl ;)
Kannst die Zeile problemlos auskommentieren.
Welches perl hast Du? (Ich lass mir was einfallen)

herrmannj

Zitat von: sash.sc am 22 März 2020, 23:03:35
Respekt !

Besteht die Möglichkeit von den folgenden URL´s die Daten abzugreifen, über das Modiul

https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_0/

https://gisanddata.maps.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6


Danke für deine Arbeit !

Gruß
Sascha
Die beiden links liefern bei mir keine Daten, was soll das sein?

sash.sc

Ein dashboard für die Übersicht mit dem ganzen Corona Kram.

Aber ich denke, da muss ich dann mit httpmod dran.

Gesendet von meinem MI 9 mit Tapatalk

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

herrmannj

Zitat von: Otto123 am 22 März 2020, 23:18:09
Hallo Jörg,

ich habe mal versucht das Beispiel "nachzukochen"
Ich habe update gemacht und mir die Datei 98_JsonMod.pm aus dem SVN geholt.

Ich scheitere dann sofort beim define:
2020.03.22 23:13:51 0: Unknown warnings category 'redundant' at ./FHEM/98_JsonMod.pm line 274.
BEGIN failed--compilation aborted at ./FHEM/98_JsonMod.pm line 274.

Fehlt was?

Gruß Otto
Der Fehler sollte nur perl 5.18 und 5.20 betreffen. Ich habe ein update eingecheckt und würde mich über die Bestätigung freuen.

somansch

Hallo Herrmann,

erstmal vielen Dank für das Modul und dein Beispiel. Ich konnte es erfolgreich umsetzen und möchte Statistics erzeugen. Leider ohne Erfolg: "monitoredDevicesUnsupported". Hier meine Definition:
defmod coronaSpread_statistic statistics coronaSpread
attr coronaSpread_statistic room 097_News

setstate coronaSpread_statistic Waiting for notifications
setstate coronaSpread_statistic 2020-03-23 09:11:51 monitoredDevicesUnsupported coronaSpread#JsonMod
setstate coronaSpread_statistic 2020-03-23 09:11:51 nextPeriodChangeCalc 2020-03-23 09:59:55


Ich vermute, dass da etwas im Modul fehlt, oder?

Danke und Gruß
Andreas

Otto123

Hallo Jörg,

mein versuch gestern mit Fehlermeldung war 5.20.2 
Mein Versuch gerade mit 5.28.1 funktioniert das define ohne Fehler. (Vorher normales Update)
Nach dem Update (direkt SVN) gerade eben funktioniert es auch unter 5.20.2 - ok sehe gerade Du hattest das Update ja gestern Abend gemacht. :)

Liebe Grüße
Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

herrmannj

#9
Zitat von: Otto123 am 23 März 2020, 10:07:25
Hallo Jörg,

mein versuch gestern mit Fehlermeldung war 5.20.2 
Mein Versuch gerade mit 5.28.1 funktioniert das define ohne Fehler. (Vorher normales Update)
Nach dem Update (direkt SVN) gerade eben funktioniert es auch unter 5.20.2 - ok sehe gerade Du hattest das Update ja gestern Abend gemacht. :)

Liebe Grüße
Otto
perfekt passt. das es an einem 5.20 liegen muss habe ich mir gedacht. Fix dafür (5.18 und 5.20) ist eingebaut und von Dir getestet. Danke!

herrmannj

#10
Zitat von: somansch am 23 März 2020, 09:20:45
Hallo Herrmann,

erstmal vielen Dank für das Modul und dein Beispiel. Ich konnte es erfolgreich umsetzen und möchte Statistics erzeugen. Leider ohne Erfolg: "monitoredDevicesUnsupported". Hier meine Definition:
defmod coronaSpread_statistic statistics coronaSpread
attr coronaSpread_statistic room 097_News

setstate coronaSpread_statistic Waiting for notifications
setstate coronaSpread_statistic 2020-03-23 09:11:51 monitoredDevicesUnsupported coronaSpread#JsonMod
setstate coronaSpread_statistic 2020-03-23 09:11:51 nextPeriodChangeCalc 2020-03-23 09:59:55


Ich vermute, dass da etwas im Modul fehlt, oder?

Danke und Gruß
Andreas
Moin,

das liegt dann an 'statistic', da kann ich leider nichts zu sagen. Nach wirklich ganz schnellem check in der source von statistic würde ich vermuten dass der Fehler von statistic geworfen wird weil state in diesem Beispiel nicht gesetzt ist.

Das ist ok (works as designed). Sinn des Modules ist ja dass das eine user action ist. Du kannst also testweise stateFormat mit einem reading besetzen.

Aber ich frage mich ob hier statistic on top überhaupt sinnvoll eingesetzt ist? Der JSON in diesem Beispiel liefert das doch hier sowieso schon. (?)

Im Zweifel kannst Du aber "bei statiistic" (siehe maintainer) nachfragen und mir den link zum thread schicken. Wenn ich dafür bei mir was einbauen muss kann ich das gern machen.

JoWiemann

Zitat von: herrmannj am 23 März 2020, 10:34:47
Moin,

Das ist ok (works as designed). Sinn des Modules ist ja dass das eine user action ist. Du kannst also testweise stateFormat mit einem reading besetzen.


stateFormat beeinflusst STATE und nicht state. state wird mit dem Attribut setState beeinflusst.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

herrmannj

Hast Recht!

Ändert aber nichts an meiner Vermutung dass statistic den Fehler wirft weil es kein state reading findet. Das muss verifiziert werden. Wenn ja dann muss man (jeder für sich) überlegen "was" in diesem Beispiel der "state" ist und dann kann man den aktivieren. Wenn man statistic möchte.

somansch

Zitat von: herrmannj am 23 März 2020, 10:34:47
Aber ich frage mich ob hier statistic on top überhaupt sinnvoll eingesetzt ist? Der JSON in diesem Beispiel liefert das doch hier sowieso schon. (?)

Ich habe die jetzigen Readings in mein FTUI eingebaut. Die Statistics sind sinnvoll, um einen Trend der täglichen Veränderung darzustellen (wie im Beispiel Temperaturtrend - siehe Anhang). Darum geht es ja letzendlich, wenn man bewerten möchte, in welchen Ländern es hoffentlich bald bergauf geht.

herrmannj

Auch wenn der Anlass mehr als unerfreulich ist, die Umsetzung gefällt mir bei Dir sehr.

Sollte sich die Theorie bestätigen dass der fehlende state das statistics verwirrt: mittelfristig wollte ich ohnehin Aggregatfunktionen einbauen. Dann könnte man etwas in der Art sum() dafür nehmen um. Alle Länder addiert, hier dann Weltweit. Aber Corona ist eben auch _nur ein_ Anwendungsfall für das modul und Corona ist hoffentlich schnell obsolet.

Die 'normale' Anwendung sind Webdienste wie Wetter, Umwelt, Ölpreis, Spritpreis, IOT Device mit Json Interface. Alles was Json kann und mal fix rein in FHEM soll.