Ich verwende structure ganz normal um Gruppen von Geräten zu überwachen und zu schalten. Dabei möchte ich die Gruppen nicht durch Aneinanderreihung von einzelnen Devices definieren, sondern durch Wildcards. Das funktioniert prinzipiell auch für die Überwachung. Will ich aber set Befehle an die Devices der so definierten structure übergeben, klappt das nicht.
Meine structure Definition sieht in etwas so aus:
Internals:
ATTR Lampen
CHANGEDCNT 0
DEF Lampen .*_Lampe.*
NAME strctAlleLampen
NR 215
NTFY_ORDER 50-strctAlleLampen
STATE off
TYPE structure
CONTENT:
dg_SZ_Lampe_sued 1
eg_WZ_Lampe_west 1
og_KZ_Lampe1
READINGS:
2018-01-10 17:04:45 LastDevice og_KZ_Lampe
2018-01-10 17:04:45 LastDevice_Abs og_KZ_Lampe
2018-01-10 17:04:45 non 0
2018-01-10 17:04:45 noff 3
2018-01-10 17:04:45 state off
Attributes:
clientstate_behavior relative
clientstate_priority on off
evaluateSetResult 1
userReadings non{
my $regexp = InternalVal("strctAlleLampen","DEF","");
my $type = InternalVal("strctAlleLampen","ATTR","");
$regexp =~ s/$type //;
my @devs = devspec2array("NAME=" . $regexp);
my $n = 0;
foreach (@devs) {
$n++ if (ReadingsVal($_,"state","") eq "on");
}
return $n;
},
noff {
my $regexp = InternalVal("strctAlleLampen","DEF","");
my $type = InternalVal("strctAlleLampen","ATTR","");
$regexp =~ s/$type //;
my @devs = devspec2array("NAME=" . $regexp);
my $n = 0;
foreach (@devs) {
$n++ if (ReadingsVal($_,"state","") eq "off");
}
return $n;
}
userattr Lampen Lampen_map structexclude
(die userreadings zählen die Staii der Lampen).
Wenn einzelne Lampen verändert werden, dann spiegelt sich das in der structure wieder. Wennn ich aber einen Befehl wie
set strctAlleLampen on/of
absetze, dann passiert nichts.
Ich habe mir mal den Code des Moduls in 98_structure.pm angeschaut und bin der Meinung, dass da in der _Set Funktion eine Auswertung der regexp fehlt wenn die Liste mit den zu bearbeitenden Devices zusammen gebaut wird. Wenn ich folgende Zeile (rot) einfüge, zeigt sich das Verhalten, wie ich es gern hätte. Ich bin mir aber nicht so ganz sicher, ob das von Rudi so gewollt ist bzw. ob es da nicht irgendwelche Seiteneffekte gibt (dazu habe ich zu wenig Insider Wissen).
my @devList = split("[ \t][ \t]*", $hash->{DEF});
shift @devList;
@devList = devspec2array("NAME=" . join("|",@devList));
if(@list > 1 && $list[$#list] eq "reverse") {
pop @list;
@devList = reverse @devList;
}
Dass beim structure-define moeglich ist ein devSpec anzugeben, suggeriert leider, dass das dynamisch passiert, das ist aber nicht der Fall. Die Zeile unten genuegt nicht, da structure verspricht auch die Zustaende aller angegebenen Geraete zu ueberwachen.
Als Workaround koennte man ein notify bauen, was auf global:DEFINED horcht, und modify structure ausfuehrt.
Das mit der Überwachung scheint ja nach meinen Erfahrungen mit den Wildcards zu klappen. State changes kommen von allen betroffenen Devices bei der structure an und auch so Dinge wie clientstate_behaviour und clientstate_priority werden richtig berücksichtigt. Was fehlt denn da dann noch? Geht es darum was passiert, wenn ich neue Devices anlege, die in der regexp abgedeckt sein müssten?
ZitatGeht es darum was passiert, wenn ich neue Devices anlege, die in der regexp abgedeckt sein müssten?
Ich habe structure.pm nochmal angeschaut: die Erweiterung, was devscpec2array einbaut, ist fehlerhaft und unvollstaendig: set funktioniert nicht, falsche devspecs werden nicht behandelt, nachtraeglich definierte Geraete, die dem devspec entsprechen, werden nicht ueberwacht, und das ist nur das, was mir beim ueberfliegen aufgefallen ist.
Dein Patch funktioniert nur in deinem speziellen Fall, sowas wie TYPE=FS20 oder NAME=.*_Lampe.* wuerde schiefgehen.
Dass die eine Zeile nicht die Lösung ist, habe ich ja schon befürchtet (siehe oben zum Thema Seiteneffekte). Ich wollte damit eher eine Anregung geben mal darüber nachzudenken ob es Chancen gibt das mit den Wildcards und structure hinzubekommen.
Ich habe jetzt eine Version eingecheckt, was die per devspec definierten Mitglieder auch waehrend der Laufzeit dynamisch hinzufuegt, hoffentlich ohne Nebeneffekte. Das Verhalten der explizit genannten Mitglieder sollte sich nicht geaendert haben.
Super, vielen Dank. Ich werds testen und melden wenn mir was auffällt.
Bei mir ändert seit dem gestrigen Update eine structure über alle Fensterkontakte den Status nicht mehr, sobald ein Fenster geöffnet wird:
Internals:
ATTR struct.state
CHANGEDCNT 2
DEF struct.state hm.fk.eg.Arbeitszimmer.links hm.fk.eg.Arbeitszimmer.rechts hm.fk.eg.Badezimmer hm.fk.eg.Kueche.links hm.fk.eg.Kueche.rechts hm.fk.eg.Wohnzimmer.links hm.fk.eg.Wohnzimmer.rechts hm.fk.eg.Wohnzimmer.Tuer.links hm.fk.eg.Wohnzimmer.Tuer.Mitte hm.fk.eg.Wohnzimmer.Tuer.rechts hm.fk.eg.Wohnzimmer.Tuergriff.Mitte hm.fk.st.Arbeitszimmer.links hm.fk.st.Arbeitszimmer.rechts hm.fk.st.Schlafzimmer.rechts hm.fk.st.Schlafzimmer.links hm.fk.ug.Keller.Tuer
NAME struct.fk.alle
NR 705
NTFY_ORDER 50-struct.fk.alle
STATE GESCHLOSSEN
TYPE structure
CONTENT:
hm.fk.eg.Arbeitszimmer.links GESCHLOSSEN
hm.fk.eg.Arbeitszimmer.rechts GESCHLOSSEN
hm.fk.eg.Badezimmer GESCHLOSSEN
hm.fk.eg.Kueche.links GESCHLOSSEN
hm.fk.eg.Kueche.rechts GESCHLOSSEN
hm.fk.eg.Wohnzimmer.Tuer.Mitte GESCHLOSSEN
hm.fk.eg.Wohnzimmer.Tuer.links GESCHLOSSEN
hm.fk.eg.Wohnzimmer.Tuer.rechts GESCHLOSSEN
hm.fk.eg.Wohnzimmer.Tuergriff.Mitte GESCHLOSSEN
hm.fk.eg.Wohnzimmer.links GESCHLOSSEN
hm.fk.eg.Wohnzimmer.rechts GESCHLOSSEN
hm.fk.st.Arbeitszimmer.links GESCHLOSSEN
hm.fk.st.Arbeitszimmer.rechts GESCHLOSSEN
hm.fk.st.Schlafzimmer.links GESCHLOSSEN
hm.fk.st.Schlafzimmer.rechts GESCHLOSSEN
hm.fk.ug.Keller.Tuer GESCHLOSSEN
READINGS:
2018-01-13 11:09:47 LastDevice hm.fk.eg.Arbeitszimmer.links
2018-01-13 11:09:47 LastDevice_Abs hm.fk.eg.Arbeitszimmer.links
2018-01-13 11:09:47 SwitchTime 11.09
2018-01-13 11:09:47 state GESCHLOSSEN
2018-01-13 11:09:47 statusIcon1 ok
2018-01-13 11:09:47 statusIcon2 none
2018-01-13 11:09:47 statusSound :long.mp3:
Attributes:
alias Fenster
clientstate_behavior relative
clientstate_priority OFFEN GESCHLOSSEN
event-on-change-reading state,onoff,battery,SwitchTime,total
fhem_widget_command {"allowed_values":[],"order":0}
room Widget,dummy
userReadings SwitchTime {(substr((ReadingsTimestamp("struct.fk.alle","state"," ")),11,2).'.'.(substr((ReadingsTimestamp("struct.fk.alle","state"," ")),14,2)))},
statusIcon1 {((ReadingsVal("struct.fk.alle","state","OFFEN") eq "GESCHLOSSEN")? "ok":"error")},
statusIcon2 {((ReadingsVal("struct.fk.alle","state","OFFEN") eq "GESCHLOSSEN")? "none":"error")},
statusSound {((ReadingsVal("struct.fk.alle","state","OFFEN") eq "GESCHLOSSEN")? ":long.mp3:":":2short.mp3:")},
Die zurückgespielte Version vom 04.01.2018 funktioniert problemlos.
Gibt wohl Probleme mit der Änderung
https://forum.fhem.de/index.php/topic,82661.0.html
Habe ein Problem gefixt: die letzte Version hat alle Geraete, die nach der structure-Definition definiert waren, ignoriert.
@netwalk: danke fuer die Details. Kannst du es bitte testen? Falls das Problem nicht weg ist, bitte "attr global showInternalValues 1" setzen, und das Ergebnis von "list structure" hier anhaengen, mit einem "attr global verbose 5" Log-Mitschnitt des Schaltvorgangs.
Nach heutigem Update konnte ich keine Geräte mehr per structure schalten. Also set Befehle an die structure kamen nicht bei den Geräten an.
Habe dann gerade die Heute geänderte Version 15875 herunter geladen. Damit startet FHEM nicht mehr.
Folgende Fehlermeldung im LOG:
Can't use an undefined value as an ARRAY reference at ./FHEM/98_structure.pm line 512, <$fh> line 450.
Danke fuer den Hinweis, das habe ich jetzt gefixt.
top, funktioniert!
Ich stelle auch keine Probleme mehr fest.
Auch ich habe keine Fehler mehr festgestellt, Danke noch mal.