FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: heikoh81 am 18 Mai 2016, 23:26:07

Titel: DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 18 Mai 2016, 23:26:07
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)


([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
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Per am 18 Mai 2016, 23:49:18
Der 01/05 war dieses Jahr ein Sonntag, damit hat |8 zugeschlagen und DOIF alles richtig gemacht.
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 19 Mai 2016, 22:20:14
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
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: igami am 19 Mai 2016, 22:36:07
ne != Ist ja auch doppelt gemoppelt ;)
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 19 Mai 2016, 23:21:20
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
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: igami am 20 Mai 2016, 05:41:50
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
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 27 Mai 2016, 22:30:49
Funktioniert.
Tausend Dank.
Das werde ich jetzt öfters mit DOIF einsetzen.

Viele Grüße,
Heiko
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 01 Januar 2017, 16:17:14
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
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Damian am 01 Januar 2017, 17:58:36
nicht (A oder B) ist

nicht (A) und nicht (B)

daher:

(("$mday $month" ne "1 1") and ("$mday $month" ne "1 5"))

Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 01 Januar 2017, 19:44:55
Danke, Damian, alles klar!
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Skusi am 22 Januar 2020, 18:49:23
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 ?
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Frank_Huber am 22 Januar 2020, 20:13:56
Haste mal nen list vom doif?

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Damian am 22 Januar 2020, 23:38:30
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])
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: Skusi am 23 Januar 2020, 18:28:07
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 ?
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: xenos1984 am 23 Januar 2020, 19:48:26
Kurz gesagt: hänge Tag, Leerzeichen und Monat hintereinander:
Titel: Antw:DOIF: $month != und $mday != funktioniert nicht
Beitrag von: heikoh81 am 26 Januar 2020, 21:34:26
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