DOIF: $month != und $mday != funktioniert nicht

Begonnen von heikoh81, 18 Mai 2016, 23:26:07

Vorheriges Thema - Nächstes Thema

heikoh81

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

Per

Der 01/05 war dieses Jahr ein Sonntag, damit hat |8 zugeschlagen und DOIF alles richtig gemacht.

heikoh81

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

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

heikoh81

#4
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

igami

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
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

heikoh81

Funktioniert.
Tausend Dank.
Das werde ich jetzt öfters mit DOIF einsetzen.

Viele Grüße,
Heiko

heikoh81

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

Damian

nicht (A oder B) ist

nicht (A) und nicht (B)

daher:

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

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

heikoh81


Skusi

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 ?
RPI3B, SIGNALduino, NanoCul868 (a-culfw), JeeLink Clone (LaCrosse), Firmata  für FB Heizung,Wasser+Gas+Klingel+Lux, Somfy Rolladen, Pollin Steckd.,TX29DTH,ESPEasy an S0 Stromz., MAX Fensterkontakte, IButton, SonOff Tasmota, ESP LED Controler

Frank_Huber

Haste mal nen list vom doif?

Gesendet von meinem Doogee S60 mit Tapatalk


Damian

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])
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Skusi

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 ?
RPI3B, SIGNALduino, NanoCul868 (a-culfw), JeeLink Clone (LaCrosse), Firmata  für FB Heizung,Wasser+Gas+Klingel+Lux, Somfy Rolladen, Pollin Steckd.,TX29DTH,ESPEasy an S0 Stromz., MAX Fensterkontakte, IButton, SonOff Tasmota, ESP LED Controler

xenos1984

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