[98_JsonMod.pm] Bug? Multiples Ersetzen und Umrechnen von Werten

Begonnen von bstaeheli, 21 Juli 2021, 13:04:17

Vorheriges Thema - Nächstes Thema

bstaeheli

Das Umrechnen von von Werten direkt beim Parsen des JSONs ist richtig toll. Nur leider funktioniert das bei mir nur beim Auslesen unseres myPV AC Thor 9s' nur beim ersten Mal, alle nachfolgenden Definitionen im readingList werden ignoriert, resp. die Verarbeitung wird gestoppt.

In diesem Fall wird nur temp2 als reading dargestellt, von temp1 und currentIP fehlt jede Spur. Ist das vielleicht ein Bug? Kann das jemand nachstellen?

Device definition:

defmod UG.tk.XX.ACThorDataTest JsonMod http://nn.xx.zz.yy/data.jsn
attr UG.tk.XX.ACThorDataTest event-on-change-reading .*
attr UG.tk.XX.ACThorDataTest interval */2 * * * *
attr UG.tk.XX.ACThorDataTest readingList single((jsonPath('$.temp2') / 10), 'temp2', 'N/A');;\
single((jsonPath('$.temp1') / 10), 'temp1', 'N/A');;\
single(jsonPath('$.cur_ip'), 'currentIP', 'N/A');;
attr UG.tk.XX.ACThorDataTest room UG Technikkeller
attr UG.tk.XX.ACThorDataTest timestamp-on-change-reading .*
attr UG.tk.XX.ACThorDataTest update-on-start 1

setstate UG.tk.XX.ACThorDataTest 2872 W | 93.3 °C / 75.3 °C
setstate UG.tk.XX.ACThorDataTest 2021-07-20 14:07:52 .computedReadings temp2
setstate UG.tk.XX.ACThorDataTest 2021-07-20 14:07:52 temp2 86.5


das json sieht folgendermassen aus:

{
"device":"ACTHOR",
"acthor9s":2,
"fwversion":"a0020410",
...
"temp1":857,
"temp2":865,
"temp3":786,
"temp4":729,
..
"cur_ip":"nn.xx.yy.zz",
...
}

herrmannj


herrmannj

Muss ich untersuchen, ist nichts offensichtliches, leider wohl auch nicht trivial. Mit * oder + funktionierts. Kannst Du Dir 'ne andere Heizung kaufen?

herrmannj

ja blöd. Gibt ein offenens ticket dazu, ist auch erst 14 Jahre alt: https://rt.cpan.org/Public/Bug/Display.html?id=30883

Für den Fall dass die neue Heizung keine Option ist. Kannste warten? Die fixen das bestimmt :(

herrmannj

fixed.

kosmetische Idee noch, falls Du das nicht ohnehin auf dem Zettel hast. Du kannst vor das jsonPath noch ein sprintf setzen damit die Nullstellen stimmen, falls es Ganzzahlen sind. Ist nur für optisch...

Ungetestet so:
single(sprintf('%.1f °C', jsonPath('$.temp1') / 10), 'temp1', 'N/A');

bstaeheli

@herrmannj, super, vielen Dank für die schnelle Rückmeldung!

Zum Glück kann ich eine 10er Division auch mit einer Multiplikation erreichen, ist günstiger als ne neue Heizung  ;D


single((jsonPath('$.temp2') * 0.1), 'temp2', 'N/A');
single((jsonPath('$.temp1') * 0.1), 'temp1', 'N/A');


funktioniert wie gewünscht.

Merci für den Hint mit der Formatierung, ist in meinem Fall nicht notwendig, ich möchte gerne die Daten im DBLogger speichern, da habe ich lieber "reine" Zahlen. Die schöne Formatierung mache ich im stateformat

Liebe Grüsse aus der Schweiz, Boris

herrmannj

Der bug mit Division ist aber beseitigt.

Grüße aus Hamburg in die Schweiz