json2nameValue verstehen - einsatz fpr MQTT2

Begonnen von martinp876, 19 April 2026, 19:50:07

Vorheriges Thema - Nächstes Thema

martinp876

Ich habe versucht json2nameValue zu verstehen - im Zusammenhang mit MQTT2.
MQTT2 liefert "im Automode" indiuskutabel lange Namen - und zu viel sowieso. Also muss man filtern und übersetzen.
Aktuelles Beispiel ist ein ESP32 mit (aktuell) 5 Temperatursensoren. GEht erst einmal prima. das Zerlegen der Tasmota MQTT Infos geht mit json2nameValue gut. Da nun die Namen quatsch sind muss man den Sensoren Namen geben um die Readings zu erzeugen.

json2nameValue bietet nun die Option "map" sowie einen Positiv und einen negativ filter. Ich habe keine schlüssige Dokumentation hierzu gefunden - eben so keine Beispiele.
Musss man den Code prüfen: Negativ Filter betreffen die ürsprünglichen Namen während positv-filter die "gemappten" Daten betreffen. Da ich allerding das Mapping nicht einfichten konnte ist es am Ende eh egal - ich konnte es nicht zum Laufen bekommen.

Am Ende war ich deutlich schneller, selbst eine Funktion zu erstellen. Die einfache Option, diese in MQTT readlingList einzupflegen scheitert dann wieder an der Einschrängung, ein Kommando in eine Zeile schreiben zu müssen. Da hat man ich den Trenner gespart bzw \n genutzt.

Also noch ein Umweg. Wirklich userfreindlich ist das nicht - aber möglich, wie alles.
Ich werde noch ein einer eleganteren Version arbeiten
==> gibt es schon bessere Funktionen und gibt es eine komplette Doku zu json2nameValue?
  • #funktion als Reading einbauen
  • # Funktion definieren "evalRead"
  • # Readingslist erstellen

  userattr  EvalRead:textField-long
  EvalRead
{
my $x= json2nameValue($EVENT);
my $mttqID ="StatusSNS_DS18B20-";
my %didH = ("000000505B1A" => "WPRaum"
    ,"00000051CAD9" => "WP_ein"
    ,"000000526D95" => "WP_aus"
    ,"000000544C2C" => "Wasser"
    ,"0000005310E3" => "Boiler");
my (%midH,%resH);
for my $n (grep/_Id$/,keys %{$x}) {
    $n =~ m/.*-(.*?)_Id/;
    $midH{$1."_Id"}= defined $didH{%{$x}{$n}} ? $didH{%{$x}{$n}} : $1."_undef"};
for my $n (grep/_Temperature$/,keys %{$x}){
    $n =~ m/.*-(.*?)_Temp/;
    $resH{"temp_".$midH{$1."_Id"}}= %{$x}{$n}};
\%resH}
  readingList DVES_FB81CC:stat/tasmota_FB81CC/STATUS8:.* {eval AttrVal($NAME,"EvalRead","")}

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

TomLee

Oder:

https://wiki.fhem.de/wiki/AttrTemplate

dann:

set <Device-Name> attrTemplate ?
dann:
set <Device-Name> attrTemplate tasmota_use_DS18x20_id
?