Anwendungsbeispiel JsonMod #2: CORONA Verbreitung

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

Vorheriges Thema - Nächstes Thema

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

bjoernbo

@somansch: Würdest Du deien FTUI Code zur Verfügung stellen? Die Darstellungsweise gefällt mir und würde diese gerne übernehmen. Danke.
Raspberry Pi 3 - FB6490C - Synology NAS DS916+ - NETATMO - HUE - SIEMENS G-Tag'S - FTUI - EchoDOT -

bjoernbo

#17
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>


Raspberry Pi 3 - FB6490C - Synology NAS DS916+ - NETATMO - HUE - SIEMENS G-Tag'S - FTUI - EchoDOT -

RichardCZ

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 at

kommt 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.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

herrmannj

#19
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

RichardCZ

#20
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.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

herrmannj

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ß)

Otto123

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 :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

herrmannj

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.

Otto123

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

herrmannj

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]


Otto123

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 :)

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

herrmannj

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' ... :)

Otto123

#28
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 👍
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

somansch

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