Alle Device die on im state und das attr alias mit einen bestimmten Inhalt haben

Begonnen von Stelaku, 12 Dezember 2021, 13:31:59

Vorheriges Thema - Nächstes Thema

Stelaku

Hallo allle zusammen.

Bin gerade mal wieder an meine Grenzen gestoßen und komme nicht weiter.

Es will mir nicht gelingen folgendes DOIF so hinzubekommen das es nur auf devices triggert die im state das event on haben und zusätzlich im attr alias Eltako vorkommt.

list vom DOIF


Internals:
   CFGFN     
   DEF        ([@"":state:$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"])
()
   DOIFDEV    ^global$|
   FUUID      61b5e2f6-f33f-134a-98a3-b7b03d0d012f09be
   MODEL      FHEM
   NAME       EltakoSchutz1
   NR         125036
   NTFY_ORDER 50-EltakoSchutz1
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-12 13:21:26   Device          Waermepumpe
     2021-12-12 13:13:54   cmd             1
     2021-12-12 13:13:54   cmd_event       global
     2021-12-12 13:13:54   cmd_nr          1
     2021-12-12 13:13:53   mode            enabled
     2021-12-12 13:13:54   state           cmd_1
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           ""         
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'@','','state','$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"')
   do:
     0:
       0         
     1:
   helper:
     DEVFILTER  ^global$|
     NOTIFYDEV  global|.*
     event      power: 2.36
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Waermepumpe
     timerevent power: 2.36
     triggerDev Waermepumpe
     timerevents:
       power: 2.36
     timereventsState:
       power: 2.36
     triggerEvents:
       power: 2.36
     triggerEventsState:
       power: 2.36
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:


mit der def
([@"":state:$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"])


triggert das DOIF gefühlt auf alles.

Ich hab das def aus der commandref genommen und auf das attr alias umgeschrieben
https://fhem.de/commandref_DE.html#DOIF_aggregation
Liste der Devices, deren state-Reading "on" ist und das Attribut disable nicht auf "1" gesetzt ist:

[@"":state:$_ eq "on" and AttrVal($name,"disable","") ne "1"]


kann mir jemand sagen was ich da falsch mache.

Vielen dank

Viele Grüsse

Stephan

Damian

Zitatmit der def
Code: [Auswählen]
([@"":state:$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"])

triggert das DOIF gefühlt auf alles.

nicht nur gefühlt ;)

Du hast auch keinen Trigger definiert, wie z. B.:

[@":on$":state:$_ eq "on" and ....
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Hallo Damian

Vielen dank für Deine schnelle Antwort.

mit den trigger [@":on$":state:$_ eq "on" and ....
funktioniert es schon mal so weit das jetzt nur noch events mit "on" berücksichtigt werden.
nur wenn ich das richtig sehe triggern auch andere Devices mit on im state mein DOIF die kein attr mit alias Eltako haben.
Es soll aber nur getriggert werden wenn on und attr alias die Zeichen Eltako beinhalten.
([@":on$":state:$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"])
()


hier mal eine list vom DOIF wo es durch interupt getriggert wurde

Internals:
   CFGFN     
   DEF        ([@":on$":state:$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"])
()
   DOIFDEV    ^global$|
   FUUID      61b5e2f6-f33f-134a-98a3-b7b03d0d012f09be
   MODEL      FHEM
   NAME       EltakoSchutz1
   NR         125036
   NTFY_ORDER 50-EltakoSchutz1
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-12 15:20:47   Device          Interrupt
     2021-12-12 15:20:22   cmd             2
     2021-12-12 15:20:22   cmd_event       MCP4_A6
     2021-12-12 15:20:22   cmd_nr          2
     2021-12-12 15:20:17   mode            enabled
     2021-12-12 15:20:22   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           ":on$"     :on$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'@','','state','$_ eq "on" and AttrVal($name,"alias","") =~ "Eltako"')
   do:
     0:
       0         
     1:
   helper:
     DEVFILTER  ^global$|
     NOTIFYDEV  global|.*
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Interrupt
     timerevent on
     triggerDev Interrupt
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:


und hier ein List vom Device Interupt


Internals:
   DEF        4
   EXCEPT_FD  23
   FUUID      5cadfcd0-f33f-134a-c739-dac48455863a12aa
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    4
   NAME       Interrupt
   NR         85
   STATE      off
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/bin/gpio
   lasttrg    1639318906.46752
   READINGS:
     2021-12-12 15:21:46   Dblclick        off
     2021-12-12 15:21:46   Longpress       off
     2021-12-12 15:21:46   Pinlevel        low
     2021-12-12 15:21:46   state           off
     2021-12-12 15:21:46   test            egal
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   event-on-change-reading state
   group      MCP23017
   interrupt  both
   room       Bus
   userReadings test {fhem ("get MCP0,MCP2,MCP4,MCP6");;;; "egal"}


und auch ein list vom MCP4_A6


Internals:
   DEF        MCP4:PortA6
   DEVICE     MCP4
   FUUID      5cadfcd3-f33f-134a-21f2-cd047014b6c4ccf3
   NAME       MCP4_A6
   NOTIFYDEV  MCP4,global
   NR         233
   NTFY_ORDER 50-MCP4_A6
   READING    PortA6
   STATE      off
   TYPE       readingsProxy
   CONTENT:
     MCP4       1
   READINGS:
     2021-12-12 15:29:04   Status          off
     2021-12-12 15:29:04   state           off
Attributes:
   alias      BW_Stephan
   event-on-change-reading .*
   fp_Grundriss 882,1059,0,MCP4_A6,
   group      MCP4_rechts
   room       Eingänge
   sortby     02
   userReadings Status { ReadingsVal($name,"state",0) }
   valueFn    {($VALUE eq "on")?"off":"on"}


da sind keine attr mit inhallt Eltako.
wo habe ich da blos wieder einen Gedankenfehler.





Damian

Trigger kannst du nur mit Regex auf Devicenamen und auf Events definieren, nicht aber auf Bedingungen, die man im hinteren Teil angibt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Hallo Damian

Dann habe ich das falsch verstanden. Ich habe das so interpretiert das das doif auch nur auslöst wenn die (and) Bedingung auch erfüllt ist.
and AttrVal($name,"alias","") =~ "Eltako"])

ich hab das jetzt erstmal zum testen so gelöst.

defmod EltakoSchutz DOIF {if ([@":on$":state:$_ eq "on"]){ \
if (AttrVal("$DEVICE","alias","") =~ "Eltako")\
{set_Exec("$DEVICE",5,'fhem_set("$DEVICE off")','ReadingsVal("$DEVICE","state","on") eq "on"')}\
}\
}
attr EltakoSchutz room Eltako_Schutz

so funktioniert es wie ich es brauche.
Wenn ein Device mit on im Event
  wenn dieses Device einen alias mit dem Wort Eltako hat,
    wird ein timer mit diesem Devicenamen gesetzt der nach 5 Sekunden schaut ob das Device immer noch im state on ist und wenn ja dann schalte es aus.


Das was jetzt ein DOIF macht hatte ich vorher mit 25 einzelnen DOIF´s erledigt.
Das einzige was ich jetzt beobachte ist das der Block bei jeden event mit on ausgelöst wird.
Es werden zwar keine timer gesetzt ab ich frage mich ob das jetzt besser ist oder ob es vorher mit den einzelnen Doif perfomanter war.

Vielen dank für Deine hilfe

Stephan




Damian

Zitat von: Stelaku am 13 Dezember 2021, 06:31:22
Hallo Damian

Dann habe ich das falsch verstanden. Ich habe das so interpretiert das das doif auch nur auslöst wenn die (and) Bedingung auch erfüllt ist.
and AttrVal($name,"alias","") =~ "Eltako"])

ich hab das jetzt erstmal zum testen so gelöst.

defmod EltakoSchutz DOIF {if ([@":on$":state:$_ eq "on"]){ \
if (AttrVal("$DEVICE","alias","") =~ "Eltako")\
{set_Exec("$DEVICE",5,'fhem_set("$DEVICE off")','ReadingsVal("$DEVICE","state","on") eq "on"')}\
}\
}
attr EltakoSchutz room Eltako_Schutz

so funktioniert es wie ich es brauche.
Wenn ein Device mit on im Event
  wenn dieses Device einen alias mit dem Wort Eltako hat,
    wird ein timer mit diesem Devicenamen gesetzt der nach 5 Sekunden schaut ob das Device immer noch im state on ist und wenn ja dann schalte es aus.


Das was jetzt ein DOIF macht hatte ich vorher mit 25 einzelnen DOIF´s erledigt.
Das einzige was ich jetzt beobachte ist das der Block bei jeden event mit on ausgelöst wird.
Es werden zwar keine timer gesetzt ab ich frage mich ob das jetzt besser ist oder ob es vorher mit den einzelnen Doif perfomanter war.

Vielen dank für Deine hilfe

Stephan

Die aktuelle Lösung macht so keinen Sinn.

Wenn ein Device "on" liefert, wird aufwändig bei allen Devices nach "on" gesucht. Diese Information wird gar nicht mehr ausgewertet, stattdessen wird beim triggernden Device das Attribut geprüft.

Da kann man gleich abfragen:

defmod EltakoSchutz DOIF {if ([":on$"]){ ....
 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Hallo Damian

Ich habe jetzt noch ein wenig herumgetestet, und ich glaube mit meinen try and error Versuchen zu einer vieleicht richtigen Möglichkeit gekommen zu sein.

Hier einmal die raw


defmod EltakoSchutz1 DOIF {if ([@":on$"] and AttrVal("$DEVICE","alias","") =~ "Eltako"){ \
set_Reading("$DEVICE",AttrVal("$DEVICE","alias",""),1)}\
}\


Das soll ein Test device sein in dem ich das gleiche abfrage wie zuvor. ( alle on Event´s die im triggernden Device einen alias mit Eltako haben.
dieses wird dann in ein Reading geschrieben mit dem triggernden device und den dazugehörigen alias.
Wenn ich das jetzt richtig interpretiere wird zwar auf alles mit on ein triggerDev gesetzt dieser kommt aber nur durch wenn auch die
and AttrVal("$DEVICE","alias","") =~ "Eltako"
Bedingung erfüllt ist.

hier mal ein List wo als triggerDev Inetrupt steht. aber es wird kein Reading mit Interupt angelegt. Was dann für mich so aussieht als wenn
das so funktioniert wie ich es haben will.


Internals:
   DEF        {if ([@":on$"] and AttrVal("$DEVICE","alias","") =~ "Eltako"){
set_Reading("$DEVICE",AttrVal("$DEVICE","alias",""),1)}
}

   DOIFDEV    ^global$|
   FUUID      61b61954-f33f-134a-2f47-81df81394fab36c2
   MODEL      Perl
   NAME       EltakoSchutz1
   NR         473
   NTFY_ORDER 50-EltakoSchutz1
   STATE      initialized
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-12-13 15:54:33   Aufimpuls       Eltako_Flur_vorne
     2021-12-13 16:17:14   Device          Interrupt
     2021-12-13 15:15:21   GPIO13          Eltako_Bad_rechts
     2021-12-13 15:15:21   GPIO16          Schalfzimmer Eltako
     2021-12-13 15:15:21   GPIO6           Eltako_Bad_links
     2021-12-13 16:07:41   MCP1_A0         Eltako_Bad_Mitte
     2021-12-13 15:15:21   MCP1_A1         Eltako Stube
     2021-12-13 15:15:21   MCP1_A2         Eltako Küche Mitte
     2021-12-13 15:15:21   MCP1_A3         Eltako Esszimmer
     2021-12-13 15:15:21   MCP1_A4         Eltako Küche rechts
     2021-12-13 15:15:29   MCP1_A5         Eltako Küche links
     2021-12-13 15:15:22   MCP3_A2         Eltako_Silke_rechts
     2021-12-13 15:15:59   MCP3_A3         Eltako_Stephan_mitte
     2021-12-13 15:16:12   MCP3_A4         Eltako_Gast
     2021-12-13 15:31:12   MCP3_A5         Eltako_Keller
     2021-12-13 15:15:21   MCP3_A6         Eltako_Eingang
     2021-12-13 15:15:21   MCP3_A7         Eltako_WC
     2021-12-13 06:32:47   MCP3_B0         Eltako_Sat_Stube
     2021-12-13 06:06:33   MCP3_B1         Eltako_Sat_Gast
     2021-12-13 15:15:22   MCP3_B7         Eltako_Silke_mitte
     2021-12-13 15:48:55   MCP7_A5         Eltako_Flur_Steckdose_Fahrstuhl
     2021-12-13 15:46:05   MCP7_B0         Eltako Esszimmer Steckdose links
     2021-12-13 15:46:55   MCP7_B1         Eltako Esszimmer Steckdose rechts
     2021-12-13 16:17:06   MCP7_B2         Eltako_Stephan_links
     2021-12-13 15:52:05   MCP7_B3         Eltako_Stephan_rechts
     2021-12-13 15:55:20   Zuimpuls        Eltako_Flur_hinten
     2021-12-13 16:17:14   block_01        executed
     2021-12-13 16:17:00   mode            enabled
     2021-12-13 16:17:00   state           initialized
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           ":on$"     :on$
   condition:
     0          if (::AggregateDoIf($hash,'@','') and AttrVal("$DEVICE","alias","") =~ "Eltako"){
set_Reading("$DEVICE",AttrVal("$DEVICE","alias",""),1)}

   helper:
     DEVFILTER  ^global$|
     NOTIFYDEV  global|.*
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev Interrupt
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
   perlblock:
     0          block_01
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   disable    0


Vielen dank für Deine Geduld

Gruß

Stephan