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 (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
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 ....
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.
Trigger kannst du nur mit Regex auf Devicenamen und auf Events definieren, nicht aber auf Bedingungen, die man im hinteren Teil angibt.
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
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$"]){ ....
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