Seite 1 von 2

Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 15:18
von SRX
Da ich voll auf den Geschmack gekommen bin zum Thema Automatisierung wollte ich ein Regelwerk bauen um zum Sonnenuntergang oder einer eingestellten Zeit in einer Gruppe zusammen gefassten Rolladen schließen

Jetzt bekomme ich nur die Minute und Stunde´von astro_Sonnenuntergang nicht extrahiert

Diese beiden Varianten habe ich schon probiert

var sollMinute = (astro_Sonnenuntergang.state as DateTimeType).getMinuteOfHour()
var sollMinute = astro_Sonnenuntergang.getMinuteOfHour()

now.getMinuteOfHour() funktioniert, also vermute ich das ich hier auf dem verkehrten Weg bin wie ich astro_Sonnenuntergang in ein Datum verwandle

Kann mir jemand hier auch helfen?

Gruß Uwe

Re: Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 15:25
von seppy
Hi,
warum so kompliziert? Schau mal in diesem Beitrag viewtopic.php?p=15796#p15796, da dreht es sich um das Sonnenaufgang/-untergangsthema mit Beispielcode.

Grüße,
Seppy

Re: Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 15:39
von PeterA
Das Astrobinding liefert schon "fertige" items welche bei sonnen auf/untergang triggern.
Damit kannst Du dann arbeiten.
Und im Binding kann man auch offsets einstellen.
Alles ohne Rule

Re: Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 19:41
von SRX
So, ich habe mir eure Ratschläge zu Herzen genommen und das ganze etwas umgebaut

Die Items

Code: Alles auswählen

// Konfiguration Sunset
Switch Sunsetautomatik "Sunset-Automatik an/aus"
Number Sunsetautomatik_zielwert "Schließen auf [%d Prozent]"
Number Sunsetautomatik_Hour "Spätestens um Stunde [%d Uhr]"
Number Sunsetautomatik_Minute "Spätestens um Minute [%d min]"
Sitemap Auszug

Code: Alles auswählen

	Frame label="Sonnenuntergang" icon="attic" {


		Text label="Konfiguration Sonnenuntergang" icon="rollershutter" {
		Frame label="Aktivieren der Automatik Sonnenuntergang" {
		Switch item=Sunsetautomatik

		}
		Frame label="Rollo spätestens runterfahren um ... "{
		Setpoint item=Sunsetautomatik_Hour minValue=0 maxValue=23 step=1
		Setpoint item=Sunsetautomatik_Minute minValue=0 maxValue=59 step=1
		Setpoint item=astro_Sonnenuntergang
		}
    }
	}
Die Rules
IsNight.rules

Code: Alles auswählen

rule "Tag"
when
    Channel "astro:sun:home:rise#event" triggered START
then
    IsNight.postUpdate(OFF)
end

rule "Nacht"
when
    Channel "astro:sun:home:set#event" triggered START
then
    IsNight.postUpdate(ON)
end
Sunsetautomatik.rules

Code: Alles auswählen

import org.joda.time.*
var boolean log = false
rule "Sonnenuntergang Zeit" 

when 
    Time cron "0 * 16-21 * * ?"   // every minute
then
val String logPrefix = 'Sunsetautomatik - '

if (log) logInfo('rules', logPrefix + 'Ich arbeite: ' + now.getHourOfDay() + ':' + now.getMinuteOfHour())
 
	if (Sunsetautomatik.state == ON) {
//	logInfo('rules', logPrefix + 'Setze Variablen für Uhrzeit')
//		var sollStunde = astro_Sonnenuntergang.getHourOfDay()
//		var sollMinute = (astro_Sonnenuntergang.state as DateTimeType).getMinuteOfHour()
//		var sollMinute = astro_Sonnenuntergang.getMinuteOfHour()
		
		if (log) logInfo('rules', logPrefix + 'Prüfe die Uhrzeit für eine Aktion. Nachtstatus: ' + IsNight.state)
// Erst prüfen ob die eingestellte Zeit erreicht wurde
// Die manuelle Uhrzeit nur in der Sommerzeit ausführen
//		if (astro_jahreszeit=='SOMMER'){
			if (Sunsetautomatik_Minute == now.getMinuteOfHour() && Sunsetautomatik_Hour == now.getHourOfDay()) {
			
				if (log) logInfo('rules', logPrefix + 'Fahre Rolladen nach Uhrzeit herunter')
				if (log) logInfo('rules', logPrefix + 'Zeitvergleich: Vorgabe: ' + Sunsetautomatik_Hour + ':' + Sunsetautomatik_Minute + ' Aktuelle Zeit: ' + now.getHourOfDay() + ':' + now.getMinuteOfHour())
				GF_Sunset_Rollo.sendCommand(100)
				IsNight.postUpdate(OFF)
			}
		

			else (IsNight.state == ON) {
		
			if (log) logInfo('rules', logPrefix + 'Fahre Rolladen zum Sonnenuntergang herunter')
			if (log) logInfo('rules', logPrefix + 'Nachtstatus: ' + IsNight.state)
			if (log) logInfo('rules', logPrefix + 'Rolladenposition: ' + F2_MasterBedroom_Shutter.state)


			GF_Sunset_Rollo.sendCommand(100)
			IsNight.postUpdate(OFF)
			}
		
	}
end

Leider ist die Zeit zu spät geworden um zu testen ob die Rolladen runterfahren.
Aber die Logeinträge stimmen (Log war true) und IsNight wird auf OFF gestellt.
Damit will ich verhindern dass das sendcommand jede Minute feuert

Ich werde euch morgen auf dem laufenden halten

Danke erst einmal für euern Input

Gruß Uwe

Re: Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 20:29
von udo1toni
Das ist aber ganz schön von hinten durch die Brust ins Auge...

Warum führst Du eine Rule minütlich aus, die dann doch nur bei einer bestimmten Uhrzeit die Läden fahren soll? Du kannst im Astro Binding verschiedene Events nutzen, von Sonnenauf/untergang über bürgerliche und nautische bis zur astronomischen Dämmerung (entsprechend 0°, -6°, -12° und -18° Sonnenwinkel über Horizont). Für jeden dieser Trigger kannst Du Grenzwerte setzen, also frühestens um x:xx Uhr, spätestens um x:xx Uhr, außerdem kannst Du auch noch einen Offset definieren, also z.B. "12 Minuten vor Sonnenaufgang" oder "17 Minuten nach bürgerlicher Dämmerung".
Dann reicht eine Rule zum Schließen und eine Rule zum Öffnen der Läden.
Wahlweise kann man noch Einschränkungen einbauen, ich habe z.B. eine Wochenendeinschränkung, d.h. die Läden fahren am Wochenende (und an Feiertagen/ während der Ferien) nicht über die frühen Rules. Eine weitere Rule, die um 8:30 triggert fährt die Läden dann auf jeden Fall auf.

Abgesehen davon, auch wenn es verschiedene Codebeispiele mit dem Konstrukt

Code: Alles auswählen

if (log) logInfo(...) 
gibt, so möchte ich darauf hinweisen, dass das am System vorbei programmiert ist. Ich habe das erschöpfend in diesem Post dargelegt :) viewtopic.php?f=8&t=2193&p=10456&hilit=log%3Aset#p10456

Cyrelian hat an anderer Stelle ausführlich gepostet, wie man es richtig macht ;)

Re: Ich bin ja ziemlich umtriebig

Verfasst: 17. Feb 2020 21:49
von SRX
Nun ja, mit den loginfo gebe ich Dir Recht. Allerdings hatte ich das aus einer anderen Regel abgeschaut. Nobody is perfect

Allerdings ist es bei dieser Regel nicht so das sie letztendlich nur zu einer bestimmten Uhrzeit ausgeführt wird.
Die Vorgabe ist:
Fahre die Rolladen herunter wenn Sonnenuntergang ist.
Ausnahme: Wenn die eingestellte Zeit vor Sonnenuntergang ist, dann nimm diese Zeit
Ich habe die Zeiteingabe mittlerweile auf 5 Minuntenschritte eingestellt und die Cronangaben dementsprechend angepasst.
Er läuft damit nur zwischen 16:00 und 21:00 alle 5 Minuten.

Die ganzen Logeinträge waren eher für mich gedacht um zu sehen was geht und nicht.
Dieses verschwindet eh wieder.
Ich werde mir den link separat später einmal genauer ansehen

Re: Ich bin ja ziemlich umtriebig

Verfasst: 18. Feb 2020 09:24
von seppy
Hi,
schau Dir mal diesen Abschnitt der Astro Binding Doku an https://www.openhab.org/addons/bindings ... nel-config.

Ich lasse mal schnell den relevanten Teil übersetzen:
Kanal-Konfiguration
Offsets: Für jede Ereignisgruppe können Sie optional einen Offset in Minuten konfigurieren. Der Offset muss in den Kanaleigenschaften für die entsprechende Sache konfiguriert werden.

Der minimal zulässige Offset ist -1440 und der maximal zulässige Offset ist 1440.

Früheste/späteste: Für jeden Trigger-Kanal und für jeden Start- und Enddatum-Zeitwert können Sie optional die früheste und späteste Zeit des Tages konfigurieren.

z.B. Sonnenuntergang frühestens=18:00, spätestens=20:00

Sonnenuntergang ist 17:40, aber der früheste ist auf 18:00 gesetzt, so dass der Ereignis/Datums-Zeitwert auf 18:00 verschoben wird.

ODER

Der Sonnenuntergang ist 22:10 Uhr, aber der späteste Zeitpunkt ist auf 20:00 Uhr festgelegt, so dass der Ereignis-/Datumswert um 20:00 Uhr verschoben wird.
Damit lässt sich Dein Problem ohne permanente Crons elegant lösen.

Grüße,
Seppy

Re: Ich bin ja ziemlich umtriebig

Verfasst: 18. Feb 2020 14:18
von udo1toni
Was tatsächlich nicht geht, ist, die Zeiten über die normale UI einzustellen. Wenn man das partout haben möchte, muss man das Thing über Paper UI definieren und dort die Zeiten einstellen, oder alternativ mit hohem Aufwand ein Script erstellen, welches das per Paper UI angelegte Thing mittels REST API manipuliert.
Allerdings muss ich aus meiner Erfahrung heraus sagen, dass ich diese Zeiten bisher nicht anfassen musste (nachdem ich einmal die für uns richtigen Zeiten gefunden hatte). Es ist auch kein Parameter, den jeder Anwender (im Haus, also nicht der openHAB Admin, sondern der openHAB DAU) verstellen können sollte, dazu muss man schon verstanden haben, wie der Parameter wirkt.

Re: Ich bin ja ziemlich umtriebig

Verfasst: 18. Feb 2020 14:19
von SRX
Ich bin immer wieder fasziniert was es alles gibt in OpenHab.
Da ich noch Neuling bin versuche ich aus den Beispielen welche ich finde meine Ideen umzusetzen.

Dank Deines Beitrags, Seppy, habe ich die Regel umgebaut

Das Logging habe ich komplett rausgelassen. Das kann ich später immer noch wieder einbauen

Hier nun die Regel: Earlist habe ich auf 16:00 und latest auf 21:00 gesetzt

Code: Alles auswählen

rule "sunsetautomatik" 

when 
	Channel "astro:sun:local:set#end" triggered START
then

	if (Sunsetautomatik.state == ON) {
				GF_Sunset_Rollo.sendCommand(100)

			}
	
end
Nachtrag:
Leider kann ich bei dem Beitrag von Seppy kein "Gefällt mir" drücken

Re: Ich bin ja ziemlich umtriebig

Verfasst: 23. Feb 2020 14:38
von SRX
Ich muss noch einmal eure Hilfe in Anspruch nehmen. Evtl. verstehe ich da was nicht
Ich habe bei Sonnenaufgang ein earlist= 08:00 eingetragen.
In PaperUI zeigt er mir auch korrekt 08:00 an

Nur, der Trigger feuerte heute um 07:35

Hier die Regel, muss ich den Channel anders ansprechen?

Code: Alles auswählen

rule "sunriseautomatik" 

when 

	Channel "astro:sun:local:rise#event" triggered START
then

	if (Sunsetautomatik.state == ON) {
//Sonnenaufgang Automatik Schlafzimmer
				GF_Sunset_Rollo.sendCommand(0)
				Sunriseautomatik_last.postUpdate(now.toString())
//Sonnenaufgang Automatik Esszimmer
	if (Sunriseautomatik_Dinningroom.state ==ON) {
				GF_Dining_Shutter_Right.sendCommand(11)
				GF_Dining_Shutter_Left.sendCommand(6)
	}
			}
	
end