DOIF Zeitschaltuhr triggert falsch

Begonnen von Spartacus, 06 März 2015, 10:00:01

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
sehe gerade den Fehler nicht:
heute (Freitag) hat die Zirkulationspumpe um 09:30 abgeschaltet. Sollte aber um 08:15 abschalten.
Wieso triggert 09:30 aus der ersten Zeile?  hl.01.Feiertag ist auf "none"
Mo-Fr.        => 06:30-08:15 u. 17:30-20:00
Sa.           => 07:30-09:30 u. 15:30-20:30
So.           => 08:30-13:00 u. 16:30.20:30
an Feiertagen => 08:30-11:00 u. 16:30-20:00


(([07:30-09:30|5] or [15:30-20:30|5]) and [?hl.01.Feiertag] eq "none" or
([08:30-13:00|6] or [16:30-20:30|6]) and [?hl.01.Feiertag] eq "none" or
([06:30-08:15|8] or [17:30-20:00|8]) and [?hl.01.Feiertag] eq "none" or
([08:30-11:00]   or [16:30-20:00])   and [?hl.01.Feiertag] ne "none")
(set KG.ss.SA.ZirkuPumpe on)
DOELSE (set KG.ss.SA.ZirkuPumpe off)

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 06 März 2015, 10:00:01
Hallo,
sehe gerade den Fehler nicht:
heute (Freitag) hat die Zirkulationspumpe um 09:30 abgeschaltet. Sollte aber um 08:15 abschalten.
Wieso triggert 09:30 aus der ersten Zeile?  hl.01.Feiertag ist auf "none"
Mo-Fr.        => 06:30-08:15 u. 17:30-20:00
Sa.           => 07:30-09:30 u. 15:30-20:30
So.           => 08:30-13:00 u. 16:30.20:30
an Feiertagen => 08:30-11:00 u. 16:30-20:00


(([07:30-09:30|5] or [15:30-20:30|5]) and [?hl.01.Feiertag] eq "none" or
([08:30-13:00|6] or [16:30-20:30|6]) and [?hl.01.Feiertag] eq "none" or
([06:30-08:15|8] or [17:30-20:00|8]) and [?hl.01.Feiertag] eq "none" or
([08:30-11:00]   or [16:30-20:00])   and [?hl.01.Feiertag] ne "none")
(set KG.ss.SA.ZirkuPumpe on)
DOELSE (set KG.ss.SA.ZirkuPumpe off)

Christian

Um 08:15 ist doch [07:30-09:30|5 noch wahr am Freitag, daher wird nicht abgeschaltet.

Es wird eine Erweiterung geben, wo man die Bedingung unabhängig von einander für ein Kommando angeben kann.
Das sieht dann so aus:

(([07:30-09:30|5] or [15:30-20:30|5]) and [?hl.01.Feiertag] eq "none") | ([08:30-13:00|6] or [16:30-20:30|6]) and [?hl.01.Feiertag] eq "none")....

Gruß

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

Spartacus

Hallo Damian,
jetzt verstehe ich gar nichts mehr!

wieso ist am Freitag um 08:15 diese Bedingung wahr? [07:30-09:30|5]
"4" steht doch für Freitag und "5" steht doch für Samstag, oder?

Ich verstehe den Ausdruck so, dass nur samstags ("5") von 07:30 bis 09:30 geschaltet wird. Wieso wird die Bedingung freitags wahr?

Ich verstehe in diesem Sinne auch die Erweiterung mit "|" nicht wirklich

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 06 März 2015, 15:34:01
Hallo Damian,
jetzt verstehe ich gar nichts mehr!

wieso ist am Freitag um 08:15 diese Bedingung wahr? [07:30-09:30|5]
"4" steht doch für Freitag und "5" steht doch für Samstag, oder?

Ich verstehe den Ausdruck so, dass nur samstags ("5") von 07:30 bis 09:30 geschaltet wird. Wieso wird die Bedingung freitags wahr?

Ich verstehe in diesem Sinne auch die Erweiterung mit "|" nicht wirklich

Christian

Auszug aus der Commandref zu DOIF:

Zitat(0-6 entspricht Sonntag bis Samstag) sowie 7 für $we und 8 für !$we

Zähle mal durch ;)

Gruß

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

Spartacus

Damian,
ich bin ja so bekloppt! Ich habe Montag mit "0" und Sonntag mit "6"gezählt und offenbar durchgehend falsch bei mir implementiert. Junge, Junge, da sind jetzt zig Steuerungen falsch und mir ist es erst hierbei aufgefallen!

DANKE!
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 06 März 2015, 16:14:20
Damian,
ich bin ja so bekloppt! Ich habe Montag mit "0" und Sonntag mit "6"gezählt und offenbar durchgehend falsch bei mir implementiert. Junge, Junge, da sind jetzt zig Steuerungen falsch und mir ist es erst hierbei aufgefallen!

DANKE!
Christian

Ich merke mir, die Woche beginnt mit Montag also 1, Sonntag ist ein besonderer Tag daher 0.

Gruß

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

knochenmuehle

Habe ein ähnliches Problem ...

([05:15-09:00|8] or [15:30-01:00] and [THLP:luminosity] < 35) (set Fl_Eingang on) DOELSE (set Fl_Eingang off)

schaltet um 05:15 ein und um 09:00 aus obwohl es wie z.B. heute morgen schon um 08:15 einen Helligkeitswert von 39 hatte.
Nachmittags wird korrekt nach Helligkeit eingeschaltet.


marvin78


(([05:15-09:00|8] or [15:30-01:00]) and [THLP:luminosity] < 35) (set Fl_Eingang on) DOELSE (set Fl_Eingang off)

Spartacus

#8
Hallo zusammen,
ich habe noch einmal eine Triggerfrage: Habe heute ein DOIF gebaut, welches über eine Fuktion nun nicht nur die Endzeit, sondern auch die Startzeit berechnet.
([[ontime.GA.ss.SA.Wasserspiel.dum]-[offtime.GA.ss.SA.Wasserspiel.dum]])
(set GA.ss.SA.Wasserspiel on, set offtime.GA.ss.SA.Wasserspiel.dum {(OffTimePumpe())}, set ontime.GA.ss.SA.Wasserspiel.dum {(OnTimePumpe())})
DOELSE
(set GA.ss.SA.Wasserspiel off)


Mir ist nicht ganz klar, ob das korrekt funktionieren wird:
Beim Initialisieren wurden die Zeiten korrekt berechnet:
Für heute ist das 17:30 "ein" und 21:30 "aus" t1 steht auf 17:30 und t2 auf 21:30.
Morgen soll um 14:30 "ein" und um "22:00" ausgeschaltet werden.

Wann wird der neue Einschalt-Timer für morgen aktualisiert? Heute, mit dem Trigger um 17:30 Uhr? Dann wäre alles ok!

Danke für die Rückmeldung,
Christian

Nachtrag:
Funktioniert nicht! Es wird natürlich um 17:30 die  Zeit für den aktuellen Tag berechnet und nicht für morgen. Wie kann man das denn abfangen?  Mir fällt spontan nur ein at ein, welches um 0 Uhr die dummys setzt. Geht das nicht eleganter?
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 11 März 2015, 17:02:48
Hallo zusammen,
ich habe noch einmal eine Triggerfrage: Habe heute ein DOIF gebaut, welches über eine Fuktion nun nicht nur die Endzeit, sondern auch die Startzeit berechnet.
([[ontime.GA.ss.SA.Wasserspiel.dum]-[offtime.GA.ss.SA.Wasserspiel.dum]])
(set GA.ss.SA.Wasserspiel on, set offtime.GA.ss.SA.Wasserspiel.dum {(OffTimePumpe())}, set ontime.GA.ss.SA.Wasserspiel.dum {(OnTimePumpe())})
DOELSE
(set GA.ss.SA.Wasserspiel off)


Mir ist nicht ganz klar, ob das korrekt funktionieren wird:
Beim Initialisieren wurden die Zeiten korrekt berechnet:
Für heute ist das 17:30 "ein" und 21:30 "aus" t1 steht auf 17:30 und t2 auf 21:30.
Morgen soll um 14:30 "ein" und um "22:00" ausgeschaltet werden.

Wann wird der neue Einschalt-Timer für morgen aktualisiert? Heute, mit dem Trigger um 17:30 Uhr? Dann wäre alles ok!

Danke für die Rückmeldung,
Christian

Nachtrag:
Funktioniert nicht! Es wird natürlich um 17:30 die  Zeit für den aktuellen Tag berechnet und nicht für morgen. Wie kann man das denn abfangen?  Mir fällt spontan nur ein at ein, welches um 0 Uhr die dummys setzt. Geht das nicht eleganter?


([[ontime.GA.ss.SA.Wasserspiel.dum]-[offtime.GA.ss.SA.Wasserspiel.dum]])
(set GA.ss.SA.Wasserspiel on)
DOELSE
(set GA.ss.SA.Wasserspiel off, set offtime.GA.ss.SA.Wasserspiel.dum {(OffTimePumpe())}, set ontime.GA.ss.SA.Wasserspiel.dum {(OnTimePumpe())})


Finde ich irgendwo logisch, ohne groß darüber nachzudenken ;)

Gruß

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

Spartacus

Hi Damian,
Du kennst mich ja! Ich musste halt länger drüber nachdenken....deshalb mein verspäteter Nachtrag! :-)

Aber hast Du ggf. eine bessere Idee, als das über ein at um 0:00 Uhr zu lösen?

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 11 März 2015, 19:01:57
Hi Damian,
Du kennst mich ja! Ich musste halt länger drüber nachdenken....deshalb mein verspäteter Nachtrag! :-)

Aber hast Du ggf. eine bessere Idee, als das über ein at um 0:00 Uhr zu lösen?

Christian
Ich habe dir doch einen Vorschlag ohne at gemacht, oder was willst du noch vereinfachen?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hi Damian,
ja, das habe ich schon gesehen, aber das ist m.E. nichts Anderes als mein Code, oder ich verstehe die Funktionsweise mal wieder nicht ganz! :(

Die Dummy-Devices zeigen beispielsweise 17:00 und 21:00.
Dann wird das Wasserspiel von 17:00 bis 21:00 eingeschaltet. Soweit ist das klar!

Mit dem Trigger auf 21:00 wird t1 und t2 neu berechnet. Allerdings berechnen die Routinen immer noch die Zeitwerte für das aktuelle Datum. Dein Code würde funktionieren, wenn der Ausschaltzeitpunkt nach 0:00 Uhr liegen würde, oder?

Hier mal zur Vollständigkeit die SUBs


sub OnTimePumpe ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);


if ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && (ReadingsVal("hl.01.Geburtstag","state","")=~ m/none/) && ($wday =~ m/[1234]/))
{
  return ("21:00:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || (ReadingsVal("hl.01.Geburtstag","state","")!~ m/none/) || ($wday =~ m/[5]/))
{
  return ("14:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","state","") !~ m/none/) || ($wday =~ m/[06]/))
{
  return ("08:30:00")
}
}

sub OffTimePumpe ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);


if ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
  return ("21:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","state","") !~ m/none/) || ($wday =~ m/[56]/))
{
  return ("22:00:00")
}
}

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 11 März 2015, 21:17:38
Hi Damian,
ja, das habe ich schon gesehen, aber das ist m.E. nichts Anderes als mein Code, oder ich verstehe die Funktionsweise mal wieder nicht ganz! :(

Die Dummy-Devices zeigen beispielsweise 17:00 und 21:00.
Dann wird das Wasserspiel von 17:00 bis 21:00 eingeschaltet. Soweit ist das klar!

Mit dem Trigger auf 21:00 wird t1 und t2 neu berechnet. Allerdings berechnen die Routinen immer noch die Zeitwerte für das aktuelle Datum. Dein Code würde funktionieren, wenn der Ausschaltzeitpunkt nach 0:00 Uhr liegen würde, oder?

Hier mal zur Vollständigkeit die SUBs


sub OnTimePumpe ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);


if ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && (ReadingsVal("hl.01.Geburtstag","state","")=~ m/none/) && ($wday =~ m/[1234]/))
{
  return ("21:00:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || (ReadingsVal("hl.01.Geburtstag","state","")!~ m/none/) || ($wday =~ m/[5]/))
{
  return ("14:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","state","") !~ m/none/) || ($wday =~ m/[06]/))
{
  return ("08:30:00")
}
}

sub OffTimePumpe ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);


if ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
  return ("21:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","state","") !~ m/none/) || ($wday =~ m/[56]/))
{
  return ("22:00:00")
}
}

Christian

OK, du hast Recht, an 22:00 Uhr am gleichen Tag habe ich nicht gedacht. Andererseits verstehe ich nicht, warum du den einfachen Code nicht direkt als Bedingung in deinem DOIF angibst. z. B.

DOIF  ((hl.01.Feiertag:tomorrow] =~ "none" and [hl.01.Geburtstag] =~ "none" and [21:00|1234]) or
       (hl.01.Feiertag:tomorrow] =~ "none" or [hl.01.Geburtstag] =~ "none" and [14:30|5]) or
       (hl.01.Feiertag:tomorrow] =~ "none" or [hl.01.Geburtstag] =~ "none" and [08:30|7])
      )
     (set GA.ss.SA.Wasserspiel on)
DOELSEIF (....)
    (set GA.ss.SA.Wasserspiel on)



Dafür brauchst du keine indirekte Zeiten und keine Perlfunktionen. Die Bedingung des DOELSEIF-Falls schaffst du bestimmt alleine.

Gruß

Damian

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

Spartacus

Hi,
vielen Dank Damian, die SUBs sind eigentlich noch nicht final, da kommen noch weitere Bedingungen hinzu und deshalb wollte ich es vom Code her ähnlich halten wie bei der Gartenbeleuchtung.

Aber Du hast recht, ich gucke erst mal, ob ich mit Deinem Beispiel weiter komme und die anderen Bedingungen unterbringen kann...überblicke ich auf die Schnelle nicht!

Das Ausschalten des Devices erfolgt dann analog zum DOIF-Zweig im DOELSEIF-Zweig, wenn ich Deinen Code richtig verstehe!
Danke und Gruß,
Christian

Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R