Hallo!
Nach einem Wochenende mit viel Probieren und noch mehr nachlesen, brauche ich jetzt doch mal Eure Hilfe.
Ich habe Ventile (im Test erstmal 2) für die Gartenbewässerung. Davon darf immer nur eins aktiv sein, da der Wasserhahn nicht ausreichend Wasser liefert. Also Ansteuerung nacheinander. Das klappt auch.
Jetzt würde ich gerne auch mal ein Ventil sperren, weil z. B. das Trampolin dort steht. Wenn ich also das erste Ventil sperren, springt das zweite aber trotzdem erst an, nachdem die Zeit für das erste Ventil abgelaufen ist, obwohl es nicht aktiviert wurde.
Wie erreiche ich, dass bei der Triggerung durch set du_Ventil_aktiv 2 das cmd_1 quasi abgebrochen wird und die Waittimer gelöscht werden?
Hier das list während des Wartens:
Internals:
DEF ([du_FTUI_Bewaesserung_manuell] eq "on") (set du_Ventil_aktiv 1)
DOELSEIF ([du_Ventil_aktiv] == 1)
(IF ([AG_Ventil_1] eq "Auto") (set AG_Ventil_1 An) ELSE (set du_Ventil_aktiv 2))
(IF ([AG_Ventil_1] ne "Gesperrt") (set AG_Ventil_1 Auto))
(set du_Ventil_aktiv 2)
DOELSEIF ([du_Ventil_aktiv] == 2)
(IF ([AG_Ventil_2] eq "Auto") (set AG_Ventil_2 An) ELSE (set du_Ventil_aktiv 3))
(IF ([AG_Ventil_2] ne "Gesperrt") (set AG_Ventil_2 Auto))
(set du_Ventil_aktiv 3)
DOELSEIF ([du_Ventil_aktiv] == 3)
(set du_Ventil_aktiv 0,set du_FTUI_Bewaesserung_manuell off)
MODEL FHEM
NAME di_AG_Test_Bewaesserung
NR 315
NTFY_ORDER 50-di_AG_Test_Bewaesserung
STATE cmd_1
TYPE DOIF
READINGS:
2020-04-20 22:11:35 Device du_Ventil_aktiv
2020-04-20 22:11:35 cmd 1
2020-04-20 22:11:35 cmd_event du_FTUI_Bewaesserung_manuell
2020-04-20 22:11:35 cmd_nr 1
2020-04-20 22:11:35 e_du_FTUI_Bewaesserung_manuell_STATE on
2020-04-20 22:11:35 e_du_Ventil_aktiv_STATE 1
2020-04-20 22:07:48 mode enabled
2020-04-20 22:11:35 state cmd_1
2020-04-20 22:11:35 wait_timer 20.04.2020 22:11:40 cmd_2_2 du_Ventil_aktiv
Regex:
attr:
cmdState:
wait:
0:
0
1:
0
[du_Bewaesserungsdauer]
0
2:
0
[du_Bewaesserungsdauer]
3:
0
waitdel:
condition:
0 InternalDoIf($hash,'du_FTUI_Bewaesserung_manuell','STATE') eq "on"
1 InternalDoIf($hash,'du_Ventil_aktiv','STATE') == 1
2 InternalDoIf($hash,'du_Ventil_aktiv','STATE') == 2
3 InternalDoIf($hash,'du_Ventil_aktiv','STATE') == 3
devices:
0 du_FTUI_Bewaesserung_manuell
1 du_Ventil_aktiv
2 du_Ventil_aktiv
3 du_Ventil_aktiv
all du_FTUI_Bewaesserung_manuell du_Ventil_aktiv
do:
0:
0 set du_Ventil_aktiv 1
1:
0 IF ([AG_Ventil_1] eq "Auto") (set AG_Ventil_1 An) ELSE (set du_Ventil_aktiv 2)
1 IF ([AG_Ventil_1] ne "Gesperrt") (set AG_Ventil_1 Auto)
2 set du_Ventil_aktiv 2
2:
0 IF ([AG_Ventil_2] eq "Auto") (set AG_Ventil_2 An) ELSE (set du_Ventil_aktiv 3)
1 IF ([AG_Ventil_2] ne "Gesperrt") (set AG_Ventil_2 Auto)
2 set du_Ventil_aktiv 3
3:
0 set du_Ventil_aktiv 0,set du_FTUI_Bewaesserung_manuell off
4:
helper:
event 1
globalinit 1
last_timer 0
sleepdevice du_Ventil_aktiv
sleepsubtimer 1
sleeptimer 1
timerdev du_Ventil_aktiv
timerevent 1
triggerDev du_Ventil_aktiv
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: du_FTUI_Bewaesserung_manuell
state: cmd_1
timerevents:
1
2
timereventsState:
state: 1
triggerEvents:
1
2
triggerEventsState:
state: 1
internals:
0 du_FTUI_Bewaesserung_manuell:STATE
1 du_Ventil_aktiv:STATE
2 du_Ventil_aktiv:STATE
3 du_Ventil_aktiv:STATE
all du_FTUI_Bewaesserung_manuell:STATE du_Ventil_aktiv:STATE
itimer:
readings:
trigger:
uiState:
uiTable:
Attributes:
selftrigger all
wait 0:0,[du_Bewaesserungsdauer],0:0,[du_Bewaesserungsdauer]:0
Ich drehe mich im Kreis und habe jetzt den Überblick total verloren. Für einen Schubs in die richtige Richtung wäre ich dankbar.
Grüße
Niel
Du kannst die Waitzeiten als indirekte Zeiten angeben. Diese kannst du dann nach Bedarf auf Null setzen.
z. B. attr wait [$SELF:wait1]:....
und
setreading $SELF wait1 0
Danke, werde ich morgen ausprobieren und mich melden.
Hallo!
Den Vorschlag mit setReading habe ich kurz probiert, aber dann verworfen, da dann immer ein save fällig wird.
Habe es jetzt anders gelöst. Pro Ventil Wird die Zeit vorher in einem dummy festgelegt, wenn sich der Status des Ventils ändert (Auto -> Gesperrt -> Auto) Dieser dummy steht im wait-Attribut. Daher kein save notwendig.
Allerdings darf der dummy nicht 0 sein, sonst hängt das doif. Habe es jetzt bei gesperrtem Ventil auf 0.01 gesetzt. Da passiert am Ventil nichts. Die 0 funktionierte bei der Variante mit setReading übrigens auch nicht.
Grüße
Niel