FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: WumpE am 12 Juli 2021, 21:36:33

Titel: MQTT Payload as CSV
Beitrag von: WumpE am 12 Juli 2021, 21:36:33
Hey Leute,

wie geht man am besten mit nem MQTT Payload als CSV um ?

801000056601,49.98,25.6,233.9,0.3,0.3,3.5,3.5,1.32,1.48,1.75,1.74,0,0,28.2,28.1,0.1,0.1,28.1,28

das bekomme ich als payload,

1. ist die Serial des Gerätes
2. Hz
3.Tmperatur
4. Volt
....

usw

wie bekomme ich sowas am besten in readings gepackt?

problemstellung dabei, es gibt mehrere geräte die mit dieser subscription solchen payload senden. Auseinanderhalten kann man sie nur durch die sereinnummer.

Es handelt sich hier um APSystems Wechselrichter die per Zigbee senden. Diese daten Fische ich mit esp8266 und cc2530 ab und gebe sie per mqtt an den mqtt broker weiter. den lua script habe ich mir nicht neu einfallen lassen, den gibt es schon.

bin für jegliche hilfe offen....


danke und grüße
Stefan
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 12 Juli 2021, 22:02:25
Mobile Kurzfassung: Array anlegen mit den Reading-Namen. split auf $EVENT. Ersten Wert per shift in eine Variable. Rest in einen Hash packen, jeweils key aus Namens-Array, value aus dem split. json2nameValue($myHash,"${Name}_") zurückgeben...
Titel: Antw:MQTT Payload as CSV
Beitrag von: WumpE am 12 Juli 2021, 22:16:34
Zitat von: Beta-User am 12 Juli 2021, 22:02:25
Mobile Kurzfassung: Array anlegen mit den Reading-Namen. split auf $EVENT. Ersten Wert per shift in eine Variable. Rest in einen Hash packen, jeweils key aus Namens-Array, value aus dem split. json2nameValue($myHash,"${Name}_") zurückgeben...

Hört sich gut an .... Werde ich morgen mal testen .....

Geht nur der Weg über subroutine in den utils oder hat noch jemand nen codeschnippel wie es gleich im mqtt device evtl per userreading geht ?
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 06:25:55
Müsste direkt in readingList gehen, ist halt relativ viel Code. userReadings ist m.E. für diesen Zweck nicht die beste Lösung. readingList-Hash => alle Readings werden auf einmal aktualisiert.
Titel: Antw:MQTT Payload as CSV
Beitrag von: rudolfkoenig am 13 Juli 2021, 09:56:39
Vorschlag:
define MQTT2_esp8266 MQTT2_DEVICE esp8266
attr MQTT2_esp8266 readingList esp8266:topic:.* { my @e=split(",",$EVENT);; my $n=shift @e;; json2nameValue(toJSON(\@e), "${n}_", $JSONMAP) }
attr MQTT2_esp8266 jsonMap 801000056601_1:serial\
801000056601_2:freq\
801000056601_3:temperature\
801000056601_4:voltage
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 10:48:04
...hat auch was für sich, v.a., wenn die Struktur des csv sich ändern sollte.

Problem dürfte sein, dass man dann eine ziemlich lange jsonMap braucht, nämlich für jede "serial" einen kompletten Satz. Evtl. wäre es aber eine Idee, $JSONMAP zu nutzen, um die Zuordnung "Array-Index" zu "postfix" zu machen? (das scheint aber nicht trivial zu sein...)

Titel: Antw:MQTT Payload as CSV
Beitrag von: WumpE am 13 Juli 2021, 11:40:07
Danke euch beiden,

habs jetzt erstmal so
ECU-DATA.* { my @a = split(",",$EVENT);  {"$a[0]_Inv_Hz" => $a[1],"$a[0]_Inv_Temp" => $a[2],"$a[0]_Inv_V" => $a[3],"$a[0]_MPP_1_W" => $a[4],"$a[0]_MPP_2_W" => $a[5],"$a[0]_MPP_3_W" => $a[6],"$a[0]_MPP_4_W" => $a[7],"$a[0]_MPP_1_kWh" => $a[8],"$a[0]_MPP_2_kWh" => $a[9] ,"$a[0]_MPP_3_kWh" => $a[10] ,"$a[0]_MPP_4_kWh" => $a[11] ,"$a[0]_MPP_1_A" => $a[12] ,"$a[0]_MPP_2_A" => $a[13],"$a[0]_MPP_1_V" => $a[14],"$a[0]_MPP_2_V" => $a[15],"$a[0]_MPP_3_A" => $a[16],"$a[0]_MPP_4_A" => $a[17],"$a[0]_MPP_3_V" => $a[18],"$a[0]_MPP_4_V" => $a[19] }}
sehr statisch aber funktioniert

und habe nun auch schon die stelle im lua file gefunden wo der string zusammen gebastelt wird und werde ihn dort json konform bauen, dann umgehe ich das gefrickel

grüße Stefan
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 12:01:07
Das Ändern des scripts ist ggf. für Nachahmer etwas schwierig.

Vielleicht hilft auch das hier weiter:
defmod MQTT2_esp8266 MQTT2_DEVICE esp8266
attr MQTT2_esp8266 IODev m2server
attr MQTT2_esp8266 jsonMap 0:freq\
1:temperature\
2:voltage
attr MQTT2_esp8266 readingList testtopic:.* { my @e=split(",",$EVENT);; my $n=shift @e;; my $h;; for (0..@e) { my $pf = ( defined $defs{$NAME}->{JSONMAP} && defined $defs{$NAME}->{JSONMAP}{$_} ) ? $defs{$NAME}->{JSONMAP}->{$_} : $_;; $h->{$pf} = $e[$_] };; json2nameValue(toJSON($h), "${n}_") }
Titel: Antw:MQTT Payload as CSV
Beitrag von: rudolfkoenig am 13 Juli 2021, 12:09:41
Z.Zt. passiert die Filterung in json2nameValue vor dem Mapping.
Wenn ich die Reihenfolge vertauschen wuerde, dann koennte man einen relativ einfachen Filter einbauen (z.Bsp. ^[a-z]).

Spricht was dagegen, diese Reihenfolge zu aendern? Ist zwar nicht ganz Rueckwaertskompatibel, koennte aber etliche Probleme loesen.

Und/oder koennte ich mit einem weiteren optionalen Parameter einen Negativfilter einbauen, es scheint dafuer Bedarf zu geben.
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 12:36:17
Zitat von: rudolfkoenig am 13 Juli 2021, 12:09:41
Z.Zt. passiert die Filterung in json2nameValue vor dem Mapping.
Wenn ich die Reihenfolge vertauschen wuerde, dann koennte man einen relativ einfachen Filter einbauen (z.Bsp. ^[a-z]).

Spricht was dagegen, diese Reihenfolge zu aendern? Ist zwar nicht ganz Rueckwaertskompatibel, koennte aber etliche Probleme loesen.

Und/oder koennte ich mit einem weiteren optionalen Parameter einen Negativfilter einbauen, es scheint dafuer Bedarf zu geben.
Falls sich die Fragen an mich richten: Bin spontan etwas überfragt...
- Rückwärtskompatibel dürfte "egal" sein, soweit ich das erkennen kann, gibt es wenn, dann wenige Anwender, die das bisher nutzen
- Die Reihenfolge umzudrehen ist wohl etwas weniger effizient, v.a. wenn man große JSON hat und viel rausfiltern will, oder? Bin da aber leidenschaftslos...
- Negativfilter finde ich eine gute Idee (auch wenn ich den Zusammenhang zu dem Thread hier nicht erkennen kann)
- Mehr Argumente => unübersichtlicher. Vielleicht wäre es ausreichend, das _entweder_ als Positivfilter _oder_ als Negativfilter nutzen zu können. Wer "alles außer" haben mag, kann ja z.B. einfach ein "!" voranstellen (und trotzdem mehrere Alternativen angeben, was er nicht mag)...

M.E. sollte man das aber mal wieder nicht unbedingt nur an dieser etwas versteckten Stelle diskutieren (auch wenn ich im Moment keine sonstigen Diskutanten sehe).
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 13:06:13
Nachtrag noch zu dem RAW von vorhin: Es geht auch etwas einfacher...

defmod MQTT2_esp8266 MQTT2_DEVICE esp8266
attr MQTT2_esp8266 IODev m2server
attr MQTT2_esp8266 jsonMap 0:freq\
1:temperature\
2:voltage
attr MQTT2_esp8266 readingList testtopic:.* { my @e=split(",",$EVENT);; my $n=shift @e;; my $h;; for (0..@e) { my $pf = ( defined $defs{$NAME}->{JSONMAP} && defined $defs{$NAME}->{JSONMAP}{$_} ) ? $defs{$NAME}->{JSONMAP}->{$_} : $_;; $h->{"${n}_$pf"} = $e[$_] };; return $h}

setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_10 1.74
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_11 0
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_12 0
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_13 28.2
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_14 28.1
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_15 0.1
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_16 0.1
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_17 28.1
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_18 28
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_3 0.3
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_4 0.3
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_5 3.5
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_6 3.5
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_7 1.32
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_8 1.48
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_9 1.75
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_freq 49.98
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_temperature 25.6
setstate MQTT2_esp8266 2021-07-13 12:06:14 801000056601_voltage 233.9
Titel: Antw:MQTT Payload as CSV
Beitrag von: rudolfkoenig am 13 Juli 2021, 17:20:23
Zitat- Rückwärtskompatibel dürfte "egal" sein, soweit ich das erkennen kann, gibt es wenn, dann wenige Anwender, die das bisher nutzen
Danke, sowas wollte ich hoeren, habe die filter-Pruefung verschoben, und einen weiteren Parameter, negFilter eingebaut.
filter arbeitet auf dem jsonMap-Werten, und negFilter auf den ungemappten.
Titel: Antw:MQTT Payload as CSV
Beitrag von: Beta-User am 13 Juli 2021, 17:27:28
Zitat von: rudolfkoenig am 13 Juli 2021, 17:20:23
Danke, sowas wollte ich hoeren, habe die filter-Pruefung verschoben, und einen weiteren Parameter, negFilter eingebaut.
filter arbeitet auf dem jsonMap-Werten, und negFilter auf den ungemappten.
... immer wieder gerne ;D ...

(Muss mal überlegen, wo das ggf. (noch) in die Doku einfließen könnte, dass das vielleicht der eine oder andere wiederfindet (mich eingeschlossen  ::) ...))