Berechnung von Sunrise / Sunset um einen Tag zeitversetzt

Begonnen von m2th3o, 31 Juli 2013, 22:29:08

Vorheriges Thema - Nächstes Thema

m2th3o

Hallo,

eigentlich habe ich sunset/sunreise gut am laufen und habe kürzlich dann eine Skript-Funktion geschrieben, welche mir - abhängig vom Wochentag - eine unterschiedliche Zeit für das Rolladen hochfahren sendet. Die Funktion sieht folgender Maßen aus:


######## UpTimeRolladen Zeit zum Hochfahren der Rolladen###################
# Aufrufbeschreibung: UpTimeRolladen($)
# $ := Wochenende ($we)
# return: Zeitwert

sub UpTimeRolladen($)
{
  my ($wochenende) = @_;
  if ($wochenende)
  {
    return sprintf(sunrise(0,"09:00","09:15"));
  }
  else
  {
    return sprintf(sunrise(0,"07:00","07:30"));
  }
}

In fhem rufe ich so auf:

define SunRise at *{UpTimeRolladen($we)} set OG_Rollladen auf

Irgendwie wird dieses define jetzt aber immer erst um einen Tag zeitversetzt ausgeführt, wodurch ich die Wochenendschaltung für Sonntags und Montags und nicht für Samstags und Sonntags habe.

Kann ich irgendwie beeinflussen, dass die SunRise-Funktion korrekt berechnet wird? Oder muss ich selbst fuschen, indem ich auf Freitag und Samstag abfrage und dann die Zeit ändere?

Gruß,
Markus



rudolfkoenig

Grund: beim Definition bzw Ausfuehren von at wird deine Routine fuer die Zeitberechnung aufgerufen, um den naechsten Termin zu berechnen. Das ist in deinem Fall normalerweise ein Tag vor der Ausfuehrung es sei denn fhem wird frueh neu gestartet).

Ich wuerde 2x at definieren, und die Pruefung auf Wochenende in die Ausfuehrung verlagern.

m2th3o

Hallo,

wenngleich meine Anfrage schon etwas zurückliegt: Problem habe ich verstanden, Lösung noch nicht ganz ;) Wie würde das mit 2 at's aussehen?

Vielen Dank & Gruß,
Markus

rudolfkoenig

define r_wd at *07:00 { if(!$we) { fhem("set OG_Rollladen auf") } }
define r_we at *09:00 { if($we) { fhem("set OG_Rollladen auf") } }

m2th3o

Hmm okay danke... so könnte ich das machen, wenngleich ich dann auf jeden Fall fixe Zeiten habe. Für diesen Fall egal, aber bei anderen Anwendungen schade.

Kann man nicht eine Neuberechnung der "at"s auf 00:01 jeden Tages legen? Dann ist die $we-Var schon korrekt.

Gruß,
Markus

betateilchen

Zitat von: m2th3o schrieb am Mi, 04 September 2013 22:18Kann man nicht eine Neuberechnung der "at"s auf 00:01 jeden Tages legen?

nichts leichter als das...

attr <atName> alignTime 00:01
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

m2th3o

Hmm. Das wirft mir leider die Fehlermeldung, dass es nur für "relative ats" geht. Meins ist ja mit at *{..} absolut, wenn auch variabel. Ich glaube, dass ich einfach meine Berechnungsfunktion anpasse und auf Fr und Sa abfrage, um die Zeitversetzung rauszubekommen.

Danke allerseits...

betateilchen

Zitat von: m2th3o schrieb am Do, 05 September 2013 13:47dass es nur für "relative ats" geht.

Dann machs doch relative :)

define bla at +*24:00 delete SunRise;; define SunRise at {UpTimeRolladen($we)} set OG_Rollladen auf
attr bla alignTime 00:01


Damit wird ein at "bla" erzeugt, das nächste Nacht um 00:01 Uhr ein at namens "SunRise" generiert, das genau einmal ausgeführt wird.
Und in der nächsten Nacht passiert das gleiche wieder.
Und so weiter...


---
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

m2th3o

Puhh.. Hallo betateilchen,

wir kommen der Sache näher. Ich habe aber deinen code noch nicht so ganz verstanden.

define bla at +*24:00 delete SunRise;; define SunRise at {UpTimeRolladen($we)} set OG_Rollladen auf
attr bla alignTime 00:01


heißt, dass alle 24h SunRise gelöscht und neu angelegt wird.

Was macht denn dann das alignTime noch?

würde nicht reichen:

define RmSunRise at *00:01 delete Sunrise;; define SunRise at {UpTimeRolladen($we)} set OG_Rollladen auf

Vielen Dank & Gruß,
Markus

P.S.: Im MOment könnte ich es wg Wochenende gut testen ;)

betateilchen

Zitat von: m2th3o schrieb am Fr, 06 September 2013 18:49heißt, dass alle 24h SunRise gelöscht und neu angelegt wird.

nur, falls es - aus welchen Gründen auch immer - zu diesem Zeitpunkt noch definiert sein sollte.

Zitat von: m2th3o schrieb am Fr, 06 September 2013 18:49würde nicht reichen:

Ja. Aber nach dem ganzen Krampf, den Du hier betreibst, war ich nicht davon ausgegangen, dass Du mit solch einer einfachen Lösung zufrieden sein könntest.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

picard74

Hallo!

Ich habe nun ein ähnliches Thema, wo ich aktuell wirklich nicht durch sehe!
Ich steuere meine Rollos ebenfalls per Sunrise und möchte nun in diesem Zusammenhang eine Lösung nutzen, die es mir ermöglicht, am WE das Zeit Fenster anders zu setzen als an den Werktagen!
Bei mir sieht es aktuell wie folgt aus:

define OG_Bad_Rollo_runter_ASTRO at *{sunset(0,"16:00","22:00")} set OG_Bad_Rollo off
define OG_Bad_Rollo_hoch_ASTRO at *{sunrise(0,"06:00","09:30")} set OG_Bad_Rollo on


Nun möchte ich aber noch, dass Sonnabend und Sonntag das Rollo zu einer anderen zeit hoch fährt. Kann mir da einer helfen! Vielen Dank

betateilchen

Ja, die Suchfunktion zum Beispiel.

Es gibt in fhem eine Variable $we mit der Du abfragen kannst, ob Wochenende ist oder nicht.
Damit kannst Du in Deinen at Definitionen einfach eine if() Abfrage einbauen und entsprechend reagieren.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Jens_B

#12
define OG_Bad_Rollo_runter_ASTRO_wt at *{sunset(0,"16:00","22:00")} {if (!$we) {fhem ("set OG_Bad_Rollo off"}}

könnte zum Beispiel den Rollladen nur an Wochentagen runterfahren.

define OG_Bad_Rollo_runter_ASTRO_we at *{sunset(0,"17:00","21:00")} {if ($we) {fhem ("set OG_Bad_Rollo off"}}

das hier würde dann an Wochenenden ein anderes "Zeitfenster" nehmen. Allerdings schätze ich, das die Rollladen dadurch das das at ja über sunset genommen wird, trotzdem den großen Teil des Jahres zur selben Zeit runtergehen. Man kann Sunset ja auch einen offset vorgeben (in deinem Fall ist das "0") zum Beispiel am Wochenende +1800 (das wären 30 Minuten nach Sonnenuntergang).


Such mal hier im Forum nach  "Rollladen Zeitsteuerung".
Ich bin sicher da wirst Du fündig.

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax