[gelöst] Licht an, aber nur wenn vor Sonnenaufgang

Begonnen von rallye, 01 Februar 2019, 12:19:06

Vorheriges Thema - Nächstes Thema

rallye

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
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

betateilchen


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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rabehd

(([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.
Auch funktionierende Lösungen kann man hinterfragen.

r00t2

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).
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

rallye

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 ...
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

rallye

#5
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).
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

rallye

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.
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor

nils_

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!
viele Wege in FHEM es gibt!

betateilchen

#8
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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Paul

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.
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

rallye

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
RaspiPi v4, HM-LGW, 6x HM-TC-IT-WM-W-EU, 11x HM-CC-RT-DN, 1x HUE Bridge, 4x HUE-RC, 5x HUE White&Color, 15xHUE White, 3xHM-LC-SW1-FM, 1xHM-LC-SW2-FM, 1x ConBeeII, 15x Shelly1, 5xShellyplug, Aquara: 2x Temp-Sensor, 1x Vibrationssensor, 2x Lichtsensor, 19x Tür/Fenstersensor