[geändert]TV Programm automatisieren - Vorschlag mit der Bitte um Unterstützung

Begonnen von supernova1963, 16 November 2017, 22:32:59

Vorheriges Thema - Nächstes Thema

supernova1963

Hallo Hauswart,

wenn es denn jetzt funktioniert, weiß ich jetzt wie ich vorgehen muss. Anfangs hatte ich noch eine Fehlermeldung im FHEM Update. Das hing mit einer Datei .TVSender.pm zusammen, die ich nicht ins git hochgeladen habe. Die habe ich aus dem Ordner verbannt und die build-controls-list.pl erneut aufgerufen.

War das korrekt so?

Danke noch einmal für die Untertützung,

Gernot

supernova1963


supernova1963

Hallo CoolTux,

du warst mir schon eine große Hilfe.
Ich freue mich auf deine Vorschläge, wenn du die Zeit gefunden hast.
Mit "ohne HTTPMODe" meinst du wahrscheinlich die direkte Nutzung von HttpUtils. Habe ich auch mal auf dem Schirm gehabt, aber wieder verworfen, da mein logischer Aufbau vorsieht, dass die Daten nicht zu oft abgerufen werden und somit mind. 2 besser 4 zentrale "SeitenabrufDevices" ohnehin dabei heraus kämen. Der Vorteil wäre natürlich, dass man eher von "Modulen" sprechen, und diese dann besser aufeinander abstimmen könnte oder ggf. eine zweistufige Modulkommunikation realisieren würde. Wie bekannt, ich bin absoluter Anfänger, bin aber bereit zu lernen.
Aktuell kann ich nicht beurteilen wieviel "Balast" das HTTPMOD Modul mitbringt bzw. welche Vorteile (außer einer nicht so eingeschränkten userattr Syntax) daraus zu ziehen sind.

Danke für dein Engagement,

Gernot

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: supernova1963 am 28 November 2017, 15:52:04
Hallo CoolTux,

du warst mir schon eine große Hilfe.
Ich freue mich auf deine Vorschläge, wenn du die Zeit gefunden hast.
Mit "ohne HTTPMODe" meinst du wahrscheinlich die direkte Nutzung von HttpUtils. Habe ich auch mal auf dem Schirm gehabt, aber wieder verworfen, da mein logischer Aufbau vorsieht, dass die Daten nicht zu oft abgerufen werden und somit mind. 2 besser 4 zentrale "SeitenabrufDevices" ohnehin dabei heraus kämen. Der Vorteil wäre natürlich, dass man eher von "Modulen" sprechen, und diese dann besser aufeinander abstimmen könnte oder ggf. eine zweistufige Modulkommunikation realisieren würde. Wie bekannt, ich bin absoluter Anfänger, bin aber bereit zu lernen.
Aktuell kann ich nicht beurteilen wieviel "Balast" das HTTPMOD Modul mitbringt bzw. welche Vorteile (außer einer nicht so eingeschränkten userattr Syntax) daraus zu ziehen sind.

Danke für dein Engagement,

Gernot

Ich hatte auch an ein zweistufiges Modulkonzept gedacht. Aber das ist gar nicht nötig. Es geht auch super ohne. Ich habe das früher bei meinem AMAD gemacht.
Alles was Du machen musst in Deinem Fall ist ein Master Device (nicht Modul) welches die Daten holt und vorhält. Du kannst ohne Probleme die erhaltenen Daten in einem Hash schreiben.
$hash->{helper}{bufprime}
$hash->{helper}{bufcurrent}

Die schreibst Du meinetwegen alle 120s neu. Also Abruf über HttpUtils nonBlocking

Deine eigentlichen Devices lesen lediglich diese Hashs immer wieder neu aus und erstellen auf Basis der Daten die Readings. Die Regex passt ja schon super, hatte ich heute Morgen mal kontrolliert.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

supernova1963

Hallo CoolTux,

bis auf die für das Sendungs - Image. Wenn keins vorhanden ist sucht er weiter ggf. über den Sender hinweg.
Das steht auf der Todo - Liste (Issues - im git).
Hier habe ich auch deinen Vorschlag zur Erstellung eines Master - Devices für den Datenabruf eingestellt.

Wenn ein andere Leser helfen möchte diese Aufgaben sind noch offen (https://github.com/supernova1963/TVSender/issues):

1. Masterdevice (analog Vorschlag CoolTux)
2. Korrekte Regex für fehlende Sendung Images
3. DetailLink auf in HTTPMOD Devices als PopUp (analog Vorschlag dev0 und CoolTux)
4. SenderLogos herunterladen und lokal ablegen
5. Allgemeine Code Optimierungen

Über PR (Public Requests) dort oder Vorschläge hier würde ich mich freuen.

Vielen Dank,

Gernot

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

RoBra81

Guten Abend,

Ich erlaube mir mal, mich an der Stelle auch mal mit rein zu hängen. Ich war vor längerer Zeit auch im ursprünglichen TV-Programm-Thread aktiv und hatte damals die Excel Tabelle gebaut. Nun verfolge ich den neuen Ansatz schon seit ein paar Tagen gespannt und habe es auch schon ausprobiert. Um nicht nur wünsche zu äußern habe ich mich auch gerade mal an der Regex für die Bilder versucht (leider zunächst erfolglos, ich werde es die Tage aber weiter probieren). Ich habe noch zwei Ideen, die ich damals umgesetzt hatte und die ich auch hier nicht schlecht fände:

1. Da man die Zeiten kennt, wann ein Programm zu Ende ist, müsste eigentlich nicht alle zwei Minuten aktualisiert werden, sondern z. B. immer eine Minute nach Start einer neuen Sendung.
2. Ich hatte es in meiner ReadingsGroup so umgesetzt, dass beim Klick auf die Sendernummer (bzw. das Senderlogo) einer Sendung in der Zukunft wurde ein at angelegt, welches zum entsprechenden Zeitpunkt umgeschaltet hat...

Mit freundlichen Grüßen
Ronny

Gesendet von meinem SM-G935F mit Tapatalk


supernova1963

Hallo Ronny,

deine Excel Datei habe ich auch gesehen und hat mich inspiriert das Thema weiter zu automatisieren. Im Prinzip habe ich die notwendigen Eingaben in das Define von TVSender verlegt ergänzt um einige individuelle Einstellungen über die Attribute. Ich freue mich, dass du als der inspirierende Experte dieses Thema verfolgst und dich beteiligst.

Deine Wünsche finde ich sehr interessant und ich nehme diese gerne auf.
Bei dem ersten Lesen, fällt mir aufgrund deiner Beschreibung zum Thema UmschaltTimer direkt ein möglicher Lösungsansatz ein (man könnte z.B. die Uhrzeit als Link noch dafür verwenden). Dennoch interessiert mich, wie du es umgesetzt hast bzw. umsetzen würdest (rawDefinition der DOIF, Notify bzw. MyUtils Code; oder direkt als Public Request im git als Erweitung der TVSender_sets und dem geeigneten html <a href="/fhem/cmd= ..." für stateFormat der HTTPMOD Devices und des TVSender Devices).

Bei dem 1. Wunsch zur Minimierung der Abrufe bin ich mir noch nicht ganz im Klaren, wie du es umgesetzt hast. Magst du bitte hier das Prinzip und vielleicht geeignete Beispiele als rawDefinitions oder direkt integrierbar als PR im git mal eine sub Funktion TVSender_RequestTimer($$) vorstellen, mit der diese Abrufe gesteuert werden können?

Vielen Dank,

Gernot

RoBra81

Guten Morgen,

mir hat das mit der RegEx für die Bilder keine Ruhe gelassen und ich denke, ich könnte es hinbekommen haben:

Für die aktuelle Sendung (am Beispiel von "Das Erste"):

<td class="image left">[\s]*<a[\s]*href[^>]* title="Das Erste:[^>]*><img\s*class="epgImage" src="(.*?)"

Für die folgende Sendung (ebenfalls "Das Erste"):

<td class="image">[\s]*<a[\s]*href[^>]* title="Das Erste:[^>]*><img\s*class="epgImage" src="(.*?)"

Zu den anderen Punkten müsste ich heute Abend genauer nachsehen, hier erstmal erste Infos:

Den Code für das geplante Umschalten müsste ich raussuchen, kann aber dauern, da ich die ReadingsGroups glaube ich gelöscht hatte...

Zur Minimierung der Abrufe: Ich hatte ein HTTPMOD-Device "DG.wz.TV.Programm.remote" für alle Sender. In diesem hatte ich die folgende Attribute gesetzt:

attr DG.wz.TV.Programm.remote get1Name TVProgramm
attr DG.wz.TV.Programm.remote get1URL http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/-1/free.html


und dann konnte ich das Abrufen mittels

get DG.wz.TV.Programm.remote TVProgramm

manuell triggern.

Dies hat dann ein DOIF übernommen:

define DG.wz.TV.Programm.remote.DI.update DOIF ([[DG.wz.TV.Programm.remote:ARD_next_time]] or \
[[DG.wz.TV.Programm.remote:ZDF_next_time]] or \
[[DG.wz.TV.Programm.remote:MDR_next_time]] or \
[[DG.wz.TV.Programm.remote:SAT.1_next_time]] or \
[[DG.wz.TV.Programm.remote:RTL_next_time]] or \
[[DG.wz.TV.Programm.remote:RTL_II_next_time]] or \
[[DG.wz.TV.Programm.remote:Pro7_next_time]] or \
[[DG.wz.TV.Programm.remote:VOX_next_time]] or \
[[DG.wz.TV.Programm.remote:Kabel_eins_next_time]] or \
[[DG.wz.TV.Programm.remote:Super_RTL_next_time]] or \
[[DG.wz.TV.Programm.remote:TELE_5_next_time]] or \
[[DG.wz.TV.Programm.remote:ARTE_next_time]] or \
[[DG.wz.TV.Programm.remote:3sat_next_time]] or \
[[DG.wz.TV.Programm.remote:WDR_next_time]] or \
[[DG.wz.TV.Programm.remote:NDR_next_time]] or \
[[DG.wz.TV.Programm.remote:Bayern_next_time]] or \
[[DG.wz.TV.Programm.remote:SWR_BW_next_time]] or \
[[DG.wz.TV.Programm.remote:SWR_RP_next_time]] or \
[[DG.wz.TV.Programm.remote:HR_next_time]] or \
[[DG.wz.TV.Programm.remote:RBB_next_time]] or \
[[DG.wz.TV.Programm.remote:sixx_next_time]] or \
[[DG.wz.TV.Programm.remote:Pro7_MAXX_next_time]] or \
[[DG.wz.TV.Programm.remote:RTL_NITRO_next_time]] or \
[[DG.wz.TV.Programm.remote:SAT.1_Gold_next_time]] or \
[[DG.wz.TV.Programm.remote:NICK_next_time]] or \
[[DG.wz.TV.Programm.remote:Disney_next_time]] or \
[[DG.wz.TV.Programm.remote:KiKa_next_time]] or \
[[DG.wz.TV.Programm.remote:DMAX_next_time]] or \
[[DG.wz.TV.Programm.remote:Eins_Plus_next_time]] or \
[[DG.wz.TV.Programm.remote:Phoenix_next_time]] or \
[[DG.wz.TV.Programm.remote:N24_next_time]] or \
[[DG.wz.TV.Programm.remote:N-TV_next_time]]) (deletereading DG.wz.TV.Programm.remote .*_image, get DG.wz.TV.Programm.remote TVProgramm)\

attr DG.wz.TV.Programm.remote.DI.update cmdpause 5


Das deletereading brauchte ich, damit nicht die alten Bilder stehen bleiben, wenn er kein neues findet...

Ronny

supernova1963

Hallo Ronny,

vielen Dank für die Konkretisierung der Umsetzung deiner Vorschläge.
Die Regex für die Sendungsbilder habe ich bereits in die Internals eingegeben. Sie sollten in dem nächsten Vorab-Release enthalten sein.

Bei dem Thema URL - Abruf Optimierung ist eine Realisierung nicht ganz so einfach. Meine ersten Gedanken sind:

  • Get- Funktionen analog deines Muster in den Definitionen der HTTPMOD Devices (sub TVSender_Add_HTTPMOD_Device($$$$) { ...  }) z.B. als ReCallURL einfügen
  • In der Überwachung der ob die FHEM Intitalisierung abgeschlossen ist (in "sub TVSender_Notify($$) { ...}") den neuen Get Befehl für ein einzelnes HTTPMOD Device z.B. "get TV_Program_NOW ReCallURL" ausführen, damit für das überwachte Device ein Änderungsereignis erzeugt
  • In der Ereignisüberwachung für TV_Program_NOW (ebenfalls im "sub TVSender_Notify($$) { ... }") für alle HTTPMOD Devices einen InternalTimer setzen, der 1 Minute nach dem frühesten Wert von den Readings .*_NEXT_Time liegt und die jeweilige neue: "get < HTTPMOD Device > ReCalllURL ausführt
  • Das daraus resultierende Ereignis zu dem überwachten HTTPMOD Device setzt den InternalTimer neu
  • ...

Dann könnte imo der Interval der HTTPMOD Devices auf 0 gesetzt werden, oder habe ich da einen Denkfehler?

Danke,

Gernot

RoBra81



Zitat von: supernova1963 am 29 November 2017, 18:29:04
Dann könnte imo der Interval der HTTPMOD Devices auf 0 gesetzt werden

Dem sollte so sein. Und die Aktualisierung der Primetime würde ich einmal kurz nach Mitternacht machen...

Ronny

Gesendet von meinem SM-G935F mit Tapatalk


supernova1963

Hallo Ronny,

Zitat von: RoBra81 am 29 November 2017, 18:37:35
Und die Aktualisierung der Primetime würde ich einmal kurz nach Mitternacht machen...

Echt, reicht 1 x pro Tag? Werden z.B. bei Brennpunkten oder so die Planer nicht aktualisiert?

Gernot

supernova1963

Weiter Gedanken dazu:

Das alles wäre mit einem eigenen Master Device (1 TVMaster Device anstelle der HTTPMOD Devices), wie von CoolTux vorgeschlagen, wahrscheinlich eleganter zu lösen. Im Moment traue ich mich aus Sorge wegen des Aufwands und Sorge vor dem Scheitern nicht daran diese Master Device zu erstellen.

Die zuvor beschriebenen Anpassungen packe spätestens am WE in ein weiteres Vorab-Release. Das Thema Master Device bedarf einiger Umstellungen. Kurzfristig wäre es nur realisierbar, wenn mir einen funktionierenden Public Request im git  dazu einstellt. Mir fehlt aktuell einfach die Zeit für etliche "Try-And-Errors".

Danke,

Gernot

DarkT

Hier mal eine Idee um die Images alle in einen lokalen Ordner zu laden.
Ich bin leider noch nicht tierf genug in FHEM um die sauber FHEM intergartion durchzuführen.
Auch mit dem Thema non-blocking habe ich noch zu wenig Erfahrung.

Aber es ist schon mal zumindest ein Lösungsanstz:


use File::Fetch;
use LWP::Simple;
use HTML::LinkExtor;
use Data::Dumper;
$Data::Dumper::Indent=1;

my $url = "http://images.klack.de/fernsehprogramm/fernsehprogramm/-1/free.html";

my %images = ();
my $html = get($url)
  or die "could not get images \n";

my $parser = HTML::LinkExtor->new(undef, $url);
$parser->parse($html);

my @all_link_refs = $parser->links();

for my $link_ref ( @all_link_refs  ) {
  my ( $html_tag, $attr_name, $this_url ) = @$link_ref;
  if ( ($html_tag eq 'img') ) {
    my $image_name = (split("/", $this_url))[-1];
    $images{$image_name}++;

    if ( $images{$image_name} == 1  ) {
        print "Downloading $this_url to $image_name...\n";
         my $ff = File::Fetch->new(uri => $this_url);
my $file = $ff->fetch() or die $ff->error;
    }   
  }
}


Die Idee  - da keine Directory Listings möglich sind - ist die Seite von klack abzurufen, auf der alle Sender inkl. Logo aufgeführt sind und dann die Bilder (Logos) zu laden.