Hallo,
habe da ein kleines Problem mit meinem DoIf für meine Umwälzpumpe, das ganze läuft auf einem Raspberry. Leider schaltet jeder Timer ohne Abhängigkeit der Tage, kann mir eventuell jemand sagen weshalb die Tage nicht ausgewertet werden ?
DOIF ([05:30-07:00|124]) (set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-12:00|3]) (set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-23:59|5]) (set Keller_WarmwasserPumpe on)
DOELSEIF ([14:00-23:59|1234]) (set Keller_WarmwasserPumpe on)
DOELSEIF ([08:00-23:59|06]) (set Keller_WarmwasserPumpe on)
DOELSE (set Keller_WarmwasserPumpe off)
Hatte das ganze auch schon mit "or" in weniger DOELSEIF verschachtelt , ändert aber am Problem nichts.
Hallo Ralf,
der code sieht soweit ok aus, gleichwenn ich die Zeiten mit einem "or" verknüpfen würde.
Sonst mal ein List auf das DOIF machen, dann kann man mehr sagen.
Gruß,
Max
Welche Version des DOIF ist geladen?
version DOIF
Mit dem nachstehenden DOIF kannst Du das Schaltverhalten des DOIF Loggen, poste mal das Ergebnis und markiere die Fehler.
define logDOIF DOIF (["^<DOIF-Name>$"]) ({Log 1, "Gerät: $DEVICE Events: $EVENTS"})
und das Attribut
do always
@Max, mit dem "or" gebe ich dir recht, habe das ganze zur besseren Fehlersuche aufgesplittet
@Ellert werde heute Abend mal die Version abfragen und den logDOIF einbauen
Danke für eure Mühe
Gruss
Ralf
wie setze ich das Attribute
do always
sorry bin da noch recht neu dabei
der LOG läuft erstmals und die Version ist die
98_DOIF.pm 11314 2016-04-26 18:29:24Z damian-s
Und wo kann ich das Log dann finden ?
Gruss und Danke
ein 'list' vom dem Device ist bei der Fehlersuche immer hilfreich und das geht so:
im fhemweb in der Befehlszeile das eingeben
list <Device>
die Ausgabe davon dann bitte per copy/paste in code-Tags posten. Code Tags bekommst du wenn du auf die Raute (#) über dem Textfeld klickst.
################
das
attr <device> do always
kannst du ebenfalls in fhemweb einstellen. Du rufst einfach das DOIF auf, auf der Seite - ziemlich unten - stehen dann die 'Attributes' und in dem Feld darüber kannst du alle verfügbaren Attribute auswählen und einstellen. Das Attribut heißt in diesem Fall nur 'do' und der Wert den du dann als nächstes auswählen kannst heißt 'always'.
Vielen Dank für die ausführliche Antwort, habe das attr do allways gefunden
nun das List meiner nicht richtig funktionierenden DOIF
Internals:
DEF ([Urlaub] eq "ja")
(set Keller_WarmwasserPumpe off)
DOELSEIF ([05:30-07:00|124])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-12:00|3])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-23:59|5])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([14:00-23:59|1234])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([08:00-23:59|06])
(set Keller_WarmwasserPumpe on)
DOELSE (set Keller_WarmwasserPumpe off)
NAME di_WarmwasserPumpe
NR 122
NTFY_ORDER 50-di_WarmwasserPumpe
STATE cmd_5
TYPE DOIF
Readings:
2016-06-27 21:13:36 Device Urlaub
2016-06-29 14:00:00 cmd 5
2016-06-29 14:00:00 cmd_event timer_7
2016-06-29 14:00:00 cmd_nr 5
2016-06-27 21:13:36 e_Urlaub_STATE nein
2016-06-29 14:00:00 state cmd_5
2016-06-28 23:59:00 timer_10_c6 29.06.2016 23:59:00|06
2016-06-29 07:00:00 timer_1_c2 30.06.2016 05:30:00|124
2016-06-29 07:00:00 timer_2_c2 30.06.2016 07:00:00|124
2016-06-29 12:00:00 timer_3_c3 30.06.2016 05:30:00|3
2016-06-29 12:00:00 timer_4_c3 30.06.2016 12:00:00|3
2016-06-28 23:59:00 timer_5_c4 29.06.2016 05:30:00|5
2016-06-28 23:59:00 timer_6_c4 29.06.2016 23:59:00|5
2016-06-28 23:59:00 timer_7_c5 29.06.2016 14:00:00|1234
2016-06-28 23:59:00 timer_8_c5 29.06.2016 23:59:00|1234
2016-06-28 23:59:00 timer_9_c6 29.06.2016 08:00:00|06
Condition:
0 InternalDoIf($hash,'Urlaub','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "ja"
1 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"124")
2 DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"3")
3 DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"5")
4 DOIF_time($hash,$hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"1234")
5 DOIF_time($hash,$hash->{realtime}{8},$hash->{realtime}{9},$wday,$hms,"06")
Days:
0 124
1 124
2 3
3 3
4 5
5 5
6 1234
7 1234
8 06
9 06
Devices:
0 Urlaub
all Urlaub
Do:
0:
0 set Keller_WarmwasserPumpe off
1:
0 set Keller_WarmwasserPumpe on
2:
0 set Keller_WarmwasserPumpe on
3:
0 set Keller_WarmwasserPumpe on
4:
0 set Keller_WarmwasserPumpe on
5:
0 set Keller_WarmwasserPumpe on
6:
0 set Keller_WarmwasserPumpe off
Helper:
event timer_7
globalinit 1
last_timer 10
sleeptimer -1
timerdev
timerevent timer_7
triggerDev
timerevents:
timer_7
timereventsState:
state: nein
triggerEvents:
timer_7
triggerEventsState:
state: nein
Internals:
0 Urlaub:STATE
all Urlaub:STATE
Interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
Itimer:
Localtime:
0 1467257400
1 1467262800
2 1467257400
3 1467280800
4 1467171000
5 1467237540
6 1467201600
7 1467237540
8 1467180000
9 1467237540
Readings:
Realtime:
0 05:30:00
1 07:00:00
2 05:30:00
3 12:00:00
4 05:30:00
5 23:59:00
6 14:00:00
7 23:59:00
8 08:00:00
9 23:59:00
Regexp:
0:
1:
2:
3:
4:
5:
All:
State:
Time:
0 05:30:00
1 07:00:00
2 05:30:00
3 12:00:00
4 05:30:00
5 23:59:00
6 14:00:00
7 23:59:00
8 08:00:00
9 23:59:00
Timecond:
0 1
1 1
2 2
3 2
4 3
5 3
6 4
7 4
8 5
9 5
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Timers:
1 0 1
2 2 3
3 4 5
4 6 7
5 8 9
Trigger:
Triggertime:
1467237540:
localtime 1467237540
Hash:
1467257400:
localtime 1467257400
Hash:
1467262800:
localtime 1467262800
Hash:
1467280800:
localtime 1467280800
Hash:
Attributes:
Zitat von: RalfR am 29 Juni 2016, 20:13:10
wie setze ich das Attribute
do always
sorry bin da noch recht neu dabei
der LOG läuft erstmals und die Version ist die
98_DOIF.pm 11314 2016-04-26 18:29:24Z damian-s
Und wo kann ich das Log dann finden ?
Gruss und Danke
Zur Klärung dieser essentiellen Fragen solltes Du Dich mit den Grundfunktionen des Frontends vertraut machen und Dir mal die Menüpunkte ansehen, siehe auch http://www.fhemwiki.de/wiki/Erste_Schritte_in_fhem
Zitat von: RalfR am 29 Juni 2016, 20:33:18
Vielen Dank für die ausführliche Antwort, habe das attr do allways gefunden
nun das List meiner nicht richtig funktionierenden DOIF
Internals:
DEF ([Urlaub] eq "ja")
(set Keller_WarmwasserPumpe off)
DOELSEIF ([05:30-07:00|124])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-12:00|3])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([05:30-23:59|5])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([14:00-23:59|1234])
(set Keller_WarmwasserPumpe on)
DOELSEIF ([08:00-23:59|06])
(set Keller_WarmwasserPumpe on)
DOELSE (set Keller_WarmwasserPumpe off)
NAME di_WarmwasserPumpe
NR 122
NTFY_ORDER 50-di_WarmwasserPumpe
STATE cmd_5
TYPE DOIF
Readings:
2016-06-27 21:13:36 Device Urlaub
2016-06-29 14:00:00 cmd 5
2016-06-29 14:00:00 cmd_event timer_7
2016-06-29 14:00:00 cmd_nr 5
2016-06-27 21:13:36 e_Urlaub_STATE nein
2016-06-29 14:00:00 state cmd_5
2016-06-28 23:59:00 timer_10_c6 29.06.2016 23:59:00|06
2016-06-29 07:00:00 timer_1_c2 30.06.2016 05:30:00|124
2016-06-29 07:00:00 timer_2_c2 30.06.2016 07:00:00|124
2016-06-29 12:00:00 timer_3_c3 30.06.2016 05:30:00|3
2016-06-29 12:00:00 timer_4_c3 30.06.2016 12:00:00|3
2016-06-28 23:59:00 timer_5_c4 29.06.2016 05:30:00|5
2016-06-28 23:59:00 timer_6_c4 29.06.2016 23:59:00|5
2016-06-28 23:59:00 timer_7_c5 29.06.2016 14:00:00|1234
2016-06-28 23:59:00 timer_8_c5 29.06.2016 23:59:00|1234
2016-06-28 23:59:00 timer_9_c6 29.06.2016 08:00:00|06
Condition:
0 InternalDoIf($hash,'Urlaub','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "ja"
1 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"124")
2 DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"3")
3 DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"5")
4 DOIF_time($hash,$hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"1234")
5 DOIF_time($hash,$hash->{realtime}{8},$hash->{realtime}{9},$wday,$hms,"06")
Days:
0 124
1 124
2 3
3 3
4 5
5 5
6 1234
7 1234
8 06
9 06
Devices:
0 Urlaub
all Urlaub
Do:
0:
0 set Keller_WarmwasserPumpe off
1:
0 set Keller_WarmwasserPumpe on
2:
0 set Keller_WarmwasserPumpe on
3:
0 set Keller_WarmwasserPumpe on
4:
0 set Keller_WarmwasserPumpe on
5:
0 set Keller_WarmwasserPumpe on
6:
0 set Keller_WarmwasserPumpe off
Helper:
event timer_7
globalinit 1
last_timer 10
sleeptimer -1
timerdev
timerevent timer_7
triggerDev
timerevents:
timer_7
timereventsState:
state: nein
triggerEvents:
timer_7
triggerEventsState:
state: nein
Internals:
0 Urlaub:STATE
all Urlaub:STATE
Interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
Itimer:
Localtime:
0 1467257400
1 1467262800
2 1467257400
3 1467280800
4 1467171000
5 1467237540
6 1467201600
7 1467237540
8 1467180000
9 1467237540
Readings:
Realtime:
0 05:30:00
1 07:00:00
2 05:30:00
3 12:00:00
4 05:30:00
5 23:59:00
6 14:00:00
7 23:59:00
8 08:00:00
9 23:59:00
Regexp:
0:
1:
2:
3:
4:
5:
All:
State:
Time:
0 05:30:00
1 07:00:00
2 05:30:00
3 12:00:00
4 05:30:00
5 23:59:00
6 14:00:00
7 23:59:00
8 08:00:00
9 23:59:00
Timecond:
0 1
1 1
2 2
3 2
4 3
5 3
6 4
7 4
8 5
9 5
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Timers:
1 0 1
2 2 3
3 4 5
4 6 7
5 8 9
Trigger:
Triggertime:
1467237540:
localtime 1467237540
Hash:
1467257400:
localtime 1467257400
Hash:
1467262800:
localtime 1467262800
Hash:
1467280800:
localtime 1467280800
Hash:
Attributes:
Das DOIF hat doch richtig geschaltet
Zitat2016-06-29 14:00:00 cmd_event timer_7
und
Zitat2016-06-29 14:00:00 state cmd_5
, heute ist 4.
Leider nein, heute morgen um 7.00 Uhr hat es abgeschalten obwohl dieses am Mittwoch nicht sein soll. Und weshalb ist heute 4, dachte Mittwoch ist 3 ??
Gruss
Ralf
was für ne Server-Hardware hast du denn? stimmt bei der das Datum und die Zeit??
EDIT:
Auszug aus der Comandreff:
Wochentagsteuerung back
Hinter der Zeitangabe kann ein oder mehrere Wochentage als Ziffer getrennt mit einem Pipezeichen | angegeben werden. Die Syntax lautet:
[<time>|012345678] 0-8 entspricht: 0-Sonntag, 1-Montag, ... bis 6-Samstag sowie 7 für Wochenende und Feiertage (entspricht $we) und 8 für Arbeitstage (entspricht !$we)
Anwendungsbeispiel: Radio soll am Wochenende und an Feiertagen um 08:30 Uhr eingeschaltet und um 09:30 Uhr ausgeschaltet werden. An Arbeitstagen soll das Radio um 06:30 Uhr eingeschaltet und um 07:30 Uhr ausgeschaltet werden.
define di_radio DOIF ([06:30|8] or [08:30|7]) (set radio on) DOELSEIF ([07:30|8] or [09:30|7]) (set radio off)
Anstatt einer Zifferkombination kann ein Status oder Reading in eckigen Klammern angegeben werden. Dieser muss zum Triggerzeitpunkt mit der gewünschten Ziffernkombination für Wochentage, wie oben definiert, belegt sein.
Anwendungsbeispiel: Der Wochentag soll über einen Dummy bestimmt werden.
define dummy Wochentag
set Wochentag 135
define di_radio DOIF ([06:30|[Wochentag]]) (set radio on) DOELSEIF ([07:30|[Wochentag]]) (set radio off)
wenn mein Kalender nich kaputt is, is Heute Mittwoch - also '4'
Zitat von: RalfR am 29 Juni 2016, 20:43:07
Leider nein, heute morgen um 7.00 Uhr hat es abgeschalten obwohl dieses am Mittwoch nicht sein soll. Und weshalb ist heute 4, dachte Mittwoch ist 3 ??
Gruss
Ralf
Heute hat es um 7 Uhr abgeschaltet, weil die angegebene Zeitspanne DOELSEIF ([05:30-07:00|124]) dann endet, weil keine andere Bedingung zutrifft, tritt DOELSE in Kraft.
Hmmmmm ????? auch am Mittwoch dachte
Sonntag 0,
Montag 1,
Dienstag 2,
Mittwoch 3,
Donnerstag 4,
Freitag 5,
Sonntag 6,
WE 7,
nicht WE 8
Mein Fehler, ich war gedanklich schon bei Donnerstag ::)
8)mein Kalender ist nicht kaputt, aber mein Kopf offensichtlich. Heute ist natürlich nicht '4', sondern '3'
damit kämen wir wieder zu dem aktuellen Datum deines Servers.
Da wir jetzt bei Mittwoch "3" sind sollte eigentlich alles von 5.30 bis 12.00 laufen und nicht um 7.00 abschalten
Raspberry meint :
Mi 29. Jun 20:57:10 CEST 2016
jo, schon klar. Da deinDOIF richtig geschrieben ist, das DOIF-Modul nicht kaputt ist und der Perl-Interpreter wohl auch nicht, muss es wohl ann was anderem liegen...
Und da fällt mir nur grad ein, dass evtl. die Zeit / das Datum deines Server falsch ist.
die Idee ist gut aber wie du in meiner vorherigen Antwort sehen kannst stimmt das Datum,Zeit auch.
Hoffe ich bzw. wir können das Andere noch finden ;)
Es gab, soweit ich mich erinnere vor etwa 1/2 Jahr ein ähnliches Problem hier im Forum, kann aber leider nicht sagen in welchem Thread und welche Lösung/Ursache es war.
Eventuell doch ein Problem im DOIF Modul ? (Die Suche hat leider nichts gefunden)
hm... ist schon eher unwahrscheinlich - ich nutze selber einige DOIF mit Zeit und Tag Angabe und die funktionieren alle.
Log das DOIF doch mal ein paar Tage und schau nochmal dabei
Das DOIF Modul wird zu jedem der angegebenen Zeitpunkte getriggert, unabhängig, ob der Wochentag zutrifft oder nicht, und führt, wenn die Bedingung nicht wahr ist, den DOELSE-Fall aus. D. h. bei dir wird jeden Tag off ausgeführt.
Du solltest deine Definition auf zwei Zustände reduzieren (on und off) und kein do always setzen.
Die Definition sollte dann so aussehen:
DOELSEIF ([05:30-07:00|124] or [05:30-12:00|3] or [05:30-23:59|5] or [14:00-23:59|1234] or [08:00-23:59|06])
(set keller_WarmwasserPumpe on)
DOELSE
(set Keller_WarmwasserPumpe off)
Gruß
Damian
@Damian, danke für den Tip. 8)
Habe das ganze mal geändert und werde es beobachten bzw loggen.
Melde mich wieder sobald ich mehr Infos habe.
Für ([Urlaub] eq "ja") könntest Du die Bedingung mit ((...) and [?Urlaub] ne "nein")
ergänzen, damit die Pumpe als DOELSE Fall im Urlaub abgeschaltet wird und die Zeitspannen nicht triggern.
Das mit dem Urlaub hatte ich eingebaut, um den Fehler einzugrenzen habe ich das ganze etwas minimiert aber danke für deine Info
Zitat von: RalfR am 30 Juni 2016, 08:17:33um den Fehler einzugrenzen habe ich das ganze etwas minimiert
Und damit einen neuen eingebaut.
[Urlaub] wird nur beim Triggern abgefragt, damit arbeitet dein Konstrukt nicht wie gewünscht (im GGsatz zu dem von
Ellert).
Zitat von: Ellert am 29 Juni 2016, 23:30:56
Für ([Urlaub] eq "ja") könntest Du die Bedingung mit ((...) and [?Urlaub] ne "nein")
ergänzen, damit die Pumpe als DOELSE Fall im Urlaub abgeschaltet wird und die Zeitspannen nicht triggern.
müßte ich aber nicht auf [?Urlaub]ne "ja" abfragen da die Bedingung ja im Nichturlaubfall greifen soll im Urlaub ja soll die Pumpe ja aus sein
Ja, Du hast Recht. Ich hatte erst 'ne "ja"' geschrieben, fand aber 'eq "nein"' verständlicher, dabei habe ich vergessen 'ne' in 'eq' zu ändern.
Danke, so funktioniert es :) 8)
Gruss
Ralf