mqttPublish und mehrere Readings in einem topic???

Begonnen von frankreed, 17 April 2020, 13:16:47

Vorheriges Thema - Nächstes Thema

frankreed

Hallo zusammen,

ich versuche gerade von einem Device mehrere Readings per Attribut mqttPublish an meinen Broker zu senden.

attr Gosund_2 mqttPublish ENERGY_Power|ENERGY_Current:topic={"fhem/$device/$reading"} ENERGY_Power|ENERGY_Current:expression={"{\"$name\":".$value."}"}


Dann kommt beim Broker folgendes an (hier verbal beschrieben):

1. Ebene: fhem
2. Ebene:    Gosund_2
3. Ebene:       ENERGY_Power = {"ENERGY_Power":28}
                     ENERGY_Current = {"ENERGY_Current":0.28}


Ich hätte das ganze aber in der Form:
1. Ebene: fhem
2. Ebene:    Gosund_2 = {"ENERGY_Power":28,"ENERGY_Current":0.28}


Also so in der Art, dass keine dritte Ebene erscheint, sondern die ganzen Readings alles in der zweiten Ebene unter dem topic fhem/Gosund_2

Die Beispiele im Forum und in der Command-Ref habe ich gelesen, komme aber damit irgendwie nicht klar.

Könnte mir jemand auf die Sprünge helfen?
Vielen Dank im Voraus.

Grüße
Patrick



Gisbert

Hallo Patrick,

mir erschließt sich noch nicht genau, warum eine weitere Ebene bei den Topics vermieden werden sollte.

Soweit ich verstanden habe, ist ein topic ein string, also eine Zeichenfolge. Die Aufgabe besteht also darin eine Zeichenfolge zu definieren, die dann als topic zur Verfügung stehen und abgeschickt werden kann.

Um es konkreter zu machen, wäre ein list oder raw Definition deines Devices (Einzahl oder Mehrzahl, um alle Device- und Readingnamen zu erhalten) hilfreich.

Dann können wir gemeinsam versuchen dein Problem zu lösen. Mir ist die genaue Lösung noch nicht klar, aber ich habe eine Idee, wie man vorgehen müsste.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Otto123

Hallo Patrick,

klar geht, ich habe das hier für mich mal aufgeschrieben. Etwas weiter unten, alle Readings als JSON übertragen.

Gruß Otto
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

frankreed

@Gisbert:
Hintergrund der Frage ist der, dass ich meine Readings an einen MQTT-Broker schicke und von dort via Telegraf in eine Influxdb. Ich weiß zwar, dass es auch das Influxdblog-Modul gibt, aber das blockiert mir irgendwann mein fhem (vielleicht liegt es am blocking, keine Ahnung).
Jetzt erwartet aber Telegraf das ganze als JSON-String.
Ich stell' trotzdem mal die RAW-Def ein, die ich aber nur mal exemplarisch genommen habe. Sie dient als Versuchs-Device. Wenn's damit funktioniert mit zwei Readings kann ich das dann beliebig erweitern:

defmod Gosund_2 MQTT2_DEVICE
attr Gosund_2 IODev myMQTT2Client_Gateway
attr Gosund_2 alias Gefrierschrank
attr Gosund_2 autocreate 1
attr Gosund_2 comment NOTE: For on-for-timer SetExtensions are used. You may add on-for-timer option running on the device. The following is limited to 1h max duration, but will not affect future simple "on" commands:<br>on-for-timer {my $duration = $EVTPART1*10;; 'cmnd/cmnd/Gosund-1/Backlog POWER1 1;; delay '.$duration.';; POWER1 0'}<br>See the "Praxisbeispiele" in the wiki for "pulseTime1" alternative option and it's restrictions.
attr Gosund_2 devStateIcon {my $onl = ReadingsVal($name,"LWT","false") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";;;; my $light = ReadingsVal($name,"state","off");;;;"<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a> uptime: ".ReadingsVal($name,"Uptime",undef).sprintf(" aktuell: %.1f W Tag: %.2f kWh Gestern: %.3f kWh Gesamt: %.4f kWh", ReadingsVal($name,"ENERGY_Power","-1"), ReadingsVal($name,"ENERGY_Today","-1"), ReadingsVal($name,"ENERGY_Yesterday","-1"), ReadingsVal($name,"ENERGY_Total","-1"))}
attr Gosund_2 icon freezer
attr Gosund_2 jsonMap POWER1:state
attr Gosund_2 model tasmota_POW
attr Gosund_2 mqttPublish ENERGY_Power|ENERGY_Current:topic={"fhem/$device/$reading"} ENERGY_Power|ENERGY_Current:expression={"{\"$name\":".$value."}"}
attr Gosund_2 readingList tele/gosund_2/LWT:.* LWT\
  tele/gosund_2/STATE:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/gosund_2/SENSOR:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/gosund_2/INFO.:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/gosund_2/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/gosund_2/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Gosund_2 room Keller
attr Gosund_2 setList off:noArg    cmnd/gosund_2/POWER1 0\
  on:noArg     cmnd/gosund_2/POWER1 1\
  toggle:noArg cmnd/gosund_2/POWER1 2
attr Gosund_2 setStateList on off toggle
attr Gosund_2 stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kWh Gestern: %.3f kWh Gesamt: %.4f kWh", ReadingsVal($name,"ENERGY_Power","-1"), ReadingsVal($name,"ENERGY_Today","-1"), ReadingsVal($name,"ENERGY_Yesterday","-1"), ReadingsVal($name,"ENERGY_Total","-1"))}
attr Gosund_2 webCmd :



@Otto123:
Ich probier' mal Deine Lösung aus.

Grüße Patrick

Otto123

Ich versteh noch nicht woher $reading kommt.
Mein Ansatz erzeugt im übrigen nur einen JSON String aus den Readings der dann published wird.
Wenn ich deine Zeile richtig verstehe willst Du mehrere JSON Strings erzeugen?
Aber ich verstehe die Zeile nicht wirklich  :-[
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

frankreed

Das Device habe ich nur mal zum Testen, was dort im mqttPublish steht liefert mir halt das Ergebnis aus Post #1.
@Otto123: Du hast mich schon richtig verstanden, ich will eigentlich nur einen JSON-String unter einem speziellen topic, der String soll aber die Namen und die Werte der Readings enthalten, so in der Art:
topic fhem/Gosund_2 = = {"ENERGY_Power":28,"ENERGY_Current":0.28}

Otto123

Für den Json String zum Testen in der FHEM Kommandozeile:
In $d kommt dein Device Name!
# Für Kommandozeile - alle Readings
{my $d="fuehler1";;my $hash = $defs{$d};;my $readings = $hash->{READINGS};;my $message="{ ";;foreach my $a ( keys %{$readings} ) {my $val=ReadingsVal($d,$a,"error");;$message .= toJSON($a)." : ".toJSON($val)." ," };;chop($message);;$message.="}"}

# Für Kommandozeile - nur zwei Readings
{my $d="fuehler1";;my @readings = ("temperature","humidity");;my $message="{ ";;foreach my $a ( @readings) {my $val=ReadingsVal($d,$a,"error");;$message .= toJSON($a)." : ".toJSON($val)." ," };;chop($message);;$message.="}"}
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