Seite 1 von 3

[SOLVED)Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 16. Dez 2021 18:29
von Boris099
Pi4, OH 2.5.12
Ich habe bisher das Astro Bindung nicht verwendet, da ich im Haus einige PIRs mit Luminance Sensor besitze,
und bisher damit meine Schaltlogik gesteuert habe.
Nun habe ich mir ein neues Spielzeug eingerichtet, das ist ein Reed-Kontakt im Außenbereich am Tor, womit ich abhängig
von Tor Auf/Zu die Beleuchtung in der Einfahrt steuern möchte. Also ich denke ich brauche das Astro Binding,
um das Licht auch nur zu Schalten wenn es Dunkel ist.
OK, Binding ist installiert und das Thing ist auch da - und nun erschlägt es mich mit Channels :D
Meine Güte ich wusste gar nicht wie viele Arten von Sonnenuntergängen existieren, ich dachte es gibt nur einen, Pffff
Unabhängig davon kann ich mir nicht vorstellen welchen Channel ich hier für meine Zweck sinnvoll anwende,
und wie ich das in das Rule einbaue, Könnt ihr mir weiterhelfen?

Meine Location ist gesetzt und ich bekomme die entsprechenden Daten angezeigt
Bild_2021-12-16_181622.png
Ich habe das Rule schon mal gebaut, halt jetzt noch ohne Sonnenuntergang-Abhängigkeit.
Ich denke ich muss den Sonnenuntergang mit Offset (also wenn es wirklich dunkel wird, der nautische Wert sieht ja schon ganz gut aus)
verwenden und dann die Gültigkeit mit dem Sonnenaufgang mit Offset beenden oder etwa ganz anders?
Habt ihr hier einen Tipp wie das aussehen sollte?
Nehme ich da einfach z.B. astro:sun:local:nauticDusk#start und astro:sun:local:nauticDawn#start
aber wie lese ich nur die Uhrzeit als Trigger, brauche ja kein Datum und wie baue ich dann evtl. noch ein Offset ein?

Das ist das momentane Rule

Code: Alles auswählen

// Globale Variablen
var Timer Einfahrt_Timer = null                                              
// Globale Konstanten
val Integer Einfahrt_TimeOut = 300                                           

rule "Einfahrt_Licht"
when
        Item DW2_TOR received update ON
then
        Einfahrt_Timer?.cancel                                               
        if(Lampe_Einfahrt != ON) {                                           
        Lampe_Einfahrt.sendCommand(ON)
        }
        if(LED_Nachbar != ON) {
        LED_Nachbar.sendCommand(ON)
        }
        Einfahrt_Timer = createTimer(now.plusSeconds(Einfahrt_TimeOut), [|   
        Lampe_Einfahrt.sendCommand(OFF)                                      
        LED_Nachbar.sendCommand(OFF)
        ])
end

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 16. Dez 2021 20:49
von udo1toni
Thema Sonnenuntergang/Sonnenaufgang und die verschiedenen Werte:

Sonnen auf/Untergang ist definiert als der Zeitpunkt, wenn die Sonne die 0° Höhenlinie kreuzt.
Die Bürgerliche Dämmerung ist beim kreuzen der -6° Höhenlinie erreicht.
Die Nautische Dämmerung findet bei -12°Höhe statt.
Die astronomische Dämmerung ist bei -18° Höhe erreicht.
Da es sich bei der Sonne nicht um einen unendlich kleinen Punkt handelt, gibt es einen definierten Zeitpunkt, zu dem die Sonne beginnt, die jeweilige Höhenlinie zu berühren und einen Zeitpunkt, an dem sie damit aufhört. Diese beiden Zeitpunkte werden als Beginn und Ende des jeweiligen Ereignisses definiert.
Die DateTime Channel liefern die Zeitpunkte als Zeitstempel. Zusätzlich gibt es noch die Range Event Channel, welche das Ereignis START und END liefern, wenn die jeweiligen Zeitpunkte erreicht werden.

Weiterhin kannst Du in jedem Channel komplett unabhängig vom Rest jeweils drei Werte setzen, das sind die Grenzwerte earliest und latest (frühester Zeitpunkt, spätester Zeitpunkt) sowie offset (Versatz zum tatsächlichen Zeitpunkt in Minuten, negative Werte -> früher als real, positive Werte -> später als real).

Du willst Dich überhaupt nicht mit Uhrzeit oder Datum herum schlagen! Du möchtest ein Item, welches zu einem variablen Zeitpunkt von Tag auf Nacht umschaltet und umgekehrt. Welche der möglichen Trigger Du dafür verwendest, bleibt Dir überlassen. Grundsätzlich sieht das aber so aus:

Code: Alles auswählen

rule "Tag"
when
    Channel "astro:sun:local:civilDawn#event" triggered START
then
    Nacht.postUpdate(OFF)
end

rule "Nacht"
when
    Channel "astro:sun:local:nauticDusk#event" triggered START
then
    Nacht.postUpdate(ON)
end
Nun hast Du ein Item Nacht, welches nachts ON ist und tagsüber OFF. Dieses kannst Du bequem in Deiner Rule abfragen.

Wenn die Zeit um einige Minuten nicht passt,. kannst Du im jeweiligen Range Event Channel den Offset setzen. die Zeitanzeigen bleiben davon unberührt. Sollen die Zeiten mit Offset angezeigt werden, musst Du den Offset auch in den betreffenden DateTime Channeln eintragen.


EDIT: Tippfehler in der Rule, Trigger muss mit einem großen C geschrieben werde...

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 16. Dez 2021 22:08
von Boris099
Ok Super, das klingt cool.
Hast du aus einem bestimmten Grund einmal civil und einmal nautic genommen oder nur Zufall?
Und im Channel direkt, d.h. in paperui stelle ich einen eventuellen Offset ein, muss ich gleich checken bin gerade noch unterwegs.
Danke dir

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 16. Dez 2021 22:48
von Snatsch
sind 2 verschiedene Sachen z.B. Bürgerliche Dämmerung und Nautische Morgendämmerung.

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 16. Dez 2021 23:04
von udo1toni
Boris099 hat geschrieben: 16. Dez 2021 22:08 Hast du aus einem bestimmten Grund einmal civil und einmal nautic genommen oder nur Zufall?
Die Idee war, zu zeigen, dass es wurscht ist, welche Events Du nutzt.

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 17. Dez 2021 10:10
von Boris099
Also "Nacht" habe ich nun hinein montiert, cool ist ja dass man so einfach mit diesen Rules (dein Beispiel) ein Item erstellt, war mir nicht bewusst.
Jetzt fehlt mir noch eine Feinheit, wobei ich nicht weiß wie man das ausdrückt... wenn die Lampen vorher schon an waren, dann sollen sie auch
mit dem Timer "nicht" ausgeschaltet werden. Wahrscheinlich irgendwie mit dem state, oder?
Das Rule sieht momentan wie folgt aus:

Code: Alles auswählen

// Globale Variablen
var Timer Einfahrt_Timer = null

// Globale Konstanten
val Integer Einfahrt_TimeOut = 300

rule "Einfahrt_Licht"
when
        Item DW2_TOR received update ON
then
        if(Nacht != OFF) {
                Einfahrt_Timer?.cancel
                if(Lampe_Einfahrt != ON) {
                Lampe_Einfahrt.sendCommand(ON)
                }
                if(LED_Nachbar != ON) {
                LED_Nachbar.sendCommand(ON)
                }
                if(Lampe_Kandelaber != ON) {
                Lampe_Kandelaber.sendCommand(ON)
                }
                Einfahrt_Timer = createTimer(now.plusSeconds(Einfahrt_TimeOut), [|
                Lampe_Einfahrt.sendCommand(OFF)
                LED_Nachbar.sendCommand(OFF)
                ])
        }
end

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 17. Dez 2021 10:41
von OliverCJ
Moin!

Mag sein, dass da irgendwas an mir vorbeigegangen ist, aber eine rule erstellt normalerweise kein Item selbstständig. Das musst Du vorher schon definieren (hier wird dann gerne mal der Begriff "Dummy-item" verwendet, weil es nicht an einen channel eines thing gebunden ist. Korrekter wäre daher wohl "ungebundenes item"). Hier wäre es also ein item vom Typ Switch, welches Du dann in einer rule ON oder OFF schalten kannst.

Aber wie gesagt, vielleicht habe ich da auch was verpasst und es funktioniert tatsächlich, dass eine rule ein item erstellt... ???

Was die rule angeht, versuch mal

Code: Alles auswählen

...
if(Lampe_Einfahrt.state == OFF) {
Lampe_Einfahrt.sendCommand(ON)
}
...
Auch bei den anderen If-Abfragen, immer auf .state abfragen, dann sollte das gehen..

Oliver

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 17. Dez 2021 10:51
von Boris099
Hi Oliver,
Udo hatte oben ein separates rule als Beispiel gezeigt (auch hier unten nochmal), und damit wird das Item "Nacht" erstellt.
Ich habe das genauso auch erstellt und in meinem anderen Rule verwendet, das hat OH ohne Meckern aktzeptiert,
gehe davon aus das funktioniert, denn gerade jetzt ist die "Nacht" OFF und die Lampen bleiben aus, cool!
Aber meine Frage war ja genau andersrum, ich bekomme die Lampen ja an, und frage auch, ob sie an waren, aber ich möchte halt die Lampen ON lassen, wenn sie vorher schon evtl. manuell angeschaltet waren. Also der Timer soll diese Lampen dann nicht anfassen.

Das ist das rule für das "Nacht" item.

Code: Alles auswählen

rule "Tag"
when
    channel "astro:sun:local:civilDawn#event" triggered START
then
    Nacht.postUpdate(OFF)
end

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 17. Dez 2021 18:33
von Boris099
Kurzer Nachtrag es braucht doch den Dummy-Switch, also einfach den Eintrag "Switch Nacht" in der Items Datei -> und läuft:-)

Jetzt bleib nur noch mein Problem wie oben schon gefragt, wie hindere ich den Timer diese Lampen auszuschalten, die vorher manuell schon ON waren?

Re: Astro Bindung - Wie setze ich das denn nun ein?

Verfasst: 17. Dez 2021 19:10
von int5749
Boris099 hat geschrieben: 17. Dez 2021 10:51 Udo hatte oben ein separates rule als Beispiel gezeigt (auch hier unten nochmal), und damit wird das Item "Nacht" erstellt.
Also Items werden ausschließlich in einer Item-Datei oder über die Main UI erstellt. Aus einer Rule herause funktioniert dies nicht!
Boris099 hat geschrieben: 17. Dez 2021 10:51 Ich habe das genauso auch erstellt und in meinem anderen Rule verwendet, das hat OH ohne Meckern aktzeptiert,
Hier lege ich Die Visual Studio Code ans Herz. Mit dem OH AddOn hast Du neben einer Codeprüfung auch die Möglichkeit Items direkt von den Channels heraus zu erstellten => Hier dann übrigens in eine .Items Datei.
Boris099 hat geschrieben: 17. Dez 2021 10:51 gehe davon aus das funktioniert, denn gerade jetzt ist die "Nacht" OFF und die Lampen bleiben aus, cool!
Nun ja, dass dies nicht funktioniert hat, zeigte ja Dein nächster Post ;-)
Boris099 hat geschrieben: 17. Dez 2021 10:51 Aber meine Frage war ja genau andersrum, ich bekomme die Lampen ja an, und frage auch, ob sie an waren, aber ich möchte halt die Lampen ON lassen, wenn sie vorher schon evtl. manuell angeschaltet waren. Also der Timer soll diese Lampen dann nicht anfassen.
Hier muss Du noch für Dich entscheiden, ob eine der beiden Lampen die andere beeinflussen kann oder jede einzeln reagieren soll? Wenn einzeln, braucht es 2 Timer.

Beispiel

Code: Alles auswählen

if (Lampe_Einfahrt.state != ON) {
    Lampe_Einfahrt.sendCommand(ON)
    Einfahrt_Timer = createTimer(now.plusSeconds(Einfahrt_TimeOut), [|
    Lampe_Einfahrt.sendCommand(OFF)
    ])
}
Natürlich darf die dann oben in der Rule nicht mehr geschaltet sein.