DOIF mit vielen Bedingungen eine weitere hinzufügen

Begonnen von Ruggy, 12 März 2021, 06:59:35

Vorheriges Thema - Nächstes Thema

Ruggy

#30
Das mit den unübersichtlichen DOIF sehe ich ja mittlerweile ein.
Aber was kann ich machen, wenn ich so viele Bedingungen habe. Ich könnte höchsten auf ein paar verzichten wie z.B. dass der Lüfter auch nachts einschalten darf.

Was meinst Du mit schlecht formatiert? Das einrücken? Sollte ich mal die ganzen Leerzeichen im DEF entfernen?

Das OR sollte eigentlich zutreffen, weil alle andere Bedingungen vorher beachten werden (was dann letztendlich dazu führt, dass dieser Teil vor OR nicht zutrifft; weil es im Keller momentan ca 6,8 Grand und somit unter den festgelegten 8 bis 12 Grad ist und somit nicht einschalten soll).

Das nach dem OR enthält mehr oder weniger die selben Bedingungen, nur dass die Temperatur zusätzlich außen wärmer sein soll als im Keller.
Was momentan mit ca. 9 Grad Außentemperatur zutreffen würde und somit der Lüfter einschalten sollte/"dürfte".

Damian

Für logische Operatoren gibt es math. Regeln für Umformungen.

Wenn man weiß, dass und der Multiplikation entspricht und oder der Addition und das Distributivgesetz in der Schule kennengelernt hat, dann kann man auch gleiche Anteile ausklammern.

Und was viele intuitiv falsch machen, ist die Negation:

Das Gegenteil von A und B ist nicht: nicht A und nicht B
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ruggy

Aber die Bedingungen nach dem OR würde doch in Klammer stehen (und innerhalb die Bedingugen wieder mit und) und somit komplett als andere Bedingung angesehen werden?

Sollte ich den Teil mit den Bedingungen vor dem OR dann auch komplett in Klammern setzen (rote Klammern) und zusätzlich um das Gesamte nochmal Klammern (grüne Klammern)?


Christoph Morrison

Zitat von: Ruggy am 28 März 2021, 14:20:16
Das mit den unübersichtlichen DOIF sehe ich ja mittlerweile ein.
Aber was kann ich machen, wenn ich so viele Bedingungen habe. Ich könnte höchsten auf ein paar verzichten wie z.B. dass der Lüfter auch nachts einschalten darf.

Du kannst z.B. auch, wenn die Bedingungen wirklich exklusiv sind, deine Bedingungen auch in zwei DOIF aufteilen - schon hast du es lesbarer und wartbarer. Dein DOIF umfasst ja aktuell vier Gruppen von Fällen, die du vermutlich auch problemlos in vier DOIF auslagern kannst.

Zitat
Was meinst Du mit schlecht formatiert? Das einrücken? Sollte ich mal die ganzen Leerzeichen im DEF entfernen?

Nein im Gegenteil. Meine DOIF sehen so aus wie ich es in meinem anderen Beitrag gezeigt habe - mehr Leerzeichen, mehr Klammern, mehr Ebenen. So findet man Probleme einfach schneller.

ZitatDas OR sollte eigentlich zutreffen, weil alle andere Bedingungen vorher beachten werden (was dann letztendlich dazu führt, dass dieser Teil vor OR nicht zutrifft; weil es im Keller momentan ca 6,8 Grand und somit unter den festgelegten 8 bis 12 Grad ist und somit nicht einschalten soll).

Das nach dem OR enthält mehr oder weniger die selben Bedingungen, nur dass die Temperatur zusätzlich außen wärmer sein soll als im Keller.
Was momentan mit ca. 9 Grad Außentemperatur zutreffen würde und somit der Lüfter einschalten sollte/"dürfte".

Mag sein, aber es gibt in Perl Präzedenzen und Bindungsseiten für Operatoren. Wie gesagt, ich hab da jetzt keinen test case zu geschrieben, aber die Stelle mit and/or sieht fishy aus und da würde ich auch noch mal ansetzen.

Sany

Hallo Ruggy,

verfolge diesen Thread nun auch schon eine Weile. Es wurde ja schon oft gesagt: zu viele Bedingungen. Auf den ersten Blick stimmt das, bei genauerem hinsehen ist es gar nicht so viel und Du kannst verschiedene Teile zusammenziehen.
Was willst Du erreichen: Abhängig von Monaten (Winter/Sommer) soll der Lüfter unterschiedlich angesteuert werden. Täglich abhängig von der Uhrzeit, sprich es soll nur tagsüber etwas passieren. Ausserdem soll nur etwas passieren, wenn deltadewpoint:state größer 2 ist. Danach kommen noch zwei Bedingungen, die entweder/oder sind:
im Sommer entweder Kellertemperatur zwischen 8 und 12 Grad oder Aussen kälter als im Keller.
im Winter entweder Kellertemperatur zwischen 8 und 12 Grad oder Aussen wärmer als im Keller und der Keller kälter oder gleich 8 Grad.

Du hast Dein DOIF in 2 Hauptteile getrennt, für Sommer und für Winter. Das ist korrekt und muss so sein, da der Lüfter unterschiedlich angesteuert wird (600/1800). Das DOELSE lassen wir so, das schaltet den Lüfter aus, wenn nichts von den ersten beiden Zweigen eintritt.

Jetzt gehst Du erst mal so vor: unabhängig von den Zeiten machst Du eine Bedingung:(ich schreib das jetzt mal "leserlich", also nicht Deine Devicenamen
([Keller:temperature] > 8 and [Keller:temperature] < 12)  ##das gehört zusammen also Klammer drum.
ODER
[Aussen:temperature] < [Keller:temperature]  ## nur die eine Bedingung.
Die beiden teile sind mit ODER verknüpft, also muss um alles eine Klammer:
(([Keller:temperature] > 8 and [Keller:temperature] < 12) or [Aussen:temperature] < [Keller:temperature]) ## die ganze Klammer wird wahr, wenn mindestens eine der beiden Bedingungen wahr ist.
Jetzt bleiben nur noch die Zeiten und Dewpointdifferenz übrig: Diese sollen (müssen) wahr sein, und zwar alle, also müssen sie mit AND verknüpft werden:
($month > 4 and $month < 10 and [07:00-23:00] and [deltadewpoint:state] > 2 and (([Keller:temperature] > 8 and [Keller:temperature] < 12) or [Aussen:temperature] < [Keller:temperature]))
Das ist Teil 1 Deines DOIF.

Teil 2 ist ähnlich aufgebaut, hier hast Du allerdings die ganze Zeit schon einen Fehler drin, und deshalb gehts auch nicht: analog zum ersten Teil fragst Du $month ab.
Im ersten Teil muss $month größer 4 und kleiner 10 sein, also Mai bis September: $month > 4 and $month < 10
Im zweiten Teil suchst Du die andern Monate: nur Du schreibst $month <= 4 and $month >= 10: $month ist eine Zahl von 1 bis 12. Keine mir bekannte Zahl ist gleichzeitig kleiner 4 und größer 10. Es muss also heißen: ($month <= 4 or $month >= 10) ## das gehört zusammen und deshalb in Klammern, da nur das Ergebnis beider Vergleiche zählt.

Der Rest ist ähnlich wie im ersten teil aufgebaut:
(($month <= 4 or $month >= 10)  and [07:00-23:00] and [deltadewpoint:state] > 2 and (([Keller:temperature] > 8 and [Keller:temperature] < 12) or ([Aussen:temperature] > [Keller:temperature] and [Keller:temperature] <= 8 ))

Das Problem beim fhem-DOIF ist halt, dass Du Bedingungen nicht schachteln kannst. Es gibt nur die Zweige mit DOELSEIF, weshalb Bedingungen z.T. gleich abgeprüft werden müssen, wenn der Ausführungsteil unterschiedlich ist.
Dann ist ganz wichtig zu wissen, wie das DOIF arbeitet: Immer von links nach rechts, Zeile für Zeile (oder Bedingung für Bedingung). Bei den Bedingungen kommt immer nur wahr oder falsch raus, selbst bei Zeitangaben. Damit kannst du schon ganz gut nachvollziehen, ob das geschriebene auch funktionieren kann.
In Deinem Fall z.B. Bedingung 1:
Monat > 4   -> Nein
  und
Monat < 10 -> Ja
  und
Zwischen 7 und 23Uhr  -> Ja
  und
deltadewpoint > 2  -> Ja (als beispiel)
  und
( (Keller zwischen 8 und 12) oder Aussen < Keller)  -> falsch wenn beide Bedingungen nicht erfüllt, wahr wenn mindestens eine zutrifft.
In diesem Fall ist der ganze Zweig falsch, weil Monat > 4 falsch ist, also...DOELSEIF
(Monat <= 4 oder Monat >= 10)  -> wahr, da März
  und
Zwischen 7 und 23Uhr  -> Ja
  und
deltadewpoint > 2  -> Ja (als beispiel)
  und 
((Keller zwischen 8 und 12) oder (Aussen > Keller und Keller < 8 ))  -> wenn eine der Beiden Bedingungen wahr ist ist der gesamte Zweig wahr und der Lüfter wird angeschaltet.
Sollte auch hier eine der und-verbundenen Bedingungen nicht wahr sein ist der ganze Zweig nicht wahr und DOELSE wird ausgeführt.

Zur Formatierung hier mal ein Vorschlag:
(
[Test_deltadewpoint:state] > 2 and ## $month > 4 and $month < 10 and [07:00 - 23:00] and
(
  ([Test_KEL_LUFTFEUCHTIGKEIT:temperature] > 8 and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] < 12)
  or
  ([Test_AUS_LUFTFEUCHTIGKEIT:temperature] < [Test_KEL_LUFTFEUCHTIGKEIT:temperature])
)
)
       (set Test_HUEDevice9 on-for-timer 1800)
DOELSEIF
(
[Test_deltadewpoint:state] > 2 and ($month <= 4 or $month >= 10) and [07:00 - 23:00] and
(
  ([Test_KEL_LUFTFEUCHTIGKEIT:temperature] > 8 and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] < 12)
  or
  ([Test_AUS_LUFTFEUCHTIGKEIT:temperature] > [Test_KEL_LUFTFEUCHTIGKEIT:temperature] and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] <= 8)
)

       (set Test_HUEDevice9 on-for-timer 600)
DOELSE
       (set Test_HUEDevice9 off)

Nicht wundern:
1. in der ersten Bedingung ist Datum und Zeitabfrage auskommentiert, einfach die 2 # rausnehmen, dann wird die zeit wieder abgeprüft.
2. Alle Devices haben ein Test_ vorangestellt. Ich hatte mal Lust, Dein DOIF zu simulieren und habe die "sendenden" Devices nachgebaut.
Wenn Du die ab hier gezeigten Raw-Definitionen alles in Dein System (oder ein testsystem) einfügst bekommst Du einen Raum "Test_Kellerlüftung", dort findest Du dann alles zusammen und kannst ein wenig spielen. Der Lüfter zeigt Dir die verbleibende Zeit an bei on-for-timer. Bei Sekunden > 60 wird gerundet und Minuten angezeigt. Ich denke mal zum testen wirst Du diese Zeiten anpassen.

defmod Test_TAUPUNKT_LUEFTUNG_KG DOIF (\
[Test_deltadewpoint:state] > 2 and ## $month > 4 and $month < 10 and [07:00 - 23:00] and \
(\
  ([Test_KEL_LUFTFEUCHTIGKEIT:temperature] > 8 and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] < 12)\
  or \
  ([Test_AUS_LUFTFEUCHTIGKEIT:temperature] < [Test_KEL_LUFTFEUCHTIGKEIT:temperature])\
)\
)\
       (set Test_HUEDevice9 on-for-timer 1800)\
DOELSEIF\
(\
[Test_deltadewpoint:state] > 2 and ($month <= 4 or $month >= 10) and [07:00 - 23:00] and \
(\
  ([Test_KEL_LUFTFEUCHTIGKEIT:temperature] > 8 and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] < 12)\
  or\
  ([Test_AUS_LUFTFEUCHTIGKEIT:temperature] > [Test_KEL_LUFTFEUCHTIGKEIT:temperature] and [Test_KEL_LUFTFEUCHTIGKEIT:temperature] <= 8)\
)\
)  \
       (set Test_HUEDevice9 on-for-timer 600)\
DOELSE\
       (set Test_HUEDevice9 off)\

attr Test_TAUPUNKT_LUEFTUNG_KG repeatcmd 3600:5400
attr Test_TAUPUNKT_LUEFTUNG_KG room Test_Kellerlüftung

setstate Test_TAUPUNKT_LUEFTUNG_KG cmd_3
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 cmd 3
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 cmd_event timer_2
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 cmd_nr 3
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 21:49:53 mode enabled
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 state cmd_3
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 timer_01_c02 29.03.2021 07:00:00
setstate Test_TAUPUNKT_LUEFTUNG_KG 2021-03-28 23:00:00 timer_02_c02 29.03.2021 23:00:00


defmod Test_HUEDevice9 DOIF init{\
set_Reading("myCountdown",0,1);;\
set_State("off");;\
}\
\
ventON{\
if(["Test_HUEDevice9:^on$"]){\
set_State("on");;\
del_Exec("counter");;\
del_Exec("offTimer");;\
}\
}\
ventOFF{\
if(["Test_HUEDevice9:^off$"]){\
set_State("off");;\
del_Exec("counter");;\
del_Exec("offTimer");;\
set_Reading("myCountdown",0,1);;\
}\
}\
ventTIMER{\
if([$SELF:"^on-for-timer"]){\
set_State("on");;\
\
$event =~ /on-for-timer.(\d+)/;;\
$_zahl = $1;;\
\
set_Reading("myCountdown",($_zahl > 60)? sprintf("%.0f",$_zahl/60):$_zahl,1);;\
set_Exec("counter",($_zahl > 60)? 60 : 1,'set_Reading("myCountdown",$_zahl - $count,1)','$count <= $_zahl');;   \
\
set_Exec("offTimer",$_zahl,'set_State("off")');;\
}\
}\
OnOf1{\
if(["$SELF:^OnOFF"]){\
if(get_Reading("OnOFF") eq "ON"){\
set_State("on");;\
} else {\
set_State("off");;\
}\
}\
}
attr Test_HUEDevice9 group Test_Devices
attr Test_HUEDevice9 room Test_Kellerlüftung
attr Test_HUEDevice9 setList on off on-for-timer
attr Test_HUEDevice9 sortby c
attr Test_HUEDevice9 uiTable {\
package ui_Table;;\
$TC{0..9} = "align='center'";;\
$SHOWNOSTATE=1;;\
##widget([$SELF:OnOFF],"uzsuToggle,ON,OFF")\
sub ventIcon {\
my ($ventState) = @_;;\
\
if ($ventState =~ "on"){\
return("vent_ventilation_level_3\@limegreen");;\
} else {\
return("vent_ventilation\@slategray");;\
}\
  }\
}\
\
icon_label (ventIcon([$SELF]),([$SELF:myCountdown] > 0)?[$SELF:myCountdown]:"","yellow",([$SELF:myCountdown] > 0)?"dimgray":"")\


setstate Test_HUEDevice9 off
setstate Test_HUEDevice9 2021-03-27 16:13:29 OnOFF OFF
setstate Test_HUEDevice9 2021-03-28 10:22:18 block_init executed
setstate Test_HUEDevice9 2021-03-28 23:00:00 block_ventOFF executed
setstate Test_HUEDevice9 2021-03-28 23:00:00 block_ventTIMER executed
setstate Test_HUEDevice9 2021-03-28 23:00:00 e_Test_HUEDevice9_events off
setstate Test_HUEDevice9 2021-03-27 17:20:48 mode enabled
setstate Test_HUEDevice9 2021-03-28 23:00:00 myCountdown 0
setstate Test_HUEDevice9 2021-03-28 23:00:00 state off


defmod Test_KEL_LUFTFEUCHTIGKEIT DOIF ##
attr Test_KEL_LUFTFEUCHTIGKEIT group Test_Devices
attr Test_KEL_LUFTFEUCHTIGKEIT room Test_Kellerlüftung
attr Test_KEL_LUFTFEUCHTIGKEIT sortby e
attr Test_KEL_LUFTFEUCHTIGKEIT stateFormat T: temperature °C
attr Test_KEL_LUFTFEUCHTIGKEIT uiTable {\
package ui_Table;;\
$TC{0..9} = "align='center'";;\
##$SHOWNOSTATE=1;;\
}\
widget([$SELF:temperature],"knob,min:-15,max:35,width:100,height:100,step:.1,lineCap:round,angleOffset:240,cursor:3,thickness:.3")\
"Keller"

setstate Test_KEL_LUFTFEUCHTIGKEIT T: 14.6 °C
setstate Test_KEL_LUFTFEUCHTIGKEIT 2021-03-27 15:09:08 cmd 0
setstate Test_KEL_LUFTFEUCHTIGKEIT 2021-03-27 15:09:08 mode enabled
setstate Test_KEL_LUFTFEUCHTIGKEIT 2021-03-27 15:09:08 state initialized
setstate Test_KEL_LUFTFEUCHTIGKEIT 2021-03-28 00:34:06 temperature 14.6


defmod Test_deltadewpoint DOIF init{\
set_State(0);;\
}\
dew2State {\
if([$SELF:"^temperature"]){\
set_State(get_Reading("temperature"));;\
}\
}
attr Test_deltadewpoint group Test_Devices
attr Test_deltadewpoint room Test_Kellerlüftung
attr Test_deltadewpoint sortby f
attr Test_deltadewpoint uiTable {\
package ui_Table;;\
$TC{0..9} = "align='center'";;\
##$SHOWNOSTATE=1;;\
}\
widget([$SELF:temperature],"knob,min:-5,max:5,width:100,height:100,step:.1,lineCap:round,angleOffset:240,cursor:3,thickness:.3")\
"delta Taupunkt"

setstate Test_deltadewpoint 2.3
setstate Test_deltadewpoint 2021-03-28 23:09:39 block_dew2State executed
setstate Test_deltadewpoint 2021-03-28 10:22:18 block_init executed
setstate Test_deltadewpoint 2021-03-28 23:09:39 e_Test_deltadewpoint_events temperature: 2.3
setstate Test_deltadewpoint 2021-03-27 17:11:36 mode enabled
setstate Test_deltadewpoint 2021-03-28 23:09:39 state 2.3
setstate Test_deltadewpoint 2021-03-28 23:09:39 temperature 2.3


defmod Test_AUS_LUFTFEUCHTIGKEIT DOIF ##
attr Test_AUS_LUFTFEUCHTIGKEIT group Test_Devices
attr Test_AUS_LUFTFEUCHTIGKEIT room Test_Kellerlüftung
attr Test_AUS_LUFTFEUCHTIGKEIT sortby g
attr Test_AUS_LUFTFEUCHTIGKEIT stateFormat T: temperature °C
attr Test_AUS_LUFTFEUCHTIGKEIT uiTable {\
package ui_Table;;\
$TC{0..9} = "align='center'";;\
##$SHOWNOSTATE=1;;\
}\
widget([$SELF:temperature],"knob,min:-15,max:35,width:100,height:100,step:.1,lineCap:round,angleOffset:240,cursor:3,thickness:.3")\
"Aussen"

setstate Test_AUS_LUFTFEUCHTIGKEIT T: 4 °C
setstate Test_AUS_LUFTFEUCHTIGKEIT 2021-03-27 15:10:21 cmd 0
setstate Test_AUS_LUFTFEUCHTIGKEIT 2021-03-27 15:10:21 mode enabled
setstate Test_AUS_LUFTFEUCHTIGKEIT 2021-03-27 15:10:21 state initialized
setstate Test_AUS_LUFTFEUCHTIGKEIT 2021-03-28 00:33:54 temperature 4



mit einem
Zitatlist Test_.*:FILTER=room=Test_Kellerlüftung
kannst Du Dir alle beteiligten Devices anzeigen lassen
Mit einem
Zitatdelete Test_.*:FILTER=room=Test_Kellerlüftung
werde alle wieder gelöscht. Ich denke aber, Du kannst das gut für Erweiterungen verwenden, parallel zu Deinen "echten" Devices.

Und dann noch einen Eventmonitor mit Test_.* mitlaufen lassen, dann siehst Du, was die einzelnen Komponenten so tun.

Viel Erfolg!

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Ruggy

#35
@Sany
Vielen Dank für Deine ausführlicht Erklärung.
Kann leider nur ein "Dauenhoch" geben.

Ich muß mir aber deine Erklärung ein paarmal durchlesen, damit ich es verstehe und hoffentlich nachvollziehen kann. Heute bringt es leider nichts mehr.  ;)

Ein Hauptproblem war aber anscheinend das mit dem Monat; gleichzeitig kleiner 4 und größer 10. Wird schierig werden diese Zahl zu finden ::)


Ich wusste leider nicht, dass sich jemand so ausführlich mit meinem Problem beschäftigt und habe zur selben Zeit als "Notlösung" folgendes gemacht. Ist natürlich nicht ideal, wollte aber probieren ob es so in die Richtung geht, was ich haben möchte.
Ich habe meine DOIF in drei DOIF's aufgeteilt. Eins für normal eins für Winter und eins für Sommer. Die Monate und Uhrzeiten habe ich mal ganz weg gelassen.

Weiß nicht ob es zu einen ähnlichen Ergebnis führt.
Bin mal auf morgen gespannt.


Wie gesagt, werde ich mir Deine Ausführungen anschauen und versuchen, dass es damit klappt.
Auch das mit dem "Testsystem" finde ich praktisch.


Hier meine drei Lists:

Normal


Internals:
   CFGFN     
   DEF        ([deltadewpoint:state]>2 and
[KEL_LUFTFEUCHTIGKEIT:temperature]>8 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<12)
(set HUEDevice9 on-for-timer 600)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ee07-f33f-f59f-9eb7-12b1002aa68bffa8
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_NORMAL
   NOTIFYDEV  KEL_LUFTFEUCHTIGKEIT,deltadewpoint,global
   NR         2026
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_NORMAL
   STATE      cmd_2
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1616965817.71083
           VALUE      cmd_2
   READINGS:
     2021-03-28 23:56:29   Device          deltadewpoint
     2021-03-28 23:10:17   cmd             2
     2021-03-28 23:10:17   cmd_event       KEL_LUFTFEUCHTIGKEIT
     2021-03-28 23:10:17   cmd_nr          2
     2021-03-28 23:55:27   e_KEL_LUFTFEUCHTIGKEIT_temperature 6.81
     2021-03-28 23:56:29   e_deltadewpoint_state 6.6
     2021-03-28 23:00:45   mode            enabled
     2021-03-28 23:10:17   state           cmd_2
   Regex:
     accu:
     cond:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     cmdState:
     repeatcmd:
       3600
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')>8 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<12
   do:
     0:
       0          set HUEDevice9 on-for-timer 600
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^KEL_LUFTFEUCHTIGKEIT$|^deltadewpoint$
     NOTIFYDEV  global|KEL_LUFTFEUCHTIGKEIT|deltadewpoint
     event      6.6
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   deltadewpoint
     timerevent 6.6
     triggerDev deltadewpoint
     timerevents:
       6.6
     timereventsState:
       state: 6.6
     triggerEvents:
       6.6
     triggerEventsState:
       state: 6.6
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  3600
   room       Kellerlüftung


Kalt:

Internals:
   CFGFN     
   DEF        ([deltadewpoint:state]>2 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<=8 and
[AUS_LUFTFEUCHTIGKEIT:temperature]>[KEL_LUFTFEUCHTIGKEIT:temperature])
(set HUEDevice9 on-for-timer 600)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ef63-f33f-f59f-0724-1fb6e7a4b53fc5e7
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_KALT
   NOTIFYDEV  global,deltadewpoint,AUS_LUFTFEUCHTIGKEIT,KEL_LUFTFEUCHTIGKEIT
   NR         2042
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_KALT
   STATE      initialized
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1616965702.08496
           VALUE      initialized
   READINGS:
     2021-03-28 23:56:29   Device          deltadewpoint
     2021-03-28 23:08:22   cmd             0
     2021-03-28 23:56:29   e_AUS_LUFTFEUCHTIGKEIT_temperature 6.37
     2021-03-28 23:55:27   e_KEL_LUFTFEUCHTIGKEIT_temperature 6.81
     2021-03-28 23:56:29   e_deltadewpoint_state 6.6
     2021-03-28 23:56:29   error           condition c01: syntax error, line 1, near "8  ::ReadingValDoIf"

     2021-03-28 23:08:22   mode            enabled
     2021-03-28 23:08:22   state           initialized
     2021-03-28 23:56:29   warning         condition c01: (Missing operator before   ::ReadingValDoIf?)

   Regex:
     accu:
     cond:
       AUS_LUFTFEUCHTIGKEIT:
         0:
           temperature ^AUS_LUFTFEUCHTIGKEIT$:^temperature:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     repeatcmd:
       3600
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<=8  ::ReadingValDoIf($hash,'AUS_LUFTFEUCHTIGKEIT','temperature')>::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')
   do:
     0:
       0          set HUEDevice9 on-for-timer 600
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^deltadewpoint$|^KEL_LUFTFEUCHTIGKEIT$|^AUS_LUFTFEUCHTIGKEIT$
     NOTIFYDEV  global|deltadewpoint|KEL_LUFTFEUCHTIGKEIT|AUS_LUFTFEUCHTIGKEIT
     event      6.6
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev deltadewpoint
     triggerEvents:
       6.6
     triggerEventsState:
       state: 6.6
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature AUS_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiTable:
Attributes:
   repeatcmd  3600
   room       Kellerlüftung



Warm:

Internals:
   CFGFN     
   DEF        ([deltadewpoint:state]>2 and 
[KEL_LUFTFEUCHTIGKEIT:temperature]>=12  and
[AUS_LUFTFEUCHTIGKEIT:temperature]<[KEL_LUFTFEUCHTIGKEIT:temperature]) 
(set HUEDevice9 on-for-timer 600) 
DOELSE 
(set HUEDevice9 off)
   FUUID      6060f068-f33f-f59f-7b67-d2e5224f86ac0104
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_WARM
   NOTIFYDEV  deltadewpoint,AUS_LUFTFEUCHTIGKEIT,KEL_LUFTFEUCHTIGKEIT,global
   NR         2051
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_WARM
   STATE      initialized
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1616965965.85336
           VALUE      initialized
   READINGS:
     2021-03-28 23:56:29   Device          deltadewpoint
     2021-03-28 23:12:45   cmd             0
     2021-03-28 23:56:29   e_AUS_LUFTFEUCHTIGKEIT_temperature 6.37
     2021-03-28 23:55:27   e_KEL_LUFTFEUCHTIGKEIT_temperature 6.81
     2021-03-28 23:56:29   e_deltadewpoint_state 6.6
     2021-03-28 23:56:29   error           condition c01: syntax error, line 1, near "12   ::ReadingValDoIf"

     2021-03-28 23:12:45   mode            enabled
     2021-03-28 23:12:45   state           initialized
     2021-03-28 23:56:29   warning         condition c01: (Missing operator before    ::ReadingValDoIf?)

   Regex:
     accu:
     cond:
       AUS_LUFTFEUCHTIGKEIT:
         0:
           temperature ^AUS_LUFTFEUCHTIGKEIT$:^temperature:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     repeatcmd:
       3600
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2 and   ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')>=12   ::ReadingValDoIf($hash,'AUS_LUFTFEUCHTIGKEIT','temperature')<::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')
   do:
     0:
       0          set HUEDevice9 on-for-timer 600
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^AUS_LUFTFEUCHTIGKEIT$|^KEL_LUFTFEUCHTIGKEIT$|^deltadewpoint$
     NOTIFYDEV  global|AUS_LUFTFEUCHTIGKEIT|KEL_LUFTFEUCHTIGKEIT|deltadewpoint
     event      6.6
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev deltadewpoint
     triggerEvents:
       6.6
     triggerEventsState:
       state: 6.6
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature AUS_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiTable:
Attributes:
   repeatcmd  3600
   room       Kellerlüftung

Sany

Das mit dem auftrenne in 3 DOIFs ist zwar eine Möglichkeit, macht es aber auch nicht übersichtlicher, besonders bei Änderungen (und die wirst Du machen, um die Werte den Gegebenheiten anzupassen.
Das 2te und 3te DOIF wird aber nicht funktionieren, da es ja schon bei der Definition Fehler meldet. Woran das liegt kann ich nicht sagen, hängt aber mit der Formatierung zusammen. Offensichtlich gehen Zeilenumbrüche, Tabs und Leerzeichen nicht beliebig:
aus dem 2ten DOIF:
ZitatDEF        ([deltadewpoint:state]>2 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<=8 and
[AUS_LUFTFEUCHTIGKEIT:temperature]>[KEL_LUFTFEUCHTIGKEIT:temperature])
(set HUEDevice9 on-for-timer 600)
DOELSE
(set HUEDevice9 off)
und
Zitaterror           condition c01: syntax error, line 1, near "8  ::ReadingValDoIf"
warning         condition c01:    (Missing operator before   ::ReadingValDoIf?)

condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>2 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<=8  XX ::ReadingValDoIf($hash,'AUS_LUFTFEUCHTIGKEIT','temperature')>::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')
XX = hier fehlt das "and".
ind der letzten Zeile sieht man, dass das "and" fehlt.
Vielleicht kann jemand dazu etwas sagen, warum das so ist. Ich hatte ab und zu Fehler bei der Def mit dem Hinweis auf missing Brackets, obwohl die alle richtig waren. Hing auch mit Zeilenumbrüchen und was jeweils in der Zeile steht zusammen.
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Ruggy

Das mit den AND habe ich heute früh bemerkt und geändert.

Konnte aber jetzt erst in FHEM nachschauen was so über den Tag passiert ist und habe gesehen, dass sich der Lüfter mehrmals ein- und ausgeschalten hatten. Sieht somit aus als wie wenn es mit dieser "Notlösung" funktionieren würde. Also das "Kalt" DOIF.

Werde demnächst versuchen, das es nach Deiner Art in einem DOIF klappt.

Ruggy

Bisher läuft die "Steuerung" relativ gut.

Es funktioniert jedoch irgendwie nicht, dass ich die Einschaltzeiten und die Dauer bis der Lüfter wieder einschalten getrennt voneinander zu regeln.

Im DOIF für die Steuerung wäre es so eingestellt bzw. so gedacht, dass der Lüfter für 10 Minuten einschaltet und das ganze sich alle 4.000 Sekunden (66,67 Minuten) wiederholt.

Die Wiederholungen wollte ich mit dem Attribut repeatcmd machen.

Wenn ich aber jetzt die Luftungszeit ändere, ändert sich auch z.B. die Pausenzeit so dass alles gleich lange dauert.
Als Anhang habe ich mal einen Screeshot davon angehängt (vom 26.04.21); hier habe ich die Zeiten mehrmals geändert.

Wie kann ich es z.B. einstellen, dass der Lüfter 10 Min läuft und 60 Minuten Pause dazwischen ist?

Hier das List vom DOIF:

Internals:
   CFGFN     
   DEF        ([deltadewpoint:state]>3 and
[KEL_LUFTFEUCHTIGKEIT:temperature]>7 and
[KEL_LUFTFEUCHTIGKEIT:temperature]<12)
(set HUEDevice9 on-for-timer 600)
DOELSE
(set HUEDevice9 off)
   FUUID      6060ee07-f33f-f59f-9eb7-12b1002aa68bffa8
   MODEL      FHEM
   NAME       TAUPUNKT_LUEFTUNG_NORMAL
   NOTIFYDEV  KEL_LUFTFEUCHTIGKEIT,deltadewpoint,global
   NR         2026
   NTFY_ORDER 50-TAUPUNKT_LUEFTUNG_NORMAL
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1619955230.31368
           VALUE      cmd_1
   READINGS:
     2021-05-02 14:17:40   Device          deltadewpoint
     2021-05-02 13:33:50   cmd             1
     2021-05-02 13:33:50   cmd_event       deltadewpoint
     2021-05-02 13:33:50   cmd_nr          1
     2021-05-02 14:12:08   e_KEL_LUFTFEUCHTIGKEIT_temperature 7.6
     2021-05-02 14:17:40   e_deltadewpoint_state 3.8
     2021-04-21 15:27:26   mode            enabled
     2021-05-02 13:33:50   state           cmd_1
     2021-05-02 13:33:50   wait_timer      02.05.2021 14:40:30 cmd_1 deltadewpoint
   Regex:
     accu:
     cond:
       KEL_LUFTFEUCHTIGKEIT:
         0:
           temperature ^KEL_LUFTFEUCHTIGKEIT$:^temperature:
       deltadewpoint:
         0:
           state      ^deltadewpoint$:^state:
   attr:
     cmdState:
     repeatcmd:
       4000
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'deltadewpoint','state')>3 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')>7 and  ::ReadingValDoIf($hash,'KEL_LUFTFEUCHTIGKEIT','temperature')<12
   do:
     0:
       0          set HUEDevice9 on-for-timer 600
     1:
       0          set HUEDevice9 off
   helper:
     DEVFILTER  ^global$|^deltadewpoint$|^KEL_LUFTFEUCHTIGKEIT$
     NOTIFYDEV  global|deltadewpoint|KEL_LUFTFEUCHTIGKEIT
     event      3.8
     globalinit 1
     last_timer 0
     sleepdevice deltadewpoint
     sleepsubtimer 0
     sleeptimer 0
     timerdev   deltadewpoint
     timerevent 3.8
     triggerDev deltadewpoint
     timerevents:
       3.8
     timereventsState:
       state: 3.8
     triggerEvents:
       3.8
     triggerEventsState:
       state: 3.8
   internals:
   readings:
     all         deltadewpoint:state KEL_LUFTFEUCHTIGKEIT:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   repeatcmd  4000
   room       Kellerlüftung