Seite 1 von 1

Licht nach Sonnenaufgang einschalten

Verfasst: 7. Nov 2025 09:09
von MyHome68
Hallo zusammen,
ich habe da gleich zwei Fragen. Ich möchte meine Pflanzen in der Garage zwischen Sonnenauf- und untergang beleuchten. Dazu benutze ich die "Lokalen Sonnendaten" aus dem Astro Binding.

Die RULE dazu:

Code: Alles auswählen

rule "Sonnenaufgang Licht an"
when
    // Trigger, wenn der Sonnenaufgang beginnt
    Channel Sonnenaufgang triggered START
then
    // Aktion: Licht einschalten
    Fritz_Steckdose_Garage.sendCommand(ON)
end

rule "Sonnenuntergang Licht aus"
when
    // Trigger, wenn der Sonnenuntergang beginnt
    Channel Sonnenuntergang triggered START
then
    // Aktion: Licht ausschalten
    Fritz_Steckdose_Garage.sendCommand(OFF)
end
Als zweites möchte ich, dass diese Lampen für 30 Sekunden angehen, wenn ich Nacht's in die Garage gehe. Dazu ist ein Fensterkontakt an der Tür montiert.

RULE:

Code: Alles auswählen

rule "LichtGarage"
when
	Item Tür_Garage_Neu_State changed from 0 to 1
then
	if(Sonnenaufgang == ON){	
	sendCommand(Fritz_Steckdose_Garage, ON)
	createTimer(now.plusSeconds(30)) [| sendCommand(Fritz_Steckdose_Garage, OFF) ]
	}
end
Leider funktioniert das beides nicht. Ich hoffe das mir da jemand helfen kann. Zwei Bilder befinden sich im Anhang.
Vielen Dank im voraus
Gruß Daniel

Re: Licht nach Sonnenaufgang einschalten

Verfasst: 7. Nov 2025 12:03
von peter-pan
Ich glaube nicht, dass man den Channel (Sonnenaufgang) so einfach nach on oder off abfragen kann.
Als erste IF-Bedingung würde ich abfragen, ob das Licht schon an ist. Wenn ja kann man die Regel gleich abbrechen.
Danach würde ich nach der Zeit des Sonnenuntergangs (Start/End) oder eines anderen Channels(z.B.:Night,etc...) fragen. Dazu brauchst du natürlich auch die entsprechenden Items.
.items (Beispiel)

Code: Alles auswählen

DateTime              Sunset_Time                     "Sonnenuntergang [%1$tH:%1$tM]"                                       <sunset>                  (gAstro)  ["Point"]    {channel="astro:sun:local:set#start", stateDescription=" " [pattern="%1$tH:%1$tM"]}
DateTime              Sunrise_Time                    "Sonnenaufgang [%1$tH:%1$tM]"                                         <sunrise>                 (gAstro)  ["Point"]    {channel="astro:sun:local:rise#start", stateDescription=" " [pattern="%1$tH:%1$tM"]}
Vielleicht hilft dir das weiter.

Re: Licht nach Sonnenaufgang einschalten

Verfasst: 7. Nov 2025 12:10
von peter-pan
Mir ist gerade noch aufgefallen, dass deine Trigger-Parameter (Syntax) nicht ganz richtig sind.
Hier noch eine Beispiel-Rule:

Code: Alles auswählen

rule "Night End"
    when
        Channel 'astro:sun:local:night#event' triggered START or
        Channel 'astro:sun:local:noon#event' triggered END 
//        or Item Dummy_4 changed to ON
    then
        logInfo("astro-rules", "Channel: {} - Event: {}" , triggeringChannel, receivedEvent)
end
/*===============================================================================

Re: Licht nach Sonnenaufgang einschalten

Verfasst: 7. Nov 2025 14:54
von udo1toni
Wie peter-pan schon sehr richtig schreibt...
Ein Channel Trigger benötigt die vollständige Channel UID
Die einfachste Variante für das Pflanzenlicht wäre hier eine Rule (Gegeben: ein Thing astro:sun:local, das packt openHAB automatisch in die Inbox, wenn man den Standort des Systems angibt und astro installiert):

Code: Alles auswählen

rule "Pflanzenlicht nach Sonnenstand"
when
    Channel 'astro:sun:local:daylight#event' triggered
then
    Fritz_Steckdose_Garage.sendCommand(if(receivedEvent == 'START') ON else OFF)
end
Diese schaltet das Licht automatisch ein und aus.
Für die zweite Rule (Licht, falls Tür geöffnet wird) brauchen wir den Höhenwinkel (die Elevation) der Sonne, dazu muss der Channel astro:sun:local:position#elevation mit einem Item des Typs Number:Angle verlinkt sein, nennen wir es der Einfachheit halber SunPosElevation
Den Türkontakt legst Du am besten als Contact Item an. Je nachdem, was Du für einen Kontakt verwendest, musst Du evtl. den Wert für OPEN und CLOSED im Channel manuell angeben (also 1 und 0). Dann sähe eine passende Rule so aus:

Code: Alles auswählen

// globale Variablen vor der ersten Rule definieren!
var Timer tLichtGarage = null

ule "LichtGarage"
when
    Item Garage_Tuer_Kontakt changed to OPEN
then
    if((SunPosElevation.state as Number).floatValue > 0)
	return;
    Fritz_Steckdose_Garage.sendCommand(ON)
    tLichtGarage?.cancel
    tLichtGarage = createTimer(now.plusSeconds(30), [|
        Fritz_Steckdose_Garage.sendCommand(OFF) 
    ])
end
Punkt 1 wäre hier, dass Itemnamen keine Umlaute enthalten dürfen. Vermeide Teilstrings wie "Neu", denn irgendwann ist der Kontakt nicht mehr neu, sondern alt. Der nächste heißt dann am Ende NeuNeu oder Neu2... Nein, mach das nicht, nimm vernünftige Namen ;)
State als Teilstring des Namens ist auch irgendwie doppelt gemoppelt, denn wenn Du den Status des Items abfragen willst, musst Du noch ein .state anhängen, das wäre dann ..._State.state, irgendwie nicht schön.
Punkt 2 ist die Logik. Die Rule wird ausgelöst. Sollte die Sonne über dem Horizont stehen (Elevation ist positiv), so darf nichts passieren, d.h. die Rule wird umgehend abgebrochen. Natürlich könne man auch umgekehrt arbeiten, aber diese Herangehensweise hat einen entscheidenden Vorteil (hier egal, aber aus Prinzip...), und das ist die Schachtelung von if-Statements. Wenn das if-Statement eine Abbruchbedingung ist, spart man sich die Schachtelung, da die Abarbeitung des Codes einfach beendet werden kann.
Punkt 3: Ich empfehle immer, nur die Methode für die Befehle zu verwenden. Es gibt nur eine Situation, wo man auf die Action zurückgreifen müssen könnte, und das ist, wenn man den Namen des Items "errechnet" hat, also nicht einfach so hinschreiben kann. Spoiler: es gibt immer eine Möglichkeit, auf die Action sendCommand(<Itemname>,<Befehl>) zugunsten der Methode Item.sendCommand(<Befehl>) zu verzichten, es kann nur "umständlich" sein.
Punkt 4: Das Lambda (der Ausdruck zwischen [ und ]) ist Teil des Funktionsaufrufs createTimer(). Man kann das Lambda auch getrennt nach dem Aufruf hinschreiben, es erscheint aber sinnvoller, das Lambda explizit als Parameter zu übergeben, denn so wird klar, dass dieser Codeteil ein Parameter der Funktion ist.
Punkt 5: Es mag pedantisch wirken, aber man sollte immer darauf achten, Timer exakt einmal laufen zu lassen.
Stell Dir vor, Du öffnest die Tür, schließt sie sofort wieder und öffnest sie nach 25 Sekunden erneut (z.B. kurz unterbrochen worden...). Ohne Timer Variable wird das Licht beim ersten Öffnen eingeschaltet und der Timer gestartet. Beim zweiten Öffnen wird das Licht nochmal eingeschaltet, allerdings bleibt das wirkungslos, da das Licht ja schon an ist. Dafür wird der Timer ein zweites Mal angelegt, aber nach 5 Sekunden schaltet der erste Timer das Licht aus. Da Du die Tür noch in der Hand hast, öffnest Du sie und das Licht geht wieder an, nur um wenige Sekunden später durch den zweiten Timer ausgeschaltet zu werden, und dieses Spielt wiederholt sich, bis Du mindestens eine halbe Minute wartest, um die Tür erneut zu öffnen...
Mit der Timer Variable ist es aber kein Problem, einen bereits existierenden Timer abzubrechen, bevor man ihn mit neuer Endezeit erneut anlegt.

Re: Licht nach Sonnenaufgang einschalten

Verfasst: 7. Nov 2025 18:13
von MyHome68
Vielen Dank Euch beiden. Ich werde es morgen mal probieren.

Gruß Daniel