Bug in structure: structexclude wird nicht berücksichtigt

Begonnen von Loctotex, 27 Oktober 2026, 20:00:12

Vorheriges Thema - Nächstes Thema

Loctotex

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.