Wieso schaltet dieses DOIF außerhalb der gewollten Zeit?

Begonnen von MichaelO, 09 August 2016, 21:43:50

Vorheriges Thema - Nächstes Thema

MichaelO

Hallo,
der erste Teil eines DOIF macht irgendwie nicht, was ich will. Anscheinend aber, was ich programmiert habe. Könnte jemand bitte kontrollieren, warum morgens eingeschaltet wird, obwohl der Rolladen deutlich vor Sonnenaufgang aufgeht, ich seh den Fehler nicht.

Der Rolladen ist heute um 5:50 hochgefahren, dann hat umgehend das DOIF geschaltet. Dabei war der Timer {sunrise_abs(900)} etwa 5:21Uhr. Meiner Meinung nach hätte die Bedingung [?{sunrise_abs(900)}] lt $hms also um 5:50 Uhr verhindern müssen, dass der Ausdruck wahr wird, da $hms doch später als der Timer war. Oder stimmt da vom Syntax was nicht?

## Dekobeleuchtung an, wenn Rolladen offen, eine Deko existiert
## die Deko noch aus ist:
## morgens wenn noch nicht später als 15 Minuten nach
## Sonnenaufgang bei Bewegung Rolladen.
## abends/nachmittags zwischen 15:30 und 21:00, wenn es dunkel genug ist, der Rolladen auf
## ist, oder in der Zeit geöffnet wird (100 = zu)
( [?dy_WZ_Dekobeleuchtung] ne "keine" and
  [?WZ_ZS_Fenster] eq "off" and
  ( ([WZ_Rolladen:position] < 60 and [?{sunrise_abs(900)}] lt $hms) or
    ([WZ_Rolladen:position] < 60 and [?15:30-21:00] and [AU_Sonnensensor:Helligkeit] < [dy_SchwellwertLichtZimmerVorne])
  )
)


Danke
Michael

automatisierer


Sirel

Hallo Michael,
da Du die meisten Abfragen mit einem [? begonnen hast, bleibt eigentlich nicht mehr viel übrig, was Dein DOIF triggern kann.
Auch Deine Sonnenaufgangszeit-Abfrage triggert nicht, da sie ebenfalls mit [? beginnt. Und da die Rollläden um 5:50 hochgefahren sind, fällt der "or" Teil ebenfalls raus.

Bleibt somit nur noch der Aktor "WZ_Rolladen" übrig. Kann es sein, dass der sich zyklisch meldet bzw. seine Readings aktualisiert? Vielleicht hat der Aktor um 5:50 Uhr seine Reading aktualisiert, die Rollläden waren in einer einer Position <60 und die Bedingung wurde wahr. Dann hat das DOIF ausgelöst...

Ich kenne das zwar eigentlich nur von meinen zWave Sensoren, aber warum sollte es nicht auch Aktoren geben, die sich so verhalten...

Viele Grüße,
Max

Ellert

Wenn
Zitatda $hms doch später als der Timer war
dann ist " Timer lt $hms" wahr.

Wobei ich nicht sicher bin, ob in [?{sunrise_abs(900)}] lt $hms dieser Ausdruck [?{sunrise_abs(900)}] als HH:MM:SS repräsentiert wird.

Ich würde [?{sunrise_abs(900)}] and sunrise_abs(900) lt $hms schreiben, bzw. gt $hms.

Dabei ist zu beachten, das [?{sunrise_abs(900)}] nur evaluiert wird, wenn der Timer abläuft.

MichaelO

Danke für die zahlreichen Antworten und die Hilfe. Ich ging bislang davon aus, lediglich etwas im Ausdruck verhauen zu haben. Anscheinend könnte die "Fehlfunktion" jedoch ganz woanders liegen, so dass es mit einem kurzen Draufschauen nicht getan ist.

Zunächst einmal das ganze DOIF

Internals:
   DEF        ## Dekobeleuchtung an, wenn Rolladen offen, eine Deko existiert
## die Deko noch aus ist:
## morgens wenn noch nicht später als 15 Minuten nach
## Sonnenaufgang bei Bewegung Rolladen.
## abends/nachmittags zwischen 15:30 und 21:00, wenn es dunkel genug ist, der Rolladen auf
## ist, oder in der Zeit geöffnet wird
( [?dy_WZ_Dekobeleuchtung] ne "keine" and
  [?WZ_ZS_Fenster] eq "off" and
  ( ([WZ_Rolladen:position] < 60 and [?{sunrise_abs(900)}] lt $hms) or
    ([WZ_Rolladen:position] < 60 and [?15:30-21:00] and [AU_Sonnensensor:Helligkeit] < [dy_SchwellwertLichtZimmerVorne])
  )
)

     (set WZ_ZS_Fenster on,set WZ_DekoOnOffAutoDummy on)

DOELSEIF
## Dekobeleuchtung aus wenn Deko existiert und die Automatik sie auch
## eingeschaltet hat (Dummy)
## morgens 30 Minuten nach Sonnenaufgang,
## oder abends wenn der Rolladen zu geht
## und die Leistungsaufnahme des Entertainment unter 30 Watt ist
( [?dy_WZ_Dekobeleuchtung] ne "keine" and
  [?WZ_DekoOnOffAutoDummy] eq "on" and
  ( [([{sunrise_abs(1800)}])] or [WZ_Rolladen:position] > 60 ) and
  [?WZ_ZS_Entertainment:power:d] < 30
)

     (set WZ_ZS_Fenster off,set WZ_DekoOnOffAutoDummy off)

DOELSEIF
## Dekobeleuchtung an wenn Deko existiert, abends der Rolladen zu ist
## und die Leistungsaufnahme des Entertainment über 30 Watt ist.
## Das Dummy der Automatik ausschalten, weil ja wer im Raum ist
( [?dy_WZ_Dekobeleuchtung] ne "keine" and
  [WZ_Rolladen:position] > 90 and
  [WZ_ZS_Entertainment:power:d] > 30
)

     (set WZ_ZS_Fenster on,set WZ_DekoOnOffAutoDummy off)

DOELSEIF
## Dekobeleuchtung nach 3 Minuten aus wenn sie an ist, abends der Rolladen zu ist
## und die Leistungsaufnahme des Entertainment unter 30 Watt fällt.
## Das Dummy der Automatik ausschalten, weil ja wer im Raum ist
( [?dy_WZ_Dekobeleuchtung] ne "keine" and
  [?WZ_Rolladen] eq "closed" and
  [?17:00-02:00] and
  [WZ_ZS_Entertainment:power:d] < 30
)


@Sirel:In der Tat sollen nur bestimmte Teile des Ausdrucks die einzelnen States triggern. Das war eigentlich so gewollt. Egal ob die im Fenster stehende Lampe an oder aus gehen soll, es sollte nur die Rolladenposition oder die Leistungsaufnahme des Entertainments (TV+AV-Receiver+Sat) triggern, alles weitere - also die Zeiten - sollten nur weitere Bedingungen des Ausdrucks darstellen. Den Dummy hab ich eingeführt, da man die Lampe ja auch manuell einschalten kann (am ZWave-Stecker), und die Automatik diese dann nicht ausschalten soll (Bsp.: Abends manuell an gemacht, das Fenster zum Lüften ist offen, der Rolladen deswegen oben. Man schließt das Fenster, das Rollo fährt automatisch, meldet zu und dann würde das Licht automatisch ausgehen.).

Was ich mit der wohl falschen Bedingung erreichen wollte... 
Morgens fahren die Rolladen an diesem Fenster nach Zeitplan / Sonnenaufgang rauf und am Abend runter. Wenn morgens das Rollo auf geht, soll das Licht einschalten, wenn es noch nicht später als 15 Minuten nach Sonnenaufgang ist, denn es schaltet mit dem zweiten CMD ja 30 Minuten nach Sonnenaufgang aus. So sollte sichergestellt sein, dass es mindestens 15 Minuten brennt. Da es momentan aber auch einschaltet, wenn es später als 30 Minuten nach Sonnenaufgang ist, geht es morgens nicht aus.

Hab da wohl mächtig den Wurm drin. Ich dachte auch, dass [? Bedingungen immer wahr sein müssen, wenn ein Ausdruck durch weitere Events getriggert wird.

@Ellert: Oh man, gerade beim Schreiben gemerkt... lt heißt nicht "later than" sondern "lower than"... ist schon fast peinlich, aber das könnte es gewesen sein. Ich werde es ändern in gt und sehen, ob dann alles so läuft.

Gruß
Michael

Ellert

[?{sunrise_abs(900)}] and sunrise_abs(900) lt $hms schreiben, bzw. gt $hms

Da habe ich nicht aufgepasst, wenn Du nicht triggerst, dann reicht sunrise_abs(900) gt $hms and ...

Sirel

Hi Michael,

Zitat...es sollte nur die Rollladenposition oder die Leistungsaufnahme des Entertainments (TV+AV-Receiver+Sat) triggern, alles weitere - also die Zeiten - sollten nur weitere Bedingungen des Ausdrucks darstellen

Das ist in Deinem erster DOELSIF aber nicht der Fall. Dort triggert nur [([{sunrise_abs(1800)}])] or [WZ_Rolladen:position] > 60 )
Heißt also, dass wenn der Entertainmentverbrauch unter 30 Watt fällt, der Rollladen ist bereits >60 Watt ist, die WZ_Dekobeleuchtung den Status "keine" hat und der WZ_DekoOnOffAutoDummy an ist, passiert nichts. Es sei denn, es ist dann der Zeitpunkt Sonnenaufgang mit einem Offset von 30 min.

Schau doch noch mal hier:
http://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Stati_ohne_Trigger
Hat Damian alles sehr detailliert beschrieben.


Viele Grüße,
Max