Warum funktioniert $NAME bei setList und bei readingList nicht?

Begonnen von Juggernaut, 12 Februar 2020, 17:18:10

Vorheriges Thema - Nächstes Thema

Juggernaut

Hallo,
ich habe zur Zeit 2 Funksteckdosen mit Tasmota im Einsatz. Diese sind über Mosquitto als MQTT2_Device mit FHEM verbunden.
Jetzt habe ich mir noch ein paar weiter Steckdosen bestellt und würde mir es gerne einfacher machen mit dem definieren.

Ich kann die Variable $NAME bei setList und bei userReadings verwenden. Nur bei readingList funktioniert das überhaupt nicht.
Muss ich die Variabel bei readingList anders einbinden oder funktioniert es da generell nicht mit der Variablen $NAME?

Gruß und Danke schon mal.

Michael

P.S: Anbei noch meine aktuelle Raw definition.



defmod ender3 MQTT2_DEVICE
attr ender3 IODev Mosquitto
attr ender3 alias Ender-3
attr ender3 autocreate 0
attr ender3 devStateIcon ON:rc_GREEN:off OFF:rc_RED:on
attr ender3 group Steckdosen
attr ender3 readingList tele/ender3/LWT:.* LWT\
  tele/ender3/STATE:.* { json2nameValue($EVENT) }\
  tele/ender3/SENSOR:.* { json2nameValue($EVENT) }\
  tele/ender3/INFO.:.* { json2nameValue($EVENT) }\
  stat/ender3/RESULT:.* { json2nameValue($EVENT) }
attr ender3 room MQTT
attr ender3 setList off:noArg    cmnd/$NAME/power off\
on:noArg     cmnd/$NAME/power on\
EgyRst:noArg cmnd/$NAME/EnergyReset3 0
attr ender3 setStateList on off
attr ender3 sortby 01
attr ender3 stateFormat POWER
attr ender3 userReadings ENERGY_AverageDays { my $since = ReadingsVal($NAME,"ENERGY_TotalStartTime",0);;;; $since=~ s/T/ /g;;;; my $until = time;;;; my $days = ($until - time_str2num("$since"))/86400;;;; $days = sprintf("%.3f",$days);;;; $days }, ENERGY_AveragePerYear {my $egyperyear = (ReadingsVal($NAME,"ENERGY_Total",0) / ReadingsVal($NAME,"ENERGY_AverageDays",0))*365;;;; $egyperyear = sprintf("%.3f",$egyperyear);;;; $egyperyear}, ENERGY_AverageCostsPerYear { my $costsperyear = ReadingsVal($NAME,"ENERGY_AveragePerYear",0) * Value("Strompreis");;;; $costsperyear = sprintf("%.2f",$costsperyear);;;; $costsperyear}

KölnSolar

RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Beta-User

Der Zeil ist regex in readingList, und nicht direkt 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

Juggernaut

Mhh irgend wie bin ich zu doof.

Hab es bisher so probiert:
stat/$NAME/RESULT:.* { json2nameValue($EVENT) }
stat/$name/RESULT:.* { json2nameValue($EVENT) }
stat/"$name"/RESULT:.* { json2nameValue($EVENT) }
stat/($name)/RESULT:.* { json2nameValue($EVENT) }
stat/'$name'/RESULT:.* { json2nameValue($EVENT) }

Geht das bei RegExp generell nicht, oder kann ich das einfach nicht?

Habt ihr vielleicht noch eine Tipp für mich?

Gruß und Danke
Michael

Beta-User

Das "Problem" dürfte sein (dürfte: ich habe nicht in den Modulcode geschaut, das ist nur mein grobes Verständnis): die Angabe aus readingList wird in einen globalen hash übernommen, der dann den MQTT2-Modulen dazu dient, die passenden MQTT2_DEVICES zu finden. Der globale hash kann aber mit "$NAME" & Co wenig anfangen, das wird nicht vorab aufgelöst...

Wenn das so ist, müßte Rudi das fixen, aber m.E. lohnt der Aufwand nicht: Mach' aus deinem "Muster"-Gerät einfach ein eigenes attrTemplate, du willst ja nur den Namen tauschen können, was einfach ist; das kannst du dann auf beliebig viele deiner Geräte ausrollen ;) . Das wäre mein Tipp...
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

Juggernaut

Oh je. Hab mir gerade mal das Template für MQTT2 angeschaut.
Das ist mir zu kompliziert.
Da lege ich lieber die 8 neuen Steckdosen von Hand an.

Dachte nur ich bin zu doof oder mache irgend eine Kleinigkeit falsch.

Trotzdem vielen Dank für euer Hilfe.

Gruß Michael

Beta-User

Für "von Hand": Mach das mit RAW-Code, dann kannst du einen einfachen Editor nehmen und search+replace machen und dann die Zwischenergebnisse jeweils über den RAW-Editor am Stück importieren...
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

Juggernaut

Stimmt das geht auch. Das ist bestimmt die einfachste Lösung für mich.

Vielen Dank!!