Hi
Nächstes Problem ;)
Ich habe einen Verbraucher, den ich alle zwei Tage um 13 Uhr für zwei Stunden einschalten möchte. Mein erster Versuch war folgendermaßen
define macheWRG at 13:00:00 define WRG at +*48:00:00 set EdiPlug on-for-timer 7200
Funktionierte wie gewünscht und für Übermorgen 13:00 wurde der at-job WRG eingetragen und das wäre auch alles so weiter gegangen - bis ich fehm neu gestartet habe, da war der Job weg, weil das offenbar nicht in der Konfiguration eingetragen wird. In den Logs kann man zwar sehen, dass im statefile etwas über den Job stand, dieser aber nicht mehr definiert war und daher auch nicht ausgeführt wurde.
Ich bin mir sicher, dass man das Problem auch deutlich eleganter und gleichzeitig persistent lösen kann, aber mir fehlt der Ansatz. Kann mir jemand helfen?
Dank und Gruß,
Frank
define WRG at +*48:00:00 set EdiPlug on-for-timer 7200
attr WRG alignTime 13:00
so würde ich das machen, wenn der Timer immer ab 13:Uhr schalten soll
So geht's vermutlich aus:
define WRG DOIF ([13:00]) (set EdiPlug on-for-timer 7200)
attr WRG cmdpause 172000
attr WRG do always
Hi
Ja, ich denke das hilft mir weiter. Danke euch.
Gruß, Frank
Hi
Meine Lösung sieht jetzt so aus:
define WRG DOIF ([13:00]) ({if ((time() % 172800) < 86400) { fhem("set Ediplug1 on")}})
So läuft das Skript täglich, löst aber nur alle zwei Tage die Schaltung aus, und ich kann mittels < oder > eindeutig definieren an welchen Tagen geschaltet werden soll und an welchen nicht, was bei den relativen Varianten nicht immer sicher gewesen wäre. Der on-for-timer wird anschließend von einem notify woanders gesetzt, so, dass ich das hier weggelassen habe.
Gruß, Frank
Zitat von: Pimpinella am 02 Dezember 2015, 12:50:17
Hi
Meine Lösung sieht jetzt so aus:
define WRG DOIF ([13:00]) ({if ((time() % 172800) < 86400) { fhem("set Ediplug1 on")}})
So läuft das Skript täglich, löst aber nur alle zwei Tage die Schaltung aus, und ich kann mittels < oder > eindeutig definieren an welchen Tagen geschaltet werden soll und an welchen nicht, was bei den relativen Varianten nicht immer sicher gewesen wäre. Der on-for-timer wird anschließend von einem notify woanders gesetzt, so, dass ich das hier weggelassen habe.
Gruß, Frank
oder schalten an ungeraden Tagen:
DOIF ([13:00] and $yday%2)(set Ediplug1 on)
So bleibt man synchron, auf wenn das System zwischendurch gestoppt wird.
Gruß
Damian
Hallo Damian,
{$yday%2} ergibt in der Kommandozeile von Fhem für gerade Tage 0 und für ungerade Tage eines Jahres 1.
Warum funktioniert der Ausdruck ohne Vergleich mit 0 oder 1, also z.B. so:
$yday%2 == 0?
Viele Grüße Gisbert
Edit:
Ich denke, damit es funktioniert, muss ein Vergleich her, z.B. $yday%2 == 0 bei geraden oder $yday%2 == 1 bei ungeraden Tagen.
Der 1.1. ist der nicht der 1. Tag im Jahr, sondern der nullte.
Diese Logik ist schwer auszuhalten. Gott sei Dank findet es nicht überall Anwendung, sonst hätten wir 9 Finger und 1 Auge (kleine Korrektur: der 10. Finger hat die Nr. 9 und das 2. Auge die Nr. 1). Vermutlich hatten sich die Zyklopen zu lange mit Linux beschäftigt - das Problem scheint also schon älter zu sein.
Zitat von: Gisbert am 25 Juli 2024, 17:05:45Hallo Damian,
{$yday%2} ergibt in der Kommandozeile von Fhem für gerade Tage 0 und für ungerade Tage eines Jahres 1.
Warum funktioniert der Ausdruck ohne Vergleich mit 0 oder 1, also z.B. so:
$yday%2 == 0?
Viele Grüße Gisbert
Edit:
Ich denke, damit es funktioniert, muss ein Vergleich her, z.B. $yday%2 == 0 bei geraden oder $yday%2 == 1 bei ungeraden Tagen.
Der 1.1. ist der nicht der 1. Tag im Jahr, sondern der nullte.
Diese Logik ist schwer auszuhalten. Gott sei Dank findet es nicht überall Anwendung, sonst hätten wir 9 Finger und 1 Auge (kleine Korrektur: der 10. Finger hat die Nr. 9 und das 2. Auge die Nr. 1). Vermutlich hatten sich die Zyklopen zu lange mit Linux beschäftigt - das Problem scheint also schon älter zu sein.
Die Abfrage ($yday % 2) ist dann wahr, wenn das Ergebnis ungleich Null ist, also entspricht das der Abfrage $yday % 2 == 1
Für "Normalsterbliche nicht Informatiker" ist der 26.08.2024 der 208 Tag des Jahres siehe https://www.matheretter.de/rechner/tagesnummern#:~:text=Heute%20ist%20Donnerstag%2C%20der%2025,der%20Tabelle%20unten%20gelb%20markiert., $yday liefert 207, $yday % 2 ist also wahr.
Wenn man also bei eins anfängt zu zählen und nicht bei null, dann bedeutet '($yday % 2) ist wahr' an einem geraden Tag des Jahres.
Zitat von: Gisbert am 25 Juli 2024, 17:05:45Warum funktioniert der Ausdruck ohne Vergleich mit 0 oder 1
Weil in fast allen Programmiersprachen ein numerischer Wert 0 einem logischen "false" entspricht und 1 einem "true"
(genauer: meist ist die Unterscheidung 0 oder '!= 0', es würde also auch 5 einem "true" entsprechen)