Hallo,
Ich möchte aus folgendem JSON:
{"aktuell":{"stromerzeugung":{"wert":0.01,"einheit":"W"},"stromverbrauch":{"wert":563.551,"einheit":"W"},"netzeinspeisung":{"wert":0.01,"einheit":"W"},"netzbezug":{"wert":559.901,"einheit":"W"},"speicherbeladung":{"wert":0.01,"einheit":"W"},"speicherentnahme":{"wert":8.76,"einheit":"W"},"speicherfuellstand":{"wert":1.0E-5,"einheit":"%"},"autarkie":{"wert":0.65,"einheit":"%"},"wallbox":{"wert":0.01,"einheit":"W"}},"heute":{"stromerzeugung":{"wert":0.0,"einheit":"Wh"},"stromverbrauch":{"wert":299.8046875,"einheit":"Wh"},"netzeinspeisung":{"wert":0.0,"einheit":"Wh"},"netzbezug":{"wert":296.630859375,"einheit":"Wh"},"speicherbeladung":{"wert":0.0,"einheit":"Wh"},"speicherentnahme":{"wert":3.41796875,"einheit":"Wh"},"speicherfuellstand":{"wert":0.0,"einheit":"%"},"autarkie":{"wert":1.06,"einheit":"%"},"wallbox":{"wert":0.0,"einheit":"Wh"}},"zeitstempel":"2021-12-02T23:28:56Z","electricVehicleConnected":false}
wenn möglich mit json2reading readings in der Form haben:
stromerzeugung_aktuell = 0.01 W
oder
stromerzeugung_aktuell = 0.01
stromerzeugung_aktuell_einheit = W
anstatt
aktuell_stromerzeugung_wert = 0.01
aktuell_stromerzeugung_einheit = W
Das sollte doch mit jsonmap und/oder hashKeyRename möglich sein.
z.B.: json2reading($defs{d}, $json, undef, ???, ???)
Ich kriege es einfach nicht hin.
Wer kann mir hier helfen?
Gruß
Carlos
hashKeyRename ist fuer Daten gebaut wie:
[{"name":"NAME","value":"Value"}]
d.h. wo der Name des Readings als Wert geliefert wird.
Man kann damit den Wert nicht anpassen, nur den Namen des Readings.
Als Nebeneffekt/Hack kann man den Namen etwas anpassen, z.Bsp. jeweils _wert abschneiden.
Die folgenden zwei Aufrufe erzeugen in Summe deine zweite Version
json2reading("dummy", $data{XX}, undef, undef, 'hashKeyRename($ret,"((.*))_wert", "(.*)_wert")')
json2reading("dummy", $data{XX}, undef, undef, undef, '_einheit')
Hallo Rudolf,
Danke für die Lösung, das geht auf jeden Fall schon mal in die Richtung wie ich es nutzen will.
Es werden jetzt auf jeden Fall schon mal Readings angelegt.
Wenn man jetzt noch das heute und aktuell danach haben könnte wäre das super.
Also statt:
2021-12-03 16:55:49 heute_autarkie 1.06
2021-12-03 16:56:23 heute_autarkie_einheit %
so
2021-12-03 16:55:49 autarkie_heute 1.06
2021-12-03 16:56:23 autarkie_heute_einheit %
meinst du das ginge auch noch?
Gruß
Carlos
Ich fuerchte das ist nichts fuer hashKeyRename.
Ich empfehle eine eigene Funktion in 99_myUtils.pm zu implementieren, sie wird im json2reading (statt hashKeyRename) mit dem Rueckgabewert von json2name aufgerufen, und liefert ein neues Hash zurueck. Damit kann man auch die Einheiten an die Werte ranhaengen.
Hallo Rudolf,
Danke für die Info, dann werde ich das vielleicht mal so umsetzen.
Kannst du mir evtl noch eine Beispiel bzgl dem parameter jsonmap geben.
Ich dachte eigentlich, dass da mit die keys umbenannt werden können.
In manchen MQTT2 templates ist da ja ein attribute mit drin in der Form "foo:bar".
Oder ist das nur in den templates anwendbar.
Gruß
Carlos
ZitatKannst du mir evtl noch eine Beispiel bzgl dem parameter jsonmap geben.
my $jsonmap = {
heute_autarkie_wert => "autarkie_heute",
heute_autarkie_einheit => undef,
...
};
undef loescht den betroffenen Eintrag.
Der Haken an jsonmap ist, dass die Werte, die _nicht_ aufgefuehrt sind, unveraendert bleiben.
Das MQTT2_DEVICE Attribut jsonMap wird in das o.g. Format umgewandelt, mit:
my @ret = split(/[: \r\n]/, $param);
return "jsonMap: Odd number of elements" if(int(@ret) % 2);
my %ret = @ret;
$hash->{JSONMAP} = \%ret;
Vielen Dank Rudolf, du hast mir weitergeholfen.
Wieder was gelernt!
Das Problem ist für mich gelöst.
Gruß
Carlos
Hallo Rudolf,
Irgenwie scheint das mit dem löschen durch undef nicht zu funktionieren.
Ich habe mal folgende jsonmap genpmmen
my $jsonmap1 = {
heute_autarkie_wert => "autarkie_heute",
heute_autarkie_einheit => undef,
heute_netzbezug_wert => "netzbezug_heute",
heute_netzbezug_einheit => undef,
};
Es werden mir aber trotzdem folgende readings angelegt:
READINGS:
2021-12-05 18:55:10 autarkie_heute 47.48
2021-12-05 18:55:10 electricVehicleConnected false
2021-12-05 18:55:10 heute_autarkie_einheit %
2021-12-05 18:55:10 heute_netzbezug_einheit Wh
2021-12-05 18:55:10 heute_netzeinspeisung_einheit Wh
2021-12-05 18:55:10 heute_netzeinspeisung_wert 328.61328125
2021-12-05 18:55:10 heute_speicherbeladung_einheit Wh
2021-12-05 18:55:10 heute_speicherbeladung_wert 3381.9580078125
2021-12-05 18:55:10 heute_speicherentnahme_einheit Wh
2021-12-05 18:55:10 heute_speicherentnahme_wert 2810.9130859375
2021-12-05 18:55:10 heute_speicherfuellstand_einheit %
2021-12-05 18:55:10 heute_speicherfuellstand_wert 8.39813995361328
2021-12-05 18:55:10 heute_stromerzeugung_einheit Wh
2021-12-05 18:55:10 heute_stromerzeugung_wert 6477.05078125
2021-12-05 18:55:10 heute_stromverbrauch_einheit Wh
2021-12-05 18:55:10 heute_stromverbrauch_wert 11748.53515625
2021-12-05 18:55:10 heute_wallbox_einheit Wh
2021-12-05 18:55:10 heute_wallbox_wert 0
2021-12-05 18:55:10 netzbezug_heute 6169.76928710938
2021-12-05 18:55:10 zeitstempel 2021-12-05T17:53:57Z
also die undef keys wurden nicht gelöscht.
edit: ich habe mal in json2nameValue im else Zweig ein next ergänzt damit funktioniert es:
my %ret2;
for my $name (keys %ret) {
next if($negFilter && $name =~ m/$negFilter/);
my $oname = $name;
if(defined($map->{$name})) {
next if(!$map->{$name});
$name = $map->{$name};
} else {
next;
}
next if($filter && $name !~ m/$filter/);
$ret2{$name} = $ret{$oname};
}
return \%ret2;
}
edit2: Die Werte, die _nicht_ aufgefuehrt sind, werden leider damit raus gefiltert.
Gruß
Carlos
ZitatIrgenwie scheint das mit dem löschen durch undef nicht zu funktionieren.
Stimmt, mein Fehler, es muss ein Leerstring sein.
my $jsonmap1 = {
heute_autarkie_wert => "autarkie_heute",
heute_autarkie_einheit => "",
heute_netzbezug_wert => "netzbezug_heute",
heute_netzbezug_einheit => "",
};
Ok, alles klar.
Werde ich ausprobieren.
Gruß
Carlos