FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rallye am 01 Februar 2019, 12:19:06

Titel: [gelöst] Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rallye am 01 Februar 2019, 12:19:06
Hallo zusammen !

Ich möchte eine Lampe Wochentags um 4:45 einschalten und kurz vor Sonnenaufgang (Sonne 3° unter Horizont) wieder ausschalten. Ähnlich für Wochenende und Feiertag: 7:00 ein und kurz vor Sonnenaufgang (Sonne 3° unter Horizont) wieder aus. Ich habe das mit folgendem DOIF "gelöst":
(([07:00:00-{sunrise("HORIZON=-3.0")}|7] or [04:45-{sunrise("HORIZON=-3.0")}|8]) and [tw_light:elevation] lt -3) (set dummylicht on) DOELSE (set dummylicht off)

In meinem Log finde ich folgende Zeilen:
2019.02.01 04:45:00 4: dummy set dummylicht on
.
.
.
2019.02.01 06:25:14 4: dummy set dummylicht off
.
.
.
2019.02.01 07:10:14 4: dummy set dummylicht on
2019.02.01 07:11:04 4: dummy set dummylicht off


Die Lampe wird korrekt wie geplant um 4:45 eingeschaltet. Mein {sunrise_abs("HORIZON=-3.0")} liefert für meine Koordinaten und für den heutigen Tag 07:11:04. Damit ist die erste Einschaltzeit und die letzte Ausschaltzeit wie im Log protokolliert korrekt. Ich habe aber keine Ahnung wer mein Licht um 6:25:14 aus, und um 7:10:14 wieder einschaltet... ?
Ist mein DOIF eigentlich korrekt ? Mir ist nicht ganz klar wo das "and [tw_light:elevation] lt -3)" zieht - beim Beginn des Intervalls oder beim Ende des Intervalls oder muss es bei beiden (also Anfang und Ende des Intervalls) wahr sein damit der Ein-/Ausschaltvorgang durchgeführt wird ? Im Prinzip möchte ich, dass nur zum bestimmten Zeitpunkt eingeschaltet wird wenn die Sonne noch mehr als 3° unter dem Horizont steht und abgeschaltet, wenn sie Sonne genau 3° unter dem Horizont steht. Irgendwo fehlt mir trotz viel lesen der Durchblick.
Danke
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: betateilchen am 01 Februar 2019, 12:35:24

define werktag at *04:45 { fhem("set dummylicht on") if !$we }
define wochenende at *07:00 { fhem("set dummylicht on") if $we }
define lichtaus at *{sunrise_abs(-3)} set dummylicht off


da versteht man wenigstens, was man tut :)
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rabehd am 01 Februar 2019, 12:55:00
(([07:00:00-{sunrise("HORIZON=-3.0")}|7] ) and [tw_light:elevation] lt -3) (set dummylicht on)
DOELSEIF (([04:45-{sunrise("HORIZON=-3.0")}|8]) and [tw_light:elevation] lt -3) (set dummylicht on)
DOELSE (set dummylicht off)

Find  ich schon mal übersichtlicher.

Wozu ist hier "[tw_light:elevation] lt -3"? Scheint mir überflüssig.
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: r00t2 am 01 Februar 2019, 14:18:58
Vielleicht kann man auch einfach STATE bzw. light dazu verwenden: https://wiki.fhem.de/wiki/Twilight_Anwendungsbeispiel#Zusammenhang_STATE_und_light
Interessante Werte sind da z. B. 3 -> vor Sonnenaufgang, 4 -> vor Indoor-Aufgang, 5 -> vor "Wetter-Aufgang"
(Falls ich das nicht in dem ganze Code-Gewurschtel übersehen habe).
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rallye am 01 Februar 2019, 14:57:11
Zitat von: betateilchen am 01 Februar 2019, 12:35:24

define werktag at *04:45 { fhem("set dummylicht on") if !$we }
define wochenende at *07:00 { fhem("set dummylicht on") if $we }
define lichtaus at *{sunrise_abs(-3)} set dummylicht off


da versteht man wenigstens, was man tut :)

Da gebe ich dir recht, abe das Licht bleibt an wenn die Sonne vor 4:45 (im Sommer) bzw. vor 7:00 (ab Feb/Mar) aufgeht ...
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rallye am 01 Februar 2019, 15:00:53
Zitat von: rabehd am 01 Februar 2019, 12:55:00
(([07:00:00-{sunrise("HORIZON=-3.0")}|7] ) and [tw_light:elevation] lt -3) (set dummylicht on)
DOELSEIF (([04:45-{sunrise("HORIZON=-3.0")}|8]) and [tw_light:elevation] lt -3) (set dummylicht on)
DOELSE (set dummylicht off)

Find  ich schon mal übersichtlicher.

Wozu ist hier "[tw_light:elevation] lt -3"? Scheint mir überflüssig.

Danke, wäre mein nächster Test gewesen (nicht nur wegen der Übersichtlichkeit). Das "[tw_light:elevation] lt -3" soll verhindern, dass das Licht um 4:45 bzw. 7:00 eingeschaltet wird wenn die Sonne bereits weniger als 3° unter dem Horizont steht (da es ja dann nicht mehr ausgeschaltet werden würde).
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rallye am 01 Februar 2019, 15:04:21
Zitat von: r00t2 am 01 Februar 2019, 14:18:58
Vielleicht kann man auch einfach STATE bzw. light dazu verwenden: https://wiki.fhem.de/wiki/Twilight_Anwendungsbeispiel#Zusammenhang_STATE_und_light
Interessante Werte sind da z. B. 3 -> vor Sonnenaufgang, 4 -> vor Indoor-Aufgang, 5 -> vor "Wetter-Aufgang"
(Falls ich das nicht in dem ganze Code-Gewurschtel übersehen habe).

Absolut ! Nur State/Light 2 ist mir zu früh (da ist es noch zu finster), und State/Light 3 ist mir zu spät. Daher habe ich Hoizon=-3 genommen, was exakt zwischen State/Light 2 und 3 liegt.
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: nils_ am 01 Februar 2019, 15:20:43
Zitat von: statler am 01 Februar 2019, 12:19:06
Ich habe aber keine Ahnung wer mein Licht um 6:25:14 aus, und um 7:10:14 wieder einschaltet... ?
das wird vmtl. durch dein
... and [tw_light:elevation] lt -3) ...
passieren.

ich kenne den wertverlauf davon nicht. aber ich vermute mal das er zu den entsprechenden zeitpunken getriggert hat
also um
Zitat2019.02.01 06:25:14 4: dummy set dummylicht off
ist dein else-fall erfüllt -> Lampe aus.

und um
Zitat2019.02.01 07:10:14 4: dummy set dummylicht on
dein erster DOIF-Fall -> Lampe an

und eine Minute später triggert der sonnenuntergang, also Zeitraum beendet, Lampe wieder aus!
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: betateilchen am 01 Februar 2019, 15:49:02
Zitat von: statler am 01 Februar 2019, 14:57:11
Da gebe ich dir recht, abe das Licht bleibt an wenn die Sonne vor 4:45 (im Sommer) bzw. vor 7:00 (ab Feb/Mar) aufgeht ...

Dann erweitere doch das Einschalten einfach um die Abfrage, ob schon Sonnenaufgang war.


define werktag at *04:45 { fhem("set dummylicht on") if (!$we && !isday("HORIZON=-3")) }
define wochenende at *07:00 { fhem("set dummylicht on") if ($we && !isday("HORIZON=-3")) }
define lichtaus at *{sunrise_abs(-3)} set dummylicht off
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: Damian am 01 Februar 2019, 15:55:15
Beim DOIF sollten Zweige, die zur gleichen Ausführung führen mit or in einer Bedingung zusammengefasst werden.
Zahlenvergleiche sollten mit < statt lt gemacht werden.
Titel: Antw:Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: Paul am 01 Februar 2019, 17:57:43
Zitat von: betateilchen am 01 Februar 2019, 15:49:02
Dann erweitere doch das Einschalten einfach um die Abfrage, ob schon Sonnenaufgang war.


define werktag at *04:45 { fhem("set dummylicht on") if (!$we && !isday("HORIZON=-3")) }
define wochenende at *07:00 { fhem("set dummylicht on") if ($we && !isday("HORIZON=-3")) }
define lichtaus at *{sunrise_abs(-3)} set dummylicht off


@statler dann kannst du es jetzt auf gelöst setzen.
Titel: Antw:[gelöst] Licht an, aber nur wenn vor Sonnenaufgang
Beitrag von: rallye am 08 Februar 2019, 12:09:00
Danke an alle die mir geholfen haben. Für den Fall, dass jemand vor einem ähnlichen Problem steht hier meine Lösung:
define Morgenlicht DOIF
{if (([07:00:00-{sunrise("HORIZON=-3.0")}|7] or [04:45-{sunrise("HORIZON=-3.0")}|8])
   and [?tw_light:elevation] < -3 and [?rr_Carla] eq "home")
   {
    my $lampe = 17 + int rand(3);
    my $leuchte = "HUEDevice$lampe";
    Log(1,"zufall $leuchte");
    fhem_set "$leuchte pct 1"
   }
    else
   {
    fhem_set "HUEGroup3 off"
   }
}

Erklärung: meine Deckenleuchte im WZ hat 3 HUE-Lampen von welchen eine (zufällig ausgewählt) mit 1% eingeschaltet wird wenn meine Frau daheim ist, damit sie am Weg zum Kaffee-kochen nicht über meine Wäsche fliegt ;D. Und zwar um 4:45 an Wochentagen und um 7:00 an WE und Feiertagen. Wenn die Sonne 3° unter dem Horizont steht (dann ist es ohnehin von draußen hell genug) wird das Licht wieder abgeschaltet. Eingeschaltet wird zur Einschaltzeit aber nur, wenn die Sonne in der Früh mehr als 3° unter dem Horizont steht (ansonst würde das Licht nicht mehr - bzw. erst am nächsten Tag - abgeschaltet werden).

Einen Schönheitsfehler hat mein Konstrukt: wenn zum Einschaltzeitpunkt meine Frau nicht daheim ist oder die Sonne schob hoch genug steht (>= 3° unter Horizont) wird ein "licht-aus-Signal" gesendet (also der else-Zweig durchgeführt). Mit diesem maximal einen überflüssigen Funksignal pro Tag kann aber leben und mache keine daher Abfrage ob das Licht überhaupt "an" ist.

LG Statler