Frage zum Astro Binding

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
thedk
Beiträge: 36
Registriert: 10. Mär 2017 09:25
Answers: 0

Frage zum Astro Binding

Beitrag von thedk »

Hallo Leute,
ich hab mal wieder ein kleineres Problem, bzw. finde ich nicht die richtige Lösung. Ich möchte, dass sich unter einer bestimmten Bedingung und nachdem die Sonne untergangen ist, sich einfach nur ein Licht einschaltet.
Bspw.:

when
Item changed
then
if (Sonne ist untergangen) {
Sendcommand(Licht, ON)
}
end

Das ganze ist natrülich ein bisschen mehr. Nur welches Thing im Astro Binding gibt mir die Info darüber ob die Sonne im Moment untergangen ist? Ich dachte es wäre das: 'astro:sun:local:noon#duration'. Damit funktioniert es aber nicht.
Am liebsten wäre mir ein Thing, das man einfach als Switch angeben könnte.

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25
Answers: 0

Re: Frage zum Astro Binding

Beitrag von alkaline »

Du kannst die Tageszeit bzw. deren Events berechnen und bei den jeweiligen Events ein "ON" oder "OFF" senden:
items:

Code: Alles auswählen

/* Gruppen */
Group gAstro		  	"Astro"					(Whg)  
Group gAstroSonne		"Astro Sonne"			  	// Sonne
Group gAstroDaemmerung  "Astro Dämmerung"		  	// Dämmerung
Group gAstroMond        "Astro Mond"			  	// Mond
Group gAstroJahreszeit  "Astro Jahreszeit"		  	// Jahreszeit
Group gAstroEreignis    "Astro Ereignis"		  	// Ereignisse
Group gAstroSternzeichen "Astro Sternzeichen"	 	// Sternzeichen
Group gNAstro			"Astro Sonstiges"			

/* ----------- Astro ---------------------- */
//
DateTime    CurrentTime     "Datum [%1$tA,%1$td.%1$tm.%1$tY]"                       <clock>  (gAstro) { channel="ntp:ntp:local:dateTime" }
DateTime    SunriseStart_Time      "Sonnenaufgang [%1$tH:%1$tM Uhr]"                        <sunrise>    (gAstro,gAstroSonne) { channel="astro:sun:home:rise#start" }
DateTime    SunriseSet_Time       "Sonnenuntergang [%1$tH:%1$tM Uhr]"                      <sunset>    (gAstro,gAstroSonne) { channel="astro:sun:home:set#start" }
//
Switch      Night_State          "Nacht"                                                           (gNAstro)
//DateTime    NightStartTime      "Nacht Beginn [%1$tH:%1$tM Uhr]"                    <moon>      (gAstro) { channel="astro:sun:home:night#start" }
//DateTime    NightEndTime        "Nacht Ende [%1$tH:%1$tM Uhr]"                      <moon>      (gAstro) { channel="astro:sun:home:night#end" }
//
String      Season_Name          "Aktuelle Jahreszeit [MAP(astro.map):%s]"     <jahreszeit>            (gAstro,gAstroJahreszeit) { channel="astro:sun:home:season#name" }
DateTime Jahreszeit_Fruehjahr   "Frühlingsbeginn [%1$td.%1$tm.%1$tY %1$tH:%1$tM]"    <fruehling>    (gAstro, gAstroJahreszeit)      {channel="astro:sun:home:season#spring"}
DateTime Jahreszeit_Sommer      "Sommerbeginn [%1$td.%1$tm.%1$tY %1$tH:%1$tM]"  <sommer> (gAstro,gAstroJahreszeit)      {channel="astro:sun:home:season#summer"}
DateTime Jahreszeit_Herbst      "Herbstbeginn [%1$td.%1$tm.%1$tY %1$tH:%1$tM]"  <herbst> (gAstro,gAstroJahreszeit)      {channel="astro:sun:home:season#autumn"}
DateTime Jahreszeit_Winter      "Winterbeginn [%1$td.%1$tm.%1$tY %1$tH:%1$tM]" <winter>  (gAstro,gAstroJahreszeit)      {channel="astro:sun:home:season#winter"}
String      Zodiac_Sign          "Tierkreiszeichen [MAP(astro.map):%s]"                   <zodiac> (gAstroSternzeichen) { channel="astro:sun:home:zodiac#sign" }
Number      Sun_Elevation        "Sonnenhöhe [%.1f °]"                                    <sun>    (gAstroSonne) { channel="astro:sun:home:position#elevation" }
Number      Moon_Elevation       "Mondhöhe [%.1f °]"                                      <moon>   (gAstroMond) { channel="astro:moon:home:position#elevation" }
String      Moon_Phase           "Mondphase [MAP(astro.map):%s]"                          <moon>   (gAstro,gAstroMond) { channel="astro:moon:home:phase#name" }
DateTime    Moon_Next_Full       "Nächster Vollmond [%1$td.%1$tm.%1$tY, %1$tH:%1$tM Uhr]" <moon>   (gAstroMond) { channel="astro:moon:home:phase#full" }
DateTime    Moon_Next_New        "Nächster Neumond [%1$td.%1$tm.%1$tY, %1$tH:%1$tM Uhr]"  <moon>   (gAstroMond) { channel="astro:moon:home:phase#new" }

//
String TimePeriodOfDay "Tageszeit [MAP(astro.map):%s]" (gNAstro)

//
DateTime DawnStart_Time             "Morgendämmerung Beginn[%1$tH:%1$tM]"             (gAstroDaemmerung) { channel="astro:sun:home:civilDawn#start" }
DateTime DawnStop_Time              "Morgendämmerung Ende[%1$tH:%1$tM]"              (gAstroDaemmerung) { channel="astro:sun:home:civilDawn#end" }
DateTime DayStart_Time              "Tag Beginn [%1$tH:%1$tM]"              		(gNAstro) { channel="astro:sun:home:daylight#start" }
DateTime DayStop_Time               "Tag Ende [%1$tH:%1$tM]"               			(gNAstro) { channel="astro:sun:home:daylight#end" }
DateTime DuskStart_Time             "Abenddämmerung Beginn [%1$tH:%1$tM]"      <moon>     (gAstro,gAstroDaemmerung)	{ channel="astro:sun:home:civilDusk#start" }
DateTime DuskStop_Time              "Abenddämmerung Ende [%1$tH:%1$tM]"              (gAstroDaemmerung) { channel="astro:sun:home:civilDusk#end" }
DateTime NightStart_Time            "Nacht Beginn[%1$tH:%1$tM]"            	<moon>		(gAstro) { channel="astro:sun:home:night#start" }
DateTime NightStop_Time             "Nacht Ende[%1$tH:%1$tM]"              			(gNAstro) { channel="astro:sun:home:night#end" }
DateTime MorningNightStart_Time     "Nacht/Morgen Beginn [%1$tH:%1$tM]"      		(gNAstro)	{ channel="astro:sun:home:morningNight#start" }
DateTime MorningNightStop_Time      "Nacht/Morgen Ende [%1$tH:%1$tM]"       		(gNAstro) { channel="astro:sun:home:morningNight#end" }
DateTime EveningNightStart_Time     "Abend/Nacht Beginn [%1$tH:%1$tM]"      		(gNAstro) { channel="astro:sun:home:eveningNight#start" }
DateTime EveningNightStop_Time      "Abend/Nacht Ende [%1$tH:%1$tM]"       			(gNAstro)	{ channel="astro:sun:home:eveningNight#end" }

// Events
Switch DawnStart_Event              "Start of Dawn Event"	(gAstroEreignis)
Switch DayStart_Event               "Start of Day Event"    (gAstroEreignis)                     
Switch DuskStart_Event              "Start of Dusk Event"    (gAstroEreignis)                        
Switch NightStart_Event             "Start of Night Event"   (gAstroEreignis)
Switch SunriseStart_Event           "Start of Sunrise Event" (gAstroEreignis)
Switch SunsetStart_Event          	"Start of Sunset Event" (gAstroEreignis)

// Items
Switch Dawn                         "Dawn [%s]"                             // After Dawn and before Day
Switch Day                          "Day [%s]"                              // After Day and before Dusk
Switch Dusk                         "Dusk [%s]"                             // After Dusk and before Night
Switch Night                        "Night [%s]"                            // After Night and before Dawn


/* EXAMPLE
 * https://community.openhab.org/t/explanation-of-eveningnight-and-morningnight/2194
 *
 * MorningNight_Start   00:00
 * MorningNight_Stop    04:00
 * Night_Stop           05:02
 * AstroDawn_Start      05:00
 * AstroDawn_Stop       05:45
 * NauticDawn_Start     05:45
 * NauticDawn_Stop      06:27
 * CivilDawn_Start      06:27
 * CivilDawn_Stop       07:02
 * Sunrise_Start        07:02
 * Sunrise_Stop         07:06
 * Daylight_Start       07:06
 * Noon_Start           13:17
 * Noon_Stop            13:18
 * Daylight_Stop        19:27
 * Sunset_Start         19:27
 * Sunset_Stop          19:31
 * CivilDusk_Start      19:31
 * CivilDusk_Stop       20:06
 * NauticDusk_Start     20:06
 * NauticDusk_Stop      20:48
 * AstroDusk_Start      20:48
 * AstroDusk_Stop       21:33
 * Night_Start          21:33
 * EveningNight_Start   21:33
 * EveningNight_Stop    00:00
 */
rules:

Code: Alles auswählen

import java.util.Date

// Time of Day Rules
// Requires time update every 60 seconds

val String RFN = "time-of-day.rules"

rule "Get time period for right now"
when
    System started
then
    val now = new Date()
    val dawn = new Date((DawnStart_Time.state as DateTimeType).calendar.timeInMillis)
    val day = new Date((DayStart_Time.state as DateTimeType).calendar.timeInMillis)
    val dusk = new Date((DuskStart_Time.state as DateTimeType).calendar.timeInMillis)
    val night = new Date((NightStart_Time.state as DateTimeType).calendar.timeInMillis)

    val String initStr = "Initializing time period. The time of day is "
	
	Thread::sleep(30000)
	
    if(now.after(dawn) && now.before(day)) {
        logInfo(RFN, initStr + "Dawn: " + now)
        Dawn.sendCommand(ON)
        Day.sendCommand(OFF)
        Dusk.sendCommand(OFF)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Dawn")
    }
    else if(now.after(day) && now.before(dusk)) {
        logInfo(RFN, initStr + "Day: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(ON)
        Dusk.sendCommand(OFF)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Day")
    }
    else if(now.after(dusk) && now.before(night)) {
        logInfo(RFN, initStr + "Dusk: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(OFF)
        Dusk.sendCommand(ON)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Dusk")
    }
    else {
        logInfo(RFN, initStr + "Night: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(OFF)
        Dusk.sendCommand(OFF)
        Night.sendCommand(ON)
        TimePeriodOfDay.postUpdate("Night")
    }
end

rule "Generate Time of Day Events"
when
    Item CurrentTime received update
then
    val now = new Date()
    val dawn = new Date((DawnStart_Time.state as DateTimeType).calendar.timeInMillis)
    val day = new Date((DayStart_Time.state as DateTimeType).calendar.timeInMillis)
    val dusk = new Date((DuskStart_Time.state as DateTimeType).calendar.timeInMillis)
    val night = new Date((NightStart_Time.state as DateTimeType).calendar.timeInMillis)
    val sunset = new Date((SunriseSet_Time.state as DateTimeType).calendar.timeInMillis)
    val sunrise = new Date((SunriseStart_Time.state as DateTimeType).calendar.timeInMillis)

    if((now.getTime-(now.getTime%60000)) == (dawn.getTime-(dawn.getTime%60000))) {
        logInfo(RFN, "Übergang zur Dämmerung")
        DawnStart_Event.postUpdate(ON)
    }
    else if((now.getTime-(now.getTime%60000)) == (day.getTime-(day.getTime%60000))) {
        logInfo(RFN, "Beginn der Morgendämmerung")
        DayStart_Event.postUpdate(ON)
    }
    else if((now.getTime-(now.getTime%60000)) == (dusk.getTime-(dusk.getTime%60000))) {
        logInfo(RFN, "Es wird Tag")
        DuskStart_Event.postUpdate(ON)
    }
    else if((now.getTime-(now.getTime%60000)) == (night.getTime-(night.getTime%60000))) {
        logInfo(RFN, "Es wird Nacht")
        NightStart_Event.postUpdate(ON)
    }

    if((now.getTime-(now.getTime%60000)) == (sunrise.getTime-(sunrise.getTime%60000))) {
        logInfo(RFN, "Sonnenaufgang")
        SunriseStart_Event.postUpdate(ON)
    }
    else if((now.getTime-(now.getTime%60000)) == (sunset.getTime-(sunset.getTime%60000))) {
        logInfo(RFN, "Sonnenuntergang")
        SunsetStart_Event.postUpdate(ON)
    }
end

rule "Dawn Started"
when
    Item DawnStart_Event received update ON
then
    val now = new Date()
    val dawn = new Date((DawnStart_Time.state as DateTimeType).calendar.timeInMillis)
    val day = new Date((DayStart_Time.state as DateTimeType).calendar.timeInMillis)

    if(now.after(dawn) && now.before(day)) {
        logInfo(RFN, "Start Morgendämmerung: " + now)
        Dawn.sendCommand(ON)
        Day.sendCommand(OFF)
        Dusk.sendCommand(OFF)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Dawn")
    }
end

rule "Day Started"
when
    Item DayStart_Event received update ON
then
    val now = new Date()
    val day = new Date((DayStart_Time.state as DateTimeType).calendar.timeInMillis)
    val dusk = new Date((DuskStart_Time.state as DateTimeType).calendar.timeInMillis)

    if(now.after(day) && now.before(dusk)) {
        logInfo(RFN, "Es ist Tag: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(ON)
        Dusk.sendCommand(OFF)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Day")
    }
end

rule "Dusk started"
when
    Item DuskStart_Event received update ON
then
    val now = new Date()
    val dusk = new Date((DuskStart_Time.state as DateTimeType).calendar.timeInMillis)
    val night = new Date((NightStart_Time.state as DateTimeType).calendar.timeInMillis)

    if(now.after(dusk) && now.before(night)) {
        logInfo(RFN, "Start Abenddämmerung: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(OFF)
        Dusk.sendCommand(ON)
        Night.sendCommand(OFF)
        TimePeriodOfDay.postUpdate("Dusk")
    }
end

rule "Night started"
when
    Item NightStart_Event received update ON
then
    val now = new Date()
    val morningNightStart = new Date((MorningNightStart_Time.state as DateTimeType).calendar.timeInMillis)
    val morningNightStop = new Date((MorningNightStop_Time.state as DateTimeType).calendar.timeInMillis)
    val eveningNightStart = new Date((EveningNightStart_Time.state as DateTimeType).calendar.timeInMillis)
    val eveningNightStop = new Date((EveningNightStop_Time.state as DateTimeType).calendar.timeInMillis)

    if((now.after(morningNightStart) && now.before(morningNightStop)) || 
       (now.after(eveningNightStart) && now.before(eveningNightStop))) {
        logInfo(RFN, "Es ist Nacht: " + now)
        Dawn.sendCommand(OFF)
        Day.sendCommand(OFF)
        Dusk.sendCommand(OFF)
        Night.sendCommand(ON)
        TimePeriodOfDay.postUpdate("Night")
    }
end

rule "Sunrise started"
when
    Item SunriseStart_Event received update ON
then
    val now = new Date()
    logInfo(RFN, "Sonnenaufgang: " + now)
end

rule "Sunset started"
when
    Item SunsetStart_Event received update ON
then
    val now = new Date()
    logInfo(RFN, "Sonnenuntergang: " + now)
end
map: siehe Datei

Hinweis: Die Rule bringt bei Start des Systems einen Fehler, weil die Daten noch nicht eingelesen wurde.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25
Answers: 0

Re: Frage zum Astro Binding

Beitrag von alkaline »

Die oben stehende Konfig verrichtet bei mir seit 2-3 Monaten ihren Dienst. Habe aber gesehen, das es durchaus noch Potential gibt, siehe https://community.openhab.org/t/design- ... -day/15407

thedk
Beiträge: 36
Registriert: 10. Mär 2017 09:25
Answers: 0

Re: Frage zum Astro Binding

Beitrag von thedk »

Danke für die Antwort.

Die Lösung scheint ja doch komplizierter zu sein als ich dachte, das muss ich mir in Ruhe zu gemüte führen ^^

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Frage zum Astro Binding

Beitrag von seppy »

Hi thedk,

ich habe das etwas einfacher gelöst. Ich nutze aber noch das Legacy Binding, weil ich keine Lust bisher auf die Migration nach 2 hatte :-P.
Hier die etwas gekürzte Variante.

Ich habe die folgenden Items definiert:

Code: Alles auswählen

// 30 Minuten vor Sonnenuntergang
Switch Is30BeforeSunset
	(gAstro) 
	//{channel="astro:sun:heidewegIs30BeforeSunset:rise#event"}
	{astro="planet=sun, type=set, property=end, offset=-30"} 

Switch SunsetStarts 
	"Sonnenuntergang beginnt"
	(gAstro)

Switch SunriseEnds 
	"Sonnenaufgang endet"
	(gAstro)
Und die passende Regel dazu:

Code: Alles auswählen

/**
  * Beginn des Sonnenuntergangs aktivieren
  */
  rule "SunsetStarts"
 when
 	Item Is30BeforeSunset changed to ON
 then
 	SunsetStarts.sendCommand(ON)
	SunriseEnds.sendCommand(OFF)
	logInfo("Homebox.SystemRules:SunsetStarts", "Daylight: Sonnenuntergang beginnt (SunsetStarts: ON)")
 end
 
Und auf die entsprechenden Schalter reagiere ich dann beispielsweise für die Lichtsteuerung:

Code: Alles auswählen

/**
 * Gartenbeleuchtung mit Sonnenunter/-aufgang anschalten
 * 
 * 60 Min vor Sonnenuntergang
 * 60 Min vor Sonnenaufgang, aber nicht vor 7.00 Uhr
 */
rule "Astro_Gardenlights_On"
when
   	Item SunsetStarts received command or
   	Item SunriseStarts received command
then
	if (receivedCommand == ON){
		logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "60 Minuten vor Sonnenuntergang/-aufgang --> Beleuchtung einschalten")
		//Beleuchtung Terrasse
		if (AussenTerrasseBeleuchtung.state == OFF){
			AussenTerrasseBeleuchtung.sendCommand(ON)
			logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "--> AussenTerrasseBeleuchtung geschaltet (ON)")
		}
		//Beleuchtung Hauswand
		if (AussenGartenHauswandBeleuchtung.state == OFF){
			AussenGartenHauswandBeleuchtung.sendCommand(ON)	
			logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "--> AussenGartenHauswandBeleuchtung geschaltet (ON)")
		}
		//Beleuchtung Balkon Wohnzimmer
		if (AussenBalkonWZBeleuchtungState.state == OFF){
			AussenBalkonWZBeleuchtungState.sendCommand(ON)
			logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "--> AussenBalkonWZBeleuchtungState geschaltet (ON)")
		}
		//Beleuchtung Vorgarten
		if (AussenVorgartenBeleuchtungState.state == OFF){
			AussenVorgartenBeleuchtungState.sendCommand(ON)
			logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "--> AussenVorgartenBeleuchtungState geschaltet (ON)")
		}
		
		// Weihnachtsbeleuchtung aktivieren, wenn Weihnachtszeit
		if (GlobalChristmasPeriod.state == ON) {
			AussenTerrasseSteckdosen.sendCommand(ON)
			logInfo("Homebox.GardenRules:Astro_Gardenlights_On", "Weihnachtszeit! --> AussenTerrasseSteckdosen geschaltet (ON)")
		}
	} 
end
Vielleicht kommst Du damit weiter?!

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Antworten