Hauptmenü

Anfänger mit Doif (PoolPumpe)

Begonnen von mameier1234, 24 Juni 2017, 10:26:50

Vorheriges Thema - Nächstes Thema

mameier1234

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


amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

mameier1234

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 ?

amenomade

Kurz nachdem es (unerwünscht) ausgeschaltet wird, siehst Du im State, welchen Zweig es war, und siehst in den Readings, was angestossen hat.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

mameier1234

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 .. ?

amenomade

([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.


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Per

#6
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.

mameier1234

Ihr seid so klasse...

Obwohl meine Probleme ja bestimmt schon zig mal gefragt wurden.. das hilft echt !!

Ich werde umbauen :-)