MQTT Bluepalm B2500

Begonnen von druschba, 25 März 2025, 13:47:03

Vorheriges Thema - Nächstes Thema

druschba

Hallo,

ich möchte meinen Speicher per MQTT in Fhem einbinden.

Die Verbindung konnte ich auch schon herstellen.
MQTT ist hier aber nicht so umgesetzt, wie ich das erwartet hätte.
Wenn ich z.B. den Payload CD=01 an den Speciher schicke bekomme ich eine Antwort, die folgendermaßen außsieht und in ein reading geschrieben wird:


p1=1,p2=1,w1=132,w2=105,pe=35,vv=142,sv=11,cs=1,cd=3,am=0,o1=0,o2=0,do=100,lv=5,cj=0,kn=784,g1=0,g2=0,b1=0,b2=0,tl=14,th=15,tc=0,tf=0,fc=202303012046,id=5,a0=35,a1=0,a2=0,l0=2,l1=0


Also ganz einfach eine durch Komma seperierte Liste. Wie kann ich die einzelnen Elemente in eigene Readings packen?

Danke und Grüße

druschba
Synology Docker FHEM-Server | 1-wire an RasPi | virtual CCU | 3x HM-CFG-USB-2 an RasPi und Synology| HM-ES-PMSw1-PI | HM-TC-IT-WM-W-EU | HM-CC-RT-DN | HM-LC-Bl1PBU-FM | HM-WDS10-TH-O | DbLog | div. 1-wire Sensoren | FR!TZ DECT 200 | JeeLink | ebusd an WOLF CGB2-20

Beta-User

Ungetestet - für die readingList:
{my $ret; for my $element (split m{,}x, $EVENT) {my ($key, $val) = split m{=}x, $element; $ret->{$key}=$val} return $ret;}Theoretischer Einstieg in das Thema ca. hier:
https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt#Perl
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rudolfkoenig


Beta-User

Mich würde davor eigentlich auch interessieren, was man mit solchen Reading-Werten anfangen kann?

Vielleicht muss man nicht nur die Reading-Namen anpassen, sondern auch die Werte (teilweise) mappen?

Na ja, schauen wir mal...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

druschba

Danke für Eure Antworten.

Die Werte der einzelnen Readings sind gut dokumentiert. Damit kann ich dann den Ladezustand der Batterie etc. protokolieren und davon abhängig Energie entnehmen.

z.B. p1=1 beduetet auf eingang eins wird die batterie geladen, w1=132 Leiszung auf Eingang1 132 Watt.

Danke für Eure Anregung und Hilfe. ich werde mich mal versuchen.

Falls es interessiert hier ein LINK zu den Payloads:  https://github.com/noone2k/hm2500pub/wiki/MQTT

Danke und Grüße

druschba
Synology Docker FHEM-Server | 1-wire an RasPi | virtual CCU | 3x HM-CFG-USB-2 an RasPi und Synology| HM-ES-PMSw1-PI | HM-TC-IT-WM-W-EU | HM-CC-RT-DN | HM-LC-Bl1PBU-FM | HM-WDS10-TH-O | DbLog | div. 1-wire Sensoren | FR!TZ DECT 200 | JeeLink | ebusd an WOLF CGB2-20

frober

#5
Zitat von: Beta-User am 25 März 2025, 14:36:01{my $ret; for my $element (split m{,}x, $EVENT) {my ($key, $val) = split m{=}x, $element; $ret->{$key}=$val} return $ret;}

Jetzt muss ich doch fragen...

Zu meinen Verständnis
m{,}x mich irritieren die geschweiften Klammern. Diese kenne ich im Regex um die Anzahl der Wiederholungen zu beschränken. Bedeutet das, dass solange gesplittet wird, wie ein Komma vorhanden ist? Ein Split /,/ macht aber doch auch nichts anderes!?

Edit:
Ich beantworte es selbst...
Zitat aus Perldoc:
ZitatDas letzte Beispiel zeigt, dass s/// andere Trennzeichen wie s!!! und s{}{} und sogar verwendet werden können s{}//.


Zweitens, woher weiß FHEM hier den Readingsnamen, bzw. wie wird dieser ermittelt?
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

Zitat von: frober am 26 März 2025, 07:39:20
Zitat von: Beta-User am 25 März 2025, 14:36:01{my $ret; for my $element (split m{,}x, $EVENT) {my ($key, $val) = split m{=}x, $element; $ret->{$key}=$val} return $ret;}

Jetzt muss ich doch fragen...

Zu meinen Verständnis
m{,}x mich irritieren die geschweiften Klammern. Diese kenne ich im Regex um die Anzahl der Wiederholungen zu beschränken. Bedeutet das, dass solange gesplittet wird, wie ein Komma vorhanden ist? Ein Split /,/ macht aber doch auch nichts anderes!?

Edit:
Ich beantworte es selbst...
Zitat aus Perldoc:
ZitatDas letzte Beispiel zeigt, dass s/// andere Trennzeichen wie s!!! und s{}{} und sogar verwendet werden können s{}//.


Zweitens, woher weiß FHEM hier den Readingsnamen, bzw. wie wird dieser ermittelt?
Das "split m{,}x, $EVENT" ist "vorne" einfach eine "compilerfreundlichere" Schreibweise der regex, mit der gesplittet werden soll. Das Ergebnis ist ein Array mit "x=y" Texten.

Die werden dann einfach weiter am "=" gesplittet, der erste Teil gibt den Readingnamen (key des HASH %ret, auf den referenziert wird), der hintere Teil eben den Reading-Wert.

Zitat von: druschba am 25 März 2025, 19:48:47p1=1 beduetet auf eingang eins wird die batterie geladen
Sowas hatte ich schon vermutet, d.h. "eigentlich" willst du am Ende doch zum Teil "Menschenlesbare Text-Reading-Inhalte".

Für sowas ist es m.E. sinnvoll, die ganze Analyse von $EVENT an eine sub auszulagern, die das erledigt. Siehe z.B. (den weiter verlinkten Thread) hier: https://forum.fhem.de/index.php?msg=1109103
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

frober

Zitat von: Beta-User am 26 März 2025, 08:15:37Die werden dann einfach weiter am "=" gesplittet, der erste Teil gibt den Readingnamen (key des HASH %ret, auf den referenziert wird), der hintere Teil eben den Reading-Wert.

D.h. mit
return $retwird die Referenz
$ret->{$key}=$valanalog
Reading=Wert übergeben.

Danke für die Erläuterung.


Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

#8
Moin,

ich habs so verstanden das m erlaubt einen anderen Delimiter anzugeben wie /.
Das x ist in dem Fall mein ich überflüssig.

Beta-User

Zitat von: TomLee am 26 März 2025, 08:32:54ich habs so verstanden das m erlaubt einen anderen Delimiter anzugeben wie /.
Ja. Wobei bestimmte "Klammern" halt paarig anzugeben sind, es ginge z.B. auch:
m<,>x
Zitat von: frober am 26 März 2025, 08:30:36wird die Referenz
Nope. Ganz am Ende nach Auswertung aller Paare wird die Referenz auf einen HASH übergeben, der alle so ermittelbaren Paare enthält, und nicht, (so verstehe ich deine Rückmeldung?) nur ein einzelnes "Reading=Wert"-Paar.

PS: Ob das syntaktisch so klappt, habe ich nicht näher geprüft. Das mit den Siegeln (\%{$ret}?!?) ist immer wieder lustig... Von daher würde mich erst mal von @druschba interessieren, ob das (Zwischen-) Ergebnis paßt, ohne das log zu füllen ;D .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

frober

Zitat von: Beta-User am 26 März 2025, 08:42:07Nope. Ganz am Ende nach Auswertung aller Paare wird die Referenz auf einen HASH übergeben, der alle so ermittelbaren Paare enthält, und nicht, (so verstehe ich deine Rückmeldung?) nur ein einzelnes "Reading=Wert"-Paar.

Dein Code habe ich soweit schon verstanden.
Durch die for-Schleife werden alle ermittelten "Reading=Wert"-Paare übergeben.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

ZitatPS: Ob das syntaktisch so klappt, habe ich nicht näher geprüft.

Ich vermute es klappt, habs aber auch nicht ausprobiert. Hab mich nur so lange damit beschäftigt, bis ich alles verstanden habe.

TomLee

Muss jetzt los.

Aber eins noch.
Richtiger wäre $ret so anzugeben: my $ret={};
my ($key, $val) = split m{=}x, $element; sollte nur einmal durchlaufen werden, sollte ein = im Wert vorkommen:
my ($key, $val) = split m{=}x, $element,2;

Und dann könnte man noch für einen Ersatzwert sorgen, falls Wert mal leer ist.

Beta-User

Zitat von: TomLee am 26 März 2025, 09:06:14Richtiger wäre $ret so anzugeben: my $ret={};
Wie kommst du darauf?

Mein Verständnis - entsprechend https://perldoc.perl.org/perldata - ist:
ZitatPerl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes". A scalar is a single string (of any size, limited only by the available memory), number, or a reference to something
Da es Perl sowieso erlaubt, die Inhalte des hier relevanten SCALAR "$ret" zwischen (den drei genannten) "beliebigen" Variablen-Typen hin- und herzutauschen, muss man nicht erst explizit sagen, dass $ret eine Referenz auf einen HASH sein soll (per geschweifter Klammer).

Das mit der ",2" bei split ist zumindest theoretisch korrekt, in dem gegebenen Beispiel kam es aber genausowenig vor wie der Fall, dass gar kein Wert zugewiesen war. Daher habe ich das nicht weiter verkomplizieren wollen.


Zitat von: frober am 26 März 2025, 08:52:12Durch die for-Schleife werden alle ermittelten "Reading=Wert"-Paare übergeben.
Sprachlich m.E. korrekter: durch die for-Schleife werden alle "Reading=Wert"-Paare in den referenzierten HASH geschrieben.

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

TomLee

ZitatWie kommst du darauf?

Richtiger war auf die Schnelle vlt. falsch ausgedrückt. Würde man die geschweiften Klammern mit angeben, wäre es verständlicher/leichter auf Anhieb zu lesen/verstehen. So ist es erstmal nur ne skalare Variable, später ergibt sich das es eine Hashreferenz ist.