Aktuelles TV-Programm in FHEM

Begonnen von Kuzl, 20 Oktober 2014, 20:41:43

Vorheriges Thema - Nächstes Thema

MaJu

#375
@Markus
Einen eigenen Trade? Wen meinst du damit?
Ich will zumindest nix verkaufen. Und wenn du "Thread" meinst, dann sind die letzten Antworten hierher passend.


Nun noch eine Frage von mir, vor allem um das Problem "unnötige Seitenabrufe" weiter zu entschärfen:
Die meisten Sendungen fangen auf die Endminuten "0" oder "5" an (also 19:20 oder 20:05), die Minuten dazwischen sind eher unrelevant (es gibt kaum Sendungen die zum Beispiel 19:53 anfangen).

Ziel deshalb: Den Abruf nicht alle 2 Minuten durchführen, sondern alle 5 Minuten. Das muss dann aber auch zum Rhytmus passen. Denn es bringt ja nichts, um 20:14:58 neu zu laden, dann wird ja die nächsten 5 Minuten noch was falsches angezeigt. Vielmehr sollte der Abruf immer ein paar Sekunden nach den Endminuten "0" und "5" erfolgen und die Übersicht damit mit deutlich weniger Abrufen aktueller halten als bisher.

Wie aber bringt man FHEM bzw. dem Modul bei, immer zum Beispiel 20 Sekunden nach den beiden Endminuten den Abruf zu starten, nicht stur alle 5 Minuten?
Erlebnisreiche Grüße aus Leipzig!

RoBra81

Zitat von: MaJu am 23 Januar 2015, 13:27:30
Wie aber bringt man FHEM bzw. dem Modul bei, immer zum Beispiel 20 Sekunden nach den beiden Endminuten den Abruf zu starten, nicht stur alle 5 Minuten?

Bau doch ein at mit alignTime...

Elektrolurch

Hallo,

so ganz trivial ist das leider nun mal nicht:

1. Die einzige Möglichkeit httpmod ein- und auszuschalten ist wohl
attr name disable 1 bzw. 0.
Das macht man in einem at (at1).
2. Nach dem Einschalten weiß man aber dann erst einmal nicht, wann die next_time - Werte aktuell sind. Also muss man aus dem aktuellen at1 ein neues definieren (at2)und das aktuelle verlassen.
3. Das Folge-at2 berechnet nun die minimale (niedrigste) Zeit für die Nachfolgesendungen + ca. 30 Sekunden und definiert damit wieder das at 1, was erst einmal httpmod wieder auf disable 0 setzt.
Im at2 wird httmod auf disable 1 gesetzt.

Ich schau mal, ob ich da zwei kleine perl-Routinen für den Kram schreiben kann. Wahrscheinlich braucht man noch ein Objekt (define), so dass das ganze auch nach einem Neustart wieder anläuft.
Dann kann man auch auf at verzichten und gleich "InternalTimer" verwenden.


Jemand noch eine andere Idee?

Elektrolurch

configDB und Windows befreite Zone!

RoBra81

Oder man macht es mit dem separaten Download via wget, der mittels cronjob angestoßen wird (so mache ich es) - da kann man FHEM auch alle zwei Minuten anschubsen...

MaJu

Elektrolurch:
Wenn ich dich richtig verstanden habe, willst du sogar die Zeiten der Folgesendungen berücksichtigen und erst bei Beginn der ersten nächsten Sendung einen neuen Abruf starten?
Das wäre ja noch besser. Denn gerade am Beispiel der Sendungen 20:15 Uhr ist deutlich, dass man dann meist etwa Stunde gar keinen Abruf braucht.

Das übersteigt meine Kenntnisse leider deutlich, so dass ich leider nicht unterstützen kann. Ich teste aber gerne.
Wenn möglich, wäre die Prüfung auf einen Abwesenheitsdummy (bzw. irgendeinen Dummy) gut, damit man die Abfrage bei Abwesenheit und nachts auf ohne großen Aufwand ganz abschalten kann.
Erlebnisreiche Grüße aus Leipzig!

Elektrolurch

Würde zwei Zeiten als Attribut vorsehen:

starttime und endtime
zwischen den würden dann die Abfragen laufen.

Das Ganze würde dann so aussehen:

define myTVHelper TVHelper <TVJetzt> <TVDanach>

TVJetzt und TVDanach wären die beiden httpmod -. Objekte

Ausgewertet würden dann die readings .*next_time von <TVDanach>.

Mal sehen, ev. komme ich ja am Wochenende dazu.

Elektrolurch
configDB und Windows befreite Zone!

MaJu

#381
Fixe Zeiten finde ich nicht so gut, da es bei Schichtarbeit jeden Tag anders aussieht. Auch im Urlaub.
Damit ginge auch nicht, die Abfrage nachts beim schlafen UND tagsüber bei Abwesenheit zu unterbinden.

Ich fände einen Dummy "dummy_TV_Abfrage" mit den Möglichkeiten "abfragen" und "ruhen" (oder wie auch immer vergleichbar anders) besser, dessen Status man dann in seinen Automatismen mit setzen kann.

Das setzen des Dummy auf "ruhen" müsste die Abfrage disablen, das setzen auf "abfragen" startet eine Initiale Abfrage wie beim FHEM-Neustart.

NACHTRAG: Insbesondere um 20:15 sind die TV-Seiten fast alle überlastet, so dass die Abfrage in den Timeout läuft. Dennoch muss sichergestellt werden, dass es eine Folgeabfrage gibt, zum Beispiel nach 2 Minuten wenn es kein Zeit-Reading gibt
Erlebnisreiche Grüße aus Leipzig!

Elektrolurch

Die festen Zeiten werde ich mal vorsehen. Sind ja Attribute. Ansonsten wird das Attribut disable unterstütz. Damit kann jeder individuell seine "Gewohnheiten" implementieren.
configDB und Windows befreite Zone!

Markus

@MaJu Hast recht mein Beitrag schaut jetzt etwas verloren aus  :'(
aber Jemand hatte Fragen über httpmod die nicht hier her gehörten  ::)
und hat den Beitrag einfach Gelöscht um mich Blöd dastehen zu lassen!!  >:(

Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

RoBra81

#384
So, ich habe mal wieder was gebastelt und stelle es hier zum Test: Nach den Diskussionen oben bezüglich der Häufigkeit der Updates habe ich folgendes gemacht:

1. Ich habe das Aktualisierungsintervall meines TVProgramms (nur eins für now und next: DG.wz.TV.Programm.temp) auf 5 Sekunden gesetzt und das Attribut disable auf 1 gesetzt:


define DG.wz.TV.Programm.temp httpmod <Adresse> 5
attr DG.wz.TV.Programm.temp disable 1


2. Ich habe ein notify gebaut, das nach der Aktualisierung des TVProgramms gebaut, welches das disable wieder auf 1 setzt und (hier kommt der Clou) eine Sub aufruft:

define DG.wz.TV.Programm.temp.not.update notify DG.wz.TV.Programm.temp.* attr DG.wz.TV.Programm.temp disable 1; {defineNextUpdate()}

3. Ich habe eine Sub gebaut, die die Zeiten für die nächsten Programme durchgeht, die nächste Zeit raussucht und ein at definiert, welches 30 Sekunden nach Start des nächsten Programmes das disable des TVProgramms auf 0 setzt und somit ein Update startet:

sub
defineNextUpdate()
{
  # Name des HTTPMod-Devices, welches die nächsten Sendungen enthält
  my $nextProgramDevice = 'DG.wz.TV.Programm.temp';
  # Name des HTTPMod-Devices, welches die aktuellen Sendungen enthält (kann '' bleiben, wenn nur ein HTTPMod verwendet wird)
  my $nowProgramDevice = '';
  # Raum, welchem das at zugeordnet werden soll
  my $room = 'Wohnzimmer';

  # Liste der verwendeten Kanäle ohne "_next_time"
  my @channels = ("ard",
                  "dmax",
                  "kabel1",
                  "kika",
                  "mdr",
                  "pro7",
                  "rtl1",
                  "rtl2",
                  "sat1",
                  "superrtl",
                  "vox",
                  "zdf");

  my ($sec,$min,$hour,$mday,$mon,$year) = localtime;
  my $t  = timelocal($sec,$min,$hour,$mday,$mon,$year)+60;
  my $zero = '';
  if ($min < 10)
  {
    $zero = '0';
  }
  my $timeNow = $hour.":".$zero.$min;

  my $timeNextTime = $t + (60*60*24);
  my $timeNext = ($hour+1).":".$zero.$min;
 
  foreach (@channels) {
    my $tempTimeNext = ReadingsVal($nextProgramDevice, $_.'_next_time', '');
    my @tempTimeNextParts = split(/:/, $tempTimeNext);
    my $tempTimeNextTime;
    if ($tempTimeNext lt $timeNow && $tempTimeNext gt '00:00')
    {
      $tempTimeNextTime = timelocal($sec,$tempTimeNextParts[1],$tempTimeNextParts[0],$mday,$mon,$year) + (60*60*24);
    }
    else
    {
      $tempTimeNextTime = timelocal($sec,$tempTimeNextParts[1],$tempTimeNextParts[0],$mday,$mon,$year);
    }
    if ($tempTimeNextTime > $t && $tempTimeNextTime < $timeNextTime)
    {
      $timeNextTime = $tempTimeNextTime;
      $timeNext = $tempTimeNextParts[0].':'.$tempTimeNextParts[1];
    }
  }

  fhem('define '.$nextProgramDevice.'.at.update at '.$timeNext.':30 attr '.$nextProgramDevice.' disable 0');
  fhem('attr '.$nextProgramDevice.'.at.update room '.$room);
  if ($nowProgramDevice ne '')
  {
    fhem('define '.$nowProgramDevice.'.at.update at '.$timeNext.':30 attr '.$nowProgramDevice.' disable 0');
    fhem('attr '.$nowProgramDevice.'.at.update room '.$room);
  }
}


Das sub muss noch an den Kommentierten stellen angepasst werden.

Wie gesagt, ist das eine erste Version. Das definieren des at hat in einem ersten Test bereits erfolgreich funktioniert, ich kann aber noch nicht sagen, ob die 30 Sekunden reichen, dass die Webseite upgedatet ist, oder ob man die Zeit noch hochsetzen muss. Auch weiß ich nicht, ob Sendungen zum Tageswechsel richtig funktionieren - in der Programmierung sind diese berücksichtigt, aber getestet habe ich das noch nicht. Sollte mal keine Nachfolgesendung gefunden werden, wird ein at für in einer Stunde erstellt.

Bitte testet es mal bei Interesse und gebt bei Bedarf Rückmeldung...

Ronny

EDIT: habe noch einen kleinen Fehler korriegiert...

Elektrolurch

Hallo,

so, jetzt habe ich auch eine Lösung gebastelt, die httpmod nur noch dann aufruft, wenn sich die Zeiten in TV_Programm_next ändern.
Vorteile:
1. Man muss nicht die beiden httpmod - Module auf disable stellen und eine Wiederholungsrate von 5 Sekunden bei den Modulen einstellen. Dies kann nämlich zu Problemen führen.
2. Die Berechnung der nächten Aktualisierungszeit erfolgt über die readings *.-time_next des TV_Programm_next - Objektes. Es muss also keine Kanalliste hinterlegt werden.
So gehts:
1. Einfach die angehängte fhem-Datei ins FHEM - Verzeichnis kopieren und mit "reload" oder Neustart aktivieren.
2. Die beiden Objekte (TV_Programme und TV_Programme_next, oder wie sie bei euch heißen) per modify auf  eine lange Refreshzeit (z.B. 3 Stunden oder länger) einstellen.
Das Intervall ist die letzte Zahl im modify-Feld.

3. define TVhelper TVhelper <TV_Programme> <TV_Programme_next>

und schon läuft das Teil automatisch.
Standardmäßig werden die Programminfos zwischen 16:00 und 23:00 Uhr automatisch aktualisiert.
Wer das abändern möchte, setzt bitte die beiden Attribute
attr TVhelper starttime 12:00
attr TVhelper endtime 23:59

Das Laden der Webseiten erfolgt über das httpmod - Modul, in dem dort der TVhelper die httpmod_Update() - Routine direkt aufruft. Daher müssen die beiden httmod - Objekte
disable 0
sein, sonst werden die Webseiten nicht geladen.
Beim o.g. define wird erstmalig das disable auf 0 gesetzt, falls das jemand doch vergessen hat!


30 Sekunden nach dem Laden der Webseiten wird die nächste Zeit berechnet und ein at  erzeugt:
TVhelper_<Zeit>_at
Mit disem at wird dann die nächste Aktualisierung der Programminfos durchgefühert.

Wer diese Zeit einstellen möchte
attr TVhelper delay-time-read 15

Mit attr TVhelper verbose 3 oder 4
sieht man, wie die Zeiten berechnet werden.

Die readings im dem TV_Programme_next Objekt, die die Zeiten der nächsten Sendungen enthalten, müssen:
~m/.*_next_time/
entsprechen.

Mit
attr TVhelper disable 1
kann man das Modul daktvieren. Dann werden die Programminfos nur noch gem. des Intervalls von httmod aktualisiert.

Viel Spaß

Elektrolurch



configDB und Windows befreite Zone!

MaJu

@Elektrolurch: Danke! :-)

Habe es bei mir installiert und es macht spontan einen sehr guten Eindruck. Habe die HTTPMODs der TV-Programme auf 20000 gesetzt, durch deinen TVhelper wurde die nächste Abrufzeit anhand der von mir gewählten Sender richtig gesetzt und ausgeführt und auch das nächste at richtig gesetzt.

Auch die Möglichkeiten mit start- und endtime  finde ich hervorragend gelöst. Und disable für die getriggerte Abwesenheits- und Nachtschaltung.

Ganz dolle danke!

Was passiert eigentlich, wenn der Server nicht erreichbar ist von dem das TV-Programm geladen wird, wie es bei den Sendungen 20:05 und 20:15 sicher oft der Fall sein wird?
Erlebnisreiche Grüße aus Leipzig!

Elektrolurch

Die Zeitenberechnung macht die TVhelper_NextTime Rotine.
Falls der Server nicht erreichbar ist, liefert httpmod keine aktualisierten Daten. Leider gibt es dafür auch kein Event. Also wird die nächste Zeit auf Grund der vorhandnenen Daten berechnet, vermutlich dürfte das gar nicht auffallen j:-)
Ich hatte es seit Sonntag getestet und mir das log angeschaut und das sah eigentlich auf Anhieb ok aus.
...

Elektrolurch
configDB und Windows befreite Zone!

MaJu

Danke.
Da quasi alle Sender um 20:05/20:15 eine neue Sendung starten, gibt es zu diesem Zeitpunkt noch keine andere next_time als 20:15, die gezogen werden könnte.
Testen und beobachten wir es :-)
Da die typischen Primetime-Tage Freitag und Samstag sind, vermute ich, dass die Engpässe bei der Server-Erreichbarkeit vor allem an diesen beiden Tagen auftreten, wenn die halbe Nation online guckt was gleich im TV kommt. Das ist auch so die übliche Erfahrung die ich bisher beim TV-Programm anschauen im Browser habe. Auch die Abfrage durch fhem blieb um diese Zeiten ergebnislos.

(Bitte nicht als "meckern" verstehen, ich bin deutlich zu unerfahren für ein solches Modul [um nicht "zu doof" zu sagen] und es liegt mir fern das zu kritisieren was hier von technisch versierten Mitstreitern in der Freizeit gebastelt und kostenlos der Allgemeinheit zur Verfügung gestellt wird)
Erlebnisreiche Grüße aus Leipzig!

MaJu

Komisch, dass das Helferlein von Elektrolurch erst so wenig heruntergeladen wurde.
Liebe Nutzer dieses TV-Programm-Codeschnipsels: Bitte versucht so datensparsam wie möglich zu sein. Je mehr Nutzer den Abfrage-Server überstrapazieren, desto eher wird es dazu führen, dass technische Mittel zur Unterbindung ergriffen werden. Die Einrichtung des TVhelper ist kinderleicht, wenn man schon das andere geschafft hat.

__________________________

Ich bitte um Hilfe:

In meiner ReadingsGroup werden Sonderzeichen bei den Sendungsnamen immer als Code dargestellt wenn der Floorplan neu geladen wird. Erst beim Aktualisieren des Readings werden Zeichen wie Anführungszeichen oder Hochkomma richtig angezeigt. Insbesondere bei den 20:15-Programmen, die ja im Idealfall nur einmal am Tag geladen werden, hat man ab dem Zeitpunkt des Neuladens der Seite immer zum Beispiel "Law &amp; Order" statt "Law & Order" stehen, das reduziert leider den WAF.

Besteht hier die Möglichkeit der Abhilfe?
Erlebnisreiche Grüße aus Leipzig!