"at" einmalig - aber erst in ein paar Tagen! beste Möglichkeit?

Begonnen von Pfriemler, 24 April 2015, 14:28:53

Vorheriges Thema - Nächstes Thema

Pfriemler

Um meine "dumme" Dreambox ohne Standbytimer auch im Urlaub die heißgeliebten Crime-Serien aufnehmen zu lassen, könnte ich sie einfach durchlaufen lassen. Sie genehmigt sich aber so 10 Watt. Als FHEMler kann man das nicht tolerieren ...  :D Dabei würde es reichen, sie gut 5 Minuten vor dem Termin unter Strom zu setzen. Schaltersteckdose ist vorhanden.

Der Termin ist aber erst übermorgen. Ein einmaliges at lässt sich doch nur bis max. 24h im voraus setzen, oder? Wie löse ich das Problem?

Einzige Idee, die ich bisher habe:
1. Ich lasse das nächste Timerevent aus dem Enigma-Modul in einen Dummy kopieren, der dann z.B. "26.04.2015 20:12" enthält. Das funktioniert schon ganz gut seit Tagen. Ich müsste nur dort gleich einen Offset von 5 Minuten hereinrechnen.
2. Bei Änderung dieses Dummys modifiziere ich ein täglich laufendes at bezüglich der Uhrzeit. Das at wird einmalig angelegt (als periodisch)und nie gelöscht.
3. zum Ausführungszeitpunkt wird geprüft, ob das Tagesdatum im Inhalt des Dummys vorhanden ist und dann der Schaltbefehl ausgeführt, sonst nichts.

Oder habe ich ein Modul oder eine Funktion eines anderes Moduls übersehen, was das eleganter löst?
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

StefanD

HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

Puschel74

Ich hätte mal vorsichtig den WeekdayTimer eingeworfen.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: StefanD am 24 April 2015, 17:05:41
Schau dir mal das Modul DOIF an.  :)

VG Stefan

Man kann inzwischen beliebige "Zeit-Schweinereien" mit DOIF machen:

define di_in_zwei_tagen DOIF ([+48:00]) (set...)

oder um 15:00 Uhr in einer Woche:

define di_nächste_Woche DOIF ([([15:00]+7*86400)]) (set....)

oder jetzt in einem Monat:

define di_in_31_tagen DOIF ([+(31*86400)]) (set....)

Gruß

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

der-Lolo


StefanD

DOIF ist flexibler als ein Schweizer Taschenmesser!  ;)

Man muss nicht zwingend mit relativen Zeitangaben arbeiten, es geht auch, z.B den/die Wochentag(e) mit Zeit zu verwenden. Crime Serien haben i.d.R. Feste, sich wiederholende Sendezeiten. Kombiniert man das mit einem Dummy für An-/Abwesenheit, wäre es noch etwas komfortabler.  ;)

VG Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

Pfriemler

Danke für die Antworten.
Also ich stelle mal fest: FHEM fehlt noch eine at-Erweiterung um einen Ausführungstag.

@StephanD: Ich möchte keinesfalls die Timerprogrammierung in FHEM erledigen. Programmiert wird die Box, teilweise auch sehr unregelmäßig, FHEM soll sich nur den allernächsten Einschaltzeitpunkt daraus selbst berechnen. Aufgenommen wird immer, auch bei Anwesenheit. Wie soll ich sonst die Werbepausen überstehen?

@Puschel: weekDay geht auch nur mit wöchentlicher Programmierung, sehr knuffig und übersichtlich zu lösen. Aber hier? Hatte ich schon gesehen und verworfen.

DOIF ist mir gut bekannt, aber die Kombination von fester Zeit und einem Offset finde ich prima. Also Startzeit + Tage*86400 im voraus.
Aber wie ändere ich Zeiten eines einmal erstellten DOIF? beim at geht das mit Modify ja sehr einfach.

DANKE! Ich werde was ausprobieren und meine Lösung dann hier vorstellen.



"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Zitat von: Pfriemler am 25 April 2015, 01:19:51
Danke für die Antworten.
Also ich stelle mal fest: FHEM fehlt noch eine at-Erweiterung um einen Ausführungstag.

@StephanD: Ich möchte keinesfalls die Timerprogrammierung in FHEM erledigen. Programmiert wird die Box, teilweise auch sehr unregelmäßig, FHEM soll sich nur den allernächsten Einschaltzeitpunkt daraus selbst berechnen. Aufgenommen wird immer, auch bei Anwesenheit. Wie soll ich sonst die Werbepausen überstehen?

@Puschel: weekDay geht auch nur mit wöchentlicher Programmierung, sehr knuffig und übersichtlich zu lösen. Aber hier? Hatte ich schon gesehen und verworfen.

DOIF ist mir gut bekannt, aber die Kombination von fester Zeit und einem Offset finde ich prima. Also Startzeit + Tage*86400 im voraus.
Aber wie ändere ich Zeiten eines einmal erstellten DOIF? beim at geht das mit Modify ja sehr einfach.

DANKE! Ich werde was ausprobieren und meine Lösung dann hier vorstellen.

Modify geht genauso wie bei at und allen anderen Modulen.

Man kann sogar mit Unix-Zeit arbeiten (die Frage kam auch schon mal)

define unixtime dummy
set unixtime 1429948800  (ist heute um 10)

define di_mit_unixtime DOIF ([+([unixtime]-time())]) (set...)



Edit: mit konkreten Datums- und Zeitangaben:

define di_mit_Datum DOIF ([+(time_str2num("2015-04-25-10:00:00")-time())]) (set...)

Gruß

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

Pfriemler

#8
So, DOIF läuft.
define  nfySetDreamboxWeckerWithNextRecording DB500HD:recordings_next_counter {fhem("set DreamboxWecker ".time_num2strVA(ReadingsVal("DB500HD", "recordings_next", "")))}

kopiert (vereinfacht kurz) den nächsten Timer in den Dummy "DreamboxWecker". time_num2strVA verwandelt den Timecode in einen lokalzeitkorrigierten String im Format z.B. "2015-04-25-12:33". Der Dummy hat das Attribut "event-on-change-reading state" gesetzt, damit das DOIF-definierende Notify nicht ständig läuft.
Manuell kann man (wenn die Box aus ist und die Timerliste nicht aktualisiert wird) mit "set DreamboxWecker 2015-04-25 20:00" den Beginn des Fernsehabends festlegen.

Bei einer Änderung des Dummys wird dieses Notify gefeuert:
define nfyDreamboxWakeupHasChanged DreamboxWecker modify di_WakeupDreambox4Timer
   ([+(time_str2num(ReadingsVal("DreamboxWecker","state","2030-12-31 12:00"))-time()-599)])
        (set PWRSW_TV on) DOELSEIF ([dmyDBW]) ;
   define dbwuakttemp at +00:00:10 set dmyDBW kick


Es redefiniert das timer-ausführende DOIF:
Internals:
   DEF        ([+(time_str2num(ReadingsVal("DreamboxWecker","state","2030-12-31 12:00"))-time()-599)]) (set PWRSW_TV on) DOELSEIF ([dmyDBW])
   NAME       di_WakeupDreambox4Timer
...
     2015-04-25 12:29:06   timer_1_c1      25.04.2015 14:51:02
...
Attributes:
   alias      Zeit, zu der die Dreambox hochgefahren wird
   state      10min vor Timer, also [di_WakeupDreambox4Timer:timer_1_c1]


10 Sekunden später zwingt das mitdefinierte at das neue DOIF zu einer Statusänderung, die es auf der Oberfläche dann klarschriftlich anzeigt: Der Timerbefehl wurde erfolgreich gesetzt.

Und alles ohne Regex & Co. (obgleich ich da vieeel gelernt habe gestern). Danke an Damian mit dem Unix-zeit-Tip zum DOIF. Das war's.
Verbesserungsvorschläge? Auffälligkeiten?

Mich stört an der Lösung noch, dass sie das "save config"-Flag setzt. Könnte man das DOIF bitten, sein Time-Spec erneut zu berechnen, statt dies durch die Neudefinition zu erzwingen? quasi ein "short modify"? Denn an der Def selbst ändert sich ja gar nichts, nur der DOIF-interne Timer wird zum Zeitpunkt der Definition neu berechnet. Und den state-Wechsel (mit Anzeigenwechsel) mit dmyDBW zu erreichen ist sicher auch noch nicht der Weisheit letzter Schluss...
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Zitat von: Pfriemler am 25 April 2015, 12:52:50
So, DOIF läuft.
define  nfySetDreamboxWeckerWithNextRecording DB500HD:recordings_next_counter {fhem("set DreamboxWecker ".time_num2strVA(ReadingsVal("DB500HD", "recordings_next", "")))}

kopiert (vereinfacht kurz) den nächsten Timer in den Dummy "DreamboxWecker". time_num2strVA verwandelt den Timecode in einen lokalzeitkorrigierten String im Format z.B. "2015-04-25-12:33". Der Dummy hat das Attribut "event-on-change-reading state" gesetzt, damit das DOIF-definierende Notify nicht ständig läuft.
Manuell kann man (wenn die Box aus ist und die Timerliste nicht aktualisiert wird) mit "set DreamboxWecker 2015-04-25 20:00" den Beginn des Fernsehabends festlegen.

Bei einer Änderung des Dummys wird dieses Notify gefeuert:
define nfyDreamboxWakeupHasChanged DreamboxWecker modify di_WakeupDreambox4Timer
   ([+(time_str2num(ReadingsVal("DreamboxWecker","state","2030-12-31 12:00"))-time()-599)])
        (set PWRSW_TV on) DOELSEIF ([dmyDBW]) ;
   define dbwuakttemp at +00:00:10 set dmyDBW kick


Es redefiniert das timer-ausführende DOIF:
Internals:
   DEF        ([+(time_str2num(ReadingsVal("DreamboxWecker","state","2030-12-31 12:00"))-time()-599)]) (set PWRSW_TV on) DOELSEIF ([dmyDBW])
   NAME       di_WakeupDreambox4Timer
...
     2015-04-25 12:29:06   timer_1_c1      25.04.2015 14:51:02
...
Attributes:
   alias      Zeit, zu der die Dreambox hochgefahren wird
   state      10min vor Timer, also [di_WakeupDreambox4Timer:timer_1_c1]


10 Sekunden später zwingt das mitdefinierte at das neue DOIF zu einer Statusänderung, die es auf der Oberfläche dann klarschriftlich anzeigt: Der Timerbefehl wurde erfolgreich gesetzt.

Und alles ohne Regex & Co. (obgleich ich da vieeel gelernt habe gestern). Danke an Damian mit dem Unix-zeit-Tip zum DOIF. Das war's.
Verbesserungsvorschläge? Auffälligkeiten?

Mich stört an der Lösung noch, dass sie das "save config"-Flag setzt. Könnte man das DOIF bitten, sein Time-Spec erneut zu berechnen, statt dies durch die Neudefinition zu erzwingen? quasi ein "short modify"? Denn an der Def selbst ändert sich ja gar nichts, nur der DOIF-interne Timer wird zum Zeitpunkt der Definition neu berechnet. Und den state-Wechsel (mit Anzeigenwechsel) mit dmyDBW zu erreichen ist sicher auch noch nicht der Weisheit letzter Schluss...

Dass das alles so funktioniert, ist mehr oder weniger ein Abfallprodukt der neu eingebauten Zeitfeatures. Ich werde zukünftig noch einbauen, dass neben einfachen Zeitangaben auch Datumsangaben funktionieren, also so etwas:

([2015-04-31 12:00]) (set ...)

ebenso wie bei indirekten Zeitangaben

define Zeit dummy
set Zeit 2015-04-31 12:00
([[Zeit]]) (set ...)

Damit wird auch gleichzeitig die Zeit automatisch neugesetzt, wenn man den dummy belegt, wie jetzt auch schon bei einfachen indirekten Zeiten. Damit erübrigt sich ein modify-Befehl und ein save-Befehl.

Auch Zeitberechnungen werden kombinierbar mit Datumsangaben möglich sein:

([([Zeit]-600)]) (set ...)

Gruß

Damian

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

Pfriemler

Damian, das mit den indirekten Zeitangaben hatte ich verpasst - es löst das Aktualisierungsproblem viel eleganter. GENIAL!

Ändert sich der Wert (durch notify oder manuelles Setzen), genügt statt der Redefinition des ganzen DOIF nun das Setzen eines Dummys mit der Anzahl der Sekunden zum Einschaltzeitpunkt:

define nfyDreamboxWakeupHasChanged notify DreamboxWecker \
   {fhem("set DreamboxWakeupInSeconds ".int(time_str2num(ReadingsVal("DreamboxWecker","state","2030-12-31 12:00"))-time()-299));\
   define dbwuakttemp at +00:00:05 set dmyDBW kick;}


Das dann nur noch einmalig definierte DOIF lautet dann
define di_WakeupDreambox4Timer DOIF ([+[DreamboxWakeupInSeconds]]) (set PWRSW_TV on) DOELSEIF ([dmyDBW])
attr di_WakeupDreambox4Timer alias Zeit, zu der die Dreambox hochgefahren wird
attr di_WakeupDreambox4Timer do always
attr di_WakeupDreambox4Timer state 5 min vor Timer, also [di_WakeupDreambox4Timer:timer_1_c1]

Die Änderung des Dummys wirkt als Trigger für die Neuberechnung des DOIF-Timers, wie man sich das wünscht.

Es funktioniert, und das save-Flag kommt nicht mehr.

Sähest Du noch eine elegantere Methode, das DOIF um eine Statusaktualisierung zu bitten (nach der Neuberechnung steht dort "initialized")? Das mit dem at und dem dmyDBW funktioniert zwar, aber ...


Was meint ihr, dürfte man die Komplettlösung mal in "Codeschnipsel" posten oder ist das zu trivial?  8)
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Hollo

Da muss ich doch mal so "halb-offtopic" antworten...

Wenn ich das richtig sehe, hast Du eine DM 500HD !?
Hast Du die auf aktuellem Stand bzw. was für ein Image nutzt Du?
Meine startet problemlos für Timer-Aufnahmen aus dem deep-standby; was ja Dein ganzes "drumherum" erübrigen würde.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Pfriemler

#12
Zitat von: Hollo am 27 April 2015, 08:58:50
Wenn ich das richtig sehe, hast Du eine DM 500HD !? Hast Du die auf aktuellem Stand bzw. was für ein Image nutzt Du?
Meine startet problemlos für Timer-Aufnahmen aus dem deep-standby; was ja Dein ganzes "drumherum" erübrigen würde.
Das macht mich jetzt wirklich neidisch, denn bisher ging ich davon aus, dass es die 500er nur ohne Frontprozessor gab. Unter https://www.dream-multimedia-tv.de/board/index.php?page=Thread&threadID=6977 lese ich das erste Mal, dass es auch Versionen mit gab. Meine liefert diese Info (abzurufen unter IPderBox/#!/extras/deviceinfo)

Device & Versions
Devicename: dm500hd
Enigma Version: 2012-11-03-3.2
Image Version: Release 3.2.1 2011-11-10
Frontprozessor Version: VNone
Webinterface Version: 1.7.1


Kein Frontprozessor. Bei Dir wird da wohl dann eine Vesionsnummer statt VNone stehen.
edit: Habe SNR A3.... - ab AC haben sie Frontprozessor mit Timer-Möglichkeit. Meine habe ich im Juni 2010 gekauft. Ein Original, natürlich.

Is mir jetzt aber auch egal - die Mimik läuft seit gestern störungsfrei. Ich werde wohl Damian zu Ehren noch alles in ein einziges DOIF verpacken, spätestens wenn die <timespec> auch Datum klarschriftlich unterstützt. Bis dahin: never change a running system ... Ich hab auch so nix dagegen, dass die Box die meiste Zeit vom Stromnetz getrennt ist - das war meine DM 7000 vormals auch immer, wenn keine Timer anstanden.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Ralli

Zitat von: Damian am 25 April 2015, 15:05:41
Dass das alles so funktioniert, ist mehr oder weniger ein Abfallprodukt der neu eingebauten Zeitfeatures. Ich werde zukünftig noch einbauen, dass neben einfachen Zeitangaben auch Datumsangaben funktionieren, also so etwas:

([2015-04-31 12:00]) (set ...)

ebenso wie bei indirekten Zeitangaben

define Zeit dummy
set Zeit 2015-04-31 12:00
([[Zeit]]) (set ...)


Dafür !! Aber bitte auch mit der Möglichkeit, nicht nur an einem bestimmten Datum sondern auch zu bspw. jedem 5. im Monat oder jeden 30.01. in jedem Jahr.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

salvadore

bspw jeden 10. im Monat geht so
define backupserver_on_10_jeden_monat at *01:00:00 {if($mday==10) {fhem("set backupserver on")} }
damit wird ein Backupsystem mit dem "WOL-Modul" geweckt; auf diesem wird 5 Min. später vom NAS-System ZyXEL eine Datensicherung geschrieben. Das Backupsystem läuft mit http://www.openmediavault.org/. Nach Abschluss der Sicherung erfolgt automatisches herunterfahren.

Salvadore
FHEM 5.6, APU-Board, CUNO 1.x, RFXtrx433, 8 FHT80B, diverse FS20 Aktoren, Rasperry, div. DS18x-Sensoren, KD101, AB400R, HE877, ESA2000, Beaglebone Black Rev.C, Jeelink, PCA 301, PT8005,