Hi,
ich brauch leider schon wieder Hilfe:
Ich habe ein DOIF im perl-Modus, welches mein Garagenlicht schaltet:
Dieses reagiert leider seit ein paar Tagen nicht mehr auf meinen Bewegungsmelder.
Ich habe mein Logging größer umgebaut und die Räume sortiert. An KNX und dem BWM war ich nicht dran.
In diesem DOIF befinden sich zwei Blöcke (long und short), die über Taster getriggert werden.
Die Taster setzen [$SELF:steuern], daraufhin reagiert das DOIF und schaltet das Licht ein. Das funktioniert soweit - Allerdings bin ich auf die Problematik nur aufmerksam geworden, weil das Licht nicht mehr ausging.
Ich poste in diesem Beitrag erstmal die Kurzversion mit den Minimal-Configs,
und häng dann unten gerne noch die kompletten Configs an.
Hier ein minimal-DOIF, welches nichts weiter tun soll, als eine Logmeldung auszugeben, wenn der Bewegungsmelder *irgendwas* tut:
Internals:
CFGFN
DEF debug{
my $val = [gendev_BWM_Garage:status];
Log3("$SELF", 1,"DF_perl: gendev_Garage: $val");
}
FUUID 60203350-f33f-4040-e908-03716167e3ca8a76
MODEL Perl
NAME DF_perl
NOTIFYDEV global,gendev_BWM_Garage
NR 950
NTFY_ORDER 50-DF_perl
STATE initialized
TYPE DOIF
VERSION 23640 2021-01-30 10:49:48
READINGS:
2021-02-07 19:37:24 mode enabled
2021-02-07 19:37:24 state initialized
Regex:
accu:
cond:
gendev_BWM_Garage:
0:
status ^gendev_BWM_Garage$:^status:
condition:
0
my $val = ::ReadingValDoIf($hash,'gendev_BWM_Garage','status');
Log3("DF_perl", 1,"DF_perl: gendev_Garage: $val");
helper:
DEVFILTER ^global$|^gendev_BWM_Garage$
NOTIFYDEV global|gendev_BWM_Garage
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
0 debug
readings:
all gendev_BWM_Garage:status
uiTable:
Attributes:
Proof of Work:
> set DF_perl debug
2021.02.07 19:40:05.094 1: DF_perl: gendev_Garage: off
So. Jetzt hab ich ein Event von meinem Bewegungsmelder:
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on
und es passiert: nichts.
Events: gendev_BWM_Garage:status ==> vorhanden
2021-02-07 19:41:18.900 KNX KNX100.I01_BWM_Flur_EG bwm-brightness: 6.84 lux
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage Garage_HZG_presence: on
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on
2021-02-07 19:41:23.570 KNX KNX101.I01_BWM_Garage bwm-presence: on
2021-02-07 19:41:23.864 KNX KNX101.I01_BWM_Garage bwm-brightness: 80.88 lux
Log: Im fraglichen Zeitraum ==> keine Ausgabe
2021.02.07 19:40:24.944 3: DbLog logdb -> INFO - 81 of 84 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:40:54.947 3: DbLog logdb -> INFO - 85 of 87 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:41:24.958 3: DbLog logdb -> INFO - 107 of 112 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:41:54.964 3: DbLog logdb -> INFO - 93 of 96 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
2021.02.07 19:42:24.976 3: DbLog logdb -> INFO - 88 of 90 events inserted into table history due to PK on columns DEVICE,READING,TIMESTAMP
Ich hab doch bestimmt nur wieder irgendwo einen kleinen Fehler drin... Aber ich suche seit Tagen und finde nix ...
Danke fürs mitgucken,
Stephan
Hier noch die ganze config:
Doif, das die Bewegungsmelder der Garage zusammenfasst und einen "status" liefert:
Internals:
DEF ([KNX101.I01_BWM_Garage:bwm-status] eq "on"
|| [KNX102.I01_BWM_Garage_Tor:bwm-status] eq "on"
|| [KNX101.I01_BWM_Garage:bwm-presence] eq "on"
|| [KNX102.I01_BWM_Garage_Tor:bwm-presence] eq "on"
)
(
## sammele nur die Werte
)
FUUID 5c844712-f33f-4040-a278-1a76e628d63573d3
MODEL FHEM
NAME gendev_BWM_Garage
NOTIFYDEV KNX101.I01_BWM_Garage,global,KNX102.I01_BWM_Garage_Tor,gendev_BWM_Garage
NR 329
NTFY_ORDER 50-gendev_BWM_Garage
STATE off
TYPE DOIF
VERSION 23640 2021-01-30 10:49:48
READINGS:
2021-02-07 19:44:45 Device KNX102.I01_BWM_Garage_Tor
2021-02-07 19:43:30 Garage_HZG_presence off
2021-02-07 19:41:32 Garage_HZG_status off
2021-02-07 19:44:45 Garage_Tor_presence off
2021-02-07 19:36:05 Garage_Tor_status off
2021-02-07 19:41:32 cmd 1
2021-02-07 19:41:32 cmd_event KNX101.I01_BWM_Garage
2021-02-07 19:41:32 cmd_nr 1
2021-02-07 19:43:30 e_KNX101.I01_BWM_Garage_bwm-presence off
2021-02-07 19:41:32 e_KNX101.I01_BWM_Garage_bwm-status off
2021-02-07 19:44:45 e_KNX102.I01_BWM_Garage_Tor_bwm-presence off
2021-02-07 19:36:05 mode enabled
2021-02-07 19:41:32 state cmd_1
2021-02-07 19:43:30 status off
Regex:
accu:
cond:
KNX101.I01_BWM_Garage:
0:
bwm-presence ^KNX101.I01_BWM_Garage$:^bwm-presence:
bwm-status ^KNX101.I01_BWM_Garage$:^bwm-status:
KNX102.I01_BWM_Garage_Tor:
0:
bwm-presence ^KNX102.I01_BWM_Garage_Tor$:^bwm-presence:
bwm-status ^KNX102.I01_BWM_Garage_Tor$:^bwm-status:
event_Readings:
KNX101.I01_BWM_Garage:
Garage_HZG_presence:
bwm-presence ^KNX101.I01_BWM_Garage$:^bwm-presence:
Garage_HZG_status:
bwm-status ^KNX101.I01_BWM_Garage$:^bwm-status:
KNX102.I01_BWM_Garage_Tor:
Garage_Tor_presence:
bwm-presence ^KNX102.I01_BWM_Garage_Tor$:^bwm-presence:
Garage_Tor_status:
bwm-status ^KNX102.I01_BWM_Garage_Tor$:^bwm-status:
gendev_BWM_Garage:
status:
Garage_HZG_presence ^gendev_BWM_Garage$:^Garage_HZG_presence:
Garage_HZG_status ^gendev_BWM_Garage$:^Garage_HZG_status:
Garage_Tor_presence ^gendev_BWM_Garage$:^Garage_Tor_presence:
Garage_Tor_status ^gendev_BWM_Garage$:^Garage_Tor_status:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-status') eq "on" || ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-status') eq "on" || ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-presence') eq "on" || ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-presence') eq "on"
do:
0:
0
1:
event_Readings:
Garage_HZG_presence ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-presence')
Garage_HZG_status ::ReadingValDoIf($hash,'KNX101.I01_BWM_Garage','bwm-status')
Garage_Tor_presence ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-presence')
Garage_Tor_status ::ReadingValDoIf($hash,'KNX102.I01_BWM_Garage_Tor','bwm-status')
status {if(::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_HZG_status') eq "on" ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_Tor_status') eq "on" ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_HZG_presence') eq "on" ||::ReadingValDoIf($hash,'gendev_BWM_Garage','Garage_Tor_presence') eq "on") {return "on"} else {return "off"} }
helper:
DEVFILTER ^global$|^KNX102.I01_BWM_Garage_Tor$|^gendev_BWM_Garage$|^KNX101.I01_BWM_Garage$
NOTIFYDEV global|KNX102.I01_BWM_Garage_Tor|gendev_BWM_Garage|KNX101.I01_BWM_Garage
event bwm-presence: off
globalinit 1
last_timer 0
sleeptimer -1
timerdev KNX101.I01_BWM_Garage
timerevent bwm-status: off
triggerDev KNX102.I01_BWM_Garage_Tor
timerevents:
bwm-status: off
timereventsState:
bwm-status: off
triggerEvents:
bwm-presence: off
triggerEventsState:
bwm-presence: off
internals:
readings:
all KNX101.I01_BWM_Garage:bwm-status KNX102.I01_BWM_Garage_Tor:bwm-status KNX101.I01_BWM_Garage:bwm-presence KNX102.I01_BWM_Garage_Tor:bwm-presence
trigger:
uiState:
uiTable:
Attributes:
do always
event-on-change-reading Garage.*,status
event_Readings Garage_HZG_status: [KNX101.I01_BWM_Garage:bwm-status],
Garage_Tor_status: [KNX102.I01_BWM_Garage_Tor:bwm-status],
Garage_HZG_presence: [KNX101.I01_BWM_Garage:bwm-presence],
Garage_Tor_presence: [KNX102.I01_BWM_Garage_Tor:bwm-presence],
status: {if([$SELF:Garage_HZG_status] eq "on"
||[$SELF:Garage_Tor_status] eq "on"
||[$SELF:Garage_HZG_presence] eq "on"
||[$SELF:Garage_Tor_presence] eq "on")
{return "on"} else {return "off"}
}
room Generic Devices,_types->doif,garage
stateFormat status
DOIF, welches den Status auswerten soll (short und long, per Taster getriggert, funktionieren.
Sollte ich oben noch reinschreiben, kommt gleich
Internals:
DEF short{
if ([$SELF:steuern] eq "short")
{
if ([?gendev_Leuchte_Garage:status] =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage_hand_short", 300, 'fhem_set("gendev_Leuchte_Garage off")');
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 300 Sekunden");
}
elsif([?gendev_Leuchte_Garage:status] =~ /^on/)
{
fhem_set("gendev_Leuchte_Garage off");
del_Exec("tmr_Leuchte_Garage_hand_short");
del_Exec("tmr_Leuchte_Garage_hand_long");
del_Exec("tmr_Leuchte_Garage_auto");
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht ausgeschaltet, alle timer gelöscht");
}
}
}
long{
if ([$SELF:steuern] eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 3600 Sekunden");
set_Exec("tmr_Leuchte_Garage_hand_long", 3600, 'fhem_set("gendev_Leuchte_Garage off")');
}
}
bwm{
if([gendev_BWM_Garage:status] eq "on" && get_Exec("tmr_Leuchte_Garage_hand_long") < 120 && [$SELF:steuern:sec] > 3)
{
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Einschaltanforderung vom BWM. Schalte Licht ein.");
fhem_set("gendev_Leuchte_Garage on");
if([?BMS:1_SOC_BMS_total:d] > 80)
{
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie über 80%. Ausschaltverzögerung 600 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 600, 'fhem_set("gendev_Leuchte_Garage off")');
} else {
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie unter 80%. Ausschaltverzögerung 30 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
}
}
}
debug{
my $val = [gendev_BWM_Garage:status];
Log3("$SELF", 1,"DF_BWM_Garage_perl: gendev_Garage: $val");
}
FUUID 5f68dd9f-f33f-4040-d474-bccf6869a8e623a0
MODEL Perl
NAME DF_BWM_Garage_perl
NOTIFYDEV gendev_BWM_Garage,DF_BWM_Garage_perl,global
NR 524
NTFY_ORDER 50-DF_BWM_Garage_perl
STATE initialized
TYPE DOIF
VERSION 23640 2021-01-30 10:49:48
READINGS:
2021-02-07 19:35:21 block_bwm executed
2021-02-07 19:35:21 block_long executed
2021-02-07 19:35:21 block_short executed
2021-02-07 19:35:21 e_DF_BWM_Garage_perl_steuern short
2021-02-07 19:35:05 mode enabled
2021-02-07 19:35:05 state initialized
2021-02-07 19:35:21 steuern short
Regex:
accu:
cond:
DF_BWM_Garage_perl:
0:
steuern ^DF_BWM_Garage_perl$:^steuern:
1:
steuern ^DF_BWM_Garage_perl$:^steuern:
2:
steuern ^DF_BWM_Garage_perl$:^steuern:
3:
gendev_BWM_Garage:
2:
status ^gendev_BWM_Garage$:^status:
3:
status ^gendev_BWM_Garage$:^status:
condition:
0
if (::ReadingValDoIf($hash,'DF_BWM_Garage_perl','steuern') eq "short")
{
if (::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^off/)
{
fhem_set("gendev_Leuchte_Garage on");
set_Exec("tmr_Leuchte_Garage_hand_short", 300, 'fhem_set("gendev_Leuchte_Garage off")');
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 300 Sekunden");
}
elsif(::ReadingValDoIf($hash,'gendev_Leuchte_Garage','status') =~ /^on/)
{
fhem_set("gendev_Leuchte_Garage off");
del_Exec("tmr_Leuchte_Garage_hand_short");
del_Exec("tmr_Leuchte_Garage_hand_long");
del_Exec("tmr_Leuchte_Garage_auto");
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht ausgeschaltet, alle timer gelöscht");
}
}
1
if (::ReadingValDoIf($hash,'DF_BWM_Garage_perl','steuern') eq "long")
{
fhem_set("gendev_Leuchte_Garage on");
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Licht eingeschaltet, automatisches ausschalten in 3600 Sekunden");
set_Exec("tmr_Leuchte_Garage_hand_long", 3600, 'fhem_set("gendev_Leuchte_Garage off")');
}
2
if(::ReadingValDoIf($hash,'gendev_BWM_Garage','status') eq "on" && get_Exec("tmr_Leuchte_Garage_hand_long") < 120 && ::ReadingSecDoIf('DF_BWM_Garage_perl','steuern') > 3)
{
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Einschaltanforderung vom BWM. Schalte Licht ein.");
fhem_set("gendev_Leuchte_Garage on");
if(::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > 80)
{
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie über 80%. Ausschaltverzögerung 600 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 600, 'fhem_set("gendev_Leuchte_Garage off")');
} else {
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: Batterie unter 80%. Ausschaltverzögerung 30 Sekunden.");
set_Exec("tmr_Leuchte_Garage", 300, 'fhem_set("gendev_Leuchte_Garage off")');
}
}
3
my $val = ::ReadingValDoIf($hash,'gendev_BWM_Garage','status');
Log3("DF_BWM_Garage_perl", 1,"DF_BWM_Garage_perl: gendev_Garage: $val");
helper:
DEVFILTER ^global$|^gendev_BWM_Garage$|^DF_BWM_Garage_perl$
NOTIFYDEV global|gendev_BWM_Garage|DF_BWM_Garage_perl
event steuern: short
globalinit 1
last_timer 0
sleeptimer -1
triggerDev DF_BWM_Garage_perl
triggerEvents:
steuern: short
e_DF_BWM_Garage_perl_steuern: short
block_short: executed
block_long: executed
block_bwm: executed
triggerEventsState:
steuern: short
e_DF_BWM_Garage_perl_steuern: short
block_short: executed
block_long: executed
block_bwm: executed
internals:
perlblock:
0 short
1 long
2 bwm
3 debug
ptimer:
tmr_Leuchte_Garage_hand_long:
readings:
all DF_BWM_Garage_perl:steuern gendev_BWM_Garage:status
trigger:
uiTable:
Attributes:
room garage,x_devel
verbose 5
Bin grade nochmal über "checkReadingEvent" gefallen.
So funktionierts:
debug{
my $val1 = ["gendev_BWM_Garage:status"];## zum triggern
my $val = [gendev_BWM_Garage:status];## ich brauch aber den Wert
Log3("$SELF", 1,"DF_perl: gendev_Garage: $val");
}
Aber warum geht denn dann das hier:
short{
if ([$SELF:steuern] eq "short")
Ich versteh es nicht...
Verstehe ich nicht.
Mit
setreading test status 30
Wir das hier korrekt getriggert:
Internals:
CFGFN
DEF {set_State([test:status])}
FUUID 60203b85-f33f-c0d4-6199-24bbd685d5b757d7
MODEL Perl
NAME di_status
NOTIFYDEV global,test
NR 5057
NTFY_ORDER 50-di_status
STATE 30
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
READINGS:
2021-02-07 20:12:19 Device test
2021-02-07 20:12:19 block_01 executed
2021-02-07 20:12:19 e_test_status 30
2021-02-07 20:12:05 mode enabled
2021-02-07 20:12:19 state 30
Okay, danke, das war ein guter Tipp.
Mit
setreading gendev_BWM_Garage status on
funktioniert es bei mir auch.
Dann bleibt die Frage:
Wo ist der unterschied zwischen diesen zwei Zeilen im Eventmonitor?
2021-02-07 19:41:23.567 DOIF gendev_BWM_Garage status: on
2021-02-07 20:24:30.301 DOIF gendev_BWM_Garage status: on
Die erste hab ich erzeugt, indem ich vor dem BWM rumgesprungen bin.
Die zweite hab ich mit setreading gendev_BWM_Garage status on
erzeugt.
Kann es da einen Unterschied geben?
Keine Ahnung.
Ich kann es heute nicht reproduzieren. Also bei der gegebenen Kombination tritt es wohl reproduzierbar auf, aber ich kann keinen Testcase bauen, der sich identisch verhält.
Mal schlafen, vllt morgen nochmal.