MQTT Payload as CSV

Begonnen von WumpE, 12 Juli 2021, 21:36:33

Vorheriges Thema - Nächstes Thema

WumpE

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
Über Mich: Stefan, Informatiker, Systementwicklung Prozessleittechnik
Server: NUC7i5 - Debian Docker
Container: FHEM,DEBMATIC,EMQX,NODERED,SONOS2MQTT,TRAEFIK,HOMEBRIDGE,DECONZ
Aktoren/Sensoren: HM-RF, HM-IP, EnergyCam, Shelly, MiLight, Hue, SONOS, OEG KMS-D+, Echo's, Worx
Frontends: Smartvisu 2.9

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

WumpE

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 ?
Über Mich: Stefan, Informatiker, Systementwicklung Prozessleittechnik
Server: NUC7i5 - Debian Docker
Container: FHEM,DEBMATIC,EMQX,NODERED,SONOS2MQTT,TRAEFIK,HOMEBRIDGE,DECONZ
Aktoren/Sensoren: HM-RF, HM-IP, EnergyCam, Shelly, MiLight, Hue, SONOS, OEG KMS-D+, Echo's, Worx
Frontends: Smartvisu 2.9

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

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

Beta-User

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

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

WumpE

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
Über Mich: Stefan, Informatiker, Systementwicklung Prozessleittechnik
Server: NUC7i5 - Debian Docker
Container: FHEM,DEBMATIC,EMQX,NODERED,SONOS2MQTT,TRAEFIK,HOMEBRIDGE,DECONZ
Aktoren/Sensoren: HM-RF, HM-IP, EnergyCam, Shelly, MiLight, Hue, SONOS, OEG KMS-D+, Echo's, Worx
Frontends: Smartvisu 2.9

Beta-User

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}_") }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

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.

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

#10
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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

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.

Beta-User

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  ::) ...))
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files