[GELÖST] json mit json2reading bearbeiten

Begonnen von carlos, 03 Dezember 2021, 14:16:41

Vorheriges Thema - Nächstes Thema

carlos

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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

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

carlos

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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

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.

carlos

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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

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;

carlos

Vielen Dank Rudolf, du hast mir weitergeholfen.
Wieder was gelernt!
Das Problem ist für mich gelöst.
Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

carlos

#7
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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

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           => "",
    };

carlos

Ok, alles klar.
Werde ich ausprobieren.

Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly