DOIF schaltet manchmal nicht.

Begonnen von tomleitner, 25 April 2016, 08:56:56

Vorheriges Thema - Nächstes Thema

tomleitner

Hallo,

Nachdem es wieder kalt geworden ist, will ich einen Heizlüfter in unserem Glashaus steuern wie folgt:

# glashaus heizungs steuerung
define DoGlashausHeizung DOIF ([USBWX_Pflanzenzelt:temperature] < 6) \
        (set GlashausHeizung on-for-timer 1800  ;; sleep 2 ;; set GlashausHeizung on-for-timer 1800 ) \
    DOELSEIF ([USBWX_Pflanzenzelt:temperature] > 8) \
        (set GlashausHeizung off ;; sleep 2 ;; set GlashausHeizung off )


Das on-for-timer 1800 benutze ich damit die Heizung nicht unabsichtlich ewig läuft, sollte der Ausschaltbefehl nicht kommen.

Das geht auch meist ... nur manchmal wird die Heizung nicht geschaltet obwohl die Temperaturen erreicht wurden. Ich sehe das schön in den Temperaturdiagrammen. Siehe Grafik im Anhang. Um 03:20 wurde die Heizung eingeschaltet und um 03:50 ausgeschaltet weil die 8 Grad erreicht wurden. Hier bereits das erste komische Verhalten: Es wurde nur ein Stück off Befehl abgesetzt,wie im Log zu sehen:

2016.04.25 02:16:03 2: ZWave set GlashausHeizung off
2016.04.25 02:18:28 2: ZWave set GlashausHeizung off
2016.04.25 02:18:30 2: ZWave set GlashausHeizung off
2016.04.25 03:20:25 2: ZWave set GlashausHeizung on
2016.04.25 03:20:27 2: ZWave set GlashausHeizung on
2016.04.25 03:50:27 2: ZWave set GlashausHeizung off
2016.04.25 04:28:34 1: CUL_WS Cannot decode K056FC
2016.04.25 05:00:00 3: FS20 set KatzenBrunnen on

Wie in der zweiten Grafik im Anhang zu sehen wurde auch der OFF Befehl nicht im Registriert -- da ist nur das Event im 03:20:25 gelistet?

Alles sehr eigenartig?  Hat jemand eine Erklärung dafür unter welchen Umständen das DOIF hier so reagiert?

Danke und Ciao // Tom

Ellert

sleep in DOIF zu verwenden ist nicht empfohlen, dafür gibt es das Attribut wait für Befehlssequenzen.
Um den Befehl zu wiederholen, könntest Du, falls für ZWave vorhanden, das Attribut ITrepetition oder ein ähnliches Attribut versuchen. Dann ist die Befehlswiederholung von DOIF entkoppelt.
Du könntest DOELSE einfügen, um einen definierten Zustand zwischen 6-8°C zu erzeugen.

tomleitner

Danke für Deine Antwort. Ich werds mal mit wait versuchen.

Frage: Was sollte im DOELSE Zweig für den Zustand zwischen 6 und 8 Grad passieren? Irgendwie muss ich die Hysterese ja reinbringen und zwischen 6 und 8 Grad hängt der Zustand ja davon ab obs grade abkühlt oder aufheizt ...

Wie realisiert man das normalerweise?  Der THRESHOLD befehl hat bei mir übrigens überhaupt nicht gut geklappt, so bin ich auf das DOIF gekommen ...






Ellert

#3
ZitatWas sollte im DOELSE Zweig für den Zustand zwischen 6 und 8 Grad passieren?

Nichts, das DOIF geht dann in den Zustand cmd_3 und ist bereit für cmd_1 oder cmd_2, auch ohne do always. Es hat schon mal geholfen: https://forum.fhem.de/index.php/topic,52522.msg442799.html#msg442799

ZitatWie realisiert man das normalerweise?
So, wie Du.

Dein Logauszug zeigt, dass ZWave kein 2. geloggt hat. Hat DOIF den Befehl 2x gesendet? Wenn Du das herausfinden möchtest kannst Du das im DOIF loggen in dem Du nach jedem set-Befehl einen Log-Befehl eingügst , {Log 1, "set GlashausHeizung on-for-timer 1800 ausgeführt"}

Ein detailiertes Logging kanst Du mit einem notify durchführen:

define LogNotify notify  DoGlashausHeizung|USBWX_Pflanzenzelt:temperature.*|GlashausHeizung {Log 1, "LogNotify: ($NAME) $EVENT"}


tomleitner

Danke für Deine Antwort... ich werde das so ausprobieren ...

tomleitner

Also mit dem DOELSE() Zweig, also so:

# glashaus heizungs steuerung
define DoGlashausHeizung \
    DOIF ([USBWX_Pflanzenzelt:temperature] < 6) \
        (set GlashausHeizung on-for-timer 1800 ) \
    DOELSEIF ([USBWX_Pflanzenzelt:temperature] > 8) \
        (set GlashausHeizung off ) \
    DOELSE ()


klappt es nun einwandfrei. Siehe Foto im Anhang.

Danke & Ciao // Tom