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?
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 (http://fhem.de/commandref_DE.html#version) ist bei Dir aktiv.
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)
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.
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
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.
Hab
Value("Rollo_Kueche_Zeitkalib_sonset")
benutzt.
Funktioniert trotzt dem nicht. Auch kein LogFile eintrag.
Probier es so, wie Damian es beschrieben hat oder probier ReadingsVal. Sollte es nicht funktionieren, poste mal ein list Rollo_Kueche_nach_Uhrzeit
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)
Was passiert, wenn Du es ausprobierst?
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.
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.
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.
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.
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.
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']
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.
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)))
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
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.
Schau mal hier, vielleicht hilft das weiter: https://forum.fhem.de/index.php/topic,58237.0.html und lies bitte Antwort 7.