FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: efyzz am 14 Februar 2017, 22:42:39

Titel: Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 14 Februar 2017, 22:42:39
Nabend,

ich möchte gern meine Aquariumbeleuchtung entsprechend der realen Tagesdauer in unseren Breitengraden schalten. Dabei soll die Beleuchtung aber immer um 22:00 Uhr aus gehen, dafür jedoch variabel, entsprechend der realen Tagesdauer, einschalten. Sodass die Beleuchtungsdauer der tatsächlichen Tageslänge entspricht.

Ich bräuchte also sowas wie:
define AquariumOn at *{22:00:00-(sunset()-sunrise())} set AquariumLamp on

Könnte mir bitte jemand den Ausdruck hinter at in eine ordentliche Syntax übersetzen?

Vielen Dank!
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: KernSani am 14 Februar 2017, 23:04:12
Schau dir mal die commandref zu EL_SUNRISE (https://fhem.de/commandref.html#SUNRISE_EL) genau an, da findest du die entsprechende Info, wie du die Lampe einschaltest. Zum ausschalten brauchst du ein weiteres at, oder - falls deine Lampe es unterstützt, nutzt du on-till.

Grüße,

Oli
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 15 Februar 2017, 13:39:29
Moin,

danke für den Hinweis, aber da liegt nicht mein Problem. Das mit der Schalterei kriege ich schon irgendwie hingefummelt.

Mein Problem ist die Berechnung der Uhrzeiten. Zunächst brauche ich die Länge eines Tages:
sunset - sunrise

Und diese müsste ich dann von meiner Abschaltzeit (22:00 Uhr) abziehen, um die Einschaltzeit zu erhalten:
Einschaltzeit = 22:00 - (sunset - sunrise)

Dabei kriege ich nur Murks raus, weil ich einfach nicht weiß, wie die Syntax dafür genau aussehen müsste. Leider helfen mir die Beispiele in der Commandref dabei auch nicht weiter  :(

Nochmal ein Beispiel:
Sunrise = 8:00 Uhr
Sunset = 21:00 Uhr
-> Tageslänge = Sunset - Sunrise = 13 Stunden
-> Einschaltzeit = Abschaltzeit - Tageslänge = 22:00 Uhr - 13 Stunden = 9:00 Uhr
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: betateilchen am 15 Februar 2017, 13:51:49
Zitat von: efyzz am 15 Februar 2017, 13:39:29
Dabei kriege ich nur Murks raus, weil

weil Dein Denkansatz Murks ist.

FHEM kennt keine Uhrzeiten im Stunden/Minuten/Sekunden-Format, sondern nur absolute Zeitstempel, aus denen für die Anzeige eine für Menschen lesbare Darstellung zusammengefrickelt wird.

sunrise_abs() und sunset_abs() sollten Dir weiterhelfen, damit kann man absolute Zeitstempel ermitteln.
Ebenso kannst Du Deine Uhrzeit 22:00 Uhr in einen solchen Zeitstempel umrechnen.

Zeitstempel(22:00) - sunset_abs() + sunrise_abs() = Zeitstempel(Einschaltzeit)
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Thorsten Pferdekaemper am 15 Februar 2017, 13:58:45
Zitat von: efyzz am 14 Februar 2017, 22:42:39ich möchte gern meine Aquariumbeleuchtung entsprechend der realen Tagesdauer in unseren Breitengraden schalten.
Hast Du auch Fische aus unseren Breitengraden? Das wäre ungewöhnlich. Normalerweise hat man ja was tropisches und da sind die Tageslängen ja eher fast konstant. Außerdem mögen es die Fische meistens gar nicht so hell, außer vielleicht bei Tanganjika/Malawisee-Cichliden.
Was auch noch zu bedenken ist: Die meisten Wasserpflanzen stammen von tropischen Landpflanzen ab, d.h. sie funktionieren am besten, wenn es zur Mittagszeit ein Gewitter gibt, also man das Licht mal für 2 Stunden abschaltet. Algen andererseits kommen aus dem Meer, wo es immer hell ist. Sie mögen Dauerlicht...
Sorry, ich konnte nicht anders als mein altes Aquarienwissen zum Besten zu geben.
Gruß,
   Thorsten
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: igami am 15 Februar 2017, 14:19:07
Tageslänge habe ich hier (Globalstrahlung / Sonnenschein-vorhersage (https://forum.fhem.de/index.php/topic,21971.msg566413.html#msg566413)) mal berechnet
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: rudolfkoenig am 15 Februar 2017, 14:40:41
define AquariumOn at *{sunrise()} set AquariumLamp on-till {sunset(0,"00:00","22:00")}
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: betateilchen am 15 Februar 2017, 14:53:24
Rudi, das Licht soll nicht zum Sonnenaufgang eingeschaltet werden ;)
Dafür aber immer um 22 Uhr aus.
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: rudolfkoenig am 15 Februar 2017, 15:22:34
Ach so. Abendunterhaltung, aber die Fische sollen es nicht merken.
Na dann:
define AquariumOn at *{f67133()} set AquariumLamp on-till 22:00
mit f67133 in 99_myUtils.pm:
sub
f67133()
{
  FmtTime( time_str2num("2017-01-01 22:00:00")-
          (time_str2num("2017-01-01 ".sunset_abs())-
           time_str2num("2017-01-01 ".sunrise_abs())));
}       

Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 15 Februar 2017, 16:38:38
Ah ja, jetzt wird's interessant!
Ich werde jetzt eine Weile brauchen, um die Tipps zu testen und zu verstehen ... dann melde ich mich wieder.
Vielen Dank für eure Hilfe!

Zitat von: Thorsten Pferdekaemper am 15 Februar 2017, 13:58:45
Hast Du auch Fische aus unseren Breitengraden?
Ja, es handelt sich um ein Nordsee-Aquarium. Neben der Beleuchtungsdauer wird auch die Temperatur entsprechend der Jahreszeit angepasst. Aktuell habe ich 9°C im Becken. 
Das ist notwendig, damit die Fische im Frühjahr dann auch in Paarungsstimmung kommen ;D

Zitat von: rudolfkoenig am 15 Februar 2017, 15:22:34
Ach so. Abendunterhaltung, aber die Fische sollen es nicht merken.
Na dann:
define AquariumOn at *{f67133()} set AquariumLamp on-till 22:00
mit f67133 in 99_myUtils.pm:
sub
f67133()
{
  FmtTime( time_str2num("2017-01-01 22:00:00")-
          (time_str2num("2017-01-01 ".sunset_abs())-
           time_str2num("2017-01-01 ".sunrise_abs())));
}       


Dazu doch noch eine Frage:
Das funktioniert ja jetzt nur für den 01.01.2017. Oder muss da einfach nur irgendein Datum stehen, das sich am Ende sowieso "raus kürzt"?
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: rudolfkoenig am 15 Februar 2017, 16:49:11
Ja, wird rausgekuerzt.
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Dietmar63 am 15 Februar 2017, 18:22:55
so sollte es auch gehen:

define AquariumOn  WeekdayTimer  {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on   22:00|off
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: betateilchen am 15 Februar 2017, 18:32:44
und jetzt bitte noch jemand mit einem DOIF...  8)
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: igami am 15 Februar 2017, 18:42:28
Zitat von: betateilchen am 15 Februar 2017, 18:32:44
und jetzt bitte noch jemand mit einem DOIF...  8)

defmod aquarium DOIF ([([22:00]-{sunset()}+{sunrise()})])(\
  set AquariumLamp on\
)\
DOELSEIF\
([22:00])(\
  set AquariumLamp off\
)
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Thorsten Pferdekaemper am 15 Februar 2017, 19:23:15
Zitat von: efyzz am 15 Februar 2017, 16:38:38Ja, es handelt sich um ein Nordsee-Aquarium. Neben der Beleuchtungsdauer wird auch die Temperatur entsprechend der Jahreszeit angepasst. Aktuell habe ich 9°C im Becken. 
Das ist notwendig, damit die Fische im Frühjahr dann auch in Paarungsstimmung kommen ;D
Oha, hast Du einen Zoo? Wenn man das gescheit machen will, dann ist das echt was für Fortgeschrittene. Hast Du auch Tidenhub und Brandungssimulation?
Gruß,
   Thorsten
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: betateilchen am 15 Februar 2017, 19:30:50
"Paarungssstimmung bei 9°" deutet zumindest darauf hin, dass dort auch Eisbären und Pinguine rumlaufen könnten...
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 15 Februar 2017, 21:17:28
Wow, danke! Dann habe ich ja jetzt ein paar Möglichkeiten zum Testen  :D

Zoo? Naja, neben 3 Katzen und einem Hund habe ich aktuell 7 Aquarien, natürlich alle gesalzen. Ein tropisches Korallenbecken steht im Wohnzimmer, alle anderen beinhalten Kaltwasser und stehen im Keller.
9°C hört (und fühlt) sich zwar kalt an, aber realistisch wären so 4-6°C für Nordseeverhältnisse um diese Jahreszeit. Gekühlt wird inzwischen über eine Erdleitung, die ich letztes Jahr in 1m Tiefe im Garten verbuddelt habe. Somit stellt sich eine zur Jahreszeit passende Temperatur von selbst ein. Früher hatte ich dafür das Kühlaggregat eines Kühlschranks ins Aquarium integriert und musste die Temperatur "manuell" nachführen.
Ebbe und Flut gibt es so nicht, wohl aber wechselnde Strömung im Rhythmus der Gezeiten, sowie Wellensimulation usw.

Leider hat nur meine Steuerung keine Kapazitäten mehr frei, um die Beleuchtung entsprechend der Jahreszeiten zu steuern. Daher bietet es sich an, dies über den RPi / fhem zu machen.
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 15 Februar 2017, 22:43:14
Ich habe mich mal für die Lösung von Dietmar entschieden, da so ein Einzeiler doch wesentlich bequemer ist, als ein sub anzulegen.

Zitat von: Dietmar63 am 15 Februar 2017, 18:22:55
so sollte es auch gehen:

define AquariumOn  WeekdayTimer  {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on   22:00|off


Um 22:00 Uhr gab es wie gewünscht den off-Befehl, im Log steht nun allerdings:
Zitat2017.02.15 22:00:00 3: Please define {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on first

In die Kommandozeile eingegeben, ergibt {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))} übrigens:
10:54:13
Das klingt schon mal realistisch, die Berechnung funktioniert also.

Naja, für heute ist Feierabend. Mal schauen, ob morgen um 10:54 etwas passiert  ;)

Edit (kann nicht einschlafen):
Laut Commandref muss beim weekdayTimer ein Device angegeben werden. Deswegen habe ich Dietmars Ausdruck mal so erweitert:
define AquariumBeleuchtungTimer WeekdayTimer AquariumBeleuchtung {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on 22:00|off

Ich denke, so sollte es klappen. Mal abwarten ...
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Dietmar63 am 16 Februar 2017, 00:11:30
Ja, hast recht. Habe es auf die Schnelle hingeschrieben

so sollte ein list aussehen:

Internals:
   CFGFN
   COMMAND
   CONDITION
   DEF        wd  {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on   22:00|off
   DEVICE     wd
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       AquariumOn
   NR         1077
   Profil 0: Sonntag 10:50:14 on, 22:00:00 off
   Profil 1: Montag 10:50:14 on, 22:00:00 off
   Profil 2: Dienstag 10:50:14 on, 22:00:00 off
   Profil 3: Mittwoch 10:50:14 on, 22:00:00 off
   Profil 4: Donnerstag 10:50:14 on, 22:00:00 off
   Profil 5: Freitag 10:50:14 on, 22:00:00 off
   Profil 6: Samstag 10:50:14 on, 22:00:00 off
   STATE      active
   STILLDONETIME 0
   TYPE       WeekdayTimer
   Readings:
     2017-02-16 01:01:01   currValue       off
     2017-02-16 01:01:01   nextUpdate      2017-02-16 10:50:14
     2017-02-16 01:01:01   nextValue       on
     2017-02-16 01:01:01   state           active
   SWITCHINGTIMES:
     {h2hms_fmt(22.0-(hms2h(sunset_abs())-hms2h(sunrise_abs())))}|on
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Thorsten Pferdekaemper am 16 Februar 2017, 10:44:26
Zitat von: efyzz am 15 Februar 2017, 21:17:28Zoo? Naja, neben 3 Katzen und einem Hund habe ich aktuell 7 Aquarien, natürlich alle gesalzen. Ein tropisches Korallenbecken steht im Wohnzimmer, alle anderen beinhalten Kaltwasser und stehen im Keller.
9°C hört (und fühlt) sich zwar kalt an, aber realistisch wären so 4-6°C für Nordseeverhältnisse um diese Jahreszeit. Gekühlt wird inzwischen über eine Erdleitung, die ich letztes Jahr in 1m Tiefe im Garten verbuddelt habe. Somit stellt sich eine zur Jahreszeit passende Temperatur von selbst ein. Früher hatte ich dafür das Kühlaggregat eines Kühlschranks ins Aquarium integriert und musste die Temperatur "manuell" nachführen.
Ebbe und Flut gibt es so nicht, wohl aber wechselnde Strömung im Rhythmus der Gezeiten, sowie Wellensimulation usw.
:) ::)
Klingt ziemlich abgefahren. Wenn Du nicht so weit weg wärst, dann würde ich mir das gerne mal ansehen...
Gruß,
   Thorsten 
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 16 Februar 2017, 21:27:14
Danke Dietmar,

es funktioniert jetzt prima.
Ich kann gerade noch verstehen, warum in dem Listing (genau wie bei Dir) dann jeden Tag dieselbe Uhrzeit steht. Aber scheinbar wird diese letztlich doch täglich neu berechnet und passt somit am Ende.
Wann und wieso wird diese Neuberechnung durchgeführt? Ist das eine Eigenheit des WeekdayTimer oder was passiert da?!

@Thorsten:
In einem anderen Forum gibt es jede Menge Fotos. Wenn Du willst, schicke ich Dir einen Link per PN. Du musst Dich dann allerdings dort registrieren.
Übrigens sind solche Strömungssimulationen usw. heutzutage nichts Besonderes mehr in der (Meerwasser-) Aquaristik. Entsprechende Controller kann man überall kaufen. Ich baue sowas allerdings selbst, so kann man 2 Hobbys prima verbinden. ;)
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Dietmar63 am 16 Februar 2017, 22:24:59
kurz nach Mitternacht werden die timer des neuen Tages neu berechnet
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Thorsten Pferdekaemper am 17 Februar 2017, 08:28:57
Zitat von: efyzz am 16 Februar 2017, 21:27:14@Thorsten:
In einem anderen Forum gibt es jede Menge Fotos. Wenn Du willst, schicke ich Dir einen Link per PN. Du musst Dich dann allerdings dort registrieren.
Danke, vielleicht lieber nicht. Ansonsten fange ich selbst wieder damit an...
Gruß,
   Thorsten
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: efyzz am 24 Februar 2017, 13:38:08
Mahlzeit,

seit letztem Wochenende ist der RasPi hardwareseitig mit der Aquarienbeleuchtung vergnubselt und es funktioniert perfekt!
Nochmals vielen Dank für eure Hilfe!

Zitat2017-02-16_22:00:00 AquariumBeleuchtung off
2017-02-17_12:09:00 AquariumBeleuchtung on
2017-02-17_22:00:00 AquariumBeleuchtung off
2017-02-18_12:05:02 AquariumBeleuchtung on
2017-02-18_22:00:00 AquariumBeleuchtung off
2017-02-19_12:01:01 AquariumBeleuchtung on
2017-02-19_22:00:00 AquariumBeleuchtung off
2017-02-20_11:57:01 AquariumBeleuchtung on
2017-02-20_22:00:00 AquariumBeleuchtung off
2017-02-21_11:52:59 AquariumBeleuchtung on
2017-02-21_22:00:00 AquariumBeleuchtung off
2017-02-22_11:48:57 AquariumBeleuchtung on
2017-02-22_22:00:00 AquariumBeleuchtung off
2017-02-23_11:44:55 AquariumBeleuchtung on
2017-02-23_22:00:00 AquariumBeleuchtung off
2017-02-24_11:40:52 AquariumBeleuchtung on

Wie man sieht, geht die Beleuchtung jeden Tag etwa 4 min früher an, aber immer um 22:00 Uhr aus.  Genau so sollte es sein! :D

Ich würde nun gern die Einschaltzeit und/oder die Beleuchtungsdauer als Jahresverlauf grafisch darstellen. Dafür bräuchte ich also ein SVG-Plot, das auf der X-Achse ein ganzes Jahr abbildet und auf der Y-Achse jeweils die on-Zeit jedes Tages. Kann mir da nochmal jemand einen Denkanstoß zur Konfiguration des Plots geben?
Titel: Antw:Rechnen mit sunrise() und sunset()
Beitrag von: Thorsten Pferdekaemper am 24 Februar 2017, 17:04:47
Hi,
Du brauchst erstmal ein Reading, in dem das Gewünschte steht...
Gruß,
   Thorsten