Aufnahmetimer (Funktion: welche Aufnahme läuft aktuell?)

  • Hallo Leute,


    arbeite gerade an einem Aufnahmetimer in Rails. Habe dabei ein grundsätzliches Problem, dass jetzt nichts mit der Programmiersprache zutun hat. Und weil hier so einige Entwickler sind, die sowas ähnliches wohl schon programmiert haben frage ich hier einfach mal nach:


    Es sollen Timer mit einmaliger und mehrmaliger Startzeit (wiederholende Timer) programmiert werden können.
    Wiederholende Timer sollen nur einmalig in die Datenbank eingetragen werden. Also nur der Starttermin mit Startzeit und Wiederholungsoptionen.
    Es soll zudem jederzeit ermittelt werden können welche Aufnahme momentan läuft.
    Dies soll das Programm selbst anhand der Datenbank ermitteln können, ohne zu schauen was denn gerade für eine Aufnahme aktuell läuft. Die Funktion brauche ich zum Abgleich, was denn jetzt wirklich läuft und was eigentlich nach Plan laufen sollte und auch für eine Vorschau in Kalenderform.
    Wenn ich jezt die aktuell laufende Aufnahme für alle Timer mit einmaliger Startzeit ermitteln möchte, dann mache ich einfach folgendes:
    Suche mir alle Termine raus deren Startdatum = heute und Startzeit <= jetzt, und für Startermine die < heute gestartet frage ich die Startzeit nicht ab.
    Jeztzt sortiere ich nach Stardatum und suche mir davon die Starzeit die am größten ist aus und habe die aktuell laufende Aufnahme.


    Das Problem liegt bei wiederholenden Timern:
    Ich kann das Startdatum leider nicht mit einbeziehen, denn diese können beliebig in der Vergangenheit liegen. Und nur mit Startzeit komme ich leider nicht weiter. Ich kann zwar ermitteln ob ein wiederholender Timer heute stattfindet (bei wöchentlichen Timre z.B. durch Abfrage des Wochentages und dann einfach nach der Startzeit schauen)
    aber bei der Funktion: welche Aufnahme läuft momentan gibt es folgendes Problem:
    Da mache z.B. für wöchentliche Timer folgendes: Startdatum <= heute, Startzeit<= jetzt, wday = wday.
    Das Problem ist folgende:
    Es kann eine Aufnahme gestern abend um 23 Uhr gestartet sein welche am nächsten Tag um 1 Uhr noch läuft. Diese wird dann aber nicht als aktuelle Aufnahme angezeigt, weil Startdatum ist zwar kleiner als =< heute, aber Startzeit ist nicht <= jetzt, weil 23 Uhr ist größer als 1 Uhr. Hier kann ich um das Problem zu lösen nicht einfach vorher nach Startdatum sortieren. Da das in der Datenbank eingetragen Startdatum wie gesagt beliebig in der Vergangenheit liegen kann.


    Dachte als nächtes die wiedeholenden Timer "virtuell" abzubilden, d.h. diese für eine gewisse Zeit vorzuberechnen, aber vielleicht hat jemand eine einfachere Idee?

    _______________________________


    D-box 1, D-box 2, Dreambox 7025SC

    6 Mal editiert, zuletzt von x-man ()

    • Offizieller Beitrag

    generell hast du ein paar Möglichkeiten.
    Die einfachste: Unix Timestamps :winking_face: das sind einfach ganze Zahlen und deshalb ist das viel toller zu handeln als "echte Daten".


    Du musst ansonsten immer prüfen ob startzeit + dauer > 24 und wenn ja das dann entsprechend handeln.
    Generell würde ich mir immer aus Start und Endzeitpunkt bereithalten (letzteren kannst du ja problemlos aus Startzeit und Dauer berechnen), so kannst di ganz einfach prüfen ob eine Aufnahme aktuell aktiv ist:


    Starzeitpunkt <= jetzt <= Endzeitpunkt.


    Aber wie gesagt, benutze intern Unix Timestamps damit ist das alles um Welten einfacher!

    mfg ,
    Reichi

    Einmal editiert, zuletzt von Reichi ()

  • x-man:


    Ich denke ich verstehe dein Problem. Du suchst eine Art, einen wiederholenden Timer in einer Struktur zu beschreiben, und dann aus einer Menge von (möglicherweise wiederholenden) Timern in einem definierten Zeitrahmen alle Timerzeiten zu ermitteln.


    Um ehrlich zu sein: Ich bin dran gescheitert. Aus dem Grund gibt es in enigma2 auch keine (ordentliche) Konsistenzprüfung von Timern. Man könnte sich sicherlich damit behelfen, vom letzten Aufnahmezeitpunkt aus sämtliche Timer soweit "fortzuschreiten" bis man in dem zu testenden Bereich ist, aber das wird irgendwann natürlich unpraktikabel.


    An einer vernünftigen Lösung wäre ich auch interessiert :smiling_face:

  • Das geht jetzt an rails vorbei, aber:
    kann man nicht das delta von einem repeated timer zum start berechnen (geht ja einfach mit datetime objekten), vom delta dann nur die tage nehmen (oder h/m danach korrigieren), und von da aus weiterarbeiten.
    Somit würde man den Timer zwar auch künstlich in die Zukunft setzen (da wird man wohl nicht drum herumkommen), aber man müsste den timer nicht "tag für tag" voranschreiten lassen.


    Zur originalfrage fand ich Reichis vorschlag gar nicht so verkehrt. Einfache alternative, wenn man nur begrenzt mit Timestamps arbeiten will: Auch die wiederholenden Timer von gestern einbeziehen, und nachprüfen wann diese Enden. Ist es später als <heute, 00:00 Uhr>, so wird er in die Liste hinzugefügt.

    Homescreen eurer Apple-Geräte noch nicht voll genug?


    dreaMote: Fernbedienung für Dreamboxen
    Mobile WOL: Wake-on-LAN Client für iOS mit optionalem Widget
    My Home Remote: Fernkontrolle für Homematic CCU/CCU2 optimiert für mobile Benutzung

  • Mein Vorschlag:
    Jeder Timer hat neben einer Start- und Endzeit auch einen Start- und
    Endtag.
    Fuer einmalige Timer ist diese zur vollstaendigen Beschreibung bereits
    ausreichend.
    Fuer wiederholende Timer (dort werden dann analog die Startwochentage
    und die Endwochentage betrachtet) muss der Start- und Endtag dann auf
    die aktuelle Woche gemappt werden; wenn es mehrere Tage pro Woche
    sind, dann entsprechend auch mehrfach. Zur Optimierung kann man nur
    Timer betrachten, die gestern (Wochentag bezogen) oder heute beginnen
    und die heute oder morgen enden.


    Die Abfrage, ob gerade ein Timer laeuft, sieht dann so aus, dass man alle
    Timer, deren Endtag < heute ist, schon mal vergessen kann.
    Alle Timer deren Starttag > heute ist, fallen ebenso weg.
    Zur aktuellen Zeit laufen dann alle Timer, deren Starttag < heute und
    deren Endtag > heute sind,
    oder deren Starttag < heute und deren Endtag == heute und deren
    Endzeit >= JETZT sind,
    oder deren Starttag == heute und deren Startzeit <= JETZT und deren
    Endtag > heute sind,
    oder deren Starttag == heute und deren Startzeit <= JETZT und deren
    Endtag == heute und deren Endzeit >= JETZT sind.


    Wenn man es etwas unuebersichtlicher mag ( :winking_face: ), kann man aber auch
    mit UNIX Timestamps arbeiten. Das sollte dann trivialer sein.
    Erst mit Zeitspannen wird es dann wirklich interessant (welcher Timer
    laeuft im Zeitraum "X"?), aber das war ja nicht die Ausgangsfrage. :winking_face:


    Gruss

    DM900 SS, DM8000SSSS
    Kein Support per PN! Nutzt das Forum zum Fragen, dann haben auch andere etwas davon.

  • habs folgendermaßen gelöst. (ist nicht von mir):


    - Timer werden in Datetimeformat gespeichert.


    1. Abfrage: Ist ein physikalischer Timer für gesuchten Zeitraum eingetragen?


    2. Wenn ja => ist dies der aktuell laufende Timer


    3. Ansonsten => physikalischen Timer mit höchstem Startzeit kleiner und Endzeit größer als gesuchten Zeitraum suchen und zwischenspeichern


    4. Alle wiederholenden Timer dessen Starzeit kleiner und Endzeit größer als gesuchten Zeitraum ist hochrechnen* (virtuelle Timer) bis Startzeit kleiner oder gleich gesuchter Zeitraum ist und zwischenspeichern.


    5. Aus allen zwischengespeicherten Timern den mit höchstem Startzeitpunkt auswählen => aktuell laufender Timer



    *tägliche Timer immer + 1 Tag, wöchentliche Timer + 1 Woche usw.

    _______________________________


    D-box 1, D-box 2, Dreambox 7025SC

    5 Mal editiert, zuletzt von x-man ()