Verhalten von structure mit Wildcards

Begonnen von eki, 12 Januar 2018, 08:37:15

Vorheriges Thema - Nächstes Thema

eki

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;
  }

rudolfkoenig

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.

eki

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?

rudolfkoenig

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.

eki

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.

rudolfkoenig

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.

eki

Super, vielen Dank. Ich werds testen und melden wenn mir was auffällt.

netwalk

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.
live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7590 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, Ubiquiti G3 PRO/FLEX/DOME/MICRO

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

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.

automatisierer

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.




rudolfkoenig

Danke fuer den Hinweis, das habe ich jetzt gefixt.

automatisierer


netwalk

Ich stelle auch keine Probleme mehr fest.
live long and prosper
netwalk
_______________________________________________
INTEL NUC7CJYH, Homematic mit 3x HMLGW, JEELINK mit 18x TX29-DTH-IT, DUOFERNSTICK, FB7590 mit FBDECT, NETATMO, Philips HUE, RFXtrx433, Ubiquiti G3 PRO/FLEX/DOME/MICRO

eki

Auch ich habe keine Fehler mehr festgestellt, Danke noch mal.