Moin,
ich habe einen Bug im structure-Modul gefunden. Ich fasse damit mehrere Bewegungsmelder zusammen. Wenn ich nun temporär einen davon ignorieren möchte, setze ich das Attribut `structexclude`.
Leider berücksichtigt die Structure trotzdem weiterhin die Events und den Status des ausgeschlossenen Bewegungsmelders.
Für einen schnellen Test kann man das mit zwei Dummys nachvollziehen:
defmod Demo_BM1 dummy
attr Demo_BM1 alias Bewegungsmelder 1
attr Demo_BM1 room Structure_Test
attr Demo_BM1 readingList motion battery
attr Demo_BM1 setList motion:open,closed battery:ok,low
attr Demo_BM1 stateFormat motion
attr Demo_BM1 webCmd motion:battery
defmod Demo_BM2 dummy
attr Demo_BM2 alias Bewegungsmelder 2
attr Demo_BM2 room Structure_Test
attr Demo_BM2 readingList motion battery
attr Demo_BM2 setList motion:open,closed battery:ok,low
attr Demo_BM2 stateFormat motion
attr Demo_BM2 webCmd motion:battery
defmod Demo_Motion structure DemoMotion Demo_BM1 Demo_BM2
attr Demo_Motion alias Bewegungsmelder gesamt
attr Demo_Motion room Structure_Test
attr Demo_Motion clientstate_behavior absolute
attr Demo_Motion stateFormat {ReadingsVal($name,"state","undefined") eq "open" ? "all open" : ReadingsVal($name,"state","undefined") eq "closed" ? "closed" : "any open"}
attr Demo_BM1 DemoMotion_map motion
attr Demo_BM2 DemoMotion_map motion
set Demo_BM1 motion closed
set Demo_BM2 motion closed
set Demo_BM1 battery ok
set Demo_BM2 battery ok
Mit `attr Demo_BM2 structexclude ^Demo_Motion$` sollte BM2 ignoriert werden.
Auf `set Demo_BM2 motion closed` und `set Demo_BM2 motion open` reagiert Demo_Motion aber weiterhin. Auch wenn BM1 ein Event auslöst, wird BM2 bei der Statusberechnung noch berücksichtigt.
In der FHEM-Commandref steht dazu:
Bei gesetztem Attribut wird set, attr/deleteattr ignoriert. Dies trifft ebenfalls auf die Weitergabe des Devicestatus an die Struktur zu. Fuer set und fuer die Status-Weitergabe muss der Wert den Strukturnamen matchen, bei einem Attribut-Befehl die Kombination Strukturname:Attributname.
Ich habe mir das Modul mal angesehen. In `structure_Set` wird `structexclude` bereits geprüft, in `structure_Notify` fehlt diese Prüfung allerdings.
Ich habe deshalb in `structure_Notify` zwei Prüfungen ergänzt. Einmal wird geprüft, ob das auslösende Gerät per `structexclude` ausgeschlossen ist. Außerdem werden solche Geräte bei der Berechnung des Structure-Status übersprungen. Sonst würden sie bei Events anderer Mitglieder ja weiterhin berücksichtigt werden.
Den Patch habe ich angehängt.