Hallo,
ich dachte eigentlich, dass ich mich solangsam in die Anfänge von DOIF eingearbeitet hätte, aber irgendwie gibt es doch ein Problem ...
Meine PoolPumpensteuerung...
Ich habe einen Dummy PoolPumpeAutomatik mit den möglichkeiten "Auto,Perm,Off"
Bei Auto soll die Pumpe von morgens 9:00-12:00 und abends 21:00 - 01:00 laufen.
Falls die Heitzung an ist, soll in Abhängigikeit des Öffnungsstandes eines Ventils noch die Solarpumpe an oder aus sein...
Jetzt habe ich das Problem , dass die Pumpe zur gegebenen Zeit einschaltet, aber schon nach kurzer Zeit wieder ausschaltet .... und ich weiss nicht warum ?
ich hänge mal den List an, vieleicht hat mir ja jemand einen Tipp...
Internals:
CFGFN
DEF (([PoolPumpeAutomatik] eq "Auto" or [PoolPumpeAutomatik] eq "Perm") and [sw_SolarKreislaufVentil:pct] > 60) (attr di_PoolPumpe stateFormat Heizung Perm,setreading PoolHeizung Heizbetrieb on,set sw_PoolPumpe on,set sw_SolarPumpe on) ##Permanentbetrieb
DOELSEIF ([sw_SolarKreislaufVentil:pct] > 60 and [PoolPumpeAutomatik] eq "Off") (attr di_PoolPumpe stateFormat Pumpe Aus,set PoolHeizung off) ## Versehentliches Poolheizen ohne Automatik ausschalten
DOELSEIF (([09:00-12:00] or [21:15-01:00]) and [PoolPumpeAutomatik] eq "Auto" and [sw_SolarKreislaufVentil:pct] < 60 and [PoolHeizung:Heizbetrieb] eq "on") (attr di_PoolPumpe stateFormat PumpeAnHeizung aus Auto,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe on,set sw_SolarPumpe off) ##Poolheizung während Pumpbetrieb aus..
DOELSEIF ([PoolPumpeAutomatik] eq "Auto" and [sw_SolarKreislaufVentil:pct] < 60 and [PoolHeizung:Heizbetrieb] eq "on") (attr di_PoolPumpe stateFormat PumpeAusHeizungAus Auto,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe off,set sw_SolarPumpe off) ##Poolheizung ausserhalbt Pumpbetrieb aus
DOELSEIF ([PoolPumpeAutomatik] eq "Perm" and [sw_SolarKreislaufVentil:pct] < 60 and [PoolHeizung:Heizbetrieb] eq "on") (attr di_PoolPumpe stateFormat PumpeAnHeizungAus Perm,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe on,set sw_SolarPumpe off) ##Poolheizung während permanent aus...
DOELSEIF (([09:00-12:00] or [21:15-01:00]) and [PoolPumpeAutomatik] eq "Auto") (attr di_PoolPumpe stateFormat PumpeAn Auto,set sw_PoolPumpe on) ##Pumpbetrieb Zeitgesteuert
DOELSEIF ([PoolPumpeAutomatik] eq "Perm") (attr di_PoolPumpe stateFormat PumpeAn Perm,set sw_PoolPumpe on) ##Permantenbetrieb
DOELSEIF ([Waschkueche_Wassermelder:water_detect] eq "on") (attr di_PoolPumpe stateFormat WasserAlarm,set sw_PoolPumpe off,set sw_SolarPumpe off,set PoolPumpeAutomatik Off,define at_LametricPumpe at +*00:00:10 set lametric msg "i59" "Wasser im Keller!!!" "alarms:alarm10",set telegrambot message Wasser im Keller !)
DOELSE (attr di_PoolPumpe stateFormat PumpeAus,set sw_PoolPumpe off,set sw_SolarPumpe off)
NAME di_PoolPumpe
NR 32213
NTFY_ORDER 50-di_PoolPumpe
STATE PumpeAn Auto
TYPE DOIF
Readings:
2017-06-24 09:52:38 Device PoolPumpeAutomatik
2017-06-24 09:52:38 cmd 6
2017-06-24 09:52:38 cmd_event PoolPumpeAutomatik
2017-06-24 09:52:38 cmd_nr 6
2017-06-24 09:52:38 e_PoolPumpeAutomatik_STATE Auto
2017-06-24 09:44:11 e_Waschkueche_Wassermelder_water_detect off
2017-06-24 09:52:38 state cmd_6
2017-06-23 23:55:49 timer_01_c03 24.06.2017 09:00:00
2017-06-23 23:55:49 timer_02_c03 24.06.2017 12:00:00
2017-06-24 01:00:00 timer_03_c03 24.06.2017 21:15:00
2017-06-24 01:00:00 timer_04_c03 25.06.2017 01:00:00
2017-06-23 23:55:49 timer_05_c06 24.06.2017 09:00:00
2017-06-23 23:55:49 timer_06_c06 24.06.2017 12:00:00
2017-06-24 01:00:00 timer_07_c06 24.06.2017 21:15:00
2017-06-24 01:00:00 timer_08_c06 25.06.2017 01:00:00
Condition:
0 (InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Auto" or InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Perm") and ReadingValDoIf($hash,'sw_SolarKreislaufVentil','pct') > 60
1 ReadingValDoIf($hash,'sw_SolarKreislaufVentil','pct') > 60 and InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Off"
2 (DOIF_time($hash,0,1,$wday,$hms) or DOIF_time($hash,2,3,$wday,$hms)) and InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Auto" and ReadingValDoIf($hash,'sw_SolarKreislaufVentil','pct') < 60 and ReadingValDoIf($hash,'PoolHeizung','Heizbetrieb') eq "on"
3 InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Auto" and ReadingValDoIf($hash,'sw_SolarKreislaufVentil','pct') < 60 and ReadingValDoIf($hash,'PoolHeizung','Heizbetrieb') eq "on"
4 InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Perm" and ReadingValDoIf($hash,'sw_SolarKreislaufVentil','pct') < 60 and ReadingValDoIf($hash,'PoolHeizung','Heizbetrieb') eq "on"
5 (DOIF_time($hash,4,5,$wday,$hms) or DOIF_time($hash,6,7,$wday,$hms)) and InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Auto"
6 InternalDoIf($hash,'PoolPumpeAutomatik','STATE') eq "Perm"
7 ReadingValDoIf($hash,'Waschkueche_Wassermelder','water_detect') eq "on"
Days:
Devices:
0 PoolPumpeAutomatik sw_SolarKreislaufVentil
1 sw_SolarKreislaufVentil PoolPumpeAutomatik
2 PoolPumpeAutomatik sw_SolarKreislaufVentil PoolHeizung
3 PoolPumpeAutomatik sw_SolarKreislaufVentil PoolHeizung
4 PoolPumpeAutomatik sw_SolarKreislaufVentil PoolHeizung
5 PoolPumpeAutomatik
6 PoolPumpeAutomatik
7 Waschkueche_Wassermelder
all PoolPumpeAutomatik sw_SolarKreislaufVentil PoolHeizung Waschkueche_Wassermelder
Do:
0:
0 attr di_PoolPumpe stateFormat Heizung Perm,setreading PoolHeizung Heizbetrieb on,set sw_PoolPumpe on,set sw_SolarPumpe on
1:
0 attr di_PoolPumpe stateFormat Pumpe Aus,set PoolHeizung off
2:
0 attr di_PoolPumpe stateFormat PumpeAnHeizung aus Auto,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe on,set sw_SolarPumpe off
3:
0 attr di_PoolPumpe stateFormat PumpeAusHeizungAus Auto,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe off,set sw_SolarPumpe off
4:
0 attr di_PoolPumpe stateFormat PumpeAnHeizungAus Perm,setreading PoolHeizung Heizbetrieb off,set sw_PoolPumpe on,set sw_SolarPumpe off
5:
0 attr di_PoolPumpe stateFormat PumpeAn Auto,set sw_PoolPumpe on
6:
0 attr di_PoolPumpe stateFormat PumpeAn Perm,set sw_PoolPumpe on
7:
0 attr di_PoolPumpe stateFormat WasserAlarm,set sw_PoolPumpe off,set sw_SolarPumpe off,set PoolPumpeAutomatik Off,define at_LametricPumpe at +*00:00:10 set lametric msg "i59" "Wasser im Keller!!!" "alarms:alarm10",set telegrambot message Wasser im Keller !
8:
0 attr di_PoolPumpe stateFormat PumpeAus,set sw_PoolPumpe off,set sw_SolarPumpe off
Helper:
event Auto
globalinit 1
last_timer 8
sleeptimer -1
timerdev PoolPumpeAutomatik
timerevent Auto
triggerDev PoolPumpeAutomatik
timerevents:
Auto
timereventsState:
state: Auto
triggerEvents:
Auto
triggerEventsState:
state: Auto
Internals:
0 PoolPumpeAutomatik:STATE
1 PoolPumpeAutomatik:STATE
2 PoolPumpeAutomatik:STATE
3 PoolPumpeAutomatik:STATE
4 PoolPumpeAutomatik:STATE
5 PoolPumpeAutomatik:STATE
6 PoolPumpeAutomatik:STATE
all PoolPumpeAutomatik:STATE
Interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
6 -1
7 6
Itimer:
Localtime:
0 1498287600
1 1498298400
2 1498331700
3 1498345200
4 1498287600
5 1498298400
6 1498331700
7 1498345200
Readings:
0 sw_SolarKreislaufVentil:pct
1 sw_SolarKreislaufVentil:pct
2 sw_SolarKreislaufVentil:pct PoolHeizung:Heizbetrieb
3 sw_SolarKreislaufVentil:pct PoolHeizung:Heizbetrieb
4 sw_SolarKreislaufVentil:pct PoolHeizung:Heizbetrieb
7 Waschkueche_Wassermelder:water_detect
all sw_SolarKreislaufVentil:pct PoolHeizung:Heizbetrieb Waschkueche_Wassermelder:water_detect
Realtime:
0 09:00:00
1 12:00:00
2 21:15:00
3 01:00:00
4 09:00:00
5 12:00:00
6 21:15:00
7 01:00:00
Regexp:
0:
1:
2:
3:
4:
5:
6:
7:
All:
State:
State:
Time:
0 09:00:00
1 12:00:00
2 21:15:00
3 01:00:00
4 09:00:00
5 12:00:00
6 21:15:00
7 01:00:00
Timecond:
0 2
1 2
2 2
3 2
4 5
5 5
6 5
7 5
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timers:
2 0 1 2 3
5 4 5 6 7
Trigger:
Triggertime:
1498298400:
localtime 1498298400
Hash:
1498331700:
localtime 1498331700
Hash:
1498345200:
localtime 1498345200
Hash:
Attributes:
room Pool
stateFormat PumpeAn Auto
Alle diese Geräte triggern dein DOIF
all PoolPumpeAutomatik sw_SolarKreislaufVentil PoolHeizung Waschkueche_Wassermelder
plus natürlich die Zeiten.
Das heisst: jedes Event von diesen Devices führt zur Bewertung der Bedingungen. Zum Beispeil: jedes Mal wo [sw_SolarKreislaufVentil:pct] sich ändert, wird das DOIF getriggert.
Ich würde erstmal unterscheiden zwischen Triggern und Konditionen. Die reine Konditionen, die nicht triggern müssen, sollten mit ? geschrieben werden. z.B.:[?Device:Reading]
Jetzt musst Du gucken in welchem Zustand das DOIF sich befindet, nachdem die Pumpe "nach kurzer Zeit wieder ausschaltet". Am besten dafür das Attribute stateFormat löschen. Somit weisst Du in welchem Zweig des DOIFs du gelandet bist.
Ok, ich habe den Zweig mit dem Wassermelder mal rausgenommen....
Wenn ich merke, dass ausgeschaltet ist, ist der Doif im DOELSE Zweig... (also am Schluss.. alles aus)
Im Log sehe ich nur, dass ausgeschaltet wird, aber nicht warum... Kann man sich auch protokolieren lassen warum der Doif irgendwas macht ?
Kurz nachdem es (unerwünscht) ausgeschaltet wird, siehst Du im State, welchen Zweig es war, und siehst in den Readings, was angestossen hat.
Ok, es scheint was mit dem Wassermelder (FS20-Device) zu tun haben...
Der Doif-Zweig: ([Waschkueche_Wassermelder:Water Detect] eq "on")
Zum Zeitpunkt als der zog, kam im Log:
2017-06-24_13:14:18 Waschkueche_Wassermelder water_detect: off
2017-06-24_13:14:18 Waschkueche_Wassermelder battery: ok
2017-06-24_13:14:18 Waschkueche_Wassermelder type: HMS100WD
2017-06-24_13:14:18 Waschkueche_Wassermelder Water Detect: off
Ich gehe mal davon, dass ich die Bedingung falsch abfrage... Wenn ich den Melder teste, dann geht "Water Detect:" auf on, ... water_detect: bleibt auf off (warum auch immer)
muss das vieleicht ([Waschkueche_Wassermelder:Water Detect:] eq "on") heisen, oder wie .. ?
([Waschkueche_Wassermelder:Water Detect:] eq "on")
sicher nicht
Mach mal ein "list Waschkueche_Wassermelder"
Das hat so wie so kaum mit der gesamte Logik zu tun. Ich würde das komplett aus dem DOIF nehmen, und dann eher sowas machen:
define di_WasserImKeller DOIF ([Waschkueche_Wassermelder:water_detect] eq "on")
(set di_PoolPumpe disable) ## somit wird das andere DOIF inaktiv
(set sw_PoolPumpe off,set sw_SolarPumpe off,set PoolPumpeAutomatik Off)
(set lametric msg "i59" "Wasser im Keller!!!" "alarms:alarm10",set telegrambot message Wasser im Keller !)
attr di_WasserImKeller repeatcmd 10
Warum machst Du "attr stateformat" in den Befehle. Das ändert die Konfiguration, und fhem schlägt dann immer vor, die Konfiguration zu speichern. Mach es lieber allgemein als attr des DOIFS durch "cmdState" Attribut.
attr di_PoolPumpe cmdState Heizung Perm|Pumpe Aus|PumpeAnHeizung aus Auto|PumpeAusHeizungAus Auto|PumpeAnHeizungAus Perm|PumpeAn Auto|PumpeAn Perm|WasserAlarm|PumpeAus
und alle stateFormat weg.
Zur Arbeitsweise von
DOIF i.V. mit
DOELSE und deinem Wassermelder:
jedesmal, wenn der Wassermelder was meldet (in dem Fall: "Alles OK"), läuft das DOIF los und fragt alle Bedingungen ab. Da es nix findet, wird
DOELSE ausgeführt.
Richtige Abfrage wäre daher:
([Waschkueche_Wassermelder:water_detect:"on"])
Damit wird das
DOIF nur dann angetriggert, wenn auch genau das Ereignis eintrifft, somit löst auch
DOELSE nicht aus.
Weiterhin würde ich das aus Sicherheitsgründen an den Anfang legen.
Zitat von: mameier1234 am 24 Juni 2017, 10:26:50die Anfänge von DOIF
Ein anderer Hinweis: solche
DOIF, welche mehrere Aktoren gleichzeitig gesteuert haben, hatte ich früher auch. Spätestens, wenn du neben der Poolpumpe noch die Heizungsumwälzpumpe oder so ansteuern willst und dazu ein zweites
DOIF erstellst (oder wie in dem Beispiel mit dem ausgelagerten Wassermelder-DOIF!), kommen die sich ggseitig in die Quere. Ich nutze pro Aktor genau ein
DOIF, damit habe ich die Übersicht an genau einem Ort.
Ihr seid so klasse...
Obwohl meine Probleme ja bestimmt schon zig mal gefragt wurden.. das hilft echt !!
Ich werde umbauen :-)