Sunrise und Sunset Variabel gestalten

Begonnen von butaluk, 27 September 2016, 22:34:59

Vorheriges Thema - Nächstes Thema

butaluk

Hallo,
ich habe meine Funktion Sunrise und Sunset so konfiguriert:
DOELSEIF ([{sunset("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}] and [Rollo_Kueche_Automatic:state] eq "sonne") (set UG_Kueche_Rollo geschlossen)
Die Variable "Rollo_Kueche_Zeitkalib_sonset" ist ein Slider:
attr Rollo_Kueche_Zeitkalib_sonset setList state:slider,-1200,10,1200
Es soll möglich sein die Zeit variabel anzupassen ohne jedes Mal den Quellcode dazu zu ändern.
Leider Funktioniert das so nicht wie ich mir das gedacht habe.
Hat vielleicht einer eine Idee wie man das am besten umsetzt?

Ellert

ZitatLeider Funktioniert das so nicht wie ich mir das gedacht habe.
Könntest Du diese Aussage präzisieren? Was Du Dir gedacht hast, weisst nur Du allein und was genau nicht funktioniert hat, das hast Du beobachtet und keiner, der hier mitliest. Welche DOIF-Version ist bei Dir aktiv.

butaluk

Hallo,
für meine Rollläden habe ich folgende Funktionen angelegt:
define Rollo_Kueche_nach_Uhrzeit DOIF ([[Rollo_Kueche_Zeit_hoch:state]] and [Rollo_Kueche_Automatic:state] eq "an") (set UG_Kueche_Rollo position [Rollo_Kueche_Position_hoch:state]) \
DOELSEIF ([[Rollo_Kueche_Zeit_runter:state]] and [Rollo_Kueche_Automatic:state] eq "an") (set UG_Kueche_Rollo position [Rollo_Kueche_Position_runter:state]) \
DOELSEIF ([{sunrise("REAL",0,"06:30","09:00")}] and [Rollo_Kueche_Automatic:state] eq "sonne") (set UG_Kueche_Rollo offen) \
DOELSEIF ([{sunset("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}] and [Rollo_Kueche_Automatic:state] eq "sonne") (set UG_Kueche_Rollo geschlossen)

1.   Nach der eingestellter Zeit und Position für Hoch und Runterfahrt wurden Funktionen erstellt: image_01.jpg

Wenn Automatik ,,an" ist Fahren die Rollläöden auch nach der eingestellte Zeit und Position.

2.   Als zweite Möglichkeit soll nach Sonne Hoch und Runter gefahren werden.
Wenn die Funktion so anlege funktioniert es auch:
("REAL",0,"06:30","09:00")}]
Wenn ich aber in die Funktion dem Zusatz Parameter ,,Kalibrierung" integriere,
("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}]
gibt es keine Funktion.

Im Logfile ist auch keine Meldung zu sehen.

Folgendes DOIF ist aktiv: 98_DOIF.pm          11314 2016-04-26 18:29:24Z damian-s


Der Gesamt Kode:
#~~~~~~~~~~~~~Uhrzeit Einstellung Rollo hoch~~~~~~#
define Rollo_Kueche_Zeit_hoch dummy
attr Rollo_Kueche_Zeit_hoch alias Uhrzeit HOCH:
attr Rollo_Kueche_Zeit_hoch devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Zeit_hoch group Rollo Küche Automatik
attr Rollo_Kueche_Zeit_hoch icon icoUhr
attr Rollo_Kueche_Zeit_hoch room Küche
attr Rollo_Kueche_Zeit_hoch setList state:time
attr Rollo_Kueche_Zeit_hoch sortby 01
attr Rollo_Kueche_Zeit_hoch webCmd state

#~~~~~~~~~~~~~Uhrzeit Einstellung Rollo runter~~~~~#
define Rollo_Kueche_Zeit_runter dummy
attr Rollo_Kueche_Zeit_runter alias Uhrzeit RUNTER:
attr Rollo_Kueche_Zeit_runter devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Zeit_runter group Rollo Küche Automatik
attr Rollo_Kueche_Zeit_runter icon icoUhr
attr Rollo_Kueche_Zeit_runter room Küche
attr Rollo_Kueche_Zeit_runter setList state:time
attr Rollo_Kueche_Zeit_runter sortby 02
attr Rollo_Kueche_Zeit_runter webCmd state

#~~~~~~~~~~~~Automatik Status~~~~~~~~~~~~~~~~~~~#
define Rollo_Kueche_Automatic dummy
attr Rollo_Kueche_Automatic alias Automatik Rollo:
attr Rollo_Kueche_Automatic devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Automatic group Rollo Küche Automatik
attr Rollo_Kueche_Automatic icon fts_shutter_automatic
attr Rollo_Kueche_Automatic room Küche
attr Rollo_Kueche_Automatic setList state:an,sonne,aus
attr Rollo_Kueche_Automatic sortby 03
attr Rollo_Kueche_Automatic webCmd state

###############~~Einstellungen~~#####################

#~~~~~~~~~~~~Position Atomatik hoch~~~~~~~~~~~~~~~~~~~~~~~#
define Rollo_Kueche_Position_hoch dummy
attr Rollo_Kueche_Position_hoch alias Position Automatik HOCH:
attr Rollo_Kueche_Position_hoch devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Position_hoch group Rollo Küche Automatik Einstellungen
attr Rollo_Kueche_Position_hoch icon fts_shutter_updown
attr Rollo_Kueche_Position_hoch room Küche
attr Rollo_Kueche_Position_hoch setList state:0,10,20,30,40,50,60,70,80,90,100
attr Rollo_Kueche_Position_hoch sortby 01
attr Rollo_Kueche_Position_hoch webCmd state

#~~~~~~~~~~~~Position Atomatik runter~~~~~~~~~~~~~~~~~~~~~~~#
define Rollo_Kueche_Position_runter dummy
attr Rollo_Kueche_Position_runter alias Position Automatik RUNTER:
attr Rollo_Kueche_Position_runter devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Position_runter group Rollo Küche Automatik Einstellungen
attr Rollo_Kueche_Position_runter icon fts_shutter_updown
attr Rollo_Kueche_Position_runter room Küche
attr Rollo_Kueche_Position_runter setList state:0,10,20,30,40,50,60,70,80,90,100
attr Rollo_Kueche_Position_runter sortby 02
attr Rollo_Kueche_Position_runter webCmd state

#~~~~~~~~~~~Zeit kalibrierung Sonnenuntergang~~~~~~~~~~~~#
define Rollo_Kueche_Zeitkalib_sonset dummy
attr Rollo_Kueche_Zeitkalib_sonset alias Zeitkalibrierung Sonnenuntergang:
attr Rollo_Kueche_Zeitkalib_sonset devStateIcon .*:rc_BLANK
attr Rollo_Kueche_Zeitkalib_sonset group Rollo Küche Automatik Einstellungen
attr Rollo_Kueche_Zeitkalib_sonset icon time_timer
attr Rollo_Kueche_Zeitkalib_sonset room Küche
attr Rollo_Kueche_Zeitkalib_sonset setList state:slider,-1200,10,1200
attr Rollo_Kueche_Zeitkalib_sonset sortby 03
attr Rollo_Kueche_Zeitkalib_sonset webCmd state

define Rollo_Kueche_nach_Uhrzeit DOIF ([[Rollo_Kueche_Zeit_hoch:state]] and [Rollo_Kueche_Automatic:state] eq "an") (set UG_Kueche_Rollo position [Rollo_Kueche_Position_hoch:state]) \
DOELSEIF ([[Rollo_Kueche_Zeit_runter:state]] and [Rollo_Kueche_Automatic:state] eq "an") (set UG_Kueche_Rollo position [Rollo_Kueche_Position_runter:state]) \
DOELSEIF ([{sunrise("REAL",0,"06:30","09:00")}] and [Rollo_Kueche_Automatic:state] eq "sonne") (set UG_Kueche_Rollo offen) \
DOELSEIF ([{sunset("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}] and [Rollo_Kueche_Automatic:state] eq "sonne") (set UG_Kueche_Rollo geschlossen)

Ellert

Die aktuelle Version ist: 98_DOIF.pm 12215 2016-09-26 21:02:49Z damian-s

Vielleich funktioniert es nach "update" und anschliessendem "shutdown restart", obwohl die Neuerung die beiden Zeitangaben in Anführungszeichen betrifft, soweit ich gelesen habe.

Alternativ kannst Du auch Value("Rollo_Kueche_Zeitkalib_sonset") oder ReadingsVal("Rollo_Kueche_Zeitkalib_sonset","state","0") statt [Rollo_Kueche_Zeitkalib_sonset:state] benutzen.

Damian

#4
Zitat von: butaluk am 28 September 2016, 13:42:13

2.   Als zweite Möglichkeit soll nach Sonne Hoch und Runter gefahren werden.
Wenn die Funktion so anlege funktioniert es auch:
("REAL",0,"06:30","09:00")}]
Wenn ich aber in die Funktion dem Zusatz Parameter ,,Kalibrierung" integriere,
("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}]
gibt es keine Funktion.


Du musst [Rollo_Kueche_Zeitkalib_sonset:state] in Anführungszeichen setzen, so wie es in der Commandref steht, denn die sunset-Funkton erwartet eine Zeit in Anführungszeichen.

Edit: und natürlich die aktuelle DOIF-Version installieren


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Ellert am 28 September 2016, 15:28:09
Die aktuelle Version ist: 98_DOIF.pm 12215 2016-09-26 21:02:49Z damian-s

Vielleich funktioniert es nach "update" und anschliessendem "shutdown restart", obwohl die Neuerung die beiden Zeitangaben in Anführungszeichen betrifft, soweit ich gelesen habe.

Alternativ kannst Du auch Value("Rollo_Kueche_Zeitkalib_sonset") oder ReadingsVal("Rollo_Kueche_Zeitkalib_sonset","state","0") statt [Rollo_Kueche_Zeitkalib_sonset:state] benutzen.

Der entscheidende Vorteil der neuen Syntax ist, dass eine Änderung des Dummys im DOIF sofort zur Neuberechnung der Zeit führt und damit zu Anpassung des Timers. In den ersten beiden Fällen wird sich die Auswirkung erst  auswirken, wenn der ursprüngliche Timer zuschlägt und ein neuer berechnet wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

butaluk

Hab
Value("Rollo_Kueche_Zeitkalib_sonset")
benutzt.
Funktioniert trotzt dem nicht. Auch kein LogFile eintrag.

Ellert

#7
Probier es so, wie Damian es beschrieben hat oder probier ReadingsVal. Sollte es nicht funktionieren, poste mal ein list Rollo_Kueche_nach_Uhrzeit

butaluk

Zitat von: Ellert am 28 September 2016, 20:53:57
Probier es so, wie Damian es beschrieben hat oder probier ReadingsVal. Sollte es nicht funktionieren, poste mal ein list Rollo_Kueche_nach_Uhrzeit

In der FHEM Referenz steht aber nichts von den Aufrufezeichen:
define di_light DOIF ([+{sunrise_rel(900,"06:00","08:00")}]) (set outdoorlight off) DOELSEIF ([+{sunset_rel(900,"17:00","21:00")}]) (set outdoorlight on)

Ellert


Damian

Zitat von: butaluk am 29 September 2016, 08:15:30
In der FHEM Referenz steht aber nichts von den Aufrufezeichen:
define di_light DOIF ([+{sunrise_rel(900,"06:00","08:00")}]) (set outdoorlight off) DOELSEIF ([+{sunset_rel(900,"17:00","21:00")}]) (set outdoorlight on)

ZitatIndirekte Zeitangaben können auch als Übergabeparameter für Zeitfunktionen, wie z. B. sunset oder sunrise übergeben werden:

define di_time DOIF ([{sunrise(0,"[begin]","09:00")-{sunset(0,"18:00","[end]")]) (set lamp off) DOELSE (set lamp on)

Bei einer Änderung des angebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Ich hab es mal ausprobiert, bei mir funktioniert es:
Zitat2016.09.29 19:30:01.156 1: Sonnenuntergang um 41:48:41 bei Test = -3600
2016.09.29 19:30:07.182 1: Sonnenuntergang um 42:48:42 bei Test = 1
2016.09.29 19:30:10.621 1: Sonnenuntergang um 19:51:08 bei Test = 3600
mit
Internals:
   DEF        ([{sunset("REAL",[Test])}]) ({Log 1, "cmd_1"})

DOELSEIF ([Test]) ({Log 1, "Sonnenuntergang um ".sunset("REAL",[Test])." bei Test = [Test]"})
   NAME       TestStatus
   NR         165
   NTFY_ORDER 50-TestStatus
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-09-29 19:30:10   Device          Test
     2016-09-29 19:30:10   cmd             2
     2016-09-29 19:30:10   cmd_event       Test
     2016-09-29 19:30:10   cmd_nr          2
     2016-09-29 19:30:10   e_Test_STATE    3600
     2016-09-29 19:30:10   state           cmd_2
     2016-09-29 19:30:10   timer_1_c1      29.09.2016 19:51:08
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"")
     1          InternalDoIf($hash,'Test','STATE','','',AttrVal($hash->{NAME},'notexist',undef))
   Days:
   Devices:
     1           Test
     all         Test
   Do:
     0:
       0          {Log 1, "cmd_1"}
     1:
       0          {Log 1, "Sonnenuntergang um ".sunset("REAL",[Test])." bei Test = [Test]"}
   Helper:
     event      3600
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   Test
     timerevent 3600
     triggerDev Test
     timerevents:
       3600
     timereventsState:
       state: 3600
     triggerEvents:
       3600
     triggerEventsState:
       state: 3600
   Internals:
     1           Test:STATE
     all         Test:STATE
   Itimer:
     all         Test
   Localtime:
     0          1475171468
   Readings:
   Realtime:
     0          19:51:08
   Regexp:
     0:
     1:
     All:
   State:
   Time:
     0          {sunset("REAL",[Test])}
   Timecond:
     0          0
   Timer:
     0          0
   Timers:
     0           0
   Trigger:
   Triggertime:
     1475171468:
       localtime  1475171468
       Hash:
Attributes:
   disable    0
   do         always
   group      00_Test
   room       0_Test

Das hätte auch mit der alten Version klappen müssen.

Damian

Zitat von: Ellert am 29 September 2016, 19:36:26
Ich hab es mal ausprobiert, bei mir funktioniert es:mit
Internals:
   DEF        ([{sunset("REAL",[Test])}]) ({Log 1, "cmd_1"})

DOELSEIF ([Test]) ({Log 1, "Sonnenuntergang um ".sunset("REAL",[Test])." bei Test = [Test]"})
   NAME       TestStatus
   NR         165
   NTFY_ORDER 50-TestStatus
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-09-29 19:30:10   Device          Test
     2016-09-29 19:30:10   cmd             2
     2016-09-29 19:30:10   cmd_event       Test
     2016-09-29 19:30:10   cmd_nr          2
     2016-09-29 19:30:10   e_Test_STATE    3600
     2016-09-29 19:30:10   state           cmd_2
     2016-09-29 19:30:10   timer_1_c1      29.09.2016 19:51:08
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"")
     1          InternalDoIf($hash,'Test','STATE','','',AttrVal($hash->{NAME},'notexist',undef))
   Days:
   Devices:
     1           Test
     all         Test
   Do:
     0:
       0          {Log 1, "cmd_1"}
     1:
       0          {Log 1, "Sonnenuntergang um ".sunset("REAL",[Test])." bei Test = [Test]"}
   Helper:
     event      3600
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   Test
     timerevent 3600
     triggerDev Test
     timerevents:
       3600
     timereventsState:
       state: 3600
     triggerEvents:
       3600
     triggerEventsState:
       state: 3600
   Internals:
     1           Test:STATE
     all         Test:STATE
   Itimer:
     all         Test
   Localtime:
     0          1475171468
   Readings:
   Realtime:
     0          19:51:08
   Regexp:
     0:
     1:
     All:
   State:
   Time:
     0          {sunset("REAL",[Test])}
   Timecond:
     0          0
   Timer:
     0          0
   Timers:
     0           0
   Trigger:
   Triggertime:
     1475171468:
       localtime  1475171468
       Hash:
Attributes:
   disable    0
   do         always
   group      00_Test
   room       0_Test

Das hätte auch mit der alten Version klappen müssen.

Wenn eine Zahl erwartet wird, braucht man keine Anführungszeichen. Zeitangaben der Form HH:MM sind dagegen Strings, die man in Anführungszeichen übergeben muss.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 30 September 2016, 18:27:42
Wenn eine Zahl erwartet wird, braucht man keine Anführungszeichen. Zeitangaben der Form HH:MM sind dagegen Strings, die man in Anführungszeichen übergeben muss.

Ja, das ist mir bewust, ich wollte damit nur sagen, dass [{sunset("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}] aus dem 1. Beitrag, hätte funktionieren müssen, auch ohne update.

Damian

Zitat von: Ellert am 30 September 2016, 18:41:57
Ja, das ist mir bewust, ich wollte damit nur sagen, dass [{sunset("REAL",[Rollo_Kueche_Zeitkalib_sonset:state],"17:30","20:00")}] aus dem 1. Beitrag, hätte funktionieren müssen, auch ohne update.

Nein.

In der vorherigen DOIF-Version vom April werden Readings innerhalb von Zeitfunktionen in geschweiften Klammern nicht ersetzt.


Es gibt dann eine Fehlermeldung, weil das Reading nicht aufgelöst wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 30 September 2016, 19:07:59
Nein.

In der vorherigen DOIF-Version vom April werden Readings innerhalb von Zeitfunktionen in geschweiften Klammern nicht ersetzt.


Es gibt dann eine Fehlermeldung, weil das Reading nicht aufgelöst wird.
Gut, die Unterscheidung mit den geschweiften Klammern, war mir nicht bewusst, ich habe es nie verwendet.

Ich verwende die eckigen Klammern bisher nur in normalen Funktionen, das hat schon vorher geklappt.

OffTopic:
Ich verwende zur Rolladensteuerung eine Funktion isInRange(<kleiner Wert>,[Twilight:azimuth],<großer Wert>), um mir die Wiederholug des Readings zu sparen [Twilight:azimuth] > kleiner _Wert and [Twilight:azimuth] < großer_Wert

Wäre es sinnvoll im DOIF einen Kettenvergleich einzubauen?  :) ['kl.Wert < [Vergleichswert] < gr.Wert']

Damian

Zitat von: Ellert am 30 September 2016, 19:55:23
Gut, die Unterscheidung mit den geschweiften Klammern, war mir nicht bewusst, ich habe es nie verwendet.

Ich verwende die eckigen Klammern bisher nur in normalen Funktionen, das hat schon vorher geklappt.

OffTopic:
Ich verwende zur Rolladensteuerung eine Funktion isInRange(<kleiner Wert>,[Twilight:azimuth],<großer Wert>), um mir die Wiederholug des Readings zu sparen [Twilight:azimuth] > kleiner _Wert and [Twilight:azimuth] < großer_Wert

Wäre es sinnvoll im DOIF einen Kettenvergleich einzubauen?  :) ['kl.Wert < [Vergleichswert] < gr.Wert']

Ist leider nicht ohne Weiteres möglich. Die Mächtigkeit des Moduls beruht in erster Linie auf der Mächtigkeit von Perl. Es ist im Grunde ein Präprozessor für den Perl-Interpreter und der lässt solche Vergleiche nicht zu.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

#17
Zitat von: Damian am 30 September 2016, 20:05:29
Ist leider nicht ohne Weiteres möglich. Die Mächtigkeit des Moduls beruht in erster Linie auf der Mächtigkeit von Perl. Es ist im Grunde ein Präprozessor für den Perl-Interpreter und der lässt solche Vergleiche nicht zu.
Das hatte ich fast erwartet. Das Perl keinen Kettenvergleich kennt ist mir beim Nachforschen auch aufgefallen. In Perl würde für ganzzahlige Werte Smartmatch funktionieren {250 ~~ [200..300]} im DOIF geht dies (int([Twilight:azimuth]) ~~ [200..300]) wegen der eckigen Klammern leider nicht.

Das würde allerdings funktionieren (int([Twilight:azimuth]) =~ join("|",(200..300)))

Damian

Zitat von: Ellert am 30 September 2016, 21:02:08
Das hatte ich fast erwartet. Das Perl keinen Kettenvergleich kennt ist mir beim Nachforschen auch aufgefallen. In Perl würde für ganzzahlige Werte Smartmatch funktionieren {250 ~~ [200..300]} im DOIF geht dies (int([Twilight:azimuth]) ~~ [200..300]) wegen der eckigen Klammern leider nicht.

Das würde allerdings funktionieren (int([Twilight:azimuth]) =~ join("|",(200..300)))

Solche Vergleiche sind aber nicht zu empfehlen!

if ($i>=0 and $i<=1000)

ist ca. tausend Mal schneller in der Abarbeitung als

if ($i ~~ [0..1000])

;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

butaluk

Hi,
habe DOIF updatet, die Regelung funktioniert leider immer noch nicht.
Die Vorschläge habe ich auch ausprobiert. Die Rollos fahren nicht runter und es gibt keine LogFile einträge des bezüglich.

Ellert

Schau mal hier, vielleicht hilft das weiter: https://forum.fhem.de/index.php/topic,58237.0.html und lies bitte Antwort 7.