Autor Thema: Großbuchstaben im Status ON / OFF nach Kleinschreibung on / off und zurück  (Gelesen 710 mal)

Offline Torxgewinde

  • New Member
  • *
  • Beiträge: 30
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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18411
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-T620@Debian 11, 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
Gefällt mir Gefällt mir x 1 Hilfreich Hilfreich x 1 Liste anzeigen

Offline sash.sc

  • Hero Member
  • *****
  • Beiträge: 1967
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

Offline Torxgewinde

  • New Member
  • *
  • Beiträge: 30
@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.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25415
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 }
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Torxgewinde

  • New Member
  • *
  • Beiträge: 30
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"}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Zitat
Hmm, 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".


Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18411
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...

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-T620@Debian 11, 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

 

decade-submarginal