Die Osterfeuer haben es bewiesen: ich habe leider einen Wurm in meinem Lüftungs-DOIF, den ich nicht finde. Eigentlich dachte ich, verstanden zu haben, dass DOIF bei der ersten Bedingung "einrastet", die zutrifft und dann erst wieder den Zustand wechselt, wenn diese Bedingung nicht mehr zutrifft.
Die Bedingungen meines DOIFs sind eigentlich simpel: Es gibt einen Dummy, der die Zustände min, max, AUS und auto kennt.
Und nun meine ich programmiert zu haben:
Wenn Dummy Lueftung max, dann gibt Gas
Wenn Lueftung AUS (oder abwesend an) dann gehe auf 0
Wenn Lueftung MIN ... dann stelle Lueftung auf 55
Die beiden AUTO-Zweige funktionieren gut im Alltag.
Reproduzierbar springt das DOIF aber bei Dummy eq "AUS" mit dem ersten Signal vom CO2-Sensor auf die dritte Bedingung und regelt also "MINimum".
Warum? Welches Osterei habe ich mir da in meiner Lüftungssteuerung gelegt?
Danke für hilfreichen Erfahrungsaustausch im Voraus!
Christian
Das Listing:Internals:
DEF ([Lueftung] eq "max") (set Steller_Zuluft gpio 255) (set Steller_Abluft gpio 255)
DOELSEIF ([abwesend] eq "an" or [Lueftung] eq "AUS") (set Steller_Zuluft gpio 0) (set Steller_Abluft gpio 0)
DOELSEIF ([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700) (set Steller_Zuluft gpio 55) (set Steller_Abluft gpio 55) ##LWR 0,8/h
DOELSEIF ([?Lueftung] eq "auto" and [CO2Sensor:CO2:d]>([$SELF:CO2_alt]+10) and [Steller_Zuluft:gpio:d]<246) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]+10))}) (set Steller_Zuluft gpio [$SELF:Stell_neu:d]) (set Steller_Abluft gpio [$SELF:Stell_neu:d]) ## Vereinfachung möglich mit dirkten Einstetzen von Stellwert-Zuluft als Steuerwert bei Abluft
DOELSEIF ([?Lueftung] eq "auto" and [CO2Sensor:CO2:d]<([$SELF:CO2_alt]-10) and [Steller_Zuluft:gpio:d]>64) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]-10))}) (set Steller_Zuluft gpio [$SELF:Stell_neu:d]) (set Steller_Abluft gpio [$SELF:Stell_neu:d])
FUUID 5c43298b-f33f-e1df-09ea-ab76a5ff2ccd3b93
MODEL FHEM
NAME DI_Lueftung
NR 110
NTFY_ORDER 50-DI_Lueftung
STATE Betrieb
TYPE DOIF
VERSION 18890 2019-03-13 18:56:41
.attraggr:
.attrminint:
CHANGED:
sCO2: 870
CHANGEDWITHSTATE:
sCO2: 870
DOIF_Readings:
sCO2 (::ReadingValDoIf($hash,'CO2Sensor','CO2','','med3'))
READINGS:
2019-04-20 23:59:30 CO2_alt 810
2019-04-21 10:54:48 Device CO2Sensor
2019-04-19 10:36:22 Stell_neu 65
2019-04-21 10:25:03 cmd 3.2
2019-04-21 10:25:03 cmd_event CO2Sensor
2019-04-21 10:25:03 cmd_nr 3
2019-04-21 10:25:03 cmd_seqnr 2
2019-04-21 10:54:48 e_CO2Sensor_CO2 888
2019-04-16 23:59:30 e_DI_Lueftung_CO2_alt 749
2019-04-21 10:19:57 e_Lueftung_STATE AUS
2019-03-31 19:49:08 mode enabled
2019-04-21 10:54:48 sCO2 870
2019-04-21 10:25:03 state Betrieb
2019-04-21 10:25:03 wait_timer no timer
Regex:
DOIF_Readings:
CO2Sensor:
sCO2:
CO2 ^CO2Sensor$:^CO2:
DI_Lueftung:
accu:
CO2Sensor:
accu:
CO2 ^CO2Sensor$:^CO2:
accu:
CO2Sensor CO2:
dim 3
value:
860
870
888
attr:
cmdState:
repeatsame:
wait:
0:
0
15
1:
0
15
2:
0
15
3:
0
15
15
15
4:
0
15
15
15
waitdel:
condition:
0 ::InternalDoIf($hash,'Lueftung','STATE') eq "max"
1 ::InternalDoIf($hash,'abwesend','STATE') eq "an" or ::InternalDoIf($hash,'Lueftung','STATE') eq "AUS"
2 ::InternalDoIf($hash,'Lueftung','STATE') eq "min" or ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')<700
3 ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')>(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')+10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio','','d')<246
4 ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')<(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')-10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio','','d')>64
devices:
0 Lueftung
1 abwesend Lueftung
2 Lueftung CO2Sensor
3 CO2Sensor DI_Lueftung Steller_Zuluft
4 CO2Sensor DI_Lueftung Steller_Zuluft
all Lueftung abwesend CO2Sensor DI_Lueftung Steller_Zuluft
do:
0:
0 set Steller_Zuluft gpio 255
1 set Steller_Abluft gpio 255
1:
0 set Steller_Zuluft gpio 0
1 set Steller_Abluft gpio 0
2:
0 set Steller_Zuluft gpio 55
1 set Steller_Abluft gpio 55
3:
0 setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]+10))}
1 set Steller_Zuluft gpio [DI_Lueftung:Stell_neu:d]
2 set Steller_Abluft gpio [DI_Lueftung:Stell_neu:d]
4:
0 setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]-10))}
1 set Steller_Zuluft gpio [DI_Lueftung:Stell_neu:d]
2 set Steller_Abluft gpio [DI_Lueftung:Stell_neu:d]
5:
helper:
DOIF_Readings_events
event sCO2: 870
globalinit 1
last_timer 0
sleepdevice CO2Sensor
sleepsubtimer -1
sleeptimer -1
timerdev CO2Sensor
timerevent CO2: 626
triggerDev DI_Lueftung
DOIF_eventas:
cmd_nr: 3
cmd_seqnr: 2
cmd_event: CO2Sensor
state: Betrieb
timerevents:
CO2: 626
timereventsState:
CO2: 626
triggerEvents:
sCO2: 870
triggerEventsState:
sCO2: 870
internals:
0 Lueftung:STATE
1 abwesend:STATE Lueftung:STATE
2 Lueftung:STATE
3 Lueftung:STATE
4 Lueftung:STATE
all Lueftung:STATE abwesend:STATE
itimer:
perlblock:
readings:
2 CO2Sensor:CO2
3 CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
4 CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
all CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings sCO2:([CO2Sensor:CO2:med3])
DbLogExclude .*
room Lueftung
startup set $SELF checkall
state Betrieb
verbose 2
wait 0,15:0,15:0,15:0,15,15,15:0,15,15,15
Hi,
([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700)
Diese Bedingung wird wahr, wenn entweder die Lueftung auf min steht oder der CO2 Wert kleiner als 700 ist.
Der Zustand vom Dummy spielt also bei einem Messwert von CO2 kleiner 700 keine Rolle.
Du willst eigentlich UND and?
Gruß Otto
Das sollte doch einfach nachzuvollziehen sein.
Deine dritte Bedingung beinhaltet eine or-Verknüpfung.
Wenn Lueftung aus ist und CO2Senso triggert, dann wird nicht die zweite, sondern die dritte Bedingung ausgewertet (weil der Trigger in der zweiten nicht vorkommt), diese ist dann wahr und die Anweisung wird ausgeführt.
Du könntest den Zustand "aus" mit in die Bedingung aufnehmen:
([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700 and [Lueftung] ne "aus")
Hallo Damian,
wie blöd von mir - ganz herzlichen Dank für die schnelle Aufklärung meines Fehlers.
Herzliche Grüße
Christian