structure und userReading

Begonnen von dt2510, 30 Oktober 2019, 18:33:09

Vorheriges Thema - Nächstes Thema

dt2510

Ich hätte mal 'ne Frage ...

Ich habe diverse structures angelegt - unter Anderem für Fenstersensoren und Batteriebetriebene Geträte. In der jeweiligen structure ermittle ich userReadings, die natürlich auch bei den verknüpften devices als Attribut automatisch angelegt werden.
Ist ein device jetzt in beiden structures - das ist bei den Fenstersensoren der Fall - sind nur die userReadings der zuletzt verknüpften structure beim device angelegt worden. Hier mal die Definitionen aus der fhem.cfg

structure Windows
define Windows structure Windows Hauppauge_4_in_1_ID30 PHPST02A_ID37 MAX_17fe6e MAX_18012b MAX_1884d2 MAX_1884e8
attr Windows userReadings windowsOpen { grep { $_ ne "$NAME" && ((Value($_) eq "open") || (Value($_) eq "opened")) } split(" ",$defs{$NAME}{DEF}) },\
devices { join(",",grep { $_ ne "$NAME" && ((Value($_) eq "open") || (Value($_) eq "opened")) } split(" ",$defs{$NAME}{DEF})) }


structure Batteries
define Batteries structure Batteries FGSD002_ID22 FGSD002_ID23 FGSD002_ID24 FGSD002_ID26 FGSD002_ID31 FGSD002_ID34 FPZWWS_ID36 Hauppauge_4_in_1_ID30 MAX_0810a2 MAX_0884ad MAX_0885cd MAX_088703 MAX_0f4023 MAX_17fe6e MAX_18012b MAX_18054a MAX_18073f MAX_1884d2 MAX_1884e8 MAX_1af166 MAX_1af2ad MAX_1af2c5 PHPAT02_ID32 PHPST02A_ID37
attr Batteries stateFormat batteryMin % min.
attr Batteries userReadings batteryPercent {if(ReadingsVal($NAME,"battery","ok") eq "low") {return 10;;} elsif (ReadingsVal($NAME,"battery","low") eq "ok") {return 100;;} else {return ReadingsNum($NAME,"battery",100)} },\
batteryMin { minNum(100, map { $_ eq $NAME ? 100 : ReadingsNum($_,"batteryPercent",100) } split(" ",$defs{$NAME}{DEF}) ) },\
notFull { grep { $_ ne "$NAME" && ReadingsNum($_,"batteryPercent",100) < 100 } split(" ",$defs{$NAME}{DEF}) },\
devices { join(",",grep { $_ ne "$NAME" && ReadingsNum($_,"batteryPercent",100) < 100 } split(" ",$defs{$NAME}{DEF})) },\
devicesLow { join(",",grep { $_ ne "$NAME" && ReadingsNum($_,"batteryPercent",100) < 26 } split(" ",$defs{$NAME}{DEF})) }


Fensterkontakt
define MAX_17fe6e MAX ShutterContact 17fe6e
attr MAX_17fe6e userattr Batteries Batteries_map Windows Windows_map structexclude
attr MAX_17fe6e Batteries Batteries
attr MAX_17fe6e IODev MAX
attr MAX_17fe6e Windows Windows
attr MAX_17fe6e userReadings windowsOpen { grep { $_ ne "$NAME" && ((Value($_) eq "open") || (Value($_) eq "opened")) } split(" ",$defs{$NAME}{DEF}) },\
devices { join(",",grep { $_ ne "$NAME" && ((Value($_) eq "open") || (Value($_) eq "opened")) } split(" ",$defs{$NAME}{DEF})) }


Wie man sieht, sind beim Fensterkontakt nur die userReadings der structure Windows angelegt.

Da die userReadings beim device nicht benötigt werden könnte ich sie einfach entfernen, bei der nächsten Änderung werden sie aber wieder angelegt. Kann man das irgendwie unterbinden ?

rudolfkoenig

Versuchs mal mitattr Windows propagateAttr ^$
attr Batteries propagateAttr ^$
^$ wird ab der naechsten FHEM Version die Voreinstellung sein, z.Zt. ist es .*

dt2510

#2
Das Attribut kannte ich gar nicht ... danke :)

Vielleicht noch kurz zur Erläuterung - mein RegEx ist nich so gut - wofür steht dann ^$ ?

Die userReadings bei den devices spielen ja für die structure keine Rolle und können entfernt werden - oder liege ich da falsch ?

Stütti

^ steht für den Zeilenanfang
$ steht für das Zeilenende

Es bedeutet also, dass nichts matchen wird.
FHEM auf Pi 4 + FTUI auf Pi 3, Eltako 14, SignalESP, JeeLink, EasyESP, ArduCounter, eBus-Koppler, openDTU

dt2510

Zitat von: Stütti am 31 Oktober 2019, 08:30:06
^ steht für den Zeilenanfang
$ steht für das Zeilenende

Es bedeutet also, dass nichts matchen wird.

Danke :)