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
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
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
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
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
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
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.
(([05:15-09:00|8] or [15:30-01:00]) and [THLP:luminosity] < 35) (set Fl_Eingang on) DOELSE (set Fl_Eingang off)
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?
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
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
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?
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
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
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
Ob es nun hier rein passt, weis ich jetzt nicht ganz genau!
Ich habe auch eine Frage zu DOIF:
Wie bekomme ich es hin, das etwas jede Stunde, zur vollen Stunde, getriggert wird?
Meine Idee wäre:
define test DOIF ([10:00-21:00]) ({WandUhr()})
attr test do always
attr test wait 3600
Es soll also jede Stunde die Sub Wanduhr() aufgerufen werden.
Oder würde es so gehen?
define test DOIF ([10:00] or [+01:00]) ({WandUhr()})
attr test do always
Für den 2. fall müsste man dann aber noch ein dummy und eine DOIF bauen, die das erste DOIF (test) zu einem bestimmten Zeitpunkt abschaltet.
Hat da jemand eine Idee?
Steve Jobs wird sich sicher im Grab umdrehen aber es funktioniert:
define at_hour10 at 10:00 {WandUhr()}
define at_hour11 at 11:00 {WandUhr()}
define at_hour12 at 12:00 {WandUhr()}
...
define at_hour21 at 21:00 {WandUhr()}
Gruss
flurin
Zitat von: Toto1973 am 13 März 2015, 11:59:48
Ob es nun hier rein passt, weis ich jetzt nicht ganz genau!
Ich habe auch eine Frage zu DOIF:
Wie bekomme ich es hin, das etwas jede Stunde, zur vollen Stunde, getriggert wird?
Meine Idee wäre:
define test DOIF ([10:00-21:00]) ({WandUhr()})
attr test do always
attr test wait 3600
Es soll also jede Stunde die Sub Wanduhr() aufgerufen werden.
Oder würde es so gehen?
define test DOIF ([10:00] or [+01:00]) ({WandUhr()})
attr test do always
Für den 2. fall müsste man dann aber noch ein dummy und eine DOIF bauen, die das erste DOIF (test) zu einem bestimmten Zeitpunkt abschaltet.
Hat da jemand eine Idee?
So wird es nicht funktionieren.
DOIF kann noch keine Wiederholungen zu festen Zeiten, kommt später mal.
Solange kannst du aber at nehmen:
Zitat aus der Commandref zu at:
ZitatalignTime
Nur für relative Definitionen: Stellt den Zeitpunkt der Ausführung des Befehls so, dass er auch zur alignTime ausgeführt wird. Dieses Argument ist ein timespec. Siehe oben fü die Definition
Beispiel:
# Stelle sicher das es gongt wenn eine neue Stunde beginnt.
define at2 at +*01:00 set Chime on-for-timer 1
attr at2 alignTime 00:00
Gruß
Damian
Mit einem DOIF und einem Dummy könnte man es vermutlich so machen (ungetestet):
define test DOIF ([[Uhrzeit]])
(
{WandUhr()},
{my $t=sprintf("%02d",$hour+1);;fhem("set Uhrzeit $t:00")},
IF([Uhrzeit] eq "22:00")(set Uhrzeit "10:00"),
)
Vorher müsste man Uhrzeit einmal auf einen halbwegs sinnvollen Wert setzen (z. B. die nächste volle Stunde)
Zitat von: Brockmann am 13 März 2015, 16:35:34
Mit einem DOIF und einem Dummy könnte man es vermutlich so machen (ungetestet):
define test DOIF ([[Uhrzeit]])
(
{WandUhr()},
{my $t=sprintf("%02d",$hour+1);;fhem("set Uhrzeit $t:00")},
IF([Uhrzeit] eq "22:00")(set Uhrzeit "10:00"),
)
Vorher müsste man Uhrzeit einmal auf einen halbwegs sinnvollen Wert setzen (z. B. die nächste volle Stunde)
Einen ähnlichen Ansatz hatte ich auch :)
define clock dummy
define di_hour DOIF ([[clock]])
({WandUhr();;
if($hour >= 10 and $hour <= 21)
{my $t = sprintf("%02d:00",$hour+1);; fhem("set clock $t")}
else {fhem("set clock 10:00")}
})
Hallo,
so wie von Damian vorgeschlagen würde ich das mit einem at lösen:
define Zeitschaltuhr at +*01:00:00 {WandUhr()}
attr Zeitschaltuhr alignTime 00:00
attr Zeitschaltuhr disabledForIntervals 21:01-08:59
Ich meine mich dunkel zu erinnern das Rudi das disabledForIntervals über Mitternacht gefixt hat.
Wenn nicht sollte sowas evtl. klappen:
attr Zeitschaltuhr disabledForIntervals 21:01-24:00 00:00-08:59
Grüße
Vielen dank für die Antworten.
Ich hatte eigentlich gehofft, man würde hier mit wenig Code auskommen.
Weil dann kann ich auch eine DOIF nehmen, bei der ich jede Stunde angebe und mit or verbinde ;-)
Beispiel:
define test DOIF ([09:00] or [10:00] or [11:00] or...) ({WandUhr()})
Zitat von: Toto1973 am 14 März 2015, 00:33:26
Vielen dank für die Antworten.
Ich hatte eigentlich gehofft, man würde hier mit wenig Code auskommen.
Weil dann kann ich auch eine DOIF nehmen, bei der ich jede Stunde angebe und mit or verbinde ;-)
Beispiel:
define test DOIF ([09:00] or [10:00] or [11:00] or...) ({WandUhr()})
Klar! KISS (keep it simple stupid) ist immer gut :)
Eine Variante habe ich noch:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({if ($hour >= 10 and $hour <= 21)
{WandUhr()}},attr di_hour wait 3600)
attr di_hour do always
if ($hour >= 10 and $hour <= 21) könntest Du noch in WandUhr() einfügen, dann sieht es so aus:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({WandUhr()},attr di_hour wait 3600)
attr di_hour do always
Zitat von: flurin am 14 März 2015, 07:31:12
Klar! KISS (keep it simple stupid) ist immer gut :)
Eine Variante habe ich noch:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({if ($hour >= 10 and $hour <= 21)
{WandUhr()}},attr di_hour wait 3600)
attr di_hour do always
if ($hour >= 10 and $hour <= 21) könntest Du noch in WandUhr() einfügen, dann sieht es so aus:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({WandUhr()},attr di_hour wait 3600)
attr di_hour do always
Wozu das wait?
Das sollte schon ausreichen:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and [?09:00-21:00]) ({WandUhr()})
attr di_hour do always
Gruß
Damian
Zitat von: Damian am 14 März 2015, 07:58:32
Wozu das wait?
Das sollte schon ausreichen:
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and [?09:00-21:00]) ({WandUhr()})
attr di_hour do always
Gruß
Damian
Ja, richtig! ich war noch am üben :)
Aber jetzt ist das Kind geboren. Ich denke, diese Lösung kann man generell verwenden.
Gruss
flurin
Zitat von: flurin am 14 März 2015, 08:10:23
Aber jetzt ist das Kind geboren. Ich denke, diese Lösung kann man generell verwenden.
Ich hatte doch eine Ahnung, dass es noch kürzer geht. :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).
Und wem das nun noch zuviel Code für diese Aufgabe ist, der sollte sich überlegen, ob FHEM das richtige für ihn ist. ;)
Zitat von: Brockmann am 14 März 2015, 09:00:46
Ich hatte doch eine Ahnung, dass es noch kürzer geht. :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).
Und wem das nun noch zuviel Code für diese Aufgabe ist, der sollte sich überlegen, ob FHEM das richtige für ihn ist. ;)
Wenn es sich bewährt, dann kommt das in die Commandref. Diese Lösung dürfte noch mehr Möglichkeiten bieten als alignTime bei at.
Weiß denn überhaupt jemand was denn alignTime 01:01 bedeutet?
Und wenn man es mit DOIF macht, dann sollte man auch gleich die Vorteile des Moduls nutzen ;)
define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and ([?10:00-22:01|7] or [?07:00-21:01|8])) ({WandUhr()})
attr di_hour do always
So kann man am Wochenende länger schlafen ;)
Gruß
Damian
Ich wusste, das ich in diesem Thread die Experten finden würde :-D
Vielen Dank, das gefällt mir weitaus besser und wird jetzt direkt eingebaut!
So lässt sich die WandUhr nun auch über ein dummy schalten, das z.B. erst auf on gesetzt wird, wenn der Wecker geklingelt hat.
Hab mir da nämlich auch einen für FHEM zusammen gebastelt.
Der simuliert erst ein WackupLight und weckt mich dann mit Ansage der Uhrzeit, Datum und Wetterbericht und spielt dann für 10 Minuten Radio.
FHEM ist einfach genial!
Zitat von: Damian am 14 März 2015, 09:10:16
Weiß denn überhaupt jemand was denn alignTime 01:01 bedeutet?
Alle die Leute, die wissen, was waitdel 0:2 bedeutet! *duckundweg* ;)
Zitat von: Brockmann am 14 März 2015, 09:00:46
Ich hatte doch eine Ahnung, dass es noch kürzer geht. :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).
Geschmacksache, ich finde DOIF diesbezüglich flexibler.
Meine imaginäre Wanduhr beispielsweise hat noch einen Viertelstunden-Gong:
define di_quarter DOIF ([{sprintf("%02d:%02d",$hour,$min+1)}] and ($min == 15 or $min == 30 or $min == 45)) ({Clock("quarter")})
Gruss
flurin
Zitat von: Brockmann am 14 März 2015, 09:18:42
Alle die Leute, die wissen, was waitdel 0:2 bedeutet! *duckundweg* ;)
Immerhin gibt es Beispiele zu waitdel ;)
Was ist denn nun alignTime 01:01 mit +*00:10?
Ich habe es noch nicht verstanden.
Gruß
Damian
Ergänzung: Es ist einfacher eine Bedingung positiv zu definieren:
[09:00-21:00]
ist besser als:
attr Zeitschaltuhr disabledForIntervals 21:01-08:59
Gruss
flurin
Nur mit dem Unterschied das diese Zeitangabe bei diesem Attribut nicht klappen wird.
Und der Rest ist Geschmackssache ;D
Zitat von: Puschel74 am 14 März 2015, 09:37:03
Nur mit dem Unterschied das diese Zeitangabe bei diesem Attribut nicht klappen wird.
Ja klar!, dafür ist ein Attribut gar nicht nötig. Die Bedingung wird im DOIF(...) am richtigen Ort definiert.
Zitat von: Puschel74 am 14 März 2015, 09:37:03
Nur mit dem Unterschied das diese Zeitangabe bei diesem Attribut nicht klappen wird.
Und der Rest ist Geschmackssache ;D
Es ist natürlich jedem selbst überlassen, was er am besten versteht und was nicht. Ich gebe nur zu bedenken, dass at gerade einen Zeitpunkt definiert.
Bei DOIF kannst du in einem Modul auf diese Weise beliebig viele Zeiten angeben mit beliebigen Alignements für jede Zeit separat.
Unabhängig davon finde ich alignTime persönlich nicht unbedingt intuitiver, spätestens nach dem ich ausprobiert habe, dass 00:01 01:01 02:01 .... das Gleiche bewirkt!?
Gruß
Damian
@Damian
Ih bin nicht sicher, ob so was nötig ist:
([{sprintf("%02d:00",($hour+1)%24)}] (...)
falls $hour = 24 bei Mitternacht wird.
Zitat von: flurin am 14 März 2015, 10:26:37
@Damian
Ih bin nicht sicher, ob so was nötig ist:
([{sprintf("%02d:00",($hour+1)%24)}] (...)
falls $hour = 24 bei Mitternacht wird.
dürfte egal sein: 00:00 ist das Gleiche wie 24:00
Gruß
Damian
Zitat von: Damian am 14 März 2015, 10:30:08
dürfte egal sein: 00:00 ist das Gleiche wie 24:00
Gruß
Damian
bei $min gibt es ein error, wenn $min+x > 60 ist.
Zitat von: flurin am 14 März 2015, 10:33:00
bei $min gibt es ein error, wenn $min+x > 60 ist.
ja, da macht das sind modulo zu rechnen, wir sprachen hier von $hour.
Gruß
Damian
Was das Ganze jetzt mit dem Viertelstunden Gong angeht, so habe ich das jetzt so gelöst:
define Wanduhr DOIF ([Wanduhr_dummy:state] eq "on" and [{sprintf("%02d:00",$hour+1)}]) ({WandUhr()})
DOELSEIF ([{sprintf("%02d:15",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 90")})
DOELSEIF ([{sprintf("%02d:30",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 90")})
DOELSEIF ([{sprintf("%02d:45",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 90")})
Zitat von: Toto1973 am 14 März 2015, 12:15:17
Was das Ganze jetzt mit dem Viertelstunden Gong angeht, so habe ich das jetzt so gelöst:
define Wanduhr DOIF ([Wanduhr_dummy:state] eq "on" and [{sprintf("%02d:00",$hour+1)}]) ({WandUhr()})
DOELSEIF ([{sprintf("%02d:15",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 90")})
DOELSEIF ([{sprintf("%02d:30",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 90")})
DOELSEIF ([{sprintf("%02d:45",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 90")})
Eine kleine Optimierung:
define Wanduhr DOIF ([Wanduhr_dummy:state] eq "on" and [{sprintf("%02d:00",$hour+1)}]) ({wall_clock("hour")})
DOELSEIF ([{sprintf("%02d:15",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("quarter")})
DOELSEIF ([{sprintf("%02d:30",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("quarter")})
DOELSEIF ([{sprintf("%02d:45",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("quarter")})
in 99_myUtils.pm einfügen:
sub wall_clock($)
{
my ($gong) = @_;
if ($gong eq "hour") {
WandUhr(); # oder den Code von WandUhr hier einfügen
} else {
system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 90");
}
}
Der Gong lässt sich somit an einem Ort ändern.
Gruss
flurin
Bei meine BigBen Simulation ist es ja so, das alle Viertel Stunde ein anderer Gong (Melodiefolge), so wie beim Original, erfolgt. Daher musste ich die 3 Dateien angeben.
Dann müsste man auch die Minuten in der Sub noch mit abfragen!
Zitat von: Toto1973 am 15 März 2015, 16:02:19
Bei meine BigBen Simulation ist es ja so, das alle Viertel Stunde ein anderer Gong (Melodiefolge), so wie beim Original, erfolgt. Daher musste ich die 3 Dateien angeben.
Dann müsste man auch die Minuten in der Sub noch mit abfragen!
das habe ich glatt übersehen!
evtl. so aber es bringt nicht viel:
define Wanduhr DOIF ([Wanduhr_dummy:state] eq "on" and [{sprintf("%02d:00",$hour+1)}]) ({wall_clock("hour")})
DOELSEIF ([{sprintf("%02d:15",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("BigBen_15.mp3")})
DOELSEIF ([{sprintf("%02d:30",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("BigBen_30.mp3")})
DOELSEIF ([{sprintf("%02d:45",$hour+1)}] and [Wanduhr_dummy:state] eq "on") ({wall_clock("BigBen_45.mp3")})
sub wall_clock($)
{
my ($gong) = @_;
if ($gong eq "hour") {
WandUhr(); # oder den Code von WandUhr hier einfügen
} else {
my $bigben = "mplayer /opt/fhem/Sound/".$gong." -volume 90";
system ($bigben);
}
}
Da man ja eh die 3 DOELSEIF mit angeben muss, kann man den mplayer-Aufruf auch direkt eintragen.
Hallo,
folgendes Problem:
getriggert werden soll samstags und an Geburtstagen von 14:30-21:30.
So wird das m.E. nicht funktionieren, oder?
DOIF ( [14:30-21:30|5] or [?hl.01.Geburtstag] ne "none")
(set blabla on)
müsste man wahrscheinlich so machen:
DOIF ( [14:30-21:30] and (({$wday =~ m/[5]/}) or [?hl.01.Geburtstag] ne "none"))
(set blabla on)
oder geht das doch einfacher?
Christian
Zitat von: Spartacus am 18 März 2015, 21:27:42
Hallo,
folgendes Problem:
getriggert werden soll samstags und an Geburtstagen von 14:30-21:30.
So wird das m.E. nicht funktionieren, oder?
DOIF ( [14:30-21:30|5] or [?hl.01.Geburtstag] ne "none")
(set blabla on)
müsste man wahrscheinlich so machen:
DOIF ( [14:30-21:30] and (({$wday =~ m/[5]/}) or [?hl.01.Geburtstag] ne "none"))
(set blabla on)
oder geht das doch einfacher?
Christian
Das erste geht nicht. Das zweite dann eher so:
DOIF ( [14:30-21:30] and ($wday == 5 or [?hl.01.Geburtstag] ne "none"))
(set blabla on)
Gruß
Damian