Großbuchstaben im Status ON / OFF nach Kleinschreibung on / off und zurück

Begonnen von Torxgewinde, 21 Juni 2022, 07:14:51

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo,
Einige MQTT Geräte melden ihren Status als "ON" oder "OFF". FHEM kommt besser mit den States "on" und "off" nativ klar. Um das umzuwandeln kann man  "eventMap" nutzen. Hier ein Beispiel eines Zigbee-Wasserventils, das mit Zigbee2MQTT via MQTT angesprochen werden kann:


defmod Gemuesebeet.device MQTT2_DEVICE
attr Gemuesebeet.device IODev Mosquitto
attr Gemuesebeet.device devicetopic garden/Gemüsebeet
attr Gemuesebeet.device event-on-change-reading .*
attr Gemuesebeet.device eventMap { dev=>{'ON'=>'on', 'OFF'=>'off'}, usr=>{'on'=>'ON', 'off'=>'OFF'} }
attr Gemuesebeet.device readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
attr Gemuesebeet.device setList ON $DEVICETOPIC/set ON\
OFF $DEVICETOPIC/set OFF\
timer $DEVICETOPIC/set {"timer":"$EVTPART1","state":"ON"}


Relevant ist der Teil "eventMap { dev=>{'ON'=>'on', 'OFF'=>'off'}, usr=>{'on'=>'ON', 'off'=>'OFF'} }".

Vielleicht hilft dieser Schnipsel je jemandem.

Beta-User

Hmm, irgendwie hat mich schon länger gewundert, dass sich keiner an der Großschreibung bei zigbee2mqtt stört...

eventMap finde ich nicht sooo prickelnd, weil dann immer der Reading- und Internal-Wert nicht 100% identisch sind. Bin aber leider schon länger aus zigbee2mqtt raus, von daher hier nur etwas Theorie, vielleicht hilft es jemand: An sich müßte es  auch gehen, dass man "state" aus der von json2nameValue() gelieferten Hash-Referenz manipuliert, bevor sie an das Modul zurückgegeben wird, also der Spur nach so:

attr Gemuesebeet.device readingList $DEVICETOPIC:.* { my %ret=json2nameValue($EVENT); $ret{state}=lc($ret{state}); return \%ret }
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

sash.sc

Wenn es um tasmota geht, dort kann man die groß und Kleinschreibung einstellen.

Gruß Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Torxgewinde

@Beta-User
Das klingt auch super, allerdings habe ich mit $DEVICETOPIC:.* { my %ret=json2nameValue($EVENT); $ret{state}=lc($ret{state}); return %ret }
2022.06.21 19:14:13 1 : PERL WARNING: Reference found where even-sized list expected at (eval 1670252) line 1.
2022.06.21 19:14:13 3 : eval: my $CID=   $evalSpecials->{'%CID'};my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $JSONMAP=   $evalSpecials->{'%JSONMAP'};my $NAME=   $evalSpecials->{'%NAME'};my $TOPIC=   $evalSpecials->{'%TOPIC'};{ my %ret=json2nameValue($EVENT);; $ret{state}=lc($ret{state});; return %ret }


Ich habe auch folgendes versucht $DEVICETOPIC:.* { my %ret=json2nameValue($EVENT); %ret = map lc, %ret; return %ret }, auch da gibt es einen Fehler:
2022.06.21 19:17:57 1 : PERL WARNING: Reference found where even-sized list expected at (eval 1670786) line 1.
2022.06.21 19:17:57 3 : eval: my $CID=   $evalSpecials->{'%CID'};my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $JSONMAP=   $evalSpecials->{'%JSONMAP'};my $NAME=   $evalSpecials->{'%NAME'};my $TOPIC=   $evalSpecials->{'%TOPIC'};{ my %ret=json2nameValue($EVENT);; %ret = map lc, %ret;; return %ret }


und warum $DEVICETOPIC:.* { return map lc, json2nameValue($EVENT) } nicht klappt ist mir auch ein Rätsel.

Irgendwas hakt dann da noch und mein Perl-Foo ist schwach.

@sash.sc: Ja, Tasmota kann das ändern, aber bei Zigbee2MQTT habe ich das (noch) nicht gefunden.

rudolfkoenig

json2nameValue liefert eine Referenz (vulgo Zeiger) zurueck.
Versuchs mal damit (ungetestet):
attr Gemuesebeet.device readingList $DEVICETOPIC:.* { my $ret=json2nameValue($EVENT); $ret->{state}=lc($ret->{state}); return $ret }

Torxgewinde

Jo, so klappt es! Danke!


defmod Gemuesebeet.device MQTT2_DEVICE
attr Gemuesebeet.device IODev Mosquitto
attr Gemuesebeet.device devicetopic garden/Gemüsebeet
attr Gemuesebeet.device event-on-change-reading .*
attr Gemuesebeet.device readingList $DEVICETOPIC:.* { my $ret=json2nameValue($EVENT);; $ret->{state}=lc($ret->{state});; return $ret }
attr Gemuesebeet.device setList on $DEVICETOPIC/set ON\
off $DEVICETOPIC/set OFF\
timer $DEVICETOPIC/set {"timer":"$EVTPART1","state":"ON"}

TomLee

ZitatHmm, irgendwie hat mich schon länger gewundert, dass sich keiner an der Großschreibung bei zigbee2mqtt stört...

Ich war bisher der Meinung dich so verstanden zu haben das du an der Großschreibung nichts ändern wolltest, wenn die halt bei z2m so "kommt".

Ich wäre dafür das du das bitte gleich, wenn mal Zeit ist, "vertemplatest".


Beta-User

Zitat von: TomLee am 21 Juni 2022, 20:59:33
Ich wäre dafür das du das bitte gleich, wenn mal Zeit ist, "vertemplatest".
Habe nach der lebhaften Diskussion hier den "Bedarf" erkannt...

Kommt bei Gelegenheit, nach Durchsicht der attrTemplates unter diesem Gesichtspunkt gab es eine "wilde Mischung" aus eventMap, stateFormat und "nichts", dazu noch würgarounds betr. open/closed statt true/false, na ja, alles nicht optimal...

Zitat von: TomLee am 21 Juni 2022, 20:59:33
Ich war bisher der Meinung dich so verstanden zu haben das du an der Großschreibung nichts ändern wolltest, wenn die halt bei z2m so "kommt".
Na ja, ich tendiere weiterhin dazu, nur da Änderungen vorzunehmen, wo es gute Gründe dafür gibt. Aber manchmal gibt es die eben  ::) (und dazu kommt, dass die Anpassungen jetzt (gefühlt) nicht (mehr) soooo ultra-kompliziert sind.
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

Torxgewinde

Noch eine weitere Methode ist mir heute eingefallen:
Einfach das Event vor dem Zerlegen des JSON in Kleinbuchstaben wandeln geht auch. Dann sind zwar auch alle Readings in Kleinschreibung, aber das macht mir nichts.

$DEVICETOPIC/tele/SENSOR:.* { json2nameValue(lc($EVENT)) }