Hallo zusammen,
ich möchte an einem bestimmten Tag eine bestimmte Aktion auslösen.
Dazu habe ich folgendes Test-DOIF gebaut, das aber nicht wie gewünscht funktioniert.
(Zeit ist beispielhaft zum Testen, ich habe das immer so eingestellt, dass die Uhrzeit in Kürze eintritt)
- Ist der gewünschte Tag, wird cmd_2 korrekt ausgeführt.
- Ist der Tag aber ungleich dem angegebenen Datum, passiert einfach nichts.
([16:24:35|8] and ($month !=5 and $mday !=18))
({Log 3, "doif-Test nicht 18.05."})
DOELSEIF ([16:24:45|8] and ($month == 5 and $mday == 18))
({Log 3, "doif-Test 18.05."})
list DOIF:
Internals:
CFGFN
DEF ([16:24:35|8] and ($month ne "5" and $mday ne "1"))
({Log 3, "doif-Test nicht 01.05."})
DOELSEIF ([16:24:45|8] and ($month == 5 and $mday == 1))
({Log 3, "doif-Test 01.05."})
NAME di_Tag_Monat_Test
NR 4066
NTFY_ORDER 50-di_Tag_Monat_Test
STATE initialized
TYPE DOIF
Readings:
2016-05-18 16:24:10 cmd 0
2016-05-18 16:24:10 state initialized
2016-05-18 16:24:35 timer_1_c1 19.05.2016 16:24:35|8
2016-05-18 16:24:45 timer_2_c2 19.05.2016 16:24:45|8
Condition:
0 DOIF_time_once($hash,$hash->{timer}{0},$wday,"8") and ($month ne "5" and $mday ne "1")
1 DOIF_time_once($hash,$hash->{timer}{1},$wday,"8") and ($month == 5 and $mday == 1)
Days:
0 8
1 8
Devices:
Do:
0:
0 {Log 3, "doif-Test nicht 01.05."}
1:
0 {Log 3, "doif-Test 01.05."}
2:
Helper:
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
triggerDev
triggerEvents:
timer_2
Internals:
Interval:
Itimer:
Localtime:
0 1463667875
1 1463667885
Readings:
Realtime:
0 16:24:35
1 16:24:45
Regexp:
State:
Time:
0 16:24:35
1 16:24:45
Timecond:
0 0
1 1
Timer:
0 0
1 0
Timers:
0 0
1 1
Triggertime:
1463667875:
localtime 1463667875
Hash:
1463667885:
localtime 1463667885
Hash:
Attributes:
do always
room Homematic
Habe ich einen Fehler im !=?
Probiert habe ich auch schon "ne", hat aber auch nicht funktioniert.
Habe auch schon probiert, die Klammer und das zweite and wegzulassen, hat ebenfalls nicht funktioniert.
Vielen Dank für eure Antworten,
viele Grüße,
Heiko
Der 01/05 war dieses Jahr ein Sonntag, damit hat |8 zugeschlagen und DOIF alles richtig gemacht.
Das mag sein,ist hier aber nicht das Problem.
Ich habe doch extra ein aktuelles Datum und eine Testuhrzeit gewählt.
Die ==-Bedingung wird immer ausgeführt, das != (ungleich) klappt aber nicht.
Kann mir da jemand weiterhelfen?
Vielleicht liegt es an der Perl-Syntax.
Viele Grüße,
Heiko
ne != Ist ja auch doppelt gemoppelt ;)
Zitat von: igami am 19 Mai 2016, 22:36:07
ne != Ist ja auch doppelt gemoppelt ;)
Ja, stimmt, aber das war weil ich auch "ne" probiert habe und es dann für den Forums-Post zurückgeändert habe auf !=.
Ursprünglich war nur != drin und das wird nicht war, obwohl das Beispieldatum am Test-Tag gar nicht war.
Also gerade eben nochmal das auf die aktuelle Zeit angepasste DOIF ausprobiert:
([23:23:35|8] and ($month != 5 and $mday != 1))
({Log 3, "doif-Test nicht 01.05."})
DOELSEIF ([23:23:45|8] and ($month == 5 and $mday == 1))
({Log 3, "doif-Test 01.05."})
Um 23:23:35 ==> Keine Reaktion.
Liegt es an folgendem?
Es ist gerade Mai, also: $month == 5.
"$month != 5" ==> unwahr (da Monat gleich 5 und nicht ungleich 5)
"$mday != 1" ==> wahr (da Tag gleich 19)
die Klammer ($month != 5 and $mday != 1) ==> unwahr
Somit kann cmd_1 nicht ausgeführt werden.
Aber wie bekomme ich meine Problemstellung dann in DOIF übersetzt, so lange noch keine Datumsangaben nativ von DOIF unterstützt werden?
cmd_1 soll an jedem Tag des Jahres außer am 01.05. ausgeführt werden. Der 01.05. ist aufgrund der holiday-Datei immer Feiertag und damit $we.
Viele Grüße,
Heiko
Jetzt ist der Groschen gefallen :D
([[uhrzeit]] and
($month != 5 or
($day != 1 and $month == 5)
)
)
oder Kürzer
([[zeit]] and "$mday $month" ne "1 5")
Grüße
igami
Funktioniert.
Tausend Dank.
Das werde ich jetzt öfters mit DOIF einsetzen.
Viele Grüße,
Heiko
Erstmal ein Frohes Neues Jahr 2017 an alle!
Ich hole mein Thema nochmal nach vorne, weil ich nun eine Erweitung des DOIFs für 2 oder mehr Datums-Angaben machen möchte.
Dies klappt aber noch nicht.
Das obige Beispiel funktioniert gut, aber wie müsste ich vorgehen, wenn ich 2 Datums-Angaben abfragen möchte?
In nachfolgendem Code würde cmd_2 funktionieren - wenn einer der beiden Tage ist, dann ist eine der Bedingungen wahr und somit auch die Klammer.
Aber cmd_1 würde auch an beiden Daten ausgeführt, schließlich ist am 01.01. nicht der 01.05. und somit die Klammer auch wieder wahr...
([01:00] and (("$mday $month" ne "1 1") or ("$mday $month" ne "1 5"))
##cmd_1 - nicht am 01.01. oder 01.05.
(set xyz off)
DOELSEIF ([06:00] and (("$mday $month" eq "1 1") or ("$mday $month" eq "1 5"))
##cmd_2 - am 01.01. oder 01.05.
(set xyz off)
DOELSE ()
##cmd_3
Viele Grüße,
Heiko
nicht (A oder B) ist
nicht (A) und nicht (B)
daher:
(("$mday $month" ne "1 1") and ("$mday $month" ne "1 5"))
Danke, Damian, alles klar!
Und jetzt hätte ich das gerne noch über Readings:
[17:00] and "$mday $month" ne "[Reise_Datum:Ab_Tag] [Reise_Datum:Ab_Mon]"
geht leider nicht.
Jemand ne Idee ?
Haste mal nen list vom doif?
Gesendet von meinem Doogee S60 mit Tapatalk
Die Lösung ist etwas tricky. Triggerangaben in eckigen Klammern werden vom DOIF-Modul in Perlfunktionen übersetzt. Damit das in der Bedingung funktioniert muss man es so angeben:
([17:00] and "$mday $month" ne [Reise_Datum:Ab_Tag]." ".[Reise_Datum:Ab_Mon])
Vielen Dank Damian !
Ich versteh die Schreibweise jetzt allerdings nicht, hab sie aber mal so in mein DOIF übernommen. Mal sehen ob es das tut was es soll.
Kannst Du die Schreibweise mit den ." und ". mal erleutern ?
Kurz gesagt: hänge Tag, Leerzeichen und Monat hintereinander:
- [Reise_Datum:Ab_Tag] = Tag
- . = Verkettung von Zeichenketten
- " " = Leerzeichen
- . = Verkettung von Zeichenketten
- [Reise_Datum:Ab_Mon] = Monat
Zitat von: Damian am 22 Januar 2020, 23:38:30
([17:00] and "$mday $month" ne [Reise_Datum:Ab_Tag]." ".[Reise_Datum:Ab_Mon])
Danke, gut zu wissen, falls man das Datum parametrieren möchte!
Viele Grüße,
Heiko