FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: frankreed am 17 April 2020, 13:16:47

Titel: mqttPublish und mehrere Readings in einem topic???
Beitrag von: frankreed am 17 April 2020, 13:16:47
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


Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: Gisbert am 17 April 2020, 19:53:17
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​
Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: Otto123 am 17 April 2020, 20:14:35
Hallo Patrick,

klar geht, ich habe das hier  (https://heinz-otto.blogspot.com/2019/11/mqtt-ich-muss-das-testen.html)für mich mal aufgeschrieben. Etwas weiter unten, alle Readings als JSON übertragen.

Gruß Otto
Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: frankreed am 18 April 2020, 10:50:23
@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
Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: Otto123 am 18 April 2020, 11:24:30
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  :-[
Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: frankreed am 22 April 2020, 19:05:32
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}
Titel: Antw:mqttPublish und mehrere Readings in einem topic???
Beitrag von: Otto123 am 22 April 2020, 19:43:27
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.="}"}