Hallo zusammen,
ich zweifle langsam an meinen (zugegebenermaßen beschränkten) FHEM-Kenntnissen.
Ich möchte ein Gerät ausschalten, an den Werktagen zu einer anderen Zeit als am Wochenende. Dazu habe ich folgende Definitionen gemacht:
define RegalWohnzimmer_Werktags_OFF at *22:30:00 {if($wday == 1 || $wday == 2 || $wday == 3 || $wday == 4 || $wday == 5 ) {fhem("set ESPEasy_28 off")} }
define RegalWohnzimmer_Wochenende_OFF at *23:30:00 {if($wday == 6 || $wday == 7 ) {fhem("set ESPEasy_28 off")} }
Nur - es funktioniert nict, es wird nicht ausgeschaltet. Ich finde den Fehler einfach nicht...
Danke für Eure Hilfe!
Thomas
Steht was im Log?
Schaltet der Befehl set ESPEasy_28 off wenn Du ihn über die Befehlzeile eingibst?
Funktioniert das at wenn Du nur einen Wochentag prüfst?
Wie wäre es mit einem List?
Falsch sind mind. (Doppelt genäht):
- Der Thread-Titel
- "define" gepostet statt list/raw-list/"copy for forum"
- das Verständnis für den korrekten Wertebereich für $wday
- es ist unklar, ob der Ausführungsteil nie klappt (Syntaxproblem?) oder ob es (im log?) weitere Hinweise gibt?
Sonstiges:
- "Werktag" und "Wochenende" wäre ggf. besser mit !$we bzw. $we abzugrenzen (holiday2we)
- WeekdayTimer wäre eine weitere Option, das "in einem" zu notieren.
Wenn wir bei Alternativen sind, ich finde das komplett im einem DOIF am Besten.
Hallo,
danke an die, die konstruktive Vorschläge machen.
set ESPEasy_28 off
in der Eingabezeile funktioniert.
Das verrückte ist, dass ich die Zeile quasi kopiert habe aus der Definition für ein anderes Gerät und nur die Zeit-, Wochentags- und Gerätedefinitionen angepasst habe.
Und wie würde das "komplett in einen DOIF" aussehen?
Danke für die freundliche Rückmeldung...
Nochmal zum debuggen: copy for forum wirft bei mir das hier aus:
define RegalWohnzimmer_Werktags_OFF at *22:30:00 {if($wday == 1 || $wday == 2 || $wday == 3 || $wday == 4 || $wday == 5 ) {fhem("set ESPEasy_28 off")} }
# COMMAND {if($wday == 1 || $wday == 2 || $wday == 3 || $wday == 4 || $wday == 5 ) {fhem("set ESPEasy_28 off")} }
# DEF *22:30:00 {if($wday == 1 || $wday == 2 || $wday == 3 || $wday == 4 || $wday == 5 ) {fhem("set ESPEasy_28 off")} }
# FUUID 64c24452-f33f-d171-974e-2e8e05d08c10ef59
# NAME RegalWohnzimmer_Werktags_OFF
# NR 22679
# PERIODIC yes
# RELATIVE no
# REP -1
# STATE Next: 22:30:00
# TIMESPEC 22:30:00
# TRIGGERTIME 1690489800
# TRIGGERTIME_FMT 2023-07-27 22:30:00
# TYPE at
# eventCount 1
# .attraggr:
# .attrminint:
# READINGS:
# 2023-07-27 12:17:54 state Next: 22:30:00
#
setstate RegalWohnzimmer_Werktags_OFF Next: 22:30:00
setstate RegalWohnzimmer_Werktags_OFF 2023-07-27 12:17:54 state Next: 22:30:00
Ergo ist die Syntax an sich wohl ok.
Wenn man nur den Teil unter COMMAND in die Eingabezeile wirft, kommt "Please define ... first" raus, was auch keine Überraschung ist, weil es dieses Device bei mir ja in der Tat nicht gibt.
Also nochmal die "unkonstruktive" Frage: Welchen Wertebereich kann $wday annehmen?
(Tipp: es ist keine Überraschung, falls es sonntags nicht funktioniert!)
Zitat von: musicnrw am 27 Juli 2023, 09:58:14Und wie würde das "komplett in einen DOIF" aussehen?
nur als Auszug.
defmod Regel_Arbeit DOIF ([00:38|Mo]) (set ....
DOELSE ()
attr Regel_Arbeit do always
attr Regel_Arbeit weekdays So,Mo,Di,Mi,Do,Fr,Sa,WE,AT
Bei Dir AT und WE
Zitat von: rabehd am 27 Juli 2023, 08:58:40Wenn wir bei Alternativen sind, ich finde das komplett im einem DOIF am Besten.
Mir wird schlecht... *kotz*
Die Aufgabe ist mal wieder nicht auf das einfachste heruntergebrochen.
"Schalte die Regalbeleuchtung um 23:30 Uhr aus, ausser an Werktagen, da eine Stunde früher"
define at1 at *22:30 {fhem("set ESPEasy_28 off") if !$we}
define at2 at *23:30 {fhem("set ESPEasy_28 off")}
Fertig.
Zitat von: Beta-User am 27 Juli 2023, 08:21:55- "Werktag" und "Wochenende" wäre ggf. besser mit !$we bzw. $we abzugrenzen (holiday2we)
Was holiday2we hier für eine Rolle spielen soll, habe ich nicht verstanden.
Hallo Beta-User,
Du hast recht, wenn ich jetzt sehe, dass ich den Sonntag nicht mit "wday == 0" beschreibe, was definitiv mein Fehler war. Nichtsdestotrotz: Jedoch funktioniert es gestern nicht und vorgestern nicht, und da war Dienstag und Mittwoch, und für diese Tage hätte die Definition (eigentlich) passen sollen.
An Betateilchen: Danke für Deine konstruktive Hilfe. Ich werde es später ausprobieren!
Gruß, Thomas
Zitat von: betateilchen am 27 Juli 2023, 14:38:58Die Aufgabe ist mal wieder nicht auf das einfachste heruntergebrochen.
"Schalte die Regalbeleuchtung um 23:30 Uhr aus, ausser an Werktagen, da eine Stunde früher"
define at1 at *22:30 {fhem("set ESPEasy_28 off") if !$we}
define at2 at *23:30 {fhem("set ESPEasy_28 off")}
Fertig.
und jetzt wird mir schlecht ;D
Zitat von: musicnrw am 27 Juli 2023, 14:57:25Jedoch funktioniert es gestern nicht und vorgestern nicht, und da war Dienstag und Mittwoch, und für diese Tage hätte die Definition (eigentlich) passen sollen.
Dein Werktags-at aus dem ersten Beitrag hier funktioniert bei mir einwandfrei, habe das gerade mit 15:05 als Ausführungszeit gestestet.
Zitat von: rabehd am 27 Juli 2023, 15:02:39und jetzt wird mir schlecht
Ich brauche nur zwei Zeilen in der Konfiguration, um die gestellte Aufgabe zu lösen. Theoretisch könnte ich das auch in einer einzigen Zeile machen, aber ich wollte es nachvollziehbar machen.
Wieviele Zeilen brauchst Du mit DOIF?
Du hast ja in Deinem Auszug schon 3 Zeilen FHEM (1 * define + 2 * attr)
Zitat von: betateilchen am 27 Juli 2023, 15:14:12Theoretisch könnte ich das auch in einer einzigen Zeile machen
Irgendwer wird kommen und den Beweis einfordern, deshalb...
define at3 at *22:30:00 {my $cmd ="set ESPEasy_28 off";; if (!$we) { fhem $cmd } else { fhem "define at3a at +01:00:00 $cmd" }}
Aus dem fahrenden Zug und nur mit Tablet ist sowas echt anstrengend 😀
Dann würde ich aber für das temporäre at at3a die Definition mit defmod machen.
Sonst kommt wieder die Frage nach dem roten ? auf.
Zitat von: Nobbynews am 27 Juli 2023, 15:38:12Dann würde ich aber für das temporäre at at3a die Definition mit defmod machen.
Sonst kommt wieder die Frage nach dem roten ? auf.
Probier es doch erstmal aus, bevor Du so einen Käse schreibst.
Zitat von: Nobbynews am 27 Juli 2023, 15:38:12Dann würde ich aber für das temporäre at at3a die Definition mit defmod machen.
Sonst kommt wieder die Frage nach dem roten ? auf.
+1 für defmod, aber nicht wegen des "roten Fragezeichens"... (=> einmalig auszuführendes at ;) )
Zitat von: betateilchen am 27 Juli 2023, 14:38:58Was holiday2we hier für eine Rolle spielen soll, habe ich nicht verstanden.
Das war nur als weiteres Stichwort gedacht, um den weiteren Vorteil der $we-Logik zu erwähnen, dass man es eben in weiterem Umfang wie nur mit "06" in der Hand hat, wann $we ist, und wann eben nicht...
Zitat von: betateilchen am 27 Juli 2023, 15:43:23Probier es doch erstmal aus, bevor Du so einen Käse schreibst.
Das hatte ich in der Tat dann falsch im Kopf und deswegen nicht ausprobiert.
Einen Vorteil des defmod kann ich in diesem Fall überhaupt nicht erkennen.
Und ausserdem unterscheidet das rote Fragezeichen alleine nicht nach define und/oder defmod.
Zitat von: betateilchen am 27 Juli 2023, 15:54:46Einen Vorteil des defmod kann ich in diesem Fall überhaupt nicht erkennen.
In diesem Fall ist es ggf. (nur) dann relevant, wenn man FHEM zwischen 22:30 Uhr und der Ausführungszeit des temporären at neu startet (ungeprüft).
Es geht eher um's Prinzip: Wenn man in solchen Fällen immer defmod nimmt, vermeidet man ggf. in den kritischeren Fällen das "das klappt so nicht"...
ZitatUnd ausserdem unterscheidet das rote Fragezeichen alleine nicht nach define und/oder defmod.
Das hatte ich auch nicht behauptet.
Zitat von: betateilchen am 27 Juli 2023, 15:54:46Und ausserdem unterscheidet das rote Fragezeichen alleine nicht nach define und/oder defmod.
Nee, das liegt wohl an den Unterschieden zwischen Statefile und Config-File.
Jetzt hab ich es begriffen.
Zitatwenn kein * angegeben wird, wird der Befehl nur einmal ausgeführt und der entsprechende at Eintrag danach gelöscht. In diesem Fall wird der Befehl im Statefile gespeichert (da er nicht statisch ist) und steht nicht im Config-File (siehe auch save).
Zitat von: Beta-User am 27 Juli 2023, 16:17:20In diesem Fall ist es ggf. (nur) dann relevant, wenn man FHEM zwischen 22:30 Uhr und der Ausführungszeit des temporären at neu startet (ungeprüft).
Und was soll dann schlimmes passieren? Bei einem "shutdown restart" landet das Ding im Statefile, wird nach dem Neustart um 23:30 Uhr ausgeführt und verschwindet.
Die Wahrscheinlichkeit, dass es zwischen 22:30 Uhr und 23:30 Uhr nochmal 22:30 Uhr wird, geht gegen Null.
ZitatEs geht eher um's Prinzip: Wenn man in solchen Fällen immer defmod nimmt, vermeidet man ggf. in den kritischeren Fällen das "das klappt so nicht"...
Mir geht es auch ums Prinzip. Und wenn es keinen expliziten Grund gibt, defmod zu verwenden, nehme ich das prinzipiell nicht. Hast Du mal den Code zu defmod in fhem.pl angeschaut?
ZitatDas hatte ich auch nicht behauptet.
Das galt auch nicht Dir.
Zitat von: betateilchen am 27 Juli 2023, 16:28:32Und was soll dann schlimmes passieren? Bei einem "shutdown restart" landet das Ding im Statefile, wird nach dem Neustart um 23:30 Uhr ausgeführt und verschwindet.
Die Wahrscheinlichkeit, dass es zwischen 22:30 Uhr und 23:30 Uhr nochmal 22:30 Uhr wird, geht gegen Null.
Hmmm, irgendwie hatte ich im Hinterkopf, dass at ggf. nachgeholt werden, wenn FHEM neu gestartet wird. Von daher wird es zwar nicht nochmal 22:30 Uhr, aber das at würde trotzdem nochmal ausgeführt - daher das "ungetestet"...
ZitatMir geht es auch ums Prinzip. Und wenn es keinen expliziten Grund gibt, defmod zu verwenden, nehme ich das prinzipiell nicht. Hast Du mal den Code zu defmod in fhem.pl angeschaut?
Schon länger nicht mehr, aber mir ist schon klar, dass defmod einen gewissen overhead erzeugt, den man dann nicht braucht, wenn man sicher ist, dass es nichts zu löschen gibt.
Aber lassen wir es gut sein, oder?
Naja, lass uns mal bei der Logik bleiben, das macht doch Spaß.
Zitat von: Beta-User am 27 Juli 2023, 16:45:33irgendwie hatte ich im Hinterkopf, dass at ggf. nachgeholt werden, wenn FHEM neu gestartet wird. Von daher wird es zwar nicht nochmal 22:30 Uhr, aber das at würde trotzdem nochmal ausgeführt
Da brauchst Du nix zu prüfen, da reicht Nachdenken.
Denk noch mal genau über das nach, was Du da geschrieben hast. Insbesondere über die Frage, welches at Deiner Meinung nach nochmal ausgeführt werden könnte.
Das (wiederholende) at um 22:30 wurde bereits ausgeführt, bei einem Neustart wird es also auf 22:30 des Folgetags berechnet.
Das einmal auszuführende at um 23:30 wurde noch nicht ausgeführt.
Und bevor jetzt die Korinthenkacker um die Ecke kommen:
Selbst für den Fall, dass FHEM um 23:29:59 neugestartet wird, passiert bei einem regulären Neustart nix Schlimmes.
Wie geschrieben: Hatte es nicht geprüft, ob "das at" - gemeint war das wiederholende, was sich eigentlich aus dem Gesamtzusammenhang einigermaßen zwanglos hätte ergeben sollen - am "Starttag" ggf. nochmal ausgeführt wird, wenn es eigentlich bereits "durch" ist. Wenn das nicht der Fall ist, ist ja alles gut...
(Ansonsten versuche ich grade, meinem Androiden beizubringen, wie er Wireguard mit IPv6 möglichst auf der Fritzbox verbindet, ohne dass ich "noch einen Server" aufziehen muss (habe neuerdings so einen "DS-lite"-Kack...); das beansprucht mich grade hinreichend).
Zitat von: betateilchen am 27 Juli 2023, 15:24:39define at3 at *22:30:00 {my $cmd ="set ESPEasy_28 off";; if (!$we) { fhem $cmd } else { fhem "define at3a at +01:00:00 $cmd" }}
Aus dem fahrenden Zug und nur mit Tablet ist sowas echt anstrengend 😀
Nicht schlecht. Aber später ist das für einen wenig geübten FHEM-Nutzer anstrengend, weil er nicht kapiert was da eigentlich passieren soll.
Es ist gerade der Vorteil eines mehrzeiligen (ja, wen kümmert's dass es mehr Zeilen sind?) DOIFs, dass man das so schreiben kann, dass es auch in drei Jahren noch "selbstsprechend" ist. Vor allem wenn man noch einen Kommentar einbaut.
Mit einem DOIF geht das übrigens auch locker in einer Zeile. Und für mich ist das deutlich lesbarer.
edit: wegen der o.g. Attribute im DOIF: Sie sind hier nicht erforderlich.
- do always ist automatisch impliziert bei DOIFs mit nur einem Ausführungszweig (wie hier)
- das weekdays-Attribut ist nur erforderlich, wenn man andere als zweibuchstabige Standardabkürzungen nimmt. "Mo Di Mi ..." bzw. "Mo Tu We..." kann DOIF allein.
defmod RegalWohnzimmer_Off DOIF ([22:30|Mo Di Mi Do Fr] or [23:30|Sa So]) (set ESPEasy_28 off)
Jedem Tierchen ...
Wieviele Zeilen brauchst Du mit DOIF?
Du hast ja in Deinem Auszug schon 3 Zeilen FHEM (1 * define + 2 * attr)
[/quote]
Es gibt immer viele Wege zum Ziel. Meine Antwort hat eigentlich schon Pfriemler gegeben.
Mir ist wichtig, dass ich nicht eine Vielzahl von Devices habe und das ich später noch weiß was die alle tun.
Ich wollte auch nur die Möglichkeiten ergänzen, an der Diskussion was besser, schöner... ist beteilige ich mich nicht.
Egal ob das Wetter aufs Gemüt schläg...
Hallo zusammen,
irre, was sich da entwickelt hat.
Wenn Ihr Euren Wettbewerb im Zusammenfassen von Befehlen in einer Code-Zeile weitertreiben wollt,...bitte sehr.
Der Verständlichkeit, gerade für Gelegenheitsanwender dient es garantiert nicht (daher hatte ich es ja auch in den Anfängerbereich gepostet).
Egal, ich habs gelöst. Der Vorschlag
define at1 at *22:30 {fhem("set ESPEasy_28 off") if !$we}
define at2 at *23:30 {fhem("set ESPEasy_28 off")}
führt zum gewünschten Ergebnis, ich verstehe es, es ist übersitlich, Thema abgehakt und geschlossen.
Danek an die, die zur Lösung konstruktiv und zielorientiert beigetragen haben.
Thomas