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'));
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
(https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_0/%3Cbr%20/%3E%3Cbr%20/%3Ehttps://gisanddata.maps.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6)
Danke für deine Arbeit !
Gruß
Sascha
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
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)
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
(https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4/page/page_0/%3Cbr%20/%3E%3Cbr%20/%3Ehttps://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?
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
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.
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
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
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!
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.
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
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.
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.
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.
Zitatdefmod 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
Was - ungeachtet des state-readings - auf jeden Fall fehlt, sind die Attribute.
Zitat
deltaReadings <Gerätewerte>
Durch Kommas getrennte Liste von weiteren Gerätewerten, für welche die Differenz zwischen den Werten am Anfang und Ende einer Periode (Stunde/Tag/Monat/Jahr) bestimmt wird.
durationReadings <Gerätewerte>
Durch Kommas getrennte Liste von weiteren Gerätewerten, für welche die Dauer einzelner Gerätewerte innerhalb bestimmte Zeiträume (Stunde/Tag/Monat/Jahr) erfasst wird.
minAvgMaxReadings <Gerätewerte>
Durch Kommas getrennte Liste von Gerätewerten, für die in bestimmten Zeiträumen (Tag, Monat, Jahr) Minimum, Mittelwert und Maximum erfasst werden.
tendencyReadings <Gerätewerte>
Durch Kommas getrennte Liste von weiteren Gerätewerten, für die innerhalb bestimmter Zeiträume (1h, 2h, 3h, 6h) die Differenz zwischen Anfangs- und Endwert ermittelt wird.
statistics kennt grundsätzlich einige readings-Namen (zB temperature, humidity etc.), aber kann halt mit den Readings deines Devices nichts anfangen.
Wenn du dem Modul mit den obigen Attributen ein wenig auf die Sprünge hilfst und sagst, WAS du genau auswerten willst, sollte es aber auf jeden Fall klappen.
lg, Stefan
@somansch: Würdest Du deien FTUI Code zur Verfügung stellen? Die Darstellungsweise gefällt mir und würde diese gerne übernehmen. Danke.
anbei meine Lösung für das FTUI
<table border="0" width="95%">
<tr>
<th>Land</th>
<th>Gesamt</th>
<th>best. Infektionen<br></th>
<th>Neuinfektionen</th>
<th>geheilte</th>
<th>✝</th>
<th>heute ✝<br></th>
</tr>
<tr>
<td>DEUTSCHLAND</td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_cases" data-decimals ="0"
data-digits ="8" data-color-fg="orange" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_active" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_todayCases" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_recovered" data-decimals ="0"
data-digits ="8" data-color-fg="green" class="normal"></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_deaths" data-decimals ="0"
data-digits ="6" data-color-fg="red" > </div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Germany_todayDeaths" data-decimals ="0"
data-digits ="4" data-color-fg="red" ></div></td>
</tr>
<tr>
<td>ITALIEN</td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_cases" data-decimals ="0"
data-digits ="8" data-color-fg="orange" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_active" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_todayCases" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_recovered" data-decimals ="0"
data-digits ="8" data-color-fg="green" class="normal"></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_deaths" data-decimals ="0"
data-digits ="6" data-color-fg="red" > </div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Italy_todayDeaths" data-decimals ="0"
data-digits ="4" data-color-fg="red" ></div></td>
</tr>
<tr>
<td>SPANIEN</td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_cases" data-decimals ="0"
data-digits ="8" data-color-fg="orange" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_active" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_todayCases" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_recovered" data-decimals ="0"
data-digits ="8" data-color-fg="green" class="normal"></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_deaths" data-decimals ="0"
data-digits ="6" data-color-fg="red" > </div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:Spain_todayDeaths" data-decimals ="0"
data-digits ="4" data-color-fg="red" ></div></td>
</tr>
<tr>
<td>FRANKREICH</td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_cases" data-decimals ="0"
data-digits ="8" data-color-fg="orange" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_active" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_todayCases" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_recovered" data-decimals ="0"
data-digits ="8" data-color-fg="green" class="normal"></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_deaths" data-decimals ="0"
data-digits ="6" data-color-fg="red" > </div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:France_todayDeaths" data-decimals ="0"
data-digits ="4" data-color-fg="red" ></div></td>
</tr>
<tr>
<td>USA</td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_cases" data-decimals ="0"
data-digits ="8" data-color-fg="orange" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_active" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_todayCases" data-decimals ="0"
data-digits ="8" data-color-fg="lightblue" ></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_recovered" data-decimals ="0"
data-digits ="8" data-color-fg="green" class="normal"></div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_deaths" data-decimals ="0"
data-digits ="6" data-color-fg="red" > </div></td>
<td><div data-type = "7segment" data-get-value = "coronaSpread:USA_todayDeaths" data-decimals ="0"
data-digits ="4" data-color-fg="red" ></div></td>
</tr>
</table>
</center>
Zitat von: herrmannj am 23 März 2020, 00:20:17
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.
Erstmal ein wenig aufräumen.
my sub jsonPathf {
eval 'no warnings qw( redundant missing )' if ($] >= 5.22); # Hmm... :-/
my $jsonPathExpression = shift;
my $format = shift // '%s';
my $value = $path->get($jsonPathExpression)->getResultValue();
$value = $value->[0] if (ref $value eq 'ARRAY' && @{$value});
return sprintf($format, $value) if (defined $value);
return;
}
Und dann sich überlegen warum die Warnings kommen. Offensichtlich ist irgendwas im sprintf kaputt.
Redundant argument in sprintf atkommt dann, wenn in $format nicht alle Werte verarbeitet werden. Wäre ich jetzt spontan dafür das Problem zu beheben, bevor man mit dem Morphium Pflaster "no warnings ..." an die Sache rangeht. Noch dazu im eval, noch dazu Perl version-bedingt. Technical Debt 9000.
Lobende Erwähnung fände zwar die Verwendung von defined-or, weil "alle anderen" machen || (und in 99% der Fälle falsch), aber ohne jetzt den Code ausgeführt zu haben:
Die einzigen Situationen wann der Sprintf bei perl 5.22+ besagte Warnung generieren kann, sind, wenn
a) $format ein leerer String ist. (weil man ihn bereits so übergeben hat und defined-or in diesem 1%-Fall doch ein || hätte sein sollen)
b) $value ... hmm ... mehr als ein Skalar ist.
Yepp. $format ist User property und der User macht das manchmal falsch. Deswegen machen wir, nett wie wir sind, die Warnung weg die im Log eher nicht wahrgenommen wird oder sogar verunsichert. Der User wiederum sieht direkt dass das Ergebnis (seines Formatstring) nicht den Erwartungen entspricht. :)
Das eval nehme ich weil es der einzige mir bekannte Weg für ein bedingtes use ist. Das geht vielleicht besser, aber mir ist kein Nachteil bewusst.
Nachtrag: nein. Die Warnung wird auch geworfen wenn das Format mehr und andere Parameter hat als value. Geht ganz fix
Zitat von: herrmannj am 24 März 2020, 19:37:10
Yepp. $format ist User property und der User macht das manchmal falsch. Deswegen machen wir, nett wie wir sind, die Warnung weg die im Log eher nicht wahrgenommen wird oder sogar verunsichert. Der User wiederum sieht direkt dass das Ergebnis (seines Formatstring) nicht den Erwartungen entspricht. :)
Kann natürlich sein, dass mir der Draht zu den Schneeflocken-Generationen X, Y. Z fehlt - aber Ist eine Warnung im Log nicht eher eine Hilfe wenn der User sieht, dass sein Formatstring irgendwie nicht tut?
Wenn es im Log "eher nicht wahrgenommen wird" - schont das nicht zusätzlich des Users Psyche?
Also gut, beheben wir die weiteren Probleme mit dem Code, bis Du zur Einsicht kommst. Bei mir:
say $];
5.030001
Ich habe 5.30.1
if ($] >= 5.22);
schlägt folglich bei mir nicht an, weil das ist Perl 5.220.0 - da dauert das noch eine Weile bis wir dort angekommen sind.
Mai 2105 dann irgendwann. ;)
Also if ($] >= 5.022) wennschon.
Unabhängig davon funktioniert auch
eval ' no warnings qw( redundant missing ) ' if ($] >= 5.022);
bei mir nicht. Die Warnung kommt trotzdem.
Zitat
Nachtrag: nein. Die Warnung wird auch geworfen wenn das Format mehr und andere Parameter hat als value. Geht ganz fix
Jo mei, Sollen doch die Leute wissen, dass sie FHEM Müll vorwerfen, dann wird auch schneller gefixt.
Aber zurück zum Thema:
Zitat
Das eval nehme ich weil es der einzige mir bekannte Weg für ein bedingtes use ist. Das geht vielleicht besser, aber mir ist kein Nachteil bewusst.
Schon mal mit
no if ($] >= 5.022), 'warnings' => 'redundant';
probiert? Zumindest startet man dann nicht zur Laufzeit eine Instanz der Perl Interpreters zur Evaluierung des String evals. Das soll der Performance zugute kommen - habe ich gehört.
Zitat von: RichardCZ am 24 März 2020, 20:10:12
Kann natürlich sein, dass mir der Draht zu den Schneeflocken-Generationen X, Y. Z fehlt
Zu dieser, allen vergangenen und einer vermutlich nicht unerheblichen Anzahl zukünftiger :D :D :D
Zitat
Jo mei, Sollen doch die Leute wissen, dass sie FHEM Müll vorwerfen, dann wird auch schneller gefixt.
No! Hier gibt es genau zwei Möglichkeiten: der user füttert das Attribut mit "Müll" (wie Du es nennst) und es funktioniert nicht. Dann sucht der user Hilfe hier im forum und/oder fixt es. Oder es funktioniert (trotz Warnung weil eine Warnung ist kein Fehler ;) ) dann können wir uns die Warnung schenken, was wir auch tun.
Aber wenn, dem stimme ich zu, dann richtig. Habe Deine Anregung abgewandelt übernommen. Danke.
@Otto: wenn es nach dem nächsten Update nicht mehr funktioniert dann wende Dich an Richard (nur Spaß)
Zitat98_JsonMod.pm 21502 2020-03-24 20:02:32Z herrmannj
:)
Jörg, Dich kenne ich persönlich, Du bist ein netter Typ, der Richard ist mir momentan etwas forsch - ich wende mich erstmal weiter an Dich ;)
Ich bekomme jetzt:
ZitatAPI__LAST_MSG invalid server response
???
Das Internal gab es mit SVN 21497 2020-03-23 20:44:04 nicht? Habe extra nochmal zurück gespult :)
vielen Dank, (& ich habe soweit möglich vor dem einchecken getestet ;) )
Das mit der Server response ist mir heute auch bei einem anderen user aufgefallen. Doch das gab es schon. Weil die Daten ja offensichtlich ankommen ist es es unkritisch. Ich schau mal was da los ist. Danke.
Also ich sehe es nicht, auch nicht nach dem automatischen Lauf? Oder tritt das erst bei Fehler auf?
Internals:
API_LAST_RES 1585084500.89939
DEF https://corona.lmao.ninja/countries
FUUID 5e787b9f-f33f-27f7-a449-3b78ef2b5532dfa8
NAME coronaSpread
NEXT 2020-03-24 22:30:00
NR 180
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
STATE ???
SVN 21497 2020-03-23 20:44:04
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
READINGS:
2020-03-24 22:15:03 France_active 17923
2020-03-24 22:15:03 France_cases 22304
2020-03-24 22:15:03 France_todayCases 2448
2020-03-24 22:15:03 Germany_active 29586
2020-03-24 22:15:03 Germany_cases 32986
2020-03-24 22:15:03 Germany_todayCases 3930
2020-03-24 22:15:03 Italy_active 54030
2020-03-24 22:15:03 Italy_cases 69176
2020-03-24 22:15:03 Italy_todayCases 5249
2020-03-24 22:15:03 Spain_active 33283
2020-03-24 22:15:03 Spain_cases 39885
2020-03-24 22:15:03 Spain_todayCases 4749
2020-03-24 22:15:03 USA_active 51867
2020-03-24 22:15:03 USA_cases 52921
2020-03-24 22:15:03 USA_todayCases 9187
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'));
room Corona
fix ist oben (Revision 21503). Ja das Internal wurde erst bei ersten Fehler angelegt und dann (falsch) bei Erfolg nicht wieder zurückgesetzt. Jetzt steht da der http code (200) oder eben ein Fehler wenn der remote Server was falsch macht. Dies ist glücklicherweise gerade bei checkmx so:
API__LAST_MSG read from https://api.checkwx.com:443 timed out
DEF https://api.checkwx.com/metar/EDDH/decoded
während die anderen laufen
API__LAST_MSG 200
DEF https://app.hydrawise.com/api/v1/statusschedule.php?api_key=[KEY]
Frage am Rande SVN Zeit ist UTC?
Zitat98_JsonMod.pm 21503 2020-03-24 21:21:00Z herrmannj
Weisst Du was ich irgendwie "ungünstig" finde? Das Modul läuft nicht sofort erstmal los. Man muss immer bist zum nächsten zyklischen Start warten. reread oder so was wäre für solche "hektischen" Dialoge wie jetzt doch gut :)
Also Du musst noch 7 min auf das Update warten. Ich aktualisiere hier :)
ja, SVN ist UTC, Ich kürz das 'Z' charmant weg, die Rev ist ja eindeutig.
reread ist evtl ne gute Idee. Der läuft aber auch nach einem restart direkt einmal los. Zum testen drück ich immer kurz im Editor auf "def" dann "modify.." was für das modul ja ein Neustart ist...
edit: ne 'Z' ist dran. 'ZULU' ... :)
Komisch: ich SVN Update gemacht, kein kompletter Neustart nur reload 98_JsonMod.pm
Warum werden die Infos nicht aktualisiert? Version zeigt er 21503
Internals:
API_LAST_RES 1585086300.84121
API__LAST_MSG 200
DEF https://corona.lmao.ninja/countries
FUUID 5e787b9f-f33f-27f7-a449-3b78ef2b5532dfa8
NAME coronaSpread
NEXT 2020-03-24 23:00:00
NR 180
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
STATE ???
SVN 21497 2020-03-23 20:44:04
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
READINGS:
2020-03-24 22:45:03 France_active 17923
2020-03-24 22:45:03 France_cases 22304
2020-03-24 22:45:03 France_todayCases 2448
2020-03-24 22:45:03 Germany_active 29586
2020-03-24 22:45:03 Germany_cases 32986
2020-03-24 22:45:03 Germany_todayCases 3930
2020-03-24 22:45:03 Italy_active 54030
2020-03-24 22:45:03 Italy_cases 69176
2020-03-24 22:45:03 Italy_todayCases 5249
2020-03-24 22:45:03 Spain_active 33283
2020-03-24 22:45:03 Spain_cases 39885
2020-03-24 22:45:03 Spain_todayCases 4749
2020-03-24 22:45:03 USA_active 51928
2020-03-24 22:45:03 USA_cases 52983
2020-03-24 22:45:03 USA_todayCases 9249
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'));
room Corona
ZitatZulu Time Zone gilt in der Schiff- und Luftfahrt sowie im Militär als alternativer Name für UTC +0.
FHEM SVN ist höchster Standard sozusagen 👍
Zitat von: bjoernbo am 24 März 2020, 07:42:18
@somansch: Würdest Du deien FTUI Code zur Verfügung stellen? Die Darstellungsweise gefällt mir und würde diese gerne übernehmen. Danke.
@bjoernbo,
habe meine Konfig im FTUI Forum gepostet:https://forum.fhem.de/index.php/topic,109490.0.html (https://forum.fhem.de/index.php/topic,109490.0.html)
der ts passt zu den readings (22:45). Allerdings stimmt die angezeigte svn (21497) nicht mit dem Verhalten überein (API__LAST_MSG 200). Wenn möglich mach doch einen Neustart. Ansonsten passt ja alles, sprich die LAST_MSG mit 200. Oder übersehe ich was?
Zitat von: Icinger am 24 März 2020, 04:47:02
Was - ungeachtet des state-readings - auf jeden Fall fehlt, sind die Attribute.
statistics kennt grundsätzlich einige readings-Namen (zB temperature, humidity etc.), aber kann halt mit den Readings deines Devices nichts anfangen.
Wenn du dem Modul mit den obigen Attributen ein wenig auf die Sprünge hilfst und sagst, WAS du genau auswerten willst, sollte es aber auf jeden Fall klappen.
lg, Stefan
@Icinger,
danke für deinen Tip. Manchmal muss man nur genauer die Hilfe lesen ;) (RTFM)
Zitat von: Otto123 am 24 März 2020, 22:38:55
Frage am Rande SVN Zeit ist UTC?
die zeitzone könnt ihr umstellen.
https://forum.fhem.de/index.php/topic,84181.msg764572.html#msg764572 (https://forum.fhem.de/index.php/topic,84181.msg764572.html#msg764572)
Danke. Das gilt aber nur im Trac. Ich zeige die Revision als Internals des Device. Wenn jemand einen list postet weil was nicht funktioniert sehe ich dadurch welche Version (des Moduls). Das ist dann eben Zulu. Könnte man auf lokale Zeit anpassen, aber nun .. glaube das passt so auch.
SVN 21503 2020-03-24 21:21:00
Jetzt sehe ich auch gerade das ich das Z doch wegkürze. Mir war doch so :) Na - dann hänge ich das mal wieder dran damit Ordnung herrscht. :)
Edit:
SVN 21504 2020-03-24 22:27:59 UTC
Nach einem boot ...
Internals:
API_LAST_RES 1585088100.76317
API__LAST_MSG 200
DEF https://corona.lmao.ninja/countries
FUUID 5e787b9f-f33f-27f7-a449-3b78ef2b5532dfa8
NAME coronaSpread
NEXT 2020-03-24 23:30:00
NR 180
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
STATE ???
SVN 21503 2020-03-24 21:21:00
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
READINGS:
2020-03-24 23:15:02 France_active 17923
2020-03-24 23:15:02 France_cases 22304
2020-03-24 23:15:02 France_todayCases 2448
2020-03-24 23:15:02 Germany_active 29586
2020-03-24 23:15:02 Germany_cases 32986
2020-03-24 23:15:02 Germany_todayCases 3930
2020-03-24 23:15:02 Italy_active 54030
2020-03-24 23:15:02 Italy_cases 69176
2020-03-24 23:15:02 Italy_todayCases 5249
2020-03-24 23:15:02 Spain_active 33283
2020-03-24 23:15:02 Spain_cases 39885
2020-03-24 23:15:02 Spain_todayCases 4749
2020-03-24 23:15:02 USA_active 51941
2020-03-24 23:15:02 USA_cases 52996
2020-03-24 23:15:02 USA_todayCases 9262
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'));
room Corona
Sieht gut aus. Also ... bis auf UTC -> rev 21504 :) 8)
Hallo Hermann,
danke für das klasse Modul. Ich habe mir damit sofort eine eigene Tabelle eingerichtet,
mir ist aber aufgefallen, das angelegte eigene readings mit jedem Lauf wieder gelöscht werden. Ich wollte mir eingene readings anlegen, wo ich mir die 'neuen' Coronafälle für gestern und vorgestern in einem Reading merke.
Aber es wird alles gelöscht und wieder neu angelegt.
Kann man evtl auch nur die vom Modul erzeugten Readings neu anlegen?
Danke, und bleib gesund!
Hallo,
weil ich das Thema gerade auch sehr stark verfolge, wollte ich mir die Anzahl nach Bundesländern anzeigen lassen.
Die Adresse zum Erstellen von JSON-Urls gibt es auf der RKI Seitehttps://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/ef4b445a53c1406892257fe63129a8ea_0/geoservice?geometry=-23.183%2C46.270%2C39.439%2C55.886&selectedAttribute=Aktualisierung
Ich hab die Geometrie und alles "unwichtige" weggelassen.
Leider bekomme ich es nicht hin, aus dem JSON die Daten zu extrahieren. Was mache ich falsch?
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 interval */1 * * * *
attr coronaSpreadDe readingList multi(jsonPath("$.[?(\@.LAN_ew_GEN in ['Hamburg','Bremen'])]"), concat(property('LAN_ew_GEN'), '_Death'), property('Death'));;
verbose 5 hilft mir in dem Fall leider nicht weiter.
Beste Grüße
Andy
Zitat von: Jamo am 25 März 2020, 11:39:11
Hallo Hermann,
danke für das klasse Modul. Ich habe mir damit sofort eine eigene Tabelle eingerichtet,
mir ist aber aufgefallen, das angelegte eigene readings mit jedem Lauf wieder gelöscht werden. Ich wollte mir eingene readings anlegen, wo ich mir die 'neuen' Coronafälle für gestern und vorgestern in einem Reading merke.
Aber es wird alles gelöscht und wieder neu angelegt.
Kann man evtl auch nur die vom Modul erzeugten Readings neu anlegen?
Danke, und bleib gesund!
Moin Jamo,
hmm, ok ich verstehe. Eigentlich ja, die Herausforderung ist da shutdown/restart. Stell mal bitte ein komplettes List ein
vg, &bleib auch gesund!
Zitat von: Andy89 am 25 März 2020, 11:49:14
Hallo,
weil ich das Thema gerade auch sehr stark verfolge, wollte ich mir die Anzahl nach Bundesländern anzeigen lassen.
Die Adresse zum Erstellen von JSON-Urls gibt es auf der RKI Seitehttps://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/ef4b445a53c1406892257fe63129a8ea_0/geoservice?geometry=-23.183%2C46.270%2C39.439%2C55.886&selectedAttribute=Aktualisierung
Ich hab die Geometrie und alles "unwichtige" weggelassen.
Leider bekomme ich es nicht hin, aus dem JSON die Daten zu extrahieren. Was mache ich falsch?
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 interval */1 * * * *
attr coronaSpreadDe readingList multi(jsonPath("$.[?(\@.LAN_ew_GEN in ['Hamburg','Bremen'])]"), concat(property('LAN_ew_GEN'), '_Death'), property('Death'));;
verbose 5 hilft mir in dem Fall leider nicht weiter.
Beste Grüße
Andy
Offensichtlich ein Nachbar: Moin!
so wie das List unten sollte das aussehen, ich befürchte aber Du hast einen Bug gefunden. Das muss ich mir heute Abend in Ruhe anschauen. Als Tip: querys testen geht dort sehr gut: https://jsonpath.herokuapp.com/
Internals:
API_LAST_RES 1585136426.14901
API__LAST_MSG 200
CFGFN
DEF 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
FUUID 5e7b4174-f33f-a6e8-dea1-1ac51dcf4db92252
NAME rki
NEXT 2020-03-25 13:00:00
NR 82
NTFY_ORDER 50-rki
SOURCE 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 (200)
STATE ???
SVN 21504 2020-03-24 22:27:59 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE 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
SECRET:
READINGS:
2020-03-25 12:40:26
Attributes:
readingList multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hamburg'])]"), property('attributes.LAN_ew_GEN'), property('attributes.Fallzahl'));
Zitat von: herrmannj am 25 März 2020, 12:48:16
Offensichtlich ein Nachbar: Moin!
so wie das List unten sollte das aussehen, ich befürchte aber Du hast einen Bug gefunden. Das muss ich mir heute Abend in Ruhe anschauen. Als Tip: querys testen geht dort sehr gut: https://jsonpath.herokuapp.com/
Moin,
tatsächlich komme ich aus Bonn ;) Aber weil ich dachte, dass es wegen der Bindestriche in den Bundesländern nicht geht, habe ich mir zwei Einfache rausgesucht.
Ich habe gefühlt 30 verschiedene Dinge ausprobiert, wie das Query Aussehen könnte, bin aber leider immer wieder gescheitert. Vielleich lag es ja am Bug.
Danke für Anschauen. Hat keine Eile ;)
Aus Bonn ? Ne dann mach ich das nicht ;D
Doch, bin ja daran interessiert das es läuft. Ich komme aber erst heute Abend dazu. Wie schnell das fixen gelingt hängt dann vom Aufwand ab.
Zitat von: herrmannj am 25 März 2020, 13:39:35
Doch, bin ja daran interessiert das es läuft. Ich komme aber erst heute
Abend dazu. Wie schnell das fixen gelingt hängt dann vom Aufwand ab.
ich hab diesmal wieder was anderes versucht, aber auch daran scheitere ich. Ich habe zum Testen "recovered" und "cases" mal weggelassen.
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval */1 * * * *
attr coronaSpreadWorld readingList single(jsonPathf('$.deaths', '%s'), 'world_deaths', 'N/A');;
ich habe auch die von "https://jsonpath.herokuapp.com/" vorgeschlagene normalisierte Pfad Angabe versucht:
"$['deaths']"
leider auch ohne Erfolg.
auch das ging nicht:
single(jsonPath('$.deaths'), 'world_deaths', 'N/A');
Ist das derselbe Bug wie schon vorhin? Oder mache ich hier noch einen anderen Fehler?
Beste Grüße
Andy
Hallo Andy,
ich würde mich nicht wundern, wenn Dir einer das Internet löscht ;)
"Oder mache ich hier noch einen anderen Fehler?" - JA -> */1
Die Daten dort ändern sich irgendwie am Nachmittag 2 mal die Stunde, ansonsten kaum. 1 min Abfrage zyklus. :o :o :o
Gruß Otto
Jedes Mal, wenn ich die readinglist ändere, möchte ich nicht bis zur nächsten 10er Minute warten. oder werden die Daten automatisch direkt einmalig geladen, sobald man etwas an der readinglist ändert?
Dass das Schwachsinn ist, minütlich abzurufen, weiß ich selbst bei den RKI Daten.
Die globalen Daten werden tatsächlich recht häufig aktualisiert ;) da sind 10 Minuten sinnvoll.
aber auch wenn es bei einer Minute bliebe, ist es ein kleines JSON, was abgerufen wird, und nicht irgendwelche videos.
Gesendet von iPhone mit Tapatalk
Feature Request hat Jörg schon und er hat auch einen momentaner Workaround https://forum.fhem.de/index.php/topic,109413.msg1034742.html#msg1034742
Corona ist auch nur ein kleiner Virus - die Menge machts ;) - ok es wären selbst bei allen FHEM Usern nur 300 Anfragen pro sek. 8)
Zitat von: Otto123 am 25 März 2020, 19:38:29
Feature Request hat Jörg schon und er hat auch einen momentaner Workaround https://forum.fhem.de/index.php/topic,109413.msg1034742.html#msg1034742
Corona ist auch nur ein kleiner Virus - die Menge machts ;) - ok es wären selbst bei allen FHEM Usern nur 300 Anfragen pro sek. 8)
danke dafür - ich habe das tatsächlich nicht gelesen/überlesen. Dann kann ich nun die Zeit locker hoch setzen. :)
du hast Recht - die Menge machts. Ich hab ja nun einen besseren Weg, wo ich nicht mal bis zur nächsten vollen Minute warten muss.
Beste Grüße
Andy
Hallo Hermann,
ZitatMoin Jamo,
hmm, ok ich verstehe. Eigentlich ja, die Herausforderung ist da shutdown/restart. Stell mal bitte ein komplettes List ein
vg, &bleib auch gesund!
Das hat mit dem Shutdown/restart aber nichts zu tun. Anbei zwei listings, einmal um 19:44 mit den entsprechenden readings "_yesterday", und dann um 20:00 nach dem nächsten automatischen Update. Alle "_yesterday" readings sind verschwunden.
Internals:
API_LAST_RES 1585161000.79775
API__LAST_MSG invalid server response
API__NEXT_REQ 1585115160.71333
CFGFN
DEF https://corona.lmao.ninja/countries
FUUID 5e7a69e2-f33f-97bf-7b72-3a12da173d23c379
NAME coronaSpread
NEXT 2020-03-25 20:00:00
NR 38498
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
SVN 21497 2020-03-23 20:44:04
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
OLDREADINGS:
READINGS:
2020-03-25 19:30:00 Austria_active 5549
2020-03-25 19:30:00 Austria_cases 5588
2020-03-25 19:44:31 Austria_casesnewyesterday 305
2020-03-25 19:30:00 Austria_casestoday 305
2020-03-25 19:44:31 Austria_casesyesterday 5588
2020-03-25 19:30:00 Austria_cpm 620
2020-03-25 19:30:00 Austria_critical 28
2020-03-25 19:30:00 Austria_deaths 30
2020-03-25 19:30:00 Austria_deathstoday 2
2020-03-25 19:44:31 Austria_deathsyesterday 2
2020-03-25 19:30:00 Austria_recovered 9
2020-03-25 19:30:00 France_active 20002
2020-03-25 19:30:00 France_cases 25233
2020-03-25 19:44:31 France_casesnewyesterday 2929
2020-03-25 19:30:00 France_casestoday 2929
2020-03-25 19:44:31 France_casesyesterday 25233
2020-03-25 19:30:00 France_cpm 387
2020-03-25 19:30:00 France_critical 2827
2020-03-25 19:30:00 France_deaths 1331
2020-03-25 19:30:00 France_deathstoday 231
2020-03-25 19:44:31 France_deathsyesterday 231
2020-03-25 19:30:00 France_recovered 3900
2020-03-25 19:30:00 Germany_active 33346
2020-03-25 19:30:00 Germany_cases 37098
2020-03-25 19:44:31 Germany_casesnewyesterday 4107
2020-03-25 19:30:00 Germany_casestoday 4107
2020-03-25 19:44:31 Germany_casesyesterday 37098
2020-03-25 19:30:00 Germany_cpm 443
2020-03-25 19:30:00 Germany_critical 23
2020-03-25 19:30:00 Germany_deaths 205
2020-03-25 19:30:00 Germany_deathstoday 46
2020-03-25 19:44:31 Germany_deathsyesterday 46
2020-03-25 19:30:00 Germany_recovered 3547
2020-03-25 19:30:00 Israel_active 2107
2020-03-25 19:30:00 Israel_cases 2170
2020-03-25 19:44:31 Israel_casesnewyesterday 240
2020-03-25 19:30:00 Israel_casestoday 240
2020-03-25 19:44:31 Israel_casesyesterday 2170
2020-03-25 19:30:00 Israel_cpm 251
2020-03-25 19:30:00 Israel_critical 37
2020-03-25 19:30:00 Israel_deaths 5
2020-03-25 19:30:00 Israel_deathstoday 2
2020-03-25 19:44:31 Israel_deathsyesterday 2
2020-03-25 19:30:00 Israel_recovered 58
2020-03-25 19:30:00 Italy_active 57521
2020-03-25 19:30:00 Italy_cases 74386
2020-03-25 19:44:31 Italy_casesnewyesterday 5210
2020-03-25 19:30:00 Italy_casestoday 5210
2020-03-25 19:44:31 Italy_casesyesterday 74386
2020-03-25 19:30:00 Italy_cpm 1230
2020-03-25 19:30:00 Italy_critical 3489
2020-03-25 19:30:00 Italy_deaths 7503
2020-03-25 19:30:00 Italy_deathstoday 683
2020-03-25 19:44:31 Italy_deathsyesterday 683
2020-03-25 19:30:00 Italy_recovered 9362
2020-03-25 19:30:00 Spain_active 38809
2020-03-25 19:30:00 Spain_cases 47610
2020-03-25 19:44:31 Spain_casesnewyesterday 5552
2020-03-25 19:30:00 Spain_casestoday 5552
2020-03-25 19:44:31 Spain_casesyesterday 47610
2020-03-25 19:30:00 Spain_cpm 1018
2020-03-25 19:30:00 Spain_critical 2636
2020-03-25 19:30:00 Spain_deaths 3434
2020-03-25 19:30:00 Spain_deathstoday 443
2020-03-25 19:44:31 Spain_deathsyesterday 443
2020-03-25 19:30:00 Spain_recovered 5367
2020-03-25 19:30:00 UK_active 7694
2020-03-25 19:30:00 UK_cases 8264
2020-03-25 19:44:31 UK_casesnewyesterday 187
2020-03-25 19:30:00 UK_casestoday 187
2020-03-25 19:44:31 UK_casesyesterday 8264
2020-03-25 19:30:00 UK_cpm 122
2020-03-25 19:30:00 UK_critical 20
2020-03-25 19:30:00 UK_deaths 435
2020-03-25 19:30:00 UK_deathstoday 13
2020-03-25 19:44:31 UK_deathsyesterday 13
2020-03-25 19:30:00 UK_recovered 135
2020-03-25 19:30:00 USA_active 59853
2020-03-25 19:30:00 USA_cases 61081
2020-03-25 19:44:31 USA_casesnewyesterday 6225
2020-03-25 19:30:00 USA_casestoday 6225
2020-03-25 19:44:31 USA_casesyesterday 61081
2020-03-25 19:30:00 USA_cpm 185
2020-03-25 19:30:00 USA_critical 1307
2020-03-25 19:30:00 USA_deaths 841
2020-03-25 19:30:00 USA_deathstoday 61
2020-03-25 19:44:31 USA_deathsyesterday 61
2020-03-25 19:30:00 USA_recovered 387
Attributes:
interval */30 * * * *
readingList multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_casestoday'), property('todayCases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_active'), property('active'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_deaths'), property('deaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_deathstoday'), property('todayDeaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_recovered'), property('recovered'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_critical'), property('critical'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_cpm'), property('casesPerOneMillion'));
room Info
Internals:
API_LAST_RES 1585162800.6157
API__LAST_MSG invalid server response
API__NEXT_REQ 1585115160.71333
CFGFN
DEF https://corona.lmao.ninja/countries
FUUID 5e7a69e2-f33f-97bf-7b72-3a12da173d23c379
NAME coronaSpread
NEXT 2020-03-25 20:30:00
NR 38498
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
STATE
SVN 21497 2020-03-23 20:44:04
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
OLDREADINGS:
READINGS:
2020-03-25 20:00:00 Austria_active 5549
2020-03-25 20:00:00 Austria_cases 5588
2020-03-25 20:00:00 Austria_casestoday 305
2020-03-25 20:00:00 Austria_cpm 620
2020-03-25 20:00:00 Austria_critical 28
2020-03-25 20:00:00 Austria_deaths 30
2020-03-25 20:00:00 Austria_deathstoday 2
2020-03-25 20:00:00 Austria_recovered 9
2020-03-25 20:00:00 France_active 20002
2020-03-25 20:00:00 France_cases 25233
2020-03-25 20:00:00 France_casestoday 2929
2020-03-25 20:00:00 France_cpm 387
2020-03-25 20:00:00 France_critical 2827
2020-03-25 20:00:00 France_deaths 1331
2020-03-25 20:00:00 France_deathstoday 231
2020-03-25 20:00:00 France_recovered 3900
2020-03-25 20:00:00 Germany_active 33345
2020-03-25 20:00:00 Germany_cases 37098
2020-03-25 20:00:00 Germany_casestoday 4107
2020-03-25 20:00:00 Germany_cpm 443
2020-03-25 20:00:00 Germany_critical 23
2020-03-25 20:00:00 Germany_deaths 206
2020-03-25 20:00:00 Germany_deathstoday 47
2020-03-25 20:00:00 Germany_recovered 3547
2020-03-25 20:00:00 Israel_active 2306
2020-03-25 20:00:00 Israel_cases 2369
2020-03-25 20:00:00 Israel_casestoday 439
2020-03-25 20:00:00 Israel_cpm 274
2020-03-25 20:00:00 Israel_critical 37
2020-03-25 20:00:00 Israel_deaths 5
2020-03-25 20:00:00 Israel_deathstoday 2
2020-03-25 20:00:00 Israel_recovered 58
2020-03-25 20:00:00 Italy_active 57521
2020-03-25 20:00:00 Italy_cases 74386
2020-03-25 20:00:00 Italy_casestoday 5210
2020-03-25 20:00:00 Italy_cpm 1230
2020-03-25 20:00:00 Italy_critical 3489
2020-03-25 20:00:00 Italy_deaths 7503
2020-03-25 20:00:00 Italy_deathstoday 683
2020-03-25 20:00:00 Italy_recovered 9362
2020-03-25 20:00:00 Spain_active 38809
2020-03-25 20:00:00 Spain_cases 47610
2020-03-25 20:00:00 Spain_casestoday 5552
2020-03-25 20:00:00 Spain_cpm 1018
2020-03-25 20:00:00 Spain_critical 2636
2020-03-25 20:00:00 Spain_deaths 3434
2020-03-25 20:00:00 Spain_deathstoday 443
2020-03-25 20:00:00 Spain_recovered 5367
2020-03-25 20:00:00 UK_active 7694
2020-03-25 20:00:00 UK_cases 8264
2020-03-25 20:00:00 UK_casestoday 187
2020-03-25 20:00:00 UK_cpm 122
2020-03-25 20:00:00 UK_critical 20
2020-03-25 20:00:00 UK_deaths 435
2020-03-25 20:00:00 UK_deathstoday 13
2020-03-25 20:00:00 UK_recovered 135
2020-03-25 20:00:00 USA_active 61238
2020-03-25 20:00:00 USA_cases 62505
2020-03-25 20:00:00 USA_casestoday 7649
2020-03-25 20:00:00 USA_cpm 189
2020-03-25 20:00:00 USA_critical 1382
2020-03-25 20:00:00 USA_deaths 880
2020-03-25 20:00:00 USA_deathstoday 100
2020-03-25 20:00:00 USA_recovered 387
Attributes:
interval */30 * * * *
readingList multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_casestoday'), property('todayCases'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_active'), property('active'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_deaths'), property('deaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_deathstoday'), property('todayDeaths'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_recovered'), property('recovered'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_critical'), property('critical'));
multi(jsonPath("\$.[?(\@.country in ['Austria', 'Germany', 'Italy', 'Spain', 'France', 'Israel', 'UK', 'USA'])]"), concat(property('country'), '_cpm'), property('casesPerOneMillion'));
room Info
So, dann mal der Reihe nach ;)
RKI: ich weiß nicht was die rauchen um so 'n JSON zum machen. (Wobei es sehr gut ist, dass die die Daten bereitstellen)
Der JSON ist gleich dreifach spannend, ein sehr guter TestCase. Fix im svn, ab morgen per update, rev 21515
Unten das list zum device mit 2 Ausdrücken (einer davon auskommentiert).
#1: alle Fallzahlen. Der kann jetzt für andere Felder (macht nur für faelle_100000_EW und Death Sinn) multipliziert werden. Wenn es nur die Fallzahlen sind kann man concat weglassen.
readingList multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cases'), property('attributes.Fallzahl'));
#2 mit Filter. Weil beim Filter die Länder (String) in ein Hochkomma müssen, muss der gesamte Ausdruck in doppelte Hochkommas und daher müssen @ und $ escaped werden. Das @Andy: das war bei Dir nicht aber daran lags auch nicht. Nur Hinweis. Wenn jetzt nur ein Land angezeigt werden soll würde anstelle des 'in' auch " == 'Hamburg'" gehen. Groß- Kleinschreibung macht einen Unterschied!
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hamburg', 'Berlin', 'Bremen'])]"), property('attributes.LAN_ew_GEN'), property('attributes.Fallzahl'));
Läuft also soweit. Bis auf... wieder mal Sonderzeichen Murks. :( Das wird erfahrungsgemäß hässlich ... Aber: So weit. so gut
Internals:
API_LAST_RES 1585164937.82149
API__LAST_MSG 200
DEF 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
FUUID 5e7b4174-f33f-a6e8-dea1-1ac51dcf4db92252
NAME rki
NEXT 2020-03-25 21:00:00
NR 28
NTFY_ORDER 50-rki
SOURCE 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 (200)
STATE ???
SVN 21504 2020-03-24 22:27:59 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE 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
SECRET:
OLDREADINGS:
READINGS:
2020-03-25 20:35:37 Baden-W�rttemberg_cases 6069
2020-03-25 20:35:37 Bayern_cases 6558
2020-03-25 20:35:37 Berlin_cases 1428
2020-03-25 20:35:37 Brandenburg_cases 429
2020-03-25 20:35:37 Bremen_cases 200
2020-03-25 20:35:37 Hamburg_cases 1262
2020-03-25 20:35:37 Hessen_cases 1754
2020-03-25 20:35:37 Mecklenburg-Vorpommern_cases 218
2020-03-25 20:35:37 Niedersachsen_cases 2140
2020-03-25 20:35:37 Nordrhein-Westfalen_cases 7197
2020-03-25 20:35:37 Rheinland-Pfalz_cases 1591
2020-03-25 20:35:37 Saarland_cases 403
2020-03-25 20:35:37 Sachsen-Anhalt_cases 375
2020-03-25 20:35:37 Sachsen_cases 959
2020-03-25 20:35:37 Schleswig-Holstein_cases 577
2020-03-25 20:35:37 Th�ringen_cases 394
Attributes:
readingList multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_cases'), property('attributes.Fallzahl'));
#multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hamburg', 'Berlin', 'Bremen'])]"), property('attributes.LAN_ew_GEN'), property('attributes.Fallzahl'));
Zitat von: Jamo am 25 März 2020, 20:07:37
Hallo Hermann,
Das hat mit dem Shutdown/restart aber nichts zu tun. Anbei zwei listings, einmal um 19:44 mit den entsprechenden readings "_yesterday", und dann um 20:00 nach dem nächsten automatischen Update. Alle "_yesterday" readings sind verschwunden.
Jo, Thnx. Doch hat mit shutdown/restart was zu tun, nur anders als Du denkst ;)
Wie bekommst Du denn die readings dazu ?
Hallo Herrmann,
ZitatWie bekommst Du denn die readings dazu ?
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;
}
mit setreading also. Ich hab mir das so gedacht aber hilft ja auch mal drüber zu sprechen. :)
Ich muss da mal drüber nachdenken. Klar kann ich mir merken welche readings ich setze, ergo auch löschen kann.
Problem: ich bekomme die Info nicht über einen shutdown/restart gerettet. Beim restart schreibt fhem alle ("Deine" und "Meine") readings via setreading in das device zurück und ab da ist alles gemischt.
Was mir dazu einfällt wäre readings per regex vom löschen auszunehmen oder das per attribut ganz optional zu machen. Ist aber beides eher suboptimal .. readings sind halt eigentlich nicht als "user-storage" vorgesehen. Kannste das nicht anders lösen?
edit. Wenn Du das eh schon ausgelagert hast - schreib die Daten doch in einen dummy und führe die beim table machen wieder zusammen. Ginge doch, oder?
edit. Wenn Du das eh schon ausgelagert hast - schreib die Daten doch in einen dummy und führe die beim table machen wieder zusammen. Ginge doch, oder?
Yep, das kann ich machen, kein Problem. Aber hat mich halt gewundert, beim normalen HTTPMOD modul überleben meine eigene readings (wie auch eigentlich bei allen anderen Modulen) jeden shutdown/restart. Und man hat halt gerne alles in einem Modul.
Und dann muss ich alle meine subs anpassen :( :)
PS: Habs jetzt in mein anderes HTTPMOD device geschrieben, funktioniert erstmal.
ja, verständlich. Aber das ist eher "form follows function", normalerweise gibts ja auch für einen Autor keinen Grund readings zu löschen. Hier ist das anders weil die Listen (im JSON) wachsen oder schrumpfen. Wenn ich die nicht lösche (n lasse) dann bleiben alte readings bis zum st Nimmerleinstag im device. Siehr Metar und Wolken schichten. Das sind 1..3. Strahlend blauer Himmel aber FHEM meldet dicke Suppe. ;) Daher halt hier angebracht
wäre es vielleicht sinnvoll ein Attribut anzulegen, was der User selbst pflegen kann/muss, zB userReadingList. Alle Komma-getrennten Werte der userReadingList werden von dir einfach nicht gelöscht. So ist der User zum Teil selbst verantwortlich, wenn etwas für immer da bleibt?
Ich habe nämlich auch gerne alle zusammengehörenden Daten in einem Device - vor allem, wenn sie dann noch in die Datenbank geschrieben werden sollen.
Zitat...(wie auch eigentlich bei allen anderen Modulen)...
Einfach mal so als Mitlesender und ohne genau zu wissen was die Hintergründe sind, hast du mal ausprobiert ob bei einem AT (https://forum.fhem.de/index.php/topic,109430.msg1034185.html#msg1034185) deine alten Readings erhalten bleiben.
Gruß
Thomas
ZitatIch habe nämlich auch gerne alle zusammengehörenden Daten in einem Device - vor allem, wenn sie dann noch in die Datenbank geschrieben werden sollen.
stimmt, einen dblog kann man dann schlecht machen wenn man die Readings in verschiedenen Devices hat. Wie macht HTTPMOD das denn? Da muss es doch das gleiche Problem geben... Und der user ist ja selber verantwortlich, wenn seine eigenen Readings stehenbleiben und er darum dicke Suppe sieht. Das die Modulreadings gelöscht & neu angelegt werden, verstehe ich ja.
Zitat von: Andy89 am 25 März 2020, 22:05:24
wäre es vielleicht sinnvoll ein Attribut anzulegen, was der User selbst pflegen kann/muss, zB userReadingList. Alle Komma-getrennten Werte der userReadingList werden von dir einfach nicht gelöscht. So ist der User zum Teil selbst verantwortlich, wenn etwas für immer da bleibt?
Ich habe nämlich auch gerne alle zusammengehörenden Daten in einem Device - vor allem, wenn sie dann noch in die Datenbank geschrieben werden sollen.
ja, das wäre quasi die regex variante. So richtig glücklich macht mich der Gedanke aber nicht.
ZitatWas mir dazu einfällt wäre readings per regex vom löschen auszunehmen oder das per attribut ganz optional zu machen. Ist aber beides eher suboptimal .. readings sind halt eigentlich nicht als "user-storage" vorgesehen. Kannste das nicht anders lösen?
Wie löst du sowas denn, wenn du die readings auch loggen willst?
Oder nutzt du dann dafür Datenbankabfragen? Ich meine, mit grafana wäre das sicherlich lösbar, mit dem dblog und den svg-Plots eher schwieriger (zumindest für mich)
war die Frage an mich?
Ja :)
Userreadings fallen doch eigentlich in die gleiche Kategorie, wie das Problem mit den Vortageszahlen jetzt, oder nicht?
Gesendet von iPhone mit Tapatalk
ich steh gerade auf dem Schlauch. Loggen, notify usw: einfach regex anlegen und dann passt das. Übersehe ich was?
Umlaute erledigt. Das hatte noch einen Rattenschwanz weil die automatisch erzeugten reading namen auf der einen Seite den fhem rules entsprehcen müsen (a-zA_Z0-9 usw), im JSON aber auch Hindu sein kann. Aus "Baden-Württemberg" wird daher "Baden-Wurttemberg", das RKI Beispiel ist damit komplett in Ordnung.
Zitat von: Jamo am 25 März 2020, 11:39:11
Hallo Hermann,
danke für das klasse Modul. Ich habe mir damit sofort eine eigene Tabelle eingerichtet,
mir ist aber aufgefallen, das angelegte eigene readings mit jedem Lauf wieder gelöscht werden. Ich wollte mir eingene readings anlegen, wo ich mir die 'neuen' Coronafälle für gestern und vorgestern in einem Reading merke.
Aber es wird alles gelöscht und wieder neu angelegt.
Kann man evtl auch nur die vom Modul erzeugten Readings neu anlegen?
Danke, und bleib gesund!
Done, rev 21517. UserReadings sollten damit ab jetzt bestehen bleiben. Bitte testen und berichten.
Gibt es eine Möglichkeit herauszufinden von wann die Daten sind, also der Zeitstempel der Daten?
rki hat einen Zeitstempel drin.
Zitat von: herrmannj am 25 März 2020, 20:56:39
So, dann mal der Reihe nach ;)
RKI: ich weiß nicht was die rauchen um so 'n JSON zum machen. (Wobei es sehr gut ist, dass die die Daten bereitstellen)
Der JSON ist gleich dreifach spannend, ein sehr guter TestCase. Fix im svn, ab morgen per update, rev 21515
[...]
Danke. Mein List nun so aus:
Internals: API_LAST_RES 1585208602.29452 API__LAST_MSG 200 DEF 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&outSR=4326&f=json FUUID 5e7b0e56-f33f-9177-bee2-7cc8eb4143a27a56 NAME corona NEXT 2020-03-26 09:00:00 NR 320 NTFY_ORDER 50-corona SOURCE 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&outSR=4326&f=json (200) STATE ??? SVN 21517 2020-03-25 23:14:35 UTC TYPE JsonMod CONFIG: IN_REQUEST 0 SOURCE 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&outSR=4326&f=json SECRET: OLDREADINGS: READINGS: 2020-03-26 08:43:50 Baden-Wurttemberg_aktualisierung 1585177200000 2020-03-26 08:43:50 Baden-Wurttemberg_death 56 2020-03-26 08:43:50 Baden-Wurttemberg_faelle_100000_EW 66.0683952582795 2020-03-26 08:43:50 Baden-Wurttemberg_fallzahl 7283 2020-03-26 08:43:50 Bayern_aktualisierung 1585177200000 2020-03-26 08:43:50 Bayern_death 47 2020-03-26 08:43:50 Bayern_faelle_100000_EW 61.4978421512812 2020-03-26 08:43:50 Bayern_fallzahl 7993 2020-03-26 08:43:50 Berlin_aktualisierung 1585177200000 2020-03-26 08:43:50 Berlin_death 4 2020-03-26 08:43:50 Berlin_faelle_100000_EW 45.8282078707733 2020-03-26 08:43:50 Berlin_fallzahl 1656 2020-03-26 08:43:50 Brandenburg_aktualisierung 1585177200000 2020-03-26 08:43:50 Brandenburg_death 1 2020-03-26 08:43:50 Brandenburg_faelle_100000_EW 19.0492164661906 2020-03-26 08:43:50 Brandenburg_fallzahl 477 2020-03-26 08:43:50 Bremen_aktualisierung 1585177200000 2020-03-26 08:43:50 Bremen_death 1 2020-03-26 08:43:50 Bremen_faelle_100000_EW 30.9823914294776 2020-03-26 08:43:50 Bremen_fallzahl 211 2020-03-26 08:43:50 Hamburg_aktualisierung 1585177200000 2020-03-26 08:43:50 Hamburg_death 0 2020-03-26 08:43:50 Hamburg_faelle_100000_EW 69.1036303168825 2020-03-26 08:43:50 Hamburg_fallzahl 1265 2020-03-26 08:43:50 Hessen_aktualisierung 1585177200000 2020-03-26 08:43:50 Hessen_death 6 2020-03-26 08:43:50 Hessen_faelle_100000_EW 34.5492468520463 2020-03-26 08:43:50 Hessen_fallzahl 2157 2020-03-26 08:43:50 Mecklenburg-Vorpommern_aktualisierung 1585177200000 2020-03-26 08:43:50 Mecklenburg-Vorpommern_death 0 2020-03-26 08:43:50 Mecklenburg-Vorpommern_faelle_100000_EW 15.1447534291384 2020-03-26 08:43:50 Mecklenburg-Vorpommern_fallzahl 244 2020-03-26 08:43:50 Niedersachsen_aktualisierung 1585177200000 2020-03-26 08:43:50 Niedersachsen_death 8 2020-03-26 08:43:50 Niedersachsen_faelle_100000_EW 29.4746492271852 2020-03-26 08:43:50 Niedersachsen_fallzahl 2347 2020-03-26 08:43:50 Nordrhein-Westfalen_aktualisierung 1585177200000 2020-03-26 08:43:50 Nordrhein-Westfalen_death 53 2020-03-26 08:43:50 Nordrhein-Westfalen_faelle_100000_EW 44.2381683835103 2020-03-26 08:43:50 Nordrhein-Westfalen_fallzahl 7924 2020-03-26 08:43:50 Rheinland-Pfalz_aktualisierung 1585177200000 2020-03-26 08:43:50 Rheinland-Pfalz_death 6 2020-03-26 08:43:50 Rheinland-Pfalz_faelle_100000_EW 44.5788683889919 2020-03-26 08:43:50 Rheinland-Pfalz_fallzahl 1816 2020-03-26 08:43:50 Saarland_aktualisierung 1585177200000 2020-03-26 08:43:50 Saarland_death 2 2020-03-26 08:43:50 Saarland_faelle_100000_EW 43.5531746039729 2020-03-26 08:43:50 Saarland_fallzahl 433 2020-03-26 08:43:50 Sachsen-Anhalt_aktualisierung 1585177200000 2020-03-26 08:43:50 Sachsen-Anhalt_death 1 2020-03-26 08:43:50 Sachsen-Anhalt_faelle_100000_EW 18.802733683568 2020-03-26 08:43:50 Sachsen-Anhalt_fallzahl 418 2020-03-26 08:43:50 Sachsen_aktualisierung 1585177200000 2020-03-26 08:43:50 Sachsen_death 7 2020-03-26 08:43:50 Sachsen_faelle_100000_EW 27.9567236778013 2020-03-26 08:43:50 Sachsen_fallzahl 1141 2020-03-26 08:43:50 Schleswig-Holstein_aktualisierung 1585177200000 2020-03-26 08:43:50 Schleswig-Holstein_death 3 2020-03-26 08:43:50 Schleswig-Holstein_faelle_100000_EW 23.3578481158522 2020-03-26 08:43:50 Schleswig-Holstein_fallzahl 675 2020-03-26 08:43:50 Thuringen_aktualisierung 1585177200000 2020-03-26 08:43:50 Thuringen_death 3 2020-03-26 08:43:50 Thuringen_faelle_100000_EW 21.7552488024154 2020-03-26 08:43:50 Thuringen_fallzahl 468 Attributes: readingList multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_fallzahl'), property('attributes.Fallzahl')); multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_aktualisierung'), property('attributes.Aktualisierung')); multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_faelle_100000_EW'), property('attributes.faelle_100000_EW')); multi(jsonPath('$.features[*]'), concat(property('attributes.LAN_ew_GEN'),'_death'), property('attributes.Death'));
Zitat von: herrmannj am 26 März 2020, 00:25:25
rki hat einen Zeitstempel drin.
danke es funktioniert nun =)
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 interval */10 * * * *
attr coronaSpreadDe readingList 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 Nordrhein-Westfalen_Death
attr coronaSpreadDe userReadings updated_human {POSIX::strftime ("%d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadDe","Nordrhein-Westfalen_lastUpdate",0)/1000))}
ich habe ein userreading hinzugefügt, damit man den Timestamp auch lesen kann. Nachher muss ich mich noch kurz googlen, wie ich täglich um 5 nach 0 die Daten abrufe. Ich glaube, dass das RKI, die nur einmal am Tag bereitstellt.
Hier noch meine Welt Zahlen:
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval */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 userReadings updated_human {setlocale(LC_TIME,"de_DE.utf8");; POSIX::strftime ("%a %d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadWorld","world_updated",0)/1000))}
Diese Daten werden auf jeden Fall häufiger aktualisiert. Ich gaube alle 10 Minuten.
Danke für deine Bug Fixes :) :) :)
ZitatDone, rev 21517. UserReadings sollten damit ab jetzt bestehen bleiben. Bitte testen und berichten.
Getested, ich berichte: UserReadings bleiben jetzt bestehen!. :)
DANKE!
sehr gern!
timestamp: hatte ich gestern Abend auch geschaut. Theoretisch könnte man das auch aktuell im multi() mit machen. Das wird aber furchtbar kryptischer code den keine Sau mehr versteht. UserReadings sind da deutlich "angenehmer".
Cron: https://crontab.guru/#0_5_*_*_* (https://crontab.guru/#0_5_*_*_*)
Auf der Seite kann man fix testen. Achtung, ich habe im JsonMod Cron noch keine Wochentage implementiert. (Nicht wundern. ...falls ;) )
Zitat von: Andy89 am 26 März 2020, 08:49:18
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 interval */10 * * * *
attr coronaSpreadDe readingList 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 Nordrhein-Westfalen_Death
attr coronaSpreadDe userReadings updated_human {POSIX::strftime ("%d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadDe","Nordrhein-Westfalen_lastUpdate",0)/1000))}
ich habe ein userreading hinzugefügt, damit man den Timestamp auch lesen kann. Nachher muss ich mich noch kurz googlen, wie ich täglich um 5 nach 0 die Daten abrufe. Ich glaube, dass das RKI, die nur einmal am Tag bereitstellt.
Habe ich 1:1 übernommen, funktioniert gut.
Eine Quick & Dirty Tabelle für FTUI habe ich schnell gemacht:
<table cellpadding="0" cellspacing="0">
<tr>
<td width="250">
<div class="bigger">Bundesland</div>
</td>
<td width="250">
<div class="bigger">Fälle</div>
</td>
<td width="250">
<div class="bigger">Fälle pro 100.000</div>
</td>
<td width="250">
<div class="bigger">Verstorbene</div>
</td>
</tr>
<tr>
<td width="250">
<div class="normal">Aktualisiert:</div>
</td>
<td width="250">
<div class="normal" data-type="label" data-device="coronaSpreadDe" data-get="updated_human"></div>
</td>
<td width="250">
</td>
<td width="250">
</td>
</tr>
<tr>
<td>
<div class="bigger">Nordrhein-Westfalen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Nordrhein-Westfalen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Nordrhein-Westfalen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Nordrhein-Westfalen_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Baden-Württemberg</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Baden-Wurttemberg_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Baden-Wurttemberg_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Baden-Wurttemberg_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Bayern</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Bayern_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Bayern_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Bayern_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Berlin</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Berlin_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Berlin_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Berlin_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Brandenburg</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Brandenburg_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Brandenburg_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Brandenburg_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Bremen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Bremen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Bremen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Bremen_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Hamburg</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Hamburg_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Hamburg_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Hamburg_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Hessen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Hessen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Hessen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Hessen_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Mecklenburg-Vorpommern</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Mecklenburg-Vorpommern_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Mecklenburg-Vorpommern_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Mecklenburg-Vorpommern_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Niedersachsen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Niedersachsen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Niedersachsen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Niedersachsen_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Rheinland-Pfalz</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Rheinland-Pfalz_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Rheinland-Pfalz_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Rheinland-Pfalz_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Saarland</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Saarland_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Saarland_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Saarland_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Sachsen-Anhalt</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Sachsen-Anhalt_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Sachsen-Anhalt_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Sachsen-Anhalt_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Sachsen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Sachsen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Sachsen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Sachsen_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Schleswig-Holstein</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Schleswig-Holstein_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Schleswig-Holstein_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Schleswig-Holstein_deaths"></div>
</td>
</tr>
<tr>
<td>
<div class="bigger">Thüringen</div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Thuringen_cases"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-fix="1" data-get="Thuringen_cp100k"></div>
</td>
<td>
<div class="bigger" data-type="label" data-device="coronaSpreadDe" data-get="Thuringen_deaths"></div>
</td>
</tr>
</table>
Bild :)
Sehe gerade, dass mein Log voller Einträge wie diesem ist:
Zitat
2020.03.26 06:01:00 3: IP: corona.lmao.ninja -> 104.18.36.204
2020.03.26 06:01:00 3: https://corona.lmao.ninja/countries: HTTP response code 200
2020.03.26 06:01:00 1: PERL WARNING: Useless use of reference constructor in void context at (eval 12610) line 2.
2020.03.26 06:01:00 1: PERL WARNING: Useless use of reference constructor in void context at (eval 12610) line 3.
2020.03.26 06:01:00 1: PERL WARNING: Useless use of reference constructor in void context at (eval 12610) line 4.
2020.03.26 06:01:00 1: PERL WARNING: Useless use of reference constructor in void context at (eval 12610) line 5.
2020.03.26 06:01:00 1: PERL WARNING: Useless use of reference constructor in void context at (eval 12610) line 6.
Zitat
Internals:
API_LAST_RES 1585213801.16946
API__LAST_MSG 200
DEF https://corona.lmao.ninja/countries
FUUID 5e7b1af7-f33f-4dec-2fe1-28ef6f59dd72f647
NAME coronaSpread
NEXT 2020-03-26 10:20:00
NR 100
NTFY_ORDER 50-coronaSpread
SOURCE https://corona.lmao.ninja/countries (200)
STATE 0
SVN 21517 2020-03-25 23:14:35 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/countries
SECRET:
READINGS:
2020-03-26 10:10:01 China_active 3947
2020-03-26 10:10:01 China_cases 81285
2020-03-26 10:10:01 China_casesPerOneMillion 56
2020-03-26 10:10:01 China_deaths 3287
2020-03-26 10:10:01 China_recovered 74051
2020-03-26 10:10:01 China_todayCases 67
2020-03-26 10:10:01 China_todayDeaths 6
2020-03-26 10:10:01 Denmark_active 1816
2020-03-26 10:10:01 Denmark_cases 1851
2020-03-26 10:10:01 Denmark_casesPerOneMillion 320
2020-03-26 10:10:01 Denmark_deaths 34
2020-03-26 10:10:01 Denmark_recovered 1
2020-03-26 10:10:01 Denmark_todayCases 127
2020-03-26 10:10:01 Denmark_todayDeaths 0
2020-03-26 10:10:01 France_active 20002
2020-03-26 10:10:01 France_cases 25233
2020-03-26 10:10:01 France_casesPerOneMillion 387
2020-03-26 10:10:01 France_deaths 1331
2020-03-26 10:10:01 France_recovered 3900
2020-03-26 10:10:01 France_todayCases 0
2020-03-26 10:10:01 France_todayDeaths 0
2020-03-26 10:10:01 Germany_active 33570
2020-03-26 10:10:01 Germany_cases 37323
2020-03-26 10:10:01 Germany_casesPerOneMillion 445
2020-03-26 10:10:01 Germany_deaths 206
2020-03-26 09:00:03 Germany_procent_todayDeaths 0
2020-03-26 10:10:01 Germany_recovered 3547
2020-03-26 10:10:01 Germany_todayCases 0
2020-03-26 10:10:01 Germany_todayDeaths 0
2020-03-26 10:10:01 Italy_active 57521
2020-03-26 10:10:01 Italy_cases 74386
2020-03-26 10:10:01 Italy_casesPerOneMillion 1
2020-03-26 10:10:01 Italy_deaths 7503
2020-03-26 10:10:01 Italy_recovered 9362
2020-03-26 10:10:01 Italy_todayCases 0
2020-03-26 10:10:01 Italy_todayDeaths 0
2020-03-26 10:10:01 Netherlands_active 6053
2020-03-26 10:10:01 Netherlands_cases 6412
2020-03-26 10:10:01 Netherlands_casesPerOneMillion 374
2020-03-26 10:10:01 Netherlands_deaths 356
2020-03-26 10:10:01 Netherlands_recovered 3
2020-03-26 10:10:01 Netherlands_todayCases 0
2020-03-26 10:10:01 Netherlands_todayDeaths 0
2020-03-26 10:10:01 Spain_active 40501
2020-03-26 10:10:01 Spain_cases 49515
2020-03-26 10:10:01 Spain_casesPerOneMillion 1
2020-03-26 10:10:01 Spain_deaths 3647
2020-03-26 10:10:01 Spain_recovered 5367
2020-03-26 10:10:01 Spain_todayCases 0
2020-03-26 10:10:01 Spain_todayDeaths 0
2020-03-26 10:10:01 UK_active 8929
2020-03-26 10:10:01 UK_cases 9529
2020-03-26 10:10:01 UK_casesPerOneMillion 140
2020-03-26 10:10:01 UK_deaths 465
2020-03-26 10:10:01 UK_recovered 135
2020-03-26 10:10:01 UK_todayCases 0
2020-03-26 10:10:01 UK_todayDeaths 0
2020-03-26 10:10:01 USA_active 67063
2020-03-26 10:10:01 USA_cases 68489
2020-03-26 10:10:01 USA_casesPerOneMillion 207
2020-03-26 10:10:01 USA_deaths 1032
2020-03-26 10:10:01 USA_recovered 394
2020-03-26 10:10:01 USA_todayCases 278
2020-03-26 10:10:01 USA_todayDeaths 5
Attributes:
interval */10 * * * *
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'));;
room News
stateFormat Germany_procent_todayDeaths
ich habe wieder Mal ein Problem...
aber erst einmal eine Frage:
das Internal "NEXT" ist Menschen-lesbar.
Könntest du das Internal "API_LAST_RES" auch Menschen-lesbar machen? Dann würde ich und vielleicht auch andere sehen, wann das letzte Mal Daten abgerufen wurden.
Nun zu meinem Problem. Die Quelle "https://corona.lmao.ninja/countries" hat das Land Iran umbenannt. Das heißt nun:
country "Iran, Islamic Republic of"
Ich vermute, dass das Problem hier das Komma oder evtl die Leerzeichen sind.
Beste Grüße
Andy
Zitat von: Andy89 am 26 März 2020, 10:29:47Nun zu meinem Problem. Die Quelle "https://corona.lmao.ninja/countries" hat das Land Iran umbenannt. Das heißt nun:
country "Iran, Islamic Republic of"
Kann man auf die Country-Codes (iso2, iso3) zurückgreifen?
Zitat{"country":"China","countryInfo":{"_id":156,"lat":35,"long":105,"flag":"https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/cn.png","iso3":"CHN","iso2":"CN"},"cases":81285,"todayCases":67,"deaths":3287,"todayDeaths":6,"recovered":74051,"active":3947,"critical":1235,"casesPerOneMillion":56,"deathsPerOneMillion":2}
Jetzt wünsche ich der look down würde mich auch betreffen :) :)
@Dracolein:
wo kommen denn die Umlaute in Deinen pic her? sind die auch als reading name? Mit der neuesten Version sollte das nicht sein. FHEM wird beim start meckern weil das dann keine gültigen readingnamen "wären".
Zu den meldungen im log: kenn ich so nicht. Vermutung: das ist das ";;\" am Ende der Einträge. Die können da weg ein ";" reicht.
@Andy89
sollte natürlich nicht. Welcher Art ist der Fehler denn? Was passiert? Fehlermeldungen?
API_LAST_RES_HUMAN kann ich machen.
@yersinia
ja, würde als workaround funktionieren. Aber ich gehe dem Fehler bei Andy nach wenn ich den Fehler verstehe.
Zitat von: herrmannj am 26 März 2020, 11:20:41
@Andy89
sollte natürlich nicht. Welcher Art ist der Fehler denn? Was passiert? Fehlermeldungen?
der Fehler ist, dass überhaupt keine Readings für "Iran, " erzeugt werden. Es beschwert sich nur das Userreading, dass es nicht durch 0 teilen kann, weil es kein Reading findet.
Hier der Auszug aus dem Log (von unten nach oben lesen):
2020.03.26 11:29:47.622 5: [coronaSpread] event:[Iran_procent_todayCases: Error evaluating coronaSpread userReading Iran_procent_todayCases: Illegal division by zero at (eval 272275) line 1.
], device:[coronaSpread]
2020.03.26 11:29:47.622 5: [coronaSpread] event:[Iran_procent_todayDeaths: Error evaluating coronaSpread userReading Iran_procent_todayDeaths: Illegal division by zero at (eval 272266) line 1.
2020.03.26 11:29:47.622 5: [coronaSpread] event:[Germany_todayDeaths: 16], device:[coronaSpread]
2020.03.26 11:29:47.619 1: Error evaluating coronaSpread userReading Iran_procent_todayCases: Illegal division by zero at (eval 272275) line 1.
2020.03.26 11:29:47.619 3: eval: {ReadingsVal("coronaSpread","Iran_todayCases","")/ReadingsVal("coronaSpread","Iran_cases","")*100}
2020.03.26 11:29:47.619 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 272275) line 1.
2020.03.26 11:29:47.617 1: Error evaluating coronaSpread userReading Iran_procent_todayDeaths: Illegal division by zero at (eval 272266) line 1.
2020.03.26 11:29:47.617 3: eval: {ReadingsVal("coronaSpread","Iran_todayDeaths","")/ReadingsVal("coronaSpread","Iran_deaths","")*100}
2020.03.26 11:29:47.617 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 272266) line 1.
2020.03.26 11:29:47.217 4: [coronaSpread] next request: 2020.03.26 11:31:00
Wenn ich das Device auf verbose 5 Stelle, wird mein Log eh mit allem zugemüllt, weil JsonMod scheinbar auf alles reagiert. Nochmal ein Auszug aus dem Log
2020.03.26 11:29:47.693 5: [coronaSpread] event:[UptimeSec: 220844], device:[MQTT2_Gosund004]
2020.03.26 11:29:47.693 5: [coronaSpread] event:[Time: 2020-03-26T11:29:47], device:[MQTT2_Gosund004]
2020.03.26 11:29:47.682 5: [coronaSpread] event:[state: Updated stats for: MQTT2_Gosund004], device:[statistics_Strom_Gosund]
], device:[coronaSpread]
Zitat von: Andy89 am 26 März 2020, 08:49:18
Hier noch meine Welt Zahlen:
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval */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 userReadings updated_human {setlocale(LC_TIME,"de_DE.utf8");; POSIX::strftime ("%a %d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadWorld","world_updated",0)/1000))}
Bei mir werden hier keine Readings erstellt
defmod coronaSpreadWorld JsonMod https://corona.lmao.ninja/all
attr coronaSpreadWorld event-on-change-reading .*
attr coronaSpreadWorld interval */1 * * * *
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 userReadings updated_human {setlocale(LC_TIME,"de_DE.utf8");; POSIX::strftime ("%a %d.%m.%Y %H:%M", localtime(ReadingsVal("coronaSpreadWorld","world_updated",0)/1000))}
kannst Du mal testweise diesen Teil rausnehmen:
{ReadingsVal("coronaSpread","Iran_todayCases","")/ReadingsVal("coronaSpread","Iran_cases","")*100}
Also, wenn die das Land umbenennen dann ändert sich ja auch der Name des Readings. Das sollte problemlos funktionieren (Theorie). Der alte Name wird entfernt und das Land wird neu angelegt.
Dein ReadingsVal(... 'Iran',...) läuft dann ins nirvana. Bei default dort erst mal anstelle von "" eine 1 rein (gibt dann Division / 1). Oder | und erst mal ganz weg, weil bringt ja nix. (Das Komma im Land könnte trotzdem Probleme machen, da müsste ich dann ran. Theoretisch (tm) sollte es aber funktionieren)
Nachtrag. Ah, Iran wird auch nicht als "Iran Islamic Republic of" angelegt ? modifizier mal user reading, mal schauen was passiert. Sonst muss ich heute Abend schauen.
Nachtrag2: verbose 5 . Jo, das grenze ich mal ein.
Zitat von: TWART016 am 26 März 2020, 11:45:26
Bei mir werden hier keine Readings erstellt
hast du heute schon ein FHEM Update gemacht? Das hat erst danach funktioniert.
Ich habe das Interval und die Userreadings nochmal angepasst, damit es zu den anderen Zahlen passt.
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}
Zitat von: herrmannj am 26 März 2020, 11:55:07
Nachtrag. Ah, Iran wird auch nicht als "Iran Islamic Republic of" angelegt ? modifizier mal user reading, mal schauen was passiert. Sonst muss ich heute Abend schauen.
genau. Das ist das Problem, dass das Reading nicht angelegt wird.
Das Userreading ist "mein" Problem. Wenn ich das lösche, gibt natürlich auch keinen Fehler im Log. Aber das Reading "Iran, Islamic Republic of_XXX" wird dennoch nicht angelegt. JsonMod ignoriert das einfach. Alle anderen Readings werden korrekt ausgeführt.
Ich versteh nicht, wieso die heute in ihrer API das Land umbennen mussten ???
Nachtrag: falls du es überhaupt liest. Ich wollte gerade nochmal wegen verbose 5 nachfragen, aber das hast du ja schon in Nachtrag 2 erwähnt ;D
Noch'n Nachtrag. Klar, mindestens bei den Space im Land werde ich nochmal ran müssen. Aktuell sollten die gelöscht werden um einen ReadingNamen daraus zu generieren. Da ist es sicher besser space durch '_' zu ersetzen. Todo.
Zitat von: Andy89 am 26 März 2020, 12:02:30
genau. Das ist das Problem, dass das Reading nicht angelegt wird.
Das Userreading ist "mein" Problem. Wenn ich das lösche, gibt natürlich auch keinen Fehler im Log. Aber das Reading "Iran, Islamic Republic of_XXX" wird dennoch nicht angelegt. JsonMod ignoriert das einfach. Alle anderen Readings werden korrekt ausgeführt.
Ich versteh nicht, wieso die heute in ihrer API das Land umbennen mussten ???
ok, verstehe. Ja, das schau ich mir an. Also, ist nicht so schlimm, JsonMod soll ja als "Universal Maschine" eben auch mit den seltensten Konstellationen klar kommen, von daher ist es gut das die dass gemacht haben, dann kann ichs fixen.
Edit: Wegen der Api, die hat sich schon dutzende Male geändert. Aber das ist auch ok, gerade hier kann man das ja fix nachziehen. Ein "festes Modul" käme da garnicht hinterher. Ist halt eine "dynamische" Lage ;)
edit2: verbose. Klar ;)
Zitat von: Andy89 am 26 März 2020, 11:57:03
hast du heute schon ein FHEM Update gemacht? Das hat erst danach funktioniert.
Ja, ein Update habe ich gemacht. Keine sind mehr verfügbar.
Zitat von: herrmannj am 26 März 2020, 11:20:41@yersinia
ja, würde als workaround funktionieren. Aber ich gehe dem Fehler bei Andy nach wenn ich den Fehler verstehe.
Hier der Workaround mit ISO3 Länderkürzel, wer weniger mag kann auch die ISO3 durch ISO2 ersetzen. Länderkürzel entsprechend abändern. es gibt ein weiteres Reading
_country, welches das Land aufnimmt.
Als Eingabe für das Attribut ReadingsList:
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_country'), property('country'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_cases'), property('cases'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayCases'), property('todayCases'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_active'), property('active'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_deaths'), property('deaths'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayDeaths'), property('todayDeaths'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_recovered'), property('recovered'));
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_casesPerOneMillion'), property('casesPerOneMillion'));
oder als Raw:
attr coronaSpread readingList multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_country'), property('country'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_cases'), property('cases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayCases'), property('todayCases'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_active'), property('active'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_deaths'), property('deaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_todayDeaths'), property('todayDeaths'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_recovered'), property('recovered'));;\
multi(jsonPath("\$.[?(\@.['countryInfo'].['iso3'] in ['DEU', 'CHN', 'CAN', 'NLD', 'GBR', 'ITA', 'ESP', 'FRA', 'USA'])]"), concat(property('countryInfo.iso3'), '_casesPerOneMillion'), property('casesPerOneMillion'));;
Dann ist mir egal, ob es
China oder
PRC oder
China, People Republic of ist. ;)
EDIT: ergibt Readings wie diese:
[...]
READINGS:
2020-03-26 14:25:00 CAN_active 3188
2020-03-26 14:25:00 CAN_cases 3409
2020-03-26 14:25:00 CAN_casesPerOneMillion 90
2020-03-26 14:25:00 CAN_country Canada
2020-03-26 14:25:00 CAN_deaths 36
2020-03-26 14:25:00 CAN_recovered 185
2020-03-26 14:25:00 CAN_todayCases 0
2020-03-26 14:25:00 CAN_todayDeaths 0
2020-03-26 14:25:00 CHN_active 3947
2020-03-26 14:25:00 CHN_cases 81285
2020-03-26 14:25:00 CHN_casesPerOneMillion 56
2020-03-26 14:25:00 CHN_country China
2020-03-26 14:25:00 CHN_deaths 3287
2020-03-26 14:25:00 CHN_recovered 74051
2020-03-26 14:25:00 CHN_todayCases 67
2020-03-26 14:25:00 CHN_todayDeaths 6
2020-03-26 14:25:00 DEU_active 35389
2020-03-26 14:25:00 DEU_cases 39572
2020-03-26 14:25:00 DEU_casesPerOneMillion 472
2020-03-26 14:25:00 DEU_country Germany
2020-03-26 14:25:00 DEU_deaths 224
2020-03-26 14:25:00 DEU_recovered 3959
2020-03-26 14:25:00 DEU_todayCases 2249
2020-03-26 14:25:00 DEU_todayDeaths 18
[...]
ISO Codes kann man sich aus der Quelle raussuchen oder Wikipedia (https://de.wikipedia.org/wiki/ISO-3166-1-Kodierliste) bemühen.
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
Hallo robin,
Gefällt mir. Aber schau mal den thread hier in Ruhe durch. Die hier erarbeitete Lösung ist vielseitiger, flexibler und umfangreicher.
vg
Joerg
Hallo Jörg,
ich hatte gestern deine Defimition aus dem 1. Thread probiert, und das hat soweit funktioniert.
Dann habe ich die Definition erweitert (mehr Länder und weitere Abfragen), bekomme dann aber keine neuen Readings, stattdessen einen log-Eintrag.
Meine raw-Definition:
defmod coronaSpread JsonMod https://corona.lmao.ninja/countries
attr coronaSpread interval */30 * * * *
attr coronaSpread 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'));;
Der log-Eintrag bei jeder Abfrage:
2020.03.27 03:00:00 3: IP: corona.lmao.ninja -> 104.18.36.204
2020.03.27 03:00:00 3: https://corona.lmao.ninja/countries: HTTP response code 200
2020.03.27 03:00:01 2: [coronaSpread] error while evaluating readingList: unbalanced square brackets in JsonPath filter: at .//FHEM/98_JsonMod.pm line 1276.
Kannst du schauen, ob ich ggf. was falsch verstanden habe?
Viele Grüße Gisbert
yepp. Vor UK fehlt das Hochkomma.
Hallo Jörg,
wollte gerade meinen Beitrag editieren, da mir das fehlende Hochkomma bei UK auch aufgefallen war. Damit bleiben die log-Einträge jetzt aus, aber neue Readings leider auch. Ich werde das bis morgen beobachten und melde mich dann ggf.
Vielen Dank und viele Grüße
Gisbert
Wer lesen kann ist im Vorteil, hier stand Mist. -.-
Bitte weiter scrollen. Danke.
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
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
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.
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
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.
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 :) :) :)
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.
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;
}
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
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)}
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
Such und finde eine JSON Quelle wo die Daten drin sind, dann helfe ich dir bei der Umsetzung. Robert Koch vielleicht?
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 (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 (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)
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
Zitat von: jnewton957 am 29 März 2020, 13:00:32
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
ich mache sowas immer über die "Raw definition". Das gibts in jedem Device ganz unten (zumindest bei mir). Ich bin mir aber gerade nich sicher, ob man dafür etwas im global- oder Web-Device hinterlegen muss.
Gib mir Mal bitte das list das 'lahm gelegt' hat
Nur zur Info: ich hab die Definition über das fette + eingefügt, da wurde nichts lahmgelegt.
so oder anders, da soll (und kann eigentlich) sowieso nichts lahmgelegt werden. Meine Vermutung dazu wäre auch dass das attribut dns server nicht gesetzt ist und es deswegen hing. Bevor ich das sage wollte ich das aber evaluieren und nachstellen. Wenn die Ursache wirklich _im_ JsonMod liegt will ich die beseitigen
Zitat von: Gisbert am 29 März 2020, 13:49:17
Nur zur Info: ich hab die Definition über das fette + eingefügt, da wurde nichts lahmgelegt.
was ist denn das fette "plus"?
Zitat von: herrmannj am 29 März 2020, 13:18:46
Gib mir Mal bitte das list das 'lahm gelegt' hat
das hat sich auf meine Definition der Landkreise bezogen: https://forum.fhem.de/index.php/topic,109413.msg1036195.html#msg1036195 (https://forum.fhem.de/index.php/topic,109413.msg1036195.html#msg1036195)
Zitat von: Andy89 am 29 März 2020, 13:58:11
was ist denn das fette "plus"?
Siehe hier https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Also das "Device" aus dem ersten Beitrag habe ich angelegt, die Readings werden auch sauber erzeugt, aber wie bekomme ich aus dem ganzen denn eine schöne tabellarische Ansicht?
Da bin ich aktuell überfordert.
Zur Info: für alle, bei denen sich das JsonMod Device seit gestern (ohne Fehlermeldung) nicht mehr aktualisiert, der Endpoint hat sich geändert.
Zitat{"message":"This endpoint has been deprecated. Use /v2/countries instead.","docs":"http://corona.lmao.ninja/docs"}
https://corona.lmao.ninja/countries (https://corona.lmao.ninja/countries)
Aus
define coronaSpread JsonMod https://corona.lmao.ninja/countries
wird dann
define coronaSpread JsonMod https://corona.lmao.ninja/v2/countries
(https://corona.lmao.ninja/docs/)
dies gilt auch für die Welt:
https://corona.lmao.ninja/v2/all
Einige userreadings können so nun auch durch die API ersetzt werden (active, critical, CasesPerMillion, TodayCases und TodayDeaths)
Hallo, habe mir ebenfalls diese Datei auf meine bevorzugten Kreise eingestellt, was funktioniert. Zusätzlich habe ich meine Quelle angepasst:
https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=OBJECTID,cases,deaths,cases_per_100k,cases_per_population,BL,BL_ID,county,cases7_per_100k,recovered,last_update,death_rate,GEN,EWZ&returnGeometry=false&outSR=4326&f=json (https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=OBJECTID,cases,deaths,cases_per_100k,cases_per_population,BL,BL_ID,county,cases7_per_100k,recovered,last_update,death_rate,GEN,EWZ&returnGeometry=false&outSR=4326&f=json)
Nun möchte ich die Werte für cases7_per_100k mit ausgeben, hier komme ich allerdings nicht weiter, sobald ich in readingList den entsprechenden Eintrag ergänze, passiert nichts.
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['340', '377'])]"), concat(property('attributes.county'),'_name'), property('attributes.county'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['340', '377'])]"), concat(property('attributes.county'),'_cases'), property('attributes.cases'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['340', '377'])]"), concat(property('attributes.county'),'_deaths'), property('attributes.deaths'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['340', '377'])]"), concat(property('attributes.county'),'_cp100k'), (property('attributes.cases_per_100k'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['340', '377'])]"), concat(property('attributes.county'),'_cp7100k'), (property('attributes.cases7_per_100k')));
Gruß Ainadilion
Zitat von: Andy89 am 29 März 2020, 12:34:17
dort habe ich relativ ausführlich beschrieben, wie ich Bundesländer integriert habe: https://forum.fhem.de/index.php/topic,109490.msg1035351.html#msg1035351 (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 (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)
soweit ich sehe ist die 'Klammersetzung' falsch
Hallo zusammen,
ich könnte Eure Hilfe gut gebrauchen...
Ich habe versucht das Thema nachzubauen, komme nun aber nun gar nicht mehr weiter.
Ich habe folgende Definitionen gemacht:
defmod corona 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 corona DbLogExclude .*
attr corona interval */15 * * * *
attr corona readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.county'),'_name'), property('attributes.county'));;
attr corona room xx System
setstate corona 2020-05-23 20:18:28 _name
Die Seite wird laut Log auch sauber abgerufen HTTP response code 200
aber das Reading bleibt leer ( _name 2020-05-23 20:30:00)
Vielleicht hat jemand eine Idee, wo der Fehler liegt
Viele Grüße
Martin
Zitat von: Sticks65 am 23 Mai 2020, 20:38:38
Hallo zusammen,
ich könnte Eure Hilfe gut gebrauchen...
Ich habe versucht das Thema nachzubauen, komme nun aber nun gar nicht mehr weiter.
Ich habe folgende Definitionen gemacht:
defmod corona 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 corona DbLogExclude .*
attr corona interval */15 * * * *
attr corona readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.county'),'_name'), property('attributes.county'));;
attr corona room xx System
setstate corona 2020-05-23 20:18:28 _name
Die Seite wird laut Log auch sauber abgerufen HTTP response code 200
aber das Reading bleibt leer ( _name 2020-05-23 20:30:00)
Vielleicht hat jemand eine Idee, wo der Fehler liegt
Viele Grüße
Martin
Ich sehe am Ende deines defmod ein "\". Ist bei mir dort nicht...
Zitat von: somansch am 23 Mai 2020, 22:44:38
Ich sehe am Ende deines defmod ein "\". Ist bei mir dort nicht...
Ja, hatte sich am Ende ,,eingeschlichen" ;)
Funktioniert aber auch ohne leider nicht
Grüße
Martin
Vielleicht kann er aus SK Freiburg i.Breisgau oder LK Lörrach kein Reading mit _name generieren. Versuch mal, ob dir dieses readingList immerhin den county namen basierend auf der object ID liefert:
attr corona readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));;
Das funktioniert zumindest bei mir ganz gut.
Ich finde Readings basierend auf veränderlichen Texten immer problematisch. Eine id ist zwar weniger intuitiv, aber dafür eineindeutig.
Zitat von: yersinia am 24 Mai 2020, 14:05:55
Vielleicht kann er aus SK Freiburg i.Breisgau oder LK Lörrach kein Reading mit _name generieren. Versuch mal, ob dir dieses readingList immerhin den county namen basierend auf der object ID liefert:
Hallo yersinia,
nein, dass funktioniert leider auch nicht.
Das Readings erhält zwar einen neuen Zeitstempel aber es bleibt bei " _name ".
Zitat von: Sticks65 am 24 Mai 2020, 16:40:51Das Readings erhält zwar einen neuen Zeitstempel aber es bleibt bei " _name ".
Hast du das Device nochmals geöffnet (JsonMod Devices aktualisieren sich nicht immer sofort) oder die 15 Minuten deines Intervals abgewartet?
Dann muss es an deiner FHEM Installation oder an deiner Internet-Verbindung liegen. Ich kann es bei mir nachstellen und ich erhalte Ergebnisse.
Welche Version von JsonMod nutzt du? Ein list deines Devices hilft auch.
Kannst du den Link aus der DEF (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) mit deinem Browser öffnen? Wenn ja, such mal nach
"OBJECTID":204 und
"OBJECTID":212 - kannst du diese finden?
Anbei ein RAW wie es bei mir funktioniert:
defmod corona 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 corona DbLogExclude .*
attr corona event-on-update-reading .computedReadings
attr corona interval */15 * * * *
attr corona readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.cases'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.deaths'));;
attr corona room xx System
attr corona 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,"204_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"204_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"204_deaths","-")." Tote</font><br \/>";;\
$ret .= ReadingsVal($name,"212_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"212_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"212_deaths","-")." Tote</font>";;\
$ret .= "</div>";;\
return $ret;;}
attr corona update-on-start 1
Halllo yersinia,
vielen Dank für Deinen Einsatz :)
Zitat von: yersinia am 24 Mai 2020, 19:30:31
Hast du das Device nochmals geöffnet (JsonMod Devices aktualisieren sich nicht immer sofort) oder die 15 Minuten deines Intervals abgewartet?
Ja, ich habe das Device nochmals geöffnet, und auch den Intervall abgewartet. Der Zeitstempel des Readings wird auch aktualisiert.
Zitat von: yersinia am 24 Mai 2020, 19:30:31
Welche Version von JsonMod nutzt du? Ein list deines Devices hilft auch.
list corona:
Internals:
API_LAST_RES 1590427195.97553
CFGFN
DEF 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
FUUID 5ecbfde9-f33f-5b4a-1537-58e9ae13217c70a4
NAME corona
NEXT 2020-05-25 19:30:00
NR 61931
NTFY_ORDER 50-corona
SOURCE 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 (200)
STATE ???
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE 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
SECRET:
READINGS:
2020-05-25 19:19:56 _name
Attributes:
DbLogExclude .*
interval */15 * * * *
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));
room xx System
Zitat von: yersinia am 24 Mai 2020, 19:30:31
Kannst du den Link aus der DEF (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) mit deinem Browser öffnen?
Ja, den kann ich öffnen und ich finde auch
"OBJECTID":204 und
"OBJECTID":212Zitat von: yersinia am 24 Mai 2020, 19:30:31
Anbei ein RAW wie es bei mir funktioniert
Ich habe dein RAW bei mir versucht. Da erhalte ich auch nichts brauchbares. :(
Das "attr corona update-on-start 1" musste ich entfernen, da es bei mir auf Fehler läuft.
"update-on-start" ist bei mir als Attribut nicht vorhanden... (Doch ein Versionsproblem?)
Hier das "list corona" mit deinem RAW:
Internals:
API_LAST_RES 1590428472.36368
CFGFN
CHANGED
DEF 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
FUUID 5ecbfde9-f33f-5b4a-1537-58e9ae13217c70a4
NAME corona
NEXT 2020-05-25 19:45:00
NR 61931
NTFY_ORDER 50-corona
SOURCE 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 (200)
STATE <div style="text-align: left;">last <a href="https://corona.rki.de" title="RKI CoViD19" rel="noopener noreferrer" target="_blank">RKI CoViD-19</a> check => 01.01. 00:00<br />-: <font style="color:orange;font-weight:bold;">- Fälle</font> & <font style="color:red;font-weight:bold;">- Tote</font><br />-: <font style="color:orange;font-weight:bold;">- Fälle</font> & <font style="color:red;font-weight:bold;">- Tote</font></div>
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE 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
SECRET:
READINGS:
2020-05-25 19:41:12 _cases
2020-05-25 19:41:12 _deaths
2020-05-25 19:41:12 _name
Attributes:
DbLogExclude .*
event-on-update-reading .computedReadings
interval */15 * * * *
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.cases'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['204', '212'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.deaths'));
room xx System
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,"204_name","-").": <font style=\"color:orange;font-weight:bold;\">".ReadingsVal($name,"204_cases","-")." Fälle</font> & ";
$ret .= "<font style=\"color:red;font-weight:bold;\">".ReadingsVal($name,"204_deaths","-")." Tote</font><br \/>";
$ret .= ReadingsVal($name,"212_name","-").": <font style=\"color:orange;font-weight:bold;\">".ReadingsVal($name,"212_cases","-")." Fälle</font> & ";
$ret .= "<font style=\"color:red;font-weight:bold;\">".ReadingsVal($name,"212_deaths","-")." Tote</font>";
$ret .= "</div>";
return $ret;}
Grüße Martin
ist jsonmod aktuell? -> update
wie herrmannj sagt, zeig mal deine JsonMod Version.
version JsonMod
Aktuelle Version ist
Zitat98_JsonMod.pm 21711 2020-04-17 23:29:22Z herrmannj
... ist nicht die aktuellste :(
File Rev Last Change
98_JsonMod.pm 21477 2020-03-22 03:57:31Z herrmannj
doif.js 15546 2017-12-03 09:57:42Z Ellert
fhemweb.js 21316 2020-02-29 20:24:41Z rudolfkoenig
fhemweb_readingsGroup.js 15189 2017-10-03 17:53:27Z justme1968
kann ich nur die 98_JsonMod.pm updaten, oder muss ich generell ein "Update" machen?
Was spricht gegen ein komplettes Update? So hast du ein aktuelles FHEM.
Ansonsten:
update 98_JsonMod.pm
(nach commandref (https://fhem.de/commandref_DE.html#update):
Zitatupdate [-noSSL] [<fileName>|all|check|checktime|force] [http://.../controlfile]
[...]
Falls man <fileName> spezifiziert werden nur die Dateien heruntergeladen, die diesem Regexp entsprechen.
)
:D vielen Dank !!
Ich habe das aktuelle Modul eingespielt.
Es funktioniert nun auch bei mir.
Nun komm ich auch weiter...
Vielen Dank yersinia und herrmannj für Eure Hilfe
Viele Grüße und einen schönen Abend
Hallo,
Mir gelingt es nicht die Ergebnisse in ein Logfile zu schreiben!
Generiert JsonMod keine Events?
Modul JsonMod
98_JsonMod.pm 21711 2020-04-17 23:29:22Z herrmannj
FHEM-Version
System Info
ConfigType: configFile
SVN rev: 22178
OS: linux
Perl: 5.24.1
uniqueId: cbb...
list FileLog_CORONA
Internals:
DEF ./log/FileLog_CORONA-%Y-%m.log CORONA:.*|169_cases:.*|169_deaths:.*|169_name:.*
FD 11
FUUID 5edd1d95-f33f-1aca-d2aa-cad4f690b3d07848
NAME FileLog_CORONA
NR 474
NTFY_ORDER 50-FileLog_CORONA
REGEXP CORONA:.*|169_cases:.*|169_deaths:.*|169_name:.*
STATE active
TYPE FileLog
currentlogfile ./log/CORONA-2020-06.log
logfile ./log/CORONA-%Y-%m.log
READINGS:
2020-06-25 23:07:33 linesInTheFile 0
Attributes:
logtype text
room xx System
Viele Grüße
Zitat von: Hardy62 am 26 Juni 2020, 16:53:07
Hallo,
Mir gelingt es nicht die Ergebnisse in ein Logfile zu schreiben!
Generiert JsonMod keine Events?
Doch, solange einige Readings aktualisiert werden. Wie sieht ein "list" deines CORONA Devices aus?
Hallo
Internals:
API_LAST_RES 1593259200.53522
API__LAST_MSG 200
DEF 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
FUUID 5ef5feba-f33f-1aca-a624-6f396448490d8ae3
NAME CORONA
NEXT 2020-06-27 14:59:00
NOTIFYDEV global
NR 498
NTFY_ORDER 50-CORONA
SOURCE 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 (200)
STATE <div style="text-align: left;">last <a href="https://corona.rki.de" title="RKI CoViD19" rel="noopener noreferrer" target="_blank">RKI CoViD-19</a> check => 27.06. 14:00<br />SK Worms: <font style="color:orange;font-weight:bold;">224 Fälle</font> & <font style="color:red;font-weight:bold;">7 Tote</font><br />LK Alzey-Worms: <font style="color:orange;font-weight:bold;">271 Fälle</font> & <font style="color:red;font-weight:bold;">11 Tote</font></div>
SVN 21711 2020-04-17 23:29:22 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE 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
READINGS:
2020-06-27 14:00:00 167_cases 224
2020-06-27 14:00:00 167_deaths 7
2020-06-27 14:00:00 167_name SK Worms
2020-06-27 14:00:00 169_cases 271
2020-06-27 14:00:00 169_deaths 11
2020-06-27 14:00:00 169_name LK Alzey-Worms
Attributes:
event-on-update-reading .computedReadings
interval */59 * * * *
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['167', '169'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['167', '169'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.cases'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['167', '169'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.deaths'));
room xx System
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,"167_name","-").": <font style=\"color:orange;font-weight:bold;\">".ReadingsVal($name,"167_cases","-")." Fälle</font> & ";
$ret .= "<font style=\"color:red;font-weight:bold;\">".ReadingsVal($name,"167_deaths","-")." Tote</font><br \/>";
$ret .= ReadingsVal($name,"169_name","-").": <font style=\"color:orange;font-weight:bold;\">".ReadingsVal($name,"169_cases","-")." Fälle</font> & ";
$ret .= "<font style=\"color:red;font-weight:bold;\">".ReadingsVal($name,"169_deaths","-")." Tote</font>";
$ret .= "</div>";
return $ret;}
update-on-start 1
verbose 5
Viele Grüße Hardy
Hallo Hardy,
versuche mal:
event-on-update-reading .*
Viele Grüße
Andreas
Hallo Andreas,
Dank Dir!
Habs gleich ausprobiert - bei der Eingabe wurde im Webfrontend gleich vorgeschlagen "computedReadings"
Hab das mal gleich verwendet und beobachte!
Wenn sich nix tut verwende ich dann deinen Vorschlag mit ".*"
Viele Grüße Hardy
Hallo Andreas,
Du hattest ja soooo recht!
attr CORONA event-on-update-reading .*
hast das Problem bei mir gelöst.
Ich habe noch einen weiteren Landkreis in die Selektion mit hinzugekommen...
(Damit ich nicht warten muss, bis bei uns die Fallzahlen hochgehen)
Ein herzliches Dankeschön und ein schönes Wochenende
Viele Grüße Hardy
Hi zusammen,
mit dem Feld cases7_per_100k komme ich am besten klar, es wird ja auch von den Regierungen zur Steuerung benutzt.
Für die hessischen Landkreise bekomme ich den Wert ziemlich einfach raus:
https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=BL_ID%3D6&outFields=cases7_per_100k,county,last_update,OBJECTID&returnGeometry=false&outSR=4326&f=json
Gibt es dieses Feld auch für ein ganzes Bundesland oder für ganz Deutschland?
Falls nicht, gibt es so etwas wie eine avg() Funktion wie in dieser Java-Implementierung? https://github.com/json-path/JsonPath
Dann könnte ich es recht einfach in dem Modul berechen...
VG,
Alex
Nein, der jsonpath kann noch keine Aggregat Funktionen. Ist geplant aber ich bin anderweitig ausgelastet und kann keinen Termin nennen
Zitat von: All-Ex am 29 Juni 2020, 18:11:52Falls nicht, gibt es so etwas wie eine avg() Funktion wie in dieser Java-Implementierung? https://github.com/json-path/JsonPath
Dann könnte ich es recht einfach in dem Modul berechen...
Zitat von: herrmannj am 29 Juni 2020, 18:35:37
Nein, der jsonpath kann noch keine Aggregat Funktionen. Ist geplant aber ich bin anderweitig ausgelastet und kann keinen Termin nennen
Ich habe es in die JsonMod Wunschliste (https://forum.fhem.de/index.php/topic,111489) eingetragen. ;)
Super, Danke :D
Hello everybody,
I have to read the last and next to last element of an array.
I try to read this simple URL:
https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json (https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json)
If I use the normal JSONPath syntax:
$.[(@. length-1)].tamponi
or
$.[-1:].tamponi
I get nothing, while the syntax (for example):
$.[100].tamponi
is accepted and I get a value (the 100th element of the array).
How do I need to modify jsonPath to get a read?
This is the raw of my current code with some test reads:
Internals:
API_LAST_RES 1601018514.07323
API__LAST_MSG 200
DEF https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json
FUUID 5f6d12f4-f33f-ab34-7552-ffefc7e612223927
NAME coronaSpread
NOTIFYDEV global
NR 128
NTFY_ORDER 50-coronaSpread
SOURCE https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json (200)
STATE ???
SVN 22651 2020-08-23 11:25:52 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json
OLDREADINGS:
READINGS:
2020-09-25 09:21:54 data 2020-02-24T18:00:00
2020-09-25 09:21:54 tamponi 4324
Attributes:
interval 0 12 * * *
readingList single(jsonPath('$..data'), 'data', 'none');
single(jsonPath('$..tamponi'), 'tamponi', 'none');
single(jsonPath('$.[-1:].tamponi), 'last_tamponi', 'none');
room 99 System
update-on-start 1
Finally, I apologize for my post in english with Google Translate but I write from Italy and don't know german.
Hi Xavier,
I wrote the JSONPath implementation, (there was none) but it is not 100 percent feature complete (now).
The first of your two examples are some rare features, its simply not implemented (for now). Lets do it this way: I seek to implement the second syntax next (I cannot promise to do that within a minute, planned leave ahead).
$.[-1:].tamponi
does that work for you?
saluti all'Italia
Joerg
As interim solution, you could extract just tamponi and data with a kind of index:
multi(jsonPath('$.[*]'), concat('tamponi_', count()), property('.tamponi'));
multi(jsonPath('$.[*]'), concat('data_', count()), property('.data'));
You then may use a user reading to get the latest array (the one with the biggest index ;)).
If implemented, this should work out to get last two array elements:
multi(jsonPath('$.[-2:]'), concat('tamponi_', count()), property('.tamponi'));
Btw, For JsonPath testing I use https://jsonpath.curiousconcept.com (https://jsonpath.curiousconcept.com).
@herrmannj: I assumed you have implemented Stefan Goessners JsonPath implementation?
Zitat von: herrmannj am 25 September 2020, 10:06:39
I wrote the JSONPath implementation, (there was none) but it is not 100 percent feature complete (now).
Wow, very fast reply!
Zitat von: herrmannj am 25 September 2020, 10:06:39I seek to implement the second syntax next (I cannot promise to do that within a minute, planned leave ahead).
$.[-1:].tamponi
Implementing this feature would be wonderful. I'm waiting.
Last minute addition: Thanks @yersinia for his suggestions. Now I try.
Best regards.
Regarding readings in ascending order, these readingList definition would be better (index first) imho:
multi(jsonPath('$.[*]'), concat(count(), '_tamponi'), property('.tamponi'));
multi(jsonPath('$.[*]'), concat(count(), '_data'), property('.data'));
Zitat@herrmannj: I assumed you have implemented Stefan Goessners JsonPath implementation?
yes, but goessner sets the standard syntax and all implementations follow that (more or less;)). I do tests against the goessner files.
Zitat von: yersinia am 25 September 2020, 11:09:01
Regarding readings in ascending order, these readingList definition would be better (index first) imho:
multi(jsonPath('$.[*]'), concat(count(), '_tamponi'), property('.tamponi'));
multi(jsonPath('$.[*]'), concat(count(), '_data'), property('.data'));
@yersinia: Hi, I tried your suggestion. It works, but it fills me with hundreds (!) of readings: today we got to 215. A bit excessive, imho. :)
I can wait the herrmannj's code revision, just to have a more clean solution.
Best regards,
xavier.
Zitat von: xavier am 28 September 2020, 12:51:07@yersinia: Hi, I tried your suggestion. It works, but it fills me with hundreds (!) of readings: today we got to 215. A bit excessive, imho. :)
Yes this was just an interim solution
proposal.
Zitat von: yersinia am 25 September 2020, 10:40:21
As interim solution, you could extract just tamponi and data with a kind of index:
multi(jsonPath('$.[*]'), concat(count(), '_tamponi'), property('.tamponi'));
multi(jsonPath('$.[*]'), concat(count(), '_data'), property('.data'));
You then may use a user reading to get the latest array (the one with the biggest index ;)).
If implemented, this should work out to get last two array elements:
multi(jsonPath('$.[-2:]'), concat(count(), '_tamponi'), property('.tamponi'));
;)
Hi,
since the jsonMod update is still pending, I tried an intermediate solution.
Would it be possible to add the contents of $yday into the jsonPath?
I'll explain... the ideal solution would be:
$.[-1:].tamponi
but at the moment it still can't be done.
So, my alternative is to calculate how many days have passed since the beginning of the year minus a certain value and insert it into the formula. For example to get today's tampons only (12/10/2020), it works like this:
concat('$.[',230,'].tamponi')
If 230 could be calculated as $yday-55, a formula like this would work every day:
concat('$.',{$yday-55},'. tamponi')
Unfortunately I don't know enough to get a correct value from $yday.
Can someone help me?
Attached raw full code.
Internals:
API_LAST_RES 1602537319.73396
API__LAST_MSG 200
DEF https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json
FUUID 5f6d12f4-f33f-ab34-7552-ffefc7e612223927
NAME coronaSpread
NEXT 2020-10-13 17:10:00
NR 131
SOURCE https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json (200)
STATE ???
SVN 22854 2020-09-26 01:09:01 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json
SECRET:
READINGS:
2020-10-12 23:15:19 corona_index 5.41
2020-10-12 23:15:19 data_last 2020-10-12T17:00:00
2020-10-12 23:15:19 data_prev 2020-10-11T17:00:00
2020-10-12 23:15:19 deceduti_diff 39
2020-10-12 23:15:19 deceduti_last 36205
2020-10-12 23:15:19 deceduti_prev 36166
2020-10-12 23:15:19 nuovi_positivi_diff -837
2020-10-12 23:15:19 nuovi_positivi_last 4619
2020-10-12 23:15:19 nuovi_positivi_prev 5456
2020-10-12 23:15:19 tamponi_diff 85442
2020-10-12 23:15:19 tamponi_last 12650155
2020-10-12 23:15:19 tamponi_prev 12564713
2020-10-12 23:15:19 terapia_intensiva_diff 32
2020-10-12 23:15:19 terapia_intensiva_last 452
2020-10-12 23:15:19 terapia_intensiva_prev 420
Attributes:
comment 286 = days from the beginning of the year
interval 10 17 * * *
readingList single(jsonPath(concat('$.[',286-55,'].data')), 'data_last', 'none');
single(jsonPath(concat('$.[',286-56,'].data')), 'data_prev', 'none');
single(jsonPath(concat('$.[',286-55,'].nuovi_positivi')), 'nuovi_positivi_last', 'none');
single(jsonPath(concat('$.[',286-56,'].nuovi_positivi')), 'nuovi_positivi_prev', 'none');
single(jsonPath(concat('$.[',286-55,'].deceduti')), 'deceduti_last', 'none');
single(jsonPath(concat('$.[',286-56,'].deceduti')), 'deceduti_prev', 'none');
single(jsonPath(concat('$.[',286-55,'].terapia_intensiva')), 'terapia_intensiva_last', 'none');
single(jsonPath(concat('$.[',286-56,'].terapia_intensiva')), 'terapia_intensiva_prev', 'none');
single(jsonPath(concat('$.[',286-55,'].tamponi')), 'tamponi_last', 'none');
single(jsonPath(concat('$.[',286-56,'].tamponi')), 'tamponi_prev', 'none')
room 99 System
update-on-start 1
userReadings nuovi_positivi_diff {ReadingsVal("coronaSpread","nuovi_positivi_last","")-ReadingsVal("coronaSpread","nuovi_positivi_prev","")},
deceduti_diff {ReadingsVal("coronaSpread","deceduti_last","")-ReadingsVal("coronaSpread","deceduti_prev","")},
terapia_intensiva_diff {ReadingsVal("coronaSpread","terapia_intensiva_last","")-ReadingsVal("coronaSpread","terapia_intensiva_prev","")},
tamponi_diff {ReadingsVal("coronaSpread","tamponi_last","")-ReadingsVal("coronaSpread","tamponi_prev","")},
corona_index {sprintf("%.2f",(ReadingsVal("coronaSpread","nuovi_positivi_last","") * 100) / ReadingsVal("coronaSpread","tamponi_diff",""))}
Best regards,
xavier.
Hey xavier,
Just an idea, do not know if it works: maybe it is possible when you utilize myUtils with some perl code to update
Attribute readingList of the device and initiate a reload.
The myUtils German wiki entry: https://wiki.fhem.de/wiki/99_myUtils_anlegen (https://wiki.fhem.de/wiki/99_myUtils_anlegen) (within FHEM -> left hand navigation 'Edit files' -> there should be a
99_myUtils.pm editable via mouse click)
Add an own sub here to calculate day of the year (https://perldoc.perl.org/functions/localtime)
Zitat$yday is the day of the year, in the range 0..364 (or 0..365 in leap years.)
and update Attribute via fhem command like (not tested)
fhem("attr coronaSpread readingList single(jsonPath(concat('$.[',".($yday-55).",'].data')), 'data_last', 'none');");
or similar.
As said, no idea if this will work but may worth a try.
Zitat von: yersinia am 13 Oktober 2020, 10:01:28
Just an idea, do not know if it works: maybe it is possible when you utilize myUtils...[cut]
You are a genius !! :)
The solution is really simple. Thanks to your suggestions I have inserted this short code in 99_myUtils.pm:
sub yday(){
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
return $yday;
}
and slightly modified my define in fhem.cfg:
define coronaSpread JsonMod https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json
attr coronaSpread interval 10 17 * * *
attr coronaSpread comment yday() = days from the beginning of the year
attr coronaSpread readingList single(jsonPath(concat('$.[',yday()-54,'].data')), 'data_last', 'none');;\
single(jsonPath(concat('$.[',yday()-55,'].data')), 'data_prev', 'none');;\
single(jsonPath(concat('$.[',yday()-54,'].nuovi_positivi')), 'nuovi_positivi_last', 'none');;\
single(jsonPath(concat('$.[',yday()-55,'].nuovi_positivi')), 'nuovi_positivi_prev', 'none');;\
single(jsonPath(concat('$.[',yday()-54,'].deceduti')), 'deceduti_last', 'none');;\
single(jsonPath(concat('$.[',yday()-55,'].deceduti')), 'deceduti_prev', 'none');;\
single(jsonPath(concat('$.[',yday()-54,'].terapia_intensiva')), 'terapia_intensiva_last', 'none');;\
single(jsonPath(concat('$.[',yday()-55,'].terapia_intensiva')), 'terapia_intensiva_prev', 'none');;\
single(jsonPath(concat('$.[',yday()-54,'].tamponi')), 'tamponi_last', 'none');;\
single(jsonPath(concat('$.[',yday()-55,'].tamponi')), 'tamponi_prev', 'none')
attr coronaSpread room 99 System
attr coronaSpread update-on-start 1
attr coronaSpread userReadings nuovi_positivi_diff {ReadingsVal("coronaSpread","nuovi_positivi_last","")-ReadingsVal("coronaSpread","nuovi_positivi_prev","")},\
deceduti_diff {ReadingsVal("coronaSpread","deceduti_last","")-ReadingsVal("coronaSpread","deceduti_prev","")},\
terapia_intensiva_diff {ReadingsVal("coronaSpread","terapia_intensiva_last","")-ReadingsVal("coronaSpread","terapia_intensiva_prev","")},\
tamponi_diff {ReadingsVal("coronaSpread","tamponi_last","")-ReadingsVal("coronaSpread","tamponi_prev","")},\
corona_index {sprintf("%.2f",(ReadingsVal("coronaSpread","nuovi_positivi_last","") * 100) / ReadingsVal("coronaSpread","tamponi_diff",""))}
Now until December 31st ;) I will finally be able to extract all the data I needed.
A sincere THANK YOU for your help.
Best regards,
xavier.
Awesome, even easier than I was thinking of. :D Thanks for sharing!
Zitat von: All-Ex am 29 Juni 2020, 18:11:52
Feld cases7_per_100k ...
Für die hessischen Landkreise bekomme ich den Wert ziemlich einfach raus:
https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=BL_ID%3D6&outFields=cases7_per_100k,county,last_update,OBJECTID&returnGeometry=false&outSR=4326&f=json
Issjamalcool:
Mit BL_ID kann man die URL hacken, die 15 ist Sachsen-Anhalt. Sehr fein.
Zitat von: All-Ex am 29 Juni 2020, 18:11:52
Feld cases7_per_100k
Das Ganze wäre ja für Bund sowie eigenes Bundesland auch noch ganz schön - hat da jemand schon URLs gehackt?
Zitat von: All-Ex am 29 Juni 2020, 18:11:52
Gibt es dieses Feld auch für ein ganzes Bundesland oder für ganz Deutschland?
Ach - da fragst Du es ja selbst, @All-Ex
Ok, wie weit seid ihr?
Und - jede Art von Code-Vorschlägen für FHEM-Web sowie FTUI sind willkommen!
Zitat von: curt am 19 Oktober 2020, 04:27:49Das Ganze wäre ja für Bund sowie eigenes Bundesland auch noch ganz schön - hat da jemand schon URLs gehackt?
Hier ein Beispiel für 2 Bundesländer, Suche geht über Text.
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 .computedReadings
attr coronaSpreadDE interval 9 */3 * * *
attr coronaSpreadDE readingList multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hessen', 'Bayern'])]"), concat(count(),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hessen', 'Bayern'])]"), concat(count(),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hessen', 'Bayern'])]"), concat(count(),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Hessen', 'Bayern'])]"), concat(count(),'_lastUpdate'), property('attributes.Aktualisierung'));;
attr coronaSpreadDE 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,"0_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"0_lastUpdatedh","-").")<br \/>";;\
$ret .= ReadingsVal($name,"1_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"1_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"1_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"1_lastUpdatedh","-").")";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadDE update-on-start 1
attr coronaSpreadDE userReadings 0_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"0_lastUpdate",0)/1000));;}, 1_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"1_lastUpdate",0)/1000));;}
attr coronaSpreadDE webCmd reread
Und noch einmal für Landkreise (via OBJECTID, 68=SK Mönchengladbach, 292=LK Weißenburg-Gunzenhausen):
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 ['68', '292'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.county'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['68', '292'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.cases'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['68', '292'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.deaths'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['68', '292'])]"), 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,"68_name","-").": ";;\
$ret .= "<font style=\"font-weight:bold;;color:";;\
if(ReadingsNum($name,"68_cases7_per_100k",0) < 35) {\
$ret .= "green";;\
} elsif (ReadingsNum($name,"68_cases7_per_100k",0) < 50) {\
$ret .= "orange";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\">".sprintf("%.1f", ReadingsNum($name,"68_cases7_per_100k",0))."</font> ;&; ;";;\
$ret .= "<font style=\"color:orange;;\">".ReadingsVal($name,"68_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;\">".ReadingsVal($name,"68_deaths","-")." Tote</font><br \/>";;\
$ret .= ReadingsVal($name,"292_name","-").": ";;\
$ret .= "<font style=\"font-weight:bold;;color:";;\
if(ReadingsNum($name,"292_cases7_per_100k",0) < 35) {\
$ret .= "green";;\
} elsif (ReadingsNum($name,"292_cases7_per_100k",0) < 50) {\
$ret .= "orange";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\">".sprintf("%.1f", ReadingsNum($name,"292_cases7_per_100k",0))."</font> ;&; ;";;\
$ret .= "<font style=\"color:orange;;\">".ReadingsVal($name,"292_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;\">".ReadingsVal($name,"292_deaths","-")." Tote</font>";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadCounties update-on-start 1
attr coronaSpreadCounties webCmd reread
Zitat von: curt am 02 Januar 1970, 21:31:47Und - jede Art von Code-Vorschlägen für FHEM-Web sowie FTUI sind willkommen!
Dieser Thread ist voll damit...
FHEMWEB -> #48 (https://forum.fhem.de/index.php/topic,109413.msg1035075.html#msg1035075), #50 (https://forum.fhem.de/index.php/topic,109413.msg1035081.html#msg1035081), #84 (https://forum.fhem.de/index.php/topic,109413.msg1035304.html#msg1035304)
FTUI -> #17 (https://forum.fhem.de/index.php/topic,109413.msg1034454.html#msg1034454), #29 (https://forum.fhem.de/index.php/topic,109413.msg1034746.html#msg1034746)
Hallo yersinia,
sehr interessantes Beispiel, welches auf Anhieb funktioniert.
Darf ich noch eine Bitte äußern?
Ich hätte gerne den 7-Tage-Inzidenz-Wert in der Aufstellung, allerdings gelingt mir das mit der angehängten Definition nicht. Ich habe cases7_per_100k ergänzt, aber ohne Erfolg. Sieh mir bitte nach, dass ich außer über copy-and-paste den Inhalt nicht wirklich durchdringe.
defmod coronaSpreadNRW 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,cases7_per_100k,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadNRW event-on-update-reading .computedReadings
attr coronaSpreadNRW interval 9 */3 * * *
attr coronaSpreadNRW readingList multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_lastUpdate'), property('attributes.Aktualisierung'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_cases7_per_100k'), property('attributes.cases7_per_100k'));;
attr coronaSpreadNRW room Corona
attr coronaSpreadNRW 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,"0_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"0_lastUpdatedh","-").")<br \/>";;\
$ret .= ReadingsVal($name,"1_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"1_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"1_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"1_lastUpdatedh","-").")";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadNRW update-on-start 1
attr coronaSpreadNRW userReadings 0_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"0_lastUpdate",0)/1000));;}, 1_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"1_lastUpdate",0)/1000));;}
attr coronaSpreadNRW webCmd reread
Kannst du mal reinschauen?
Viele Grüße Gisbert
Was die Quelle nicht hergibt....
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,
cases7_per_100k,Death&returnGeometry=false&outSR=4326&f=json (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,cases7_per_100k,Death&returnGeometry=false&outSR=4326&f=json) führt zu
Zitat{"error":{"code":400,"message":"Cannot perform query. Invalid query parameters.","details":["Unable to perform query. Please check your parameters."]}}
Der oben verwendete Link (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) hat keine Inzidenz in dieser Form mWn, allerdings ein Datenfeld faelle_100000_EW was für Fälle/100.000 EW steht - im Unterschied zur Inzidenz ist der zeitliche Faktor nicht einberechnet.
Entweder andere, mir derzeit nicht bekannte, Quelle für Inzidenz auf Bundesland-Ebene verwenden oder die Inzidenz der Kommunen nutzen (https://forum.fhem.de/index.php/topic,113798.0.html). Das RKI scheint Ersteres nicht zur Verfügung zu stellen (warum auch?). Vielleicht kennt jmd anders eine andere Quelle?Das ist falsch, siehe #155 (https://forum.fhem.de/index.php/topic,109413.msg1093770.html#msg1093770).
Hallo yersinia,
das kann ich natürlich verstehen, was mich aber zur Frage führt, woher weiß man, bzw. du, dass diese Abfragen (Fallzahl,Aktualisierung,faelle_100000_EW,Death) und eventuell sonst keine verfügbar sind.
Kannst du mich darüber informieren?
Leider führt mich mein trial-and-error-Ansatz bei der Suche nach Abfragen nicht zu einem Ergebnis.
Viele Grüße Gisbert
Ich habe die Informationen hier aus dem Forum, freundlicherweise von herrmannj (https://forum.fhem.de/index.php?action=profile;u=769) zusammengetragen - siehe #1 hier (https://forum.fhem.de/index.php/topic,109413.msg1034048.html#msg1034048) und 7 Tage Inzidenz Thread (https://forum.fhem.de/index.php/topic,113798.0.html).
Wenn man im Netz ein bisschen Sucht findet man aber auch dies hier inkl. API Beschreibung:
RKI Corona Bundesländer (https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/ef4b445a53c1406892257fe63129a8ea_0)
RKI Corona Landkreise (https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0)
Und wenn man die API liest, dann ist meine Aussage falsch bezgl der Inzidenz auf BL ebene, es ist nur ein anderes feld: cases7_bl_per_100k. ::) Es müsste bei dir dann ungefähr so aussehen:
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,cases7_bl_per_100k,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadDE event-on-update-reading .computedReadings
attr coronaSpreadDE interval 9 */3 * * *
attr coronaSpreadDE readingList multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_cases_per_100k'), property('attributes.faelle_100000_EW'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_cases7_bl_per_100k'), property('attributes.cases7_bl_per_100k'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Nordrhein-Westfalen'])]"), concat(count(),'_lastUpdate'), property('attributes.Aktualisierung'));;
attr coronaSpreadDE room Corona
attr coronaSpreadDE 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,"0_name","-").": ;";;\
$ret .= "<font style=\"font-weight:bold;;color:";;\
if(ReadingsNum($name,"0_cases7_bl_per_100k",0) < 35) {\
$ret .= "green";;\
} elsif (ReadingsNum($name,"0_cases7_bl_per_100k",0) < 50) {\
$ret .= "orange";;\
} else {\
$ret .= "red";;\
}\
$ret .= ";;\">".sprintf("%.1f", ReadingsNum($name,"0_cases7_bl_per_100k",0))."</font> ;&; ;";;\
$ret .= "<font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"0_lastUpdatedh","-").")";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadDE update-on-start 1
attr coronaSpreadDE userReadings 0_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"0_lastUpdate",0)/1000));;}
attr coronaSpreadDE webCmd reread
Daten zu Staaten gibt es unter disease.sh (https://disease.sh/docs/).
EDIT: Code optimiert
@yersinia
Ich weiß, dass Du genervt warst, man hörte es heraus.
Aber Du hast dann selbstlos Zeit von Deiner persönlichen Lebenszeit genommen, den Stand der Diskussion zusammengefasst, dabei den wichtigen Punkt "/7d/100.000" eingearbeitet, funktionierende Beispiele gezeigt.
Wenn ich etwas zu sagen hätte, würde ich Dir heute meinen persönlich mit Goldfolie auf Pappe geklebten Sonnen-Orden "Freundlicher Helfer des Tages" umhängen: Sehr herzlichen Dank!
Einem weiteren hast Du auch geholfen, vielleicht aber noch vielen mehr - denen, die leise mitlesen, aber sehr dankbar Wissen mitnehmen.
Danke nochmals, yersinia!
@curt: mea culpa ::) & love your sarcasm. ;) Thx.
Mit englischen Redewendungen bin ich nicht ganz sooo sattelfest, daher: Mein Dank war ehrlich und reinen Herzens.
Hast Du @yersinia oder @herrmannj vielleicht noch eine Idee für die tägliche Zahl der Neuerkrankten Deutschlands? Ich erkläre genauer:
Es schwirren da ja zig Zahlen rum, ich spare mir die Aufzählung. Ich nutze dafür einen Code aus diesem Thread, der nutzt https://disease.sh/v3/covid-19/countries - das sind Zahlen, die sich über den Tag ändern. Schon schick.
Irgendwie hätte ich gern zusätzlich die offizielle Zahl des RKI, also die Zahl, die das RKI im Dashboard angibt, also hier: https://experience.arcgis.com/experience/478220a4c454480e823b17327b2bf1d4
Dafür fand ich noch folgendes, wenn das hilft: https://github.com/rearc-data/covid-19-deutschland-robert-koch-institut
Gefunden habe ich nur diese offizielle Beschreibung: https://www.arcgis.com/home/item.html?id=dd4580c810204019a7b8eb3e0b329dd6
Anscheinend gibt das RKI keine offiziellen Zahlen für ganz DE raus, man könnte aber, mit einem userReading o.ä., die Zahlen der Bundesländer addieren.
disease.sh liefert noch für einige Staaten laut deren Aussage 'offizielle', von der Regierung gemeldete, Daten: https://disease.sh/docs/#/COVID-19%3A%20Government/get_v3_covid_19_gov__country_
Die Request Url wäre: https://disease.sh/v3/covid-19/gov/Germany
Response würde so aussehen, dabei ist der letzte Block (province
Total) interessant:
[
{
"updated": 1603294353926,
"province": "Baden-Württemberg",
"cases": 61694,
"casePreviousDayChange": 973,
"casesPerHundredThousand": 5419,
"sevenDayCasesPerHundredThousand": 48,
"deaths": 1946
},
{
"updated": 1603294353926,
"province": "Bayern",
"cases": 82102,
"casePreviousDayChange": 1222,
"casesPerHundredThousand": 7213,
"sevenDayCasesPerHundredThousand": 55,
"deaths": 2726
},
{
"updated": 1603294353927,
"province": "Berlin",
"cases": 22727,
"casePreviousDayChange": 822,
"casesPerHundredThousand": 3399,
"sevenDayCasesPerHundredThousand": 92,
"deaths": 243
},
{
"updated": 1603294353928,
"province": "Brandenburg",
"cases": 5670,
"casePreviousDayChange": 96,
"casesPerHundredThousand": 577,
"sevenDayCasesPerHundredThousand": 22,
"deaths": 175
},
{
"updated": 1603294353929,
"province": "Bremen",
"cases": 3725,
"casePreviousDayChange": 95,
"casesPerHundredThousand": 563,
"sevenDayCasesPerHundredThousand": 82,
"deaths": 63
},
{
"updated": 1603294353930,
"province": "Hamburg",
"cases": 10207,
"casePreviousDayChange": 204,
"casesPerHundredThousand": 852,
"sevenDayCasesPerHundredThousand": 46,
"deaths": 281
},
{
"updated": 1603294353930,
"province": "Hessen",
"cases": 27307,
"casePreviousDayChange": 749,
"casesPerHundredThousand": 4395,
"sevenDayCasesPerHundredThousand": 69,
"deaths": 590
},
{
"updated": 1603294353931,
"province": "Mecklenburg-\nVorpommern",
"cases": 1790,
"casePreviousDayChange": 71,
"casesPerHundredThousand": 283,
"sevenDayCasesPerHundredThousand": 17,
"deaths": 21
},
{
"updated": 1603294353931,
"province": "Niedersachsen",
"cases": 26611,
"casePreviousDayChange": 255,
"casesPerHundredThousand": 2573,
"sevenDayCasesPerHundredThousand": 32,
"deaths": 719
},
{
"updated": 1603294353932,
"province": "Nordrhein-Westfalen",
"cases": 94883,
"casePreviousDayChange": 2189,
"casesPerHundredThousand": 12027,
"sevenDayCasesPerHundredThousand": 67,
"deaths": 1970
},
{
"updated": 1603294353932,
"province": "Rheinland-Pfalz",
"cases": 14199,
"casePreviousDayChange": 242,
"casesPerHundredThousand": 1624,
"sevenDayCasesPerHundredThousand": 39,
"deaths": 265
},
{
"updated": 1603294353932,
"province": "Saarland",
"cases": 4467,
"casePreviousDayChange": 30,
"casesPerHundredThousand": 577,
"sevenDayCasesPerHundredThousand": 58,
"deaths": 177
},
{
"updated": 1603294353933,
"province": "Sachsen",
"cases": 10906,
"casePreviousDayChange": 386,
"casesPerHundredThousand": 1704,
"sevenDayCasesPerHundredThousand": 41,
"deaths": 264
},
{
"updated": 1603294353933,
"province": "Sachsen-Anhalt",
"cases": 3387,
"casePreviousDayChange": 53,
"casesPerHundredThousand": 366,
"sevenDayCasesPerHundredThousand": 16,
"deaths": 71
},
{
"updated": 1603294353933,
"province": "Schleswig-Holstein",
"cases": 5989,
"casePreviousDayChange": 110,
"casesPerHundredThousand": 597,
"sevenDayCasesPerHundredThousand": 20,
"deaths": 163
},
{
"updated": 1603294353934,
"province": "Thüringen",
"cases": 5098,
"casePreviousDayChange": 98,
"casesPerHundredThousand": 520,
"sevenDayCasesPerHundredThousand": 24,
"deaths": 201
},
{
"updated": 1603294353934,
"province": "Total",
"cases": 380762,
"casePreviousDayChange": 7595,
"casesPerHundredThousand": 42689,
"sevenDayCasesPerHundredThousand": 51,
"deaths": 9875
}
]
Die Zahlen decken sich aber nicht mit denen, die man _jetzt_ beim RKI findet.
Dies wird sich im Laufe des Tages ändern. Meiner Erfahrung nach, werden die Zahlen auf disease.sh im Laufe des Tages aktualsiert und entsprechen dann den RKI Zahlen des Vortags.
Zitat von: curt am 21 Oktober 2020, 22:29:39Dafür fand ich noch folgendes, wenn das hilft: https://github.com/rearc-data/covid-19-deutschland-robert-koch-institut
Entspricht nach eigenen Angaben dieser Quelle: RKI COVID19 (https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0/geoservice)
Auch hier gibt es keine Gesamtanzahl - außer man addiert sich dies selbst.
Die offizielle Zahl findet man in https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html
Diese Zeile, die Zahl mit dem PLUS davor:
Gesamt 392.049 +11.287 46.772 56,2 9.905
Das schreit nach HTTPMOD und RegEx. Leider scheitere ich bei sowas regelmäßig.
Hallo zusammen.
Ich habe das Anwendungsbeispiel mal nachgebaut aber ich erhalte keine Daten, ich kriege nur die Daten für die Bundesländer. Welt erhalte ich nicht. Fhem ist geupdatet und neu gestartet aber seit 3 Tagen keine Daten erhalten.
Hat jemand einen Tipp für mich, woran es liegen kann.
Danke.
Welches Anwendungsbeispiel hast du nachgebaut? Weltweite Daten sind im ersten Post (https://forum.fhem.de/index.php/topic,109413.msg1034048.html#msg1034048) beschrieben, nur hat sich mittlerweile der Link geändert:
define coronaSpread JsonMod https://disease.sh/v3/covid-19/countries
Das für Bundesländer zeigt auch nur Bundesländer-daten an.
Dank eines Tipps vom user tklein (https://forum.fhem.de/index.php?action=profile;u=27778) in diesem -> https://forum.fhem.de/index.php/topic,115264.0.html (https://forum.fhem.de/index.php/topic,115264.0.html) Thread, scheint es doch Gesamt-Deutsche Daten zu geben über den Link
https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/2/query?f=json&where=Country_Region=%27Germany%27&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=Confirmed%20desc&outSR=102100&resultOffset
Allerdings nach erstem Anschein ohne Inzidenz oder Veränderung zum Vortag.
Es scheint auch zu funktionieren, anbei eine RAW zum kopieren
defmod coronaSpreadDE_RKI JsonMod https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/2/query?f=json&where=Country_Region=%27Germany%27&returnGeometry=false&outFields=*&resultOffset
attr coronaSpreadDE_RKI interval 5 */2 * * *
attr coronaSpreadDE_RKI readingList single(jsonPath('$.features..attributes.Country_Region'), 'DE_name', '-?-');;\
single(jsonPath('$.features..attributes.Confirmed'), 'DE_confirmed', '-?-');;\
single(jsonPath('$.features..attributes.Deaths'), 'DE_deaths', '-?-');;\
single(jsonPath('$.features..attributes.Recovered'), 'DE_recovered', '-?-');;\
single(jsonPath('$.features..attributes.Active'), 'DE_active', '-?-');;\
single(jsonPath('$.features..attributes.Last_Update'), 'DE_lastUpdate', '-?-');;
attr coronaSpreadDE_RKI room CoViD-19
attr coronaSpreadDE_RKI stateFormat { my $ret = "<div style=\"text-align: left;;\">";;\
$ret .= "CoVid-19 Daten für ".ReadingsVal($name,"DE_name","-");;\
$ret .= " von ".ReadingsVal($name,"DE_lastUpdatedh","-")."<br \/>";;\
$ret .= "<font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"DE_active","-")." aktive Fä;lle</font> \/ ";;\
$ret .= "<font style=\"\">".ReadingsVal($name,"DE_confirmed","-")." Gesamt</font><br \/>";;\
$ret .= "<font style=\"color:green;;\">".ReadingsVal($name,"DE_recovered","-")." Genesene</font> und ";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"DE_deaths","-")." Tote</font><br \/>";;\
$ret .= "Letzter <a href=\"https://corona.rki.de\" title=\"RKI CoViD19\" rel=\"noopener noreferrer\" target=\"_blank\">RKI CoViD-19</a> Datenabruf: ";;\
$ret .= POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
$ret .= "</div>";;\
return $ret;;\
}
attr coronaSpreadDE_RKI userReadings DE_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"DE_lastUpdate",0)/1000));;}
attr coronaSpreadDE_RKI webCmd reread
Die Daten für die Bundesländer erhalte ich ja, nur die Daten für die ganze Welt bleiben leer.
Ein
list vom Device bitte.
Zitat von: yersinia am 25 Oktober 2020, 15:25:02
Welches Anwendungsbeispiel hast du nachgebaut? Weltweite Daten sind im ersten Post (https://forum.fhem.de/index.php/topic,109413.msg1034048.html#msg1034048) beschrieben, nur hat sich mittlerweile der Link geändert:
define coronaSpread JsonMod https://disease.sh/v3/covid-19/countries
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 COVID
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"}
attr coronaSpreadWorld verbose 5
Internals:
API_LAST_RES 1603637460.9469
API__LAST_MSG invalid server response
DEF https://corona.lmao.ninja/all
FUUID 5f8e9441-f33f-7a73-985f-5c4a100ef7180282
NAME coronaSpreadWorld
NEXT 2020-10-25 16:01:00
NR 692
SOURCE https://corona.lmao.ninja/all (502)
STATE Welt Fälle: 0
SVN 22987 2020-10-18 13:26:05 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://corona.lmao.ninja/all
SECRET:
READINGS:
2020-10-25 15:41:01 updated_human 1970-01-01 01:00:00
2020-10-25 15:41:01 world_active 0
2020-10-25 15:41:01 world_cases N/A
2020-10-25 15:41:01 world_casesPerOneMillion 0
2020-10-25 15:41:01 world_deaths N/A
2020-10-25 15:41:01 world_name Welt
2020-10-25 15:41:01 world_recovered N/A
2020-10-25 15:41:01 world_todayCases 0
2020-10-25 15:41:01 world_todayDeaths 0
2020-10-25 15:41:01 world_todayRecovered 0
2020-10-25 15:41:01 world_updated N/A
Attributes:
event-on-change-reading .*
interval 1/10 * * * *
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');
room COVID
stateFormat Welt Fälle: world_active
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"}
verbose 5
Im Log steht nichts.
OK, das es einen neuen Link gibt hast du anscheinend mehrfach überlesen, und man sieht es im list Auszug auch:
Zitat von: ErzGabriel am 25 Oktober 2020, 15:56:23
API__LAST_MSG invalid server response
DEF https://corona.lmao.ninja/all
Anstelle von
https://corona.lmao.ninja/all musst du
https://disease.sh/v3/covid-19/all nutzen:
defmod coronaSpreadWorld JsonMod https://disease.sh/v3/covid-19/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 COVID
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"}
attr coronaSpreadWorld verbose 5
Hallo Zusammen,
hat jemand einen finalen Code für mich, den ich ohne weitere Kenntnisse in mein FHEM integrieren kann?
Oder ein Anleitung, welche auf dem aktuellsten Stand ist?
Vielen Dank.
Zitat von: Tutti_Bomovski am 30 Oktober 2020, 11:43:58
hat jemand einen finalen Code für mich, den ich ohne weitere Kenntnisse in mein FHEM integrieren kann?
Welche Werte willst du denn haben?
Genau EINE Antwort zuvor ist ein Beispiel was (verm.) funktionieren sollte.
Einfügen (soweit ich das gesehen habe) per "Raw Definition" (unter jedem Device oder das "Plus Zeichen")...
ABER: ob das was hier "geholt" wird, das ist was du "sehen" willst: das weißt nur du... ;)
Ansonsten: diesen oder andere Threads "durchsuchen", ob jemand was gepostet hat, was dir "zusagt" und nehmen... ;)
Zitat von: Tutti_Bomovski am 30 Oktober 2020, 11:43:58
Oder ein Anleitung, welche auf dem aktuellsten Stand ist?
https://forum.fhem.de/index.php/topic,109413.msg1034048.html#msg1034048
Oder einfach: help jsonmod (in Fhem-Web-Eingabe)
Gruß, Joachim
Zitat von: curt am 22 Oktober 2020, 22:03:58
Die offizielle Zahl findet man in https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html
Diese Zeile, die Zahl mit dem PLUS davor:
Gesamt 392.049 +11.287 46.772 56,2 9.905
Das schreit nach HTTPMOD und RegEx. Leider scheitere ich bei sowas regelmäßig.
Ganz ohne Regex ;-) (Timeout ist nötig):
defmod corona_fz_rki7 HTTPMOD https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html 43200
attr corona_fz_rki7 userattr reading01Name reading01XPath reading02Name reading02XPath
attr corona_fz_rki7 alias Fallzahlenveränderung RKI7
attr corona_fz_rki7 reading01Name Fallzahlen_change
attr corona_fz_rki7 reading01XPath //*[@id="main"]/div[1]/table/tbody/tr[17]/td[3]/strong
attr corona_fz_rki7 reading02Name last_update
attr corona_fz_rki7 reading02XPath //*[@id="main"]/div[1]/p[1]
attr corona_fz_rki7 showError 1
attr corona_fz_rki7 stateFormat Fallzahlen_change (last_update)
attr corona_fz_rki7 timeout 60
Falscher Thread, hier geht's um JSON ;)
Zitat von: herrmannj am 10 November 2020, 09:23:31
Falscher Thread, hier geht's um JSON ;)
Sag das curt ;-)
Kannst das natürlich gerne abtrennen / verschieben.
Hallo,
wäre es möglich, das Modul um eine enable / disable Funktion zu erweitern? Ich nutze JsonMod zum Einlesen von Umweltsensoren (UV-A,UV-B) und benötige nachts keine Werte bzw. nur in größeren Intervallen. Eine (tägliche) Änderung des interval Attributs führt jedoch zum bekannten Fragezeichen.
Viele Grüße
Ronny
Zitat von: FHEMAN am 11 Dezember 2020, 10:54:37wäre es möglich, das Modul um eine enable / disable Funktion zu erweitern? Ich nutze JsonMod zum Einlesen von Umweltsensoren (UV-A,UV-B) und benötige nachts keine Werte bzw. nur in größeren Intervallen. Eine (tägliche) Änderung des interval Attributs führt jedoch zum bekannten Fragezeichen.
Falscher Thread, wäre besser hier aufgehoben: [98_JsonMod.pm] Wunschliste von neuen Funktionen (https://forum.fhem.de/index.php/topic,111489.0.html)
Ich hab es dort auch gleich zitiert (https://forum.fhem.de/index.php/topic,111489.msg1109545.html#msg1109545).
Hallo,
hat schon mal jemand versucht, Daten aus dem "Covid 19 Datenhub" zu nutzen?
https://npgeo-corona-npgeo-de.hub.arcgis.com/
Ich würde ja gerne einfach die Inzidenzwerte für meinen Wohnort in ein Log-File schreiben ...
Viele Grüße
Stephan
Würde dir dies weiterhelfen? -> Anwendungsbeispiel JsonMod / Covid / 7-Tage-Inzidenz (https://forum.fhem.de/index.php/topic,113798.0.html)
Ich habe das Beispiel aus #151 mit den beiden Bundesländern verwenden wollen. Allerdings werden keine Daten für Baden-Württemberg ermittelt. Ich vermute es liegt am Umlaut, da andere Länder gehen.
Habe keinen brauchbaren Hinweis gefunden was ich tun muss. Hat mir jemand eine Lösung?
Also das funktioniert bei mir:
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 .computedReadings
attr coronaSpreadDE interval 9 */3 * * *
attr coronaSpreadDE readingList multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Baden-Württemberg', 'Saarland'])]"), concat(count(),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Baden-Württemberg', 'Saarland'])]"), concat(count(),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Baden-Württemberg', 'Saarland'])]"), concat(count(),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.LAN_ew_GEN in ['Baden-Württemberg', 'Saarland'])]"), concat(count(),'_lastUpdate'), property('attributes.Aktualisierung'));;
attr coronaSpreadDE 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,"0_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"0_lastUpdatedh","-").")<br \/>";;\
$ret .= ReadingsVal($name,"1_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"1_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"1_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"1_lastUpdatedh","-").")";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadDE update-on-start 1
attr coronaSpreadDE userReadings 0_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"0_lastUpdate",0)/1000));;}, 1_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"1_lastUpdate",0)/1000));;}
attr coronaSpreadDE webCmd reread
ergibt:
READINGS:
2021-05-04 16:17:09 .computedReadings 1_name,0_lastUpdate,1_lastUpdate,0_name,0_deaths,1_cases,1_deaths,0_cases
2021-05-04 16:17:09 0_cases 451387
2021-05-04 16:17:09 0_deaths 9410
2021-05-04 16:17:09 0_lastUpdate 1620079200000
2021-05-04 16:17:09 0_lastUpdatedh 04.05. 00:00
2021-05-04 16:17:09 0_name Baden-Württemberg
2021-05-04 16:17:09 1_cases 37776
2021-05-04 16:17:09 1_deaths 962
2021-05-04 16:17:09 1_lastUpdate 1620079200000
2021-05-04 16:17:09 1_lastUpdatedh 04.05. 00:00
2021-05-04 16:17:09 1_name Saarland
JsonMod Version:
98_JsonMod.pm 24360 2021-04-29 21:17:23Z herrmannj
EDIT:
Oder ohne Text-Suche via OBJECTID:
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=OBJECTID,LAN_ew_GEN,Fallzahl,Aktualisierung,faelle_100000_EW,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadDE event-on-update-reading .computedReadings
attr coronaSpreadDE interval 9 */3 * * *
attr coronaSpreadDE readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(property('attributes.OBJECTID'),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(property('attributes.OBJECTID'),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(property('attributes.OBJECTID'),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(property('attributes.OBJECTID'),'_lastUpdate'), property('attributes.Aktualisierung'));;
attr coronaSpreadDE 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,"0_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= ReadingsVal($name,"1_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"1_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"1_deaths","-")." Tote</font>";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadDE update-on-start 1
attr coronaSpreadDE webCmd reread
ergibt Readings wie:
READINGS:
2021-05-04 16:40:44 .computedReadings 1_name,1_lastUpdate,12_cases,12_lastUpdate,1_cases,1_deaths,12_deaths,12_name
2021-05-04 16:40:44 12_cases 37776
2021-05-04 16:40:44 12_deaths 962
2021-05-04 16:40:44 12_lastUpdate 1620079200000
2021-05-04 16:40:44 12_name Saarland
2021-05-04 16:40:44 1_cases 451387
2021-05-04 16:40:44 1_deaths 9410
2021-05-04 16:40:44 1_lastUpdate 1620079200000
2021-05-04 16:40:44 1_name Baden-Württemberg
Oder ohne die OBJECTID als Readings-Unterscheidungsmerkmal:
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=OBJECTID,LAN_ew_GEN,Fallzahl,Aktualisierung,faelle_100000_EW,Death&returnGeometry=false&outSR=4326&f=json
attr coronaSpreadDE event-on-update-reading .computedReadings
attr coronaSpreadDE interval 9 */3 * * *
attr coronaSpreadDE readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(count(),'_name'), property('attributes.LAN_ew_GEN'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(count(),'_cases'), property('attributes.Fallzahl'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(count(),'_deaths'), property('attributes.Death'));;\
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['1', '12'])]"), concat(count(),'_lastUpdate'), property('attributes.Aktualisierung'));;
attr coronaSpreadDE room CoViD-19
attr coronaSpreadDE 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,"0_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"0_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"0_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"0_lastUpdatedh","-").")<br \/>";;\
$ret .= ReadingsVal($name,"1_name","-").": <font style=\"color:orange;;font-weight:bold;;\">".ReadingsVal($name,"1_cases","-")." Fä;lle</font> ;&; ;";;\
$ret .= "<font style=\"color:red;;font-weight:bold;;\">".ReadingsVal($name,"1_deaths","-")." Tote</font>";;\
$ret .= " ;(".ReadingsVal($name,"1_lastUpdatedh","-").")";;\
$ret .= "</div>";;\
return $ret;;}
attr coronaSpreadDE update-on-start 1
attr coronaSpreadDE userReadings 0_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"0_lastUpdate",0)/1000));;}, 1_lastUpdatedh {POSIX::strftime ("%d.%m. %H:%M", localtime(ReadingsVal($name,"1_lastUpdate",0)/1000));;}
attr coronaSpreadDE webCmd reread
ergibt readings wie oben.
Bei mir auch mit diesem Beispiel halt nicht. JsonMod Version ist die gleiche. Vielleicht fehlt mir eine generelle Einstellung?
Saarland kommt, BW nicht. FHEM ist aktuell.
Edit:
Mit dem Zweiten Beispiel über die Object-ID kommt auch BW.
Zitat von: tweety-rt am 04 Mai 2021, 16:51:28Vielleicht fehlt mir eine generelle Einstellung?
Saarland kommt, BW nicht.
Mit den wenigen Informationen ist es nur raten. Bitte ein list vom Device. Hast du ein reread durchgeführt?
Wie gesagt, auf meiner Seite funktioniert es. Alle beide Versionen.
Hallo zusammen,
mir fehlt bei meiner Corona Auswertung per Json neuerdings die Cases?
Hat jemand eine Idee
Internals:
API_LAST_MSG 200
API_LAST_RES 1628616152.85657
DEF https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
FUUID 5f975018-f33f-3c55-b947-2d72a37160719a57
NAME coronaSpreadCounties
NEXT 2021-08-10 21:10:00
NR 220
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json (200)
STATE active
SVN 24420 2021-05-11 21:25:20 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
SECRET:
OLDREADINGS:
READINGS:
2021-08-10 19:22:32 Cases7_per_100k 46.8
2021-08-10 19:22:32 Cases_per_100k 4247
2021-08-10 19:22:32 Death 440
2021-08-10 19:22:32 Name SK Düsseldorf
2021-08-10 19:22:32 Updated 10.08.2021, 00:00 Uhr
Attributes:
interval 10 */3 * * *
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Name', property('attributes.county')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases', sprintf('%.0d',property('attributes.cases')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Death', sprintf('%.0d',property('attributes.deaths')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases_per_100k',sprintf('%.0f', property('attributes.cases_per_100k')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases7_per_100k',sprintf('%.1f', property('attributes.cases7_per_100k')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Updated', property('attributes.last_update'))
update-on-start 1
verbose 0
Gruß
Roman
Ja, ich hab ein ähnliches Problem - ist aber eine andere Quelle vom RKI (https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/ncov_cases/FeatureServer/2/query?f=json&where=Country_Region=%27Germany%27&returnGeometry=false&outFields=*&resultOffset).
In deiner Quelle (https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID=%2764%27&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json) kommen die Werte aber vor:
{"attributes":{"cases":26490,"deaths":440,"cases_per_100k":4259.68479297353,"cases_per_population":4.25968479297353,"cases7_per_100k":50.9747104330921,"BL":"Nordrhein-Westfalen","BL_ID":"5","county":"SK Düsseldorf","OBJECTID":64,"last_update":"11.08.2021, 00:00 Uhr"}}
Hast du mal ein reread initiiert?
Ja hatte ich versucht, aber irgendwie bekommt JsonMod das nicht geregelt.
Keiner einen Tip?
Gruß Roman
Keine Probleme festzustellen wenn ich dies nachstelle:
Internals:
API_LAST_MSG 200
API_LAST_RES 1628751812.64973
CFGFN
DEF https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
FUUID 6114c799-f33f-3151-2ed7-5fd81075ae9182de
NAME testJM
NEXT 2021-08-12 10:00:00
NR 41361
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json (200)
STATE ???
SVN 24783 2021-07-21 22:37:12 UTC
TYPE JsonMod
.attraggr:
.attrminint:
CONFIG:
IN_REQUEST 0
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
SECRET:
READINGS:
2021-08-12 09:03:32 .computedReadings Cases7_per_100k,Name,Death,Updated,Cases_per_100k
2021-08-12 09:03:32 Cases7_per_100k 58.2
2021-08-12 09:03:32 Cases_per_100k 4274
2021-08-12 09:03:32 Death 440
2021-08-12 09:03:32 Name SK Düsseldorf
2021-08-12 09:03:32 Updated 12.08.2021, 00:00 Uhr
Attributes:
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Name', property('attributes.county')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases', sprintf('%.0d',property('attributes.cases')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Death', sprintf('%.0d',property('attributes.deaths')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases_per_100k',sprintf('%.0f', property('attributes.cases_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases7_per_100k',sprintf('%.1f', property('attributes.cases7_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Updated', property('attributes.last_update'));
Aber zwei Sachen, dir mir aufgefallen sind:
1. deine JsonMod Version ist nicht die aktuellste; deine:
SVN 24420 2021-05-11 21:25:20 UTC
versus die aktuelle aus dem SVN:
SVN 24783 2021-07-21 22:37:12 UTC
2. in deinem ReadingsList fehlen abschließende Semikolon; dein readingsList:
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Name', property('attributes.county')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases', sprintf('%.0d',property('attributes.cases')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Death', sprintf('%.0d',property('attributes.deaths')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases_per_100k',sprintf('%.0f', property('attributes.cases_per_100k')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases7_per_100k',sprintf('%.1f', property('attributes.cases7_per_100k')))
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Updated', property('attributes.last_update'))
versus
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Name', property('attributes.county')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases', sprintf('%.0d',property('attributes.cases')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Death', sprintf('%.0d',property('attributes.deaths')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases_per_100k',sprintf('%.0f', property('attributes.cases_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Cases7_per_100k',sprintf('%.1f', property('attributes.cases7_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"), 'Updated', property('attributes.last_update'));
Ich empfehle dir, readingsList zu korrigieren und ein Update zu machen. Und danach ein reread und dann schauen wir weiter.
So, alles durchgeführt. Das Problem besteht weiterhin. Jemadn eine Idee?
Zitat von: romakrau am 12 August 2021, 16:16:53So, alles durchgeführt.
Ok, dann bitte ein neues List des Devices.
Hallo yersinia,
die Lösung ist sehr simple. Die Reihenfolge des Ergebnis der Abfrage (cases,deaths,cases_per_100k,cases...) muss mit der Reihenfolge der JsonMod Defination übereinstimmen. Dann gehts. Manchmal brauchts den Anstoss von anderen.
Danke und Gruß
Roman
Zu früh gefreut, jetzt fehlt der wert für das Update:
Internals:
API_LAST_MSG 200
API_LAST_RES 1628778513.72146
DEF https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
FUUID 5f975018-f33f-3c55-b947-2d72a37160719a57
NAME coronaSpreadCounties
NEXT 2021-08-12 18:10:00
NR 220
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json (200)
STATE active
SVN 24783 2021-07-21 22:37:12 UTC
TYPE JsonMod
CONFIG:
IN_REQUEST 0
SOURCE https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=OBJECTID='64'&outFields=cases,deaths,cases_per_100k,cases_per_population,cases7_per_100k,BL,BL_ID,county,OBJECTID,last_update&returnGeometry=false&outSR=4326&f=json
SECRET:
OLDREADINGS:
READINGS:
2021-08-12 16:28:33 Cases 26578
2021-08-12 16:28:33 Cases7_per_100k 58.2
2021-08-12 16:28:33 Cases_per_100k 4274
2021-08-12 16:28:33 Death 440
2021-08-12 16:28:33 Name SK Düsseldorf
Attributes:
event-on-change-reading Updated,Cases7_per_100k,Cases
interval 10 */6 * * *
readingList multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases',sprintf('%d',property('attributes.cases')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Death',sprintf('%d',property('attributes.deaths')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases_per_100k',sprintf('%.0f',property('attributes.cases_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases7_per_100k',sprintf('%.1f',property('attributes.cases7_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Name',property('attributes.county')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Updated',property('attributes.last_update')));
update-on-start 1
verbose 0
Zitat von: romakrau am 12 August 2021, 16:26:11die Lösung ist sehr simple. Die Reihenfolge des Ergebnis der Abfrage (cases,deaths,cases_per_100k,cases...) muss mit der Reihenfolge der JsonMod Defination übereinstimmen. Dann gehts.
Ich glaube nicht, dass das beabsichtigt ist - ich vermute hier eher ein Bug. Aber wenn es in der richtigen Reihenfolge funktioniert, alles gut.
Zitat von: romakrau am 12 August 2021, 16:30:47Zu früh gefreut, jetzt fehlt der wert für das Update:
Wenn du verbose nicht auf 0 hättest, würdest du sehen, dass das Device ein Fehler wirft.
2021.08.12 16:34:40 2: [testJM] syntax error in readingList statement: ')'
Du hast in deinem Code eine schließende Klammer zuviel bei Name:
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Name',property('attributes.county')));
Richtig sollte es so aussehen:
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases', sprintf('%d',property('attributes.cases')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Death', sprintf('%d',property('attributes.deaths')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases_per_100k', sprintf('%.0f',property('attributes.cases_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Cases7_per_100k', sprintf('%.1f',property('attributes.cases7_per_100k')));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Name', property('attributes.county'));
multi(jsonPath("\$.features[?(\@.attributes.OBJECTID in ['64'])]"),'Updated', property('attributes.last_update'));
Danke für die Hilfe. Jetzt klappt's.
Gruß
Roman
Wo und wie bekomme ich die 7-Tage-Inzidenz von Deutschland her? Hat das jemand integriert?
Ich habe mein Bundesland, zwei Landkreise, das funktioniert fein. Das zeige ich auch in FTUI an. Aber Deutschland selbst fehlt mir.
Zitat von: curt am 29 September 2021, 03:47:57Wo und wie bekomme ich die 7-Tage-Inzidenz von Deutschland her? Hat das jemand integriert?
Das hättest du besser hier gefragt: Anwendungsbeispiel JsonMod / Covid / 7-Tage-Inzidenz (https://forum.fhem.de/index.php/topic,113798.0.html)
Siehe dort post #60 (https://forum.fhem.de/index.php/topic,113798.msg1152987.html#msg1152987):
Zitat von: yersinia am 28 April 2021, 14:52:02Aber auch: https://api.corona-zahlen.org/docs/ (https://api.corona-zahlen.org/docs/) (aber keine csv) ->
API mit Incidence für Deutschland seit dem 31.01.2020 (https://api.corona-zahlen.org/docs/endpoints/germany.html#germany-history-incidence) => JSON: https://api.corona-zahlen.org/germany/history/incidence (https://api.corona-zahlen.org/germany/history/incidence)
API mit Incidence für Bundesländer (Bundesland-Code benötigt) seit dem 31.01.2020 (https://api.corona-zahlen.org/docs/endpoints/states.html#states-state-history-incidence) => JSON: https://api.corona-zahlen.org/states/NI/history/incidence (https://api.corona-zahlen.org/states/NI/history/incidence) (Bundesland-Code (https://api.corona-zahlen.org/states))
API mit Incidence für Gemeinden Kreise (AGS benötigt) seit dem 31.01.2020 (https://api.corona-zahlen.org/docs/endpoints/districts.html#districts-ags-history-incidence) => JSON: https://api.corona-zahlen.org/districts/08115/history/incidence (https://api.corona-zahlen.org/districts/08115/history/incidence) (AGS Schlüssel (https://api.corona-zahlen.org/districts))
https://api.corona-zahlen.org/germany (https://api.corona-zahlen.org/germany) liefert auch die aktuelle (7-Tages-)Inzidenz für Deutschland.
Hallo @yersinia
ich hatte Deine freundlichen Hinweise zu schnell gelesen und war zudem gedanklich auf dem falschen Boot.
Herzlichen Dank!