Hallo,
ich versuche mich - bisher vergeblich - an einem DOIF welches folgende Aufgabe erfüllen soll. Vielleicht noch als Ergänzung, ich habe bisher eine funktionierende Lösung mit einem zusätzlichen dummy und einen define at ... innerhalb des Ausführungsteils; ich wollte das jetzt verschlanken, scheitere aber bisher.
Die Aufgabe:
Wenn die Bedingung erfüllt ist, dann soll ein Lüfter für 1200 Sekunden laufen.
Anschließend soll der Lüfter erst nach weiteren 600 Sekunden Pause laufen, wenn die Bedingung erneut erfüllt wird.
Also 20 Minuten laufen, 10 Minuten Pause, ..., falls die Bedingung erfüllt ist.
Wenn die Bedingung nicht erfüllt ist, soll der Lüfter ausgehen.
Meine (abstrahierte) Definition:
define Luefter DOIF (Bedingung wahr) (set Aktor on for 1200) (Bedingung nicht wahr) (set Aktor off)
attr Luefter cmdpause 1800:2
attr Luefter do always
set Aktor on for 1200: funktioniert natürlich, d.h. der Aktor kümmert sich um das Ausschalten.
Nachdem der Lüfter aus ist, geht er eben
nicht nach 10 Minuten wieder an, wobei sichergestellt ist, dass die Bedingung wahr ist und ein oder mehere Events (zur Bedingung) vorhanden sind. Es dauert dann etwas mehr als 30 Minuten, bis der Lüfter wieder läuft.
Wie muss man die commandref an dieser Stelle verstehen?
ZitatMit dem Attribut cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:... wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung. In der angegebenen Zeitspanne wird ein Kommando nicht ausgeführt, auch wenn die dazugehörige Bedingung wahr wird.
Vielleicht gibt mir jemand den richtigen Schubs.
Viele Grüße
Gisbert
Der Vollständigkeit halber, ein list des (echten) Devices:
Internals:
CFGFN ./FHEM/Luefterschaltung.cfg
DEF (([?07:00-22:30|8] or [?07:30-22:30|7]) and [TH.Haushaltsraum:humidity] > 55 and [?TH.Haushaltsraum:temperature] > 18
and [?TH.Kuhlmannweg8:temperature] < 23 and [?D.Haushaltsraum] =~ "on")
(set HWR.Ventilator_ESP_Router command gpio 14 set high for 1200)
DOELSEIF (([TH.Haushaltsraum:humidity] <= 55 or [TH.Haushaltsraum:temperature] <= 18 or [D.Haushaltsraum] =~ "off") or [+06:00:00])
(set HWR.Ventilator_ESP_Router command gpio 14 set low)
DOELSEIF ([HWR.Ventilator_ESP_Router:14] == 0)
FUUID 5c430dc7-f33f-b139-f96d-7f285d01284df736
MODEL FHEM
NAME Haushaltsraum.Lueftung
NOTIFYDEV HWR.Ventilator_ESP_Router,global,D.Haushaltsraum,TH.Haushaltsraum
NR 637
NTFY_ORDER 50-Haushaltsraum.Lueftung
STATE cmd_3
TYPE DOIF
VERSION 20929 2020-01-10 09:44:35
READINGS:
2020-02-02 12:53:04 Device TH.Haushaltsraum
2020-02-02 12:45:05 cmd 3
2020-02-02 12:45:05 cmd_event HWR.Ventilator_ESP_Router
2020-02-02 12:45:05 cmd_nr 3
2020-02-02 12:53:04 e_D.Haushaltsraum_STATE 12.8 on
2020-02-02 12:45:05 e_HWR.Ventilator_ESP_Router_14 0
2020-02-02 12:53:04 e_TH.Haushaltsraum_humidity 58
2020-02-02 12:53:04 e_TH.Haushaltsraum_temperature 21.4
2020-02-02 10:04:21 mode enabled
2020-02-02 12:45:05 state cmd_3
2020-02-02 10:04:21 timer_01_c01 03.02.2020 07:00:00|8
2020-02-02 10:04:21 timer_02_c01 02.02.2020 22:30:00|8
2020-02-02 10:04:21 timer_03_c01 03.02.2020 07:30:00|7
2020-02-02 10:04:21 timer_04_c01 02.02.2020 22:30:00|7
2020-02-02 10:04:21 timer_05_c02 02.02.2020 16:04:21
2020-02-02 10:05:56 wait_timer no timer
Regex:
accu:
cond:
D.Haushaltsraum:
0:
1:
&STATE ^D.Haushaltsraum$
2:
HWR.Ventilator_ESP_Router:
0:
1:
2:
14 ^HWR.Ventilator_ESP_Router$:^14:
TH.Haushaltsraum:
0:
humidity ^TH.Haushaltsraum$:^humidity:
1:
humidity ^TH.Haushaltsraum$:^humidity:
temperature ^TH.Haushaltsraum$:^temperature:
attr:
cmdState:
cmdpause:
1800
2
2
repeatsame:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms,"8") or ::DOIF_time($hash,2,3,$wday,$hms,"7")) and ::ReadingValDoIf($hash,'TH.Haushaltsraum','humidity') > 55 and ::ReadingValDoIf($hash,'TH.Haushaltsraum','temperature') > 18 and ::ReadingValDoIf($hash,'TH.Kuhlmannweg8','temperature') < 23 and ::InternalDoIf($hash,'D.Haushaltsraum','STATE') =~ "on"
1 (::ReadingValDoIf($hash,'TH.Haushaltsraum','humidity') <= 55 or ::ReadingValDoIf($hash,'TH.Haushaltsraum','temperature') <= 18 or ::InternalDoIf($hash,'D.Haushaltsraum','STATE') =~ "off") or ::DOIF_time_once($hash,4,$wday)
2 ::ReadingValDoIf($hash,'HWR.Ventilator_ESP_Router','14') == 0
days:
0 8
1 8
2 7
3 7
do:
0:
0 set HWR.Ventilator_ESP_Router command gpio 14 set high for 1200
1:
0 set HWR.Ventilator_ESP_Router command gpio 14 set low
2:
0
3:
helper:
DEVFILTER ^global$|^D.Haushaltsraum$|^HWR.Ventilator_ESP_Router$|^TH.Haushaltsraum$
NOTIFYDEV global|D.Haushaltsraum|HWR.Ventilator_ESP_Router|TH.Haushaltsraum
event humidity: 58,T: 21.4 H: 58,temperature: 21.4,dewpoint: 12.8
globalinit 1
last_timer 5
sleepdevice TH.Haushaltsraum
sleepsubtimer -1
sleeptimer -1
timerdev TH.Haushaltsraum
timerevent humidity: 58,T: 21.4 H: 58,temperature: 21.4,dewpoint: 12.8
triggerDev TH.Haushaltsraum
bm:
DOIF_Attr:
cnt 6
dmx -1000
dtot 0
dtotcnt 0
mTS 02.02. 10:05:56
max 0.0234968662261963
tot 0.0376739501953125
mAr:
del
Haushaltsraum.Lueftung
wait
DOIF_Get:
cnt 20
dmx -1000
dtot 0
dtotcnt 0
mTS 02.02. 12:18:13
max 2.40802764892578e-05
tot 0.000343561172485352
mAr:
HASH(0x558661709300)
Haushaltsraum.Lueftung
?
DOIF_Notify:
cnt 1992
dmx -1000
dtot 0
dtotcnt 0
mTS 02.02. 12:01:51
max 0.113728046417236
tot 1.34965753555298
mAr:
HASH(0x558661709300)
HASH(0x55865ea858c8)
DOIF_Set:
cnt 81
dmx -1000
dtot 0
dtotcnt 0
mTS 02.02. 12:13:19
max 0.0034019947052002
tot 0.0099036693572998
mAr:
HASH(0x558661709300)
Haushaltsraum.Lueftung
checkall
timerevents:
humidity: 58
T: 21.4 H: 58
temperature: 21.4
dewpoint: 12.8
timereventsState:
humidity: 58
state: T: 21.4 H: 58
temperature: 21.4
dewpoint: 12.8
triggerEvents:
humidity: 58
T: 21.4 H: 58
temperature: 21.4
dewpoint: 12.8
triggerEventsState:
humidity: 58
state: T: 21.4 H: 58
temperature: 21.4
dewpoint: 12.8
internals:
all D.Haushaltsraum:STATE
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1580709600
1 1580679000
2 1580711400
3 1580679000
4 1580655861
readings:
all TH.Haushaltsraum:humidity TH.Haushaltsraum:temperature HWR.Ventilator_ESP_Router:14
realtime:
0 07:00:00
1 22:30:00
2 07:30:00
3 22:30:00
4 16:04:21
time:
0 07:00:00
1 22:30:00
2 07:30:00
3 22:30:00
4 +06:00:00
timeCond:
0 0
1 0
2 0
3 0
4 1
timer:
0 0
1 0
2 0
3 0
4 0
timers:
1 4
trigger:
triggertime:
1580655861:
localtime 1580655861
hash:
1580679000:
localtime 1580679000
hash:
1580709600:
localtime 1580709600
hash:
1580711400:
localtime 1580711400
hash:
uiState:
uiTable:
Attributes:
cmdpause 1800:2:2
comment Hardware: IWEAS 4.0 (in abgespeckter Form, da nur das Relais benötigt wird)
Software: esp_wifi_repeater, Stand 21.12.2019
Relais hängt an GPIO14:
Anschalten: set <device> command gpio 14 set high
Anschalten für 20 min: set <device> command gpio 14 set high for 1200
Ausschalten: set <device> command gpio 14 set low
devStateIcon cmd_1:vent_ventilation_level_3@red (cmd_2|cmd_3):vent_ventilation@gray
do always
icon vent_ventilation
room CUL_HM
Hallo,
in der letzten Stunde wollte der Lüfter gar nicht mehr angehen, obwohl die Bedingung(en) erfüllt waren.
Wenn ich das Attribut cmdpause lösche, läuft der Lüfter sofort los.
Aber dann wird er sofort wieder anlaufen, sobald das nächste Event reinkommt, so dass die Bedingunge(en) erfüllt sind.
Viele Grüße Gisbert
Hallo,
ich habe heute Geburtstag, Glückwünsche und Hilfestellung zu meinem kleinen Problem werden gerne entgegen genommen ;).
Vielen Dank im voraus und viele Grüße
Gisbert
define Luefter DOIF (Bedingung wahr) (set Aktor on for 1200) (Bedingung nicht wahr) (set Aktor off)
attr Luefter cmdpause 1800:2
attr Luefter do always
da fehlt doch das DOELSEIF vor (Bedingung nicht wahr)
btw: Happy birthday! :-)
attr Luefter repeatcmd 1800:0
Zitat von: Frank_Huber am 03 Februar 2020, 12:52:20
define Luefter DOIF (Bedingung wahr) (set Aktor on for 1200) (Bedingung nicht wahr) (set Aktor off)
attr Luefter cmdpause 1800:2
attr Luefter do always
da fehlt doch das DOELSEIF vor (Bedingung nicht wahr)
btw: Happy birthday! :-)
@Frank, hast recht, diese Beschreibung war aber nur dafür gedacht, dass sich jemand nicht durch das list durchwühlen und alles haarklein nachvollziehen muss.
In "echt" ist da ein DOELSEIF drin.
attr Luefter repeatcmd 1800:0
@Per,
vielen Dank, dieser Hinweis war goldrichtig!
Ich teste grade das Attribut repeatcmd; ich hatte es bisher noch nie eingesetzt, entsprechend musste ich das Brett/Balken vor mein Stirn erst wegbekommen.
Bisher läuft's, werde dann mal den Threadtitel verändern.
Vielleicht noch als Ergänzung. bzw. Verfeinerung, da ich das Ausschalten jetzt durch Fhem heraus mache, da der Aktor sich zwischendurch neu startet, und dann vergisst er das Ausschalten.
Dann muss man die Zeiten zwischen repeatcmd und wait sinnvoll aufteilen, um das folgende Verhalten zu bekommen:
- 20 Minuten lüften
- 10 Minuten Pause
- ...
define Luefter DOIF (Bedingung wahr) (set Aktor on) (set Aktor off) DOELSEIF (Bedingung nicht wahr) (set Aktor off)
attr Luefter do always
attr Luefter repeatcmd 600:60
attr Luefter repeatsame 18:2
attr Luefter wait 0,1200:0
Viele Grüße Gisbert