Aktuelles Radio- und TV-Programm - RTVhelper 2.06

Begonnen von Elektrolurch, 28 April 2018, 11:53:19

Vorheriges Thema - Nächstes Thema

Elektrolurch

Eigenschaften:
- Das Modul zeigt das aktuelle, das von 20:15 und 22:00  TV Programm (von klack) an.
- Es kann um beliebige Radiosender (Tagesprogramm) erweitert werden. Dazu muss nur die uri und eine regex als Attribut hinterlegt werden
- Das Modul benötigt für das Laden der Webseiten kein HTTMOD und für die Anzeige keine readingsGroup. Damit entfällt viel Konfigurationsaufwand.
- Hinterlegt man im Attribut "receiverCMD" einen set - Befehl, so kann ein externer Receiver bei Klick auf das Sender-Logo direkt, und bei Klick auf die entsprechende Zeitangabe zur Programmzeit umgeschaltet werden, so dass man sich sein individuelles Radio- und Fernsehprogramm erstellen kann. Die programmierten Timer werden in allen Listen bei der Uhrzeit des Programms mit einem Symbol markiert. Widersprüchlicher Programmierungen werden gemeldet. Es gibt auch eine Darstellung, in der alle programmierten Timer im Überblick angezeigt werden.
- Sendungsdetails werden bei Klick auf den Sendungstitel, sofern verfügbar, in einer eigenen Dialogbox angezeigt.
- Das Modul enthält auch eine Suchfunktion, mit der man sich bestimmte Sendungen anzeigen lassen kann.
Die durch " " getrennten Stichworte werden ODER verknüpft. Die letzten 10 Suchanfragen werden in einem Dropdown - Menü angezeigt. Einzelne Eintragungen können mit dem daneben stehenden <x> - Symbol aus dem Menü gelöscht werden.

Das Modul lädt nur die Klack - Seite, wenn die Anzeigenliste angezeigt wird und der nächste Sendungszeitpunkt der hinterlegten Sender erreicht wird. Dabei sucht der Parser nur jene Kanäle, die sich zum Zeitpunkt auch geändert haben, so dass das Modul wenig Rechenzeit benötigt. Pro Kanal ca. 8 ms, der vollständige Satz aller bei mir angezeigten Sender braucht so ca. 150 ms, ohne das Laden der Webseite von Klack (erfolgt non blocking)

- Für die Anzeige von Radio- und Fernsehkanälen können beliebig viele Anzeigelisten definiert werden (z.B. öffentliche, Dritte, Private...)
   


define RTVhelper RTVhelper


Die uri und die regex für Klack sind schon vorbelegt und müssen nicht mehr gesetzt werden. Sie haben die  internen Kanalnamen TVjetzt, TV2015 und TV2200.

Setzt man noch einen room, definiert die anzuzeigende Senderliste (attr RTVhelper senderListTV...) und führt dann "set RTVhelper update" aus. Sollte das TV-Programm schon angezeigt werden.

Attribute:
disable 0,1,2,3
1 = keine Aktualisierung
3 = keine html - Ausgabe
Die Timer - Funktion zum Umschalten des ext. Receivers bleibt jedoch aktiv!

starttime
Uhrzeit im Format hh:mm ab dem das erste Lesen der Klack - Seite (für TVjetzt) durchgeführt werden soll.
Klappt man die Anzeige zu, wird das Attribut sowieso ignoriert. Öffnet man die Anzeige vor der Startzeit, werden automatisch alle internen Updates gestartet. 
Die Rundfunksender, falls hinterlegt, und TV2015 und TV2200 werden um 8:00 Uhr gelesen. Davor sind teilweise (für das Nachtprogramm) die Infos anders hinterlegt, so dass eine zeite regex verwendet werden müsste. Daher die Einschränkung auf 8:00 Uhr.


delay-time-read
Angabe in Sekunden, um die Klack-Seite verzögert zu lesen. Die Aktualisierung erfolgt dort nicht immer sekundengenau. 30 hat sich als Wert bewährt.

min-update-interval
Angabe in Minuten! Bei den Tests habe ich festgestellt, das viele TV-Sender auch "krumme" Anfangszeiten haben oder recht kurze Sendungen im Minutenbereich. Das erhöht den Traffic auf die Klack-Seite und die angezeigte Liste der Sender wird durch den Refesh recht häufig aktualisiert.  Mit dem Attribut "min-update-interval" werden alle Sender, die während des Intervals zu aktualisieren wären, erst am Ende des Intervals zusammen aktualisiert.   und

noheading 0,1
Unterdrückt die Kopfzeile mit dem Link zur Detail-Ansicht.
sihe -> readingsGroup

receiverCMD
Ein externer Receiver kann sofort oder per Timer umgeschaltet werden. Programmierung durch Anklicken der Uhrzeit der entsprechenden Sendung.

set Wohnzimmer_Receiver channel $CHANNEL

$CHANNEL $SENDER UND $INPUT sind Platzhalter für den aktuellen Kanalnamen, Sendernamen (s.u.) und für TV oder Radio.

senderList(Radio|TV)(-[A-Z,a-z]+\w)?
senderList(TV|Radio)[-<Listenname>] /<stationname>:<sender>:<channel>/....
Hiermit werden für Radio und TV Senderlisten definiert. Es erfolgt die Zuordnung zwischen
<stationnamen> = Name des Senders auf Klack
<sender> = Anzeigenname im Menu und unter den Sender-Logos
<channel> = Kanal-Name, mit dem der Receiver umgeschaltet werden soll.
Wichtig: Dieser Name wird auch für die Anzeige des Logos verwendet.

Bei Radio entfällt der erste Eintrag <stationname> natürlich.
Wird kein Listname angegeben, so heißt die Liste "Alle" (s.u.)

Beispiel:

senderListRadio /Bayern 2:Bayern_2/Deutschlandfunk:DLF/WDR 2:WDR_2/WDR 3:WDR_3/WDR 4:WDR_4/WDR 5:WDR_5
senderListTV-Vorschau1 /ZDF info:ZDF Info:ZDFinfo_HD/Das Erste:Das Erste:Das_Erste_HD/ZDF:ZDF:ZDF_HD/Bayern:Bayern FS:BR_Nord_HD/ARD ALPHA:ARD Alpha:ARD-alpha/Phoenix:Phoenix:PHOENIX_HD/ARTE:Arte:arte_HD/3sat:3Sat:3sat_HD/SWR BW:Südwest:SWR_BW_HD/N24 Doku:N24:N24/
senderListTV-Vorschau2 /WDR:WDR:WDR_HD_Dortmund/MDR:MDR:MDR_Sachsen_HD/RBB:RBB:rbb_Berlin_HD/ZDF neo:ZDF Neo:zdf_neo_HD/
senderListTV-Vorschau3 /RTL:RTL:RTL_Television/RTL 2:RTL 2:RTL2/Pro7:Pro 7:ProSieben/Kabel eins:Kabel 1:kabel_eins/VOX:VOX:VOX/Servus TV:Servus TV:ServusTV_HD_Deutschland/KiKa:Kika:KiKA_HD/Anixe HD:Annixe:ANIXE_HD/N-TV:N-TV:n-tv/DMAX:DMAX:DMAX/Sport 1:Sport 1:SPORT1/Eurosport:Eurosport:Eurosport_1_Deutschland/Pro7 MAXX:Pro 7 MAXX:ProSieben_MAXX/NITRO:RTL Nitro:RTLNITRO


Anmerkung: Mit

get RTVhelper showklacklist
[code]
wird angezeigt, welche "stationen" auf Klack mit Programminformationen vorhanden sind.

mit[code]
deleteattr TVhelper senderList</cod>
werden alle definierten Senderlisten zurückgesetzt. Hintergrund: Es kann zu Inkonsistenzen in der Namensumsetzung kommen, wenn definierte Senderlisten durch erneutes Setzen umdefiniert werden. Da hilft dann nur ein Neustart oder mit dem obigen Befehl aller Senderlisten zu löschen und neu anzulegen.

styleTimeCol(selectable)? styleTitleCol(selectable)?
style Anweisungen, die für die Zeit- und Titelspalte verwendet werden sollen. Beispiel: Wenn die Uhrzeit angeklickt werden kann, weil sie in der Zukunft liegt und das Attribut "receiverCMD" gesetzt wird, soll die Uhrzeit rot angezeigt werden. Liegen Sender-Details zum Programm vor, soll der Titel grün angezeigt werden.
[code]
styleTimeColselectable style="font-weight:bold; color:red; "
styleTitleColselectable style="font-weight:bold; color:green; "

Bei Eingabe über die Kommandozeile das maskieren von ";" durch ";;" nicht vergessen. -:)

collapse-symbol
Setzt das Symbol für das Auf- und Zuklappen der liste und seine Größe

attr RTVhelper collapse-symbol control_arrow_down control_arrow_right 16

Die obigen Werte  sind die Voreinstellungen.

regex|parser)(Radio|TV)-[A-Z,a-z]+\w*
Damit werden für Radiosender die uri und die regex gesetzt. Standardmässig wird die interne Routine "RTVhelper_Parse" verwendet. Soll eine andere Routine verwendet werden, so ist das Attribut parse... entsprechend zu setzen. Im Beispiel unten ist dies für die Webseite des Programms von Bayern2 der Fall, da hier die Reihenfolge der Felder eine andere ist (s.u.)

beispiel:

uriRadio-Bayern_2 https://www.br.de/radio/bayern2/programmkalender/programmfahne102.html
uriRadio-DLF http://www.deutschlandfunk.de/programmvorschau.281.de.html
uriRadio-WDR_2 https://www.wdr.de/programmvorschau/wdr2/uebersicht/
uriRadio-WDR_3 https://www.wdr.de/programmvorschau/wdr3/uebersicht/
uriRadio-WDR_4 https://www.wdr.de/programmvorschau/wdr4/uebersicht/
uriRadio-WDR_5 https://www.wdr.de/programmvorschau/wdr5/uebersicht/
 
regexRadio-Bayern_2 <strong>(\d+):(\d+)<\/strong>\s*([\w\W]*?)\s*<\/a>\s*<\/dt>\s*<dd>\s*([\w\W]*?)<\/dd>
regexRadio-DLF <td class="time">\s*(\d+):(\d+)[\s\w]*?<a id="\d+" name="\d+"><\/a><\/td><td class="description"><h3><a title="[\w\W]*?" href="([\w\W]*?)">([\w\W]*?)<\/a>\s*<a class="psradio" title="[\w\W]*?" href="[\w\W]*?">[\w\W]*?<\/a><\/h3>\s*([\w\W]*?)<(\/td>|div |a |p )
regexRadio-WDR_2 <span class="time">\s*(\d+)[\.:](\d+)<\/span>\s*<\/div>\s*<div class="epg_list_entry_item epg_list_entry_item_title">\s*<a class="title" href="([\w\W]*?)">\s*<strong>\s*([\w\W]*?)<\/strong>\s*([\w\W]*?)<\/div>
regexRadio-WDR_3 <span class="time">\s*(\d+)[\.:](\d+)<\/span>\s*<\/div>\s*<div class="epg_list_entry_item epg_list_entry_item_title">\s*<a class="title" href="([\w\W]*?)">\s*<strong>\s*([\w\W]*?)<\/strong>\s*([\w\W]*?)<\/div>
regexRadio-WDR_4 <span class="time">\s*(\d+)[\.:](\d+)<\/span>\s*<\/div>\s*<div class="epg_list_entry_item epg_list_entry_item_title">\s*<a class="title" href="([\w\W]*?)">\s*<strong>\s*([\w\W]*?)<\/strong>\s*([\w\W]*?)<\/div>
regexRadio-WDR_5 <span class="time">\s*(\d+)[\.:](\d+)<\/span>\s*<\/div>\s*<div class="epg_list_entry_item epg_list_entry_item_title">\s*<a class="title" href="([\w\W]*?)">\s*<strong>\s*([\w\W]*?)<\/strong>\s*([\w\W]*?)<\/div>

parserRadio-Bayern_2 RTVhelper_Parse_Bayern_2


Die regex wird beim Setzen des Attributs getestet, sollte sie fehlerhaft sein, so würde sie zur Laufzeit fhem zum Absturz bringen. Die subroutine, die mit dem parse - Attribut gesetzt wird, muss ebenfalls vorhanden sein (wird getestet).

Anmerkung (noch Baustelle): Die regex für klack setze ich schon beim define - Befehl als Vorbelegung. Sie funktioniert zur Laufzeit, aber beim Test mit eval kommt ein Syntax-Fehler. Die Ursache hierfür konnte ich noch nicht herausfinden.
Die regex sieht so aus:

regexTV-TVjetzt title="($STATION)"><img[\w\W]*?<td class="time">\s*(\d+:\d+)\s*[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*([\w\W]*?)\s*</a>\s*<br/>\s*([\w\W]*?)<br/>([\w\W]*?)<\/?(img|div)[\w\W]*?<td class="time[\w\W]*?Row">\s*(\d+:\d+)\s*<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*([\w\W]*?)\s*</a>\s*<br/>\s*([\w\W]*?)<br/>([\w\W]*?)<\/?(img|div)[\w\W]*?


$STATION wird natürlich zur Laufzeit durch den zu suchenden Klack-Stationsnamen ersetzt.
Hier der Auszug aus der RTVhelper_attr - Subroutine:

if($attr eq 'regex') # test it
{
my $regex = $aVal;
$regex =~s/\$STATION/station/g;
eval("{$teststring =~m/$regex/}");
if($@)
{
my $err = "attr $name: $aName $sender $@\n$regex";
Log3($name,1,$err);
return $err;
} # error
} # test regex

liefert beim Setzen des Attributs für TFjetzt (Klack):
2018.04.25 17:39:00 1: attr RTVhelper: regexTV-TVjetzt TVjetzt syntax error at (eval 1180) line 1, near "?)"

title="(station)"><img[\w\W]*?<td class="time">\s*(\d+:\d+)\s*[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*([\w\W]*?)\s*</a>\s*<br/>\s*([\w\W]*?)<br/>([\w\W]*?)<\/?(img|div)[\w\W]*?<td class="time[\w\W]*?Row">\s*(\d+:\d+)\s*<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*([\w\W]*?)\s*</a>\s*<br/>\s*([\w\W]*?)<br/>([\w\W]*?)<\/?(img|div)[\w\W]*?


Noch ein Schönheitsfehler, aber die regex funktioniert ja zur Laufzeit.

Hat man alle gewünschten Attribute eingegeben, so wird RTVhelper mit
set RTVhelper update

gestartet.


set RTVhelper update TVjetzt
set RTVhelper update WDR_2

aktualisiert die Programminformation für das aktuelle TV-Programm und für WDR_2.

Kopfzeile:
Mit den angezeigten Sybolen TV/Radio wird zwischen TV und Radio umgeschaltet. Mit der Uhr zwischen jetzt, 20:15 und 22:00.
Mit dem ">" am Zeilenanfang kann man die Liste deaktivieren. Es erfolgt dann kein Zugriff mehr auf die Klack-Seite, bis die Liste wieder mit dem >+ geöffnet wird. Das spart Ressourcen.

Eigene Senderseiten hinzufügen:

Dazu setzt man zuerst die uri für die Seite des Senders.
Danach:

set RTVhelper update <neuer_sender>
set RTVhelper showdata

Die geladene Seite des Senders (html - code) wird angezeigt.
Nun muss man die regex dafür entwickeln.
Dabei ist folgendes zu beachten:
Die Standard-Routine RTVhelper_Parse setzt folgende Reihenfolge der Werte voraus:

my ($hour,$minute,$ref,$title,$desc) = ($1,$2,$3,$4,$5);

ref ist etwas anklickbares, wird derzeit aber nicht weiter verwendet.
desc = Detailangaben zur Sendung.
hour und minute sind getrennt, da manche Webseiten die Uhrzeit nicht in hh:mm, sondern in hh.mm darstellen (z.B. WDR).
Man muss sich also aus dem angezeigten html-Quelltext einen typischen Sendungseingtrag herausholen und in eine regex umwandeln. Die zu suchenden Werte stehen dabei immer in "()".
Dabei ist aber auch für die regex zu beachten, dass manche Sendungen Zusatzinformationen haben, wie z.B. Knöpfe für podcast oder streaming und andere Eintragungen nicht.

Wer also nochz uri's und regex's für weitere Radio-Sender entwickelt, bitte hier veröffenlichen.

Optische Gestaltung:
Es werden folgende css-Klassen gesetzt:
Uhrzeitenspalte: timecol
   Titelspalte: titlecol
   
   Für die Tabelle mit den Bedienungssymbolen und für die Liste:
   
   my $headerheader = "<table  id=".$type . "-header ".
"' groupId=\"atEnd\" class=\"block wide $type header\">\n";

my $listheader = "<table  id=\"$type" . "-list\" " .
"' groupId=\"atEnd\" class=\"block wide $type list\">\n";

Für die Zeilen der Sendungen eines Senders wird odd und even eingefügt.
Die icons werde mit den Klassen: IconwithLabel LabelText
und die Senderlogos zusätzlich mit Logo gestaltet.
Hier ein Beispiel für eine css - Datei:


.Logo.icon {width:72px;}
.Logo svg {width:72px; height:72px; horizontal-align:center; vertical-align:middle;}
.IconwithLabel {
width:64px;
vertical-align:middle;
horizontal-align:center;
text-align: center;
margin:4px;
}

.LabelText {
font-size:12px;
text-align: center;
color:#ffffff;
}

/* Radiohelper  */
.RTVhelper.list td {
vertical-align:top; horizontal-align:center;
text-align: center;
padding:6px;
margin:2px;
}

.RTVhelper.list td.titlecol {
horizontal-align:left;
text-align: left;
word-break: break-all;
word-wrap:break-word;
}
/* Test */



Eine zusätzliche css - Datei wird für die fhemWEB z.B. mit:

attr WEB CssFiles pgm2/darkiphone.css

gesetzt. Die Datei muss nach www.pgm2 kopiert werden.

Da ich auf einen ScreenReader angewiesen bin, kann ich leider nicht beurteilen, wie das optische Ergebnis dann wirklich aussieht. Hier sind Vorschläge willkommen.
Außerdem bin ich nicht gerade der Experte für style und css. :-)
Ich füge mal meine Logos als zips hinzu. Die meisten sind SVG's. Weiß aber nicht, ob tatsächlich auch alle korrekt angezeigt werden....

Hinweis:
Die Logos stammen von wikipedia und sind SVGs. Laut fhem - Wiki werden die Größen der Logos wie oben beschrieben über eine CSS-Anweisung gesetzt.

Zusätzliche Ordner mit  Logos werden mit:

attr WEB.* iconPath $styleSheetPrefix:default:fhemSVG:openautomation:TVSVG:RadiosSVG:logos
und danach
set WEB.* rereadicons

eingebunden.

Der TVhelper ist jetzt schon seit einiger Zeit bei mir in Benutzung und läuft mit den oben gesetzten Attributen stabil. Trotzdem sind Fehler nicht ausgeschlossen.
Mit verbose 2 sieht man, ob der parser korrekt funktioniert.

updates hier immer im ersten BeEitrag.

Viel Spaß

Elektrolurch

Änderungen:
2.2: fix crash, wenn keine senderListTV definiert wurde.
- Das Symbol für die Programmierung einer Umschaltung wird nun über DoTrigger aktualisiert
- einCollapse - Symbol auch am Ende der Liste
- Die errmsg wird beim Zuklappen zurückgesetzt.
# 21: Umlaut korigiert
#21: Ausgabe von showKlacklist geändert
2.06: Sicherheitsabragen, wenn keine Stationen auf der Klackseite gefunden wurden
configDB und Windows befreite Zone!

MadMax-FHEM

Hiho!

Habe es auf dem "anderen Kanal" schon mitbekommen... :)

Häng mich mal hier dran und wenn demnächst mal Zeit ist, werde ich es auch mak testen...

Vielen Dank schon mal!

Gruß, Joachim
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)

mumpitzstuff

#2
Ich habs versucht und es passiert nichts. Ich dachte gestern Abend das es an der Zeit liegt, aber auch jetzt passiert bei Update nichts. Ich muss es mir heute Abend noch mal genauer ansehen.
Was mir bisher aufgefallen ist:

- bitte Code Tags in eckigen Klammern verwenden
- in deinem regex musst du vielleicht einige / mit einem \ davor versehen
- eine schritt für schritt Anleitung am Anfang wäre sinnvoll und danach erst die ganzen Details
- einige Befehle wie Update sind nicht über set erreichbar, sondern nur als Kommando in der Befehlszeile
- get abc klacklist gibt es nicht, das Kommando heißt anders
- man kann das Device nicht mehr anklicken, um in die Details rein zu kommen
- in der Beschreibung steht das vor 8 nichts geladen werden kann, im Modul ist von 9 Uhr die Rede
- warum hast du nicht gleich ein richtiges Modul aufgesetzt, anstatt ein Pseudomodul über die myUtils?
- der Code des Moduls ist nicht lesbar, da sämtliche Einrückungen fehlen. Sowas würde auch dir die Pflege sehr erleichtern

Elektrolurch

Zitat:
Ich habs versucht und es passiert nichts. Ich dachte gestern Abend das es an der Zeit liegt, aber auch jetzt passiert bei Update nichts. Ich muss es mir heute Abend noch mal genauer ansehen.

Ich habe gesehen, dass das attribut
uriTV-TVjetzt http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/0/all.html
bei den Voreinstellungen im define wegkommentiert war. Ist mir nach einem Neustart aufgefallen.
Habe das mit den Voreinstellungen gefixed. Wenn man die Attribute von Hand setzt oder nach dem define einen Neustart gemacht hätte, wäre es auch gegangen. Habe die Datei aktualisiert.

Zitat:
Was mir bisher aufgefallen ist:

- bitte Code Tags in eckigen Klammern verwenden
Ok. Über den ScreenReader kann ichnicht das Symbol dafür anklicken, da ich dann wieder aus dem Textfeld bin.


- in deinem regex musst du vielleicht einige / mit einem \ davor versehen

Das glaube ich jetzt nicht, das das Modul ja läuft. Oder ändert die Eingabe über das fhem-Frontend des Attributes etwas an  den "/"? Wäre mir nicht bekannt.
Zitat:
- eine schritt für schritt Anleitung am Anfang wäre sinnvoll und danach erst die ganzen Details

Außer dem define und das Setzen des Attribute für die senderList ist ja nichts zu tun, um erst einmal eine Anzeige zu erhalten. :-)

Zitat:
- einige Befehle wie Update sind nicht über set erreichbar, sondern nur als Kommando in der Befehlszeile
Stimmt nicht. Die Liste wird dynamisch erzeugt und enthält die Liste der definierten Seiten für Radiosender, TVjetz, TV2000 und TV2015.

Zitat:
- get abc klacklist gibt es nicht, das Kommando heißt anders
Wird beim get angezeigt und heißt: "showKlacklist".
Zitat:
- in der Beschreibung steht das vor 8 nichts geladen werden kann, im Modul ist von 9 Uhr die Rede
Wenn das Attribut starttime nicht gesetzt wird, dann ist der default für das Laden der klack-Seite 9:00 Uhr. Die Radiosender werden fix um 8:00 Uhr geladen.

Zitat:
- warum hast du nicht gleich ein richtiges Modul aufgesetzt, anstatt ein Pseudomodul über die myUtils?
Es ist ein richtiges Modul, nur kann ich es dann nicht mehr im Webbrowser editieren, wenn es nicht 99_myUtiils... heißt. Man kann es ohne Anpassungen jederzeit umbenennen... :-)

Zitat:
- der Code des Moduls ist nicht lesbar, da sämtliche Einrückungen fehlen. Sowas würde auch dir die Pflege sehr erleichtern
Sorry, wenn Du auf einen ScreeReader  angewiesen bist, nutzen Dir die Einrückungen rein gar nichts. Die stören nämlich nur. Hier gibt es auch andere im Forum, die einen ScreenReader verwenden und auf die Einrückungen verzichten. Und "lesbar" ist er für mich auf alle Fälle, jeder wie er es braucht... :-O

Und dafür steht aber hinter jeder "}" Klammer auch, welcher Block da geschlossen wird. Das halte ich nämlich für guten Programmierstil, und da fehlt es in so manchen Modulen, was mir das Leben schwer macht....
 
Elektrolurch
configDB und Windows befreite Zone!

mumpitzstuff

#4
Das Attribut war bei mir bereits gesetzt. Es geht trotzdem nicht. Mein Device sieht so aus:

defmod RTVhelper RTVhelper
attr RTVhelper collapse 0
attr RTVhelper min-update-interval 15
attr RTVhelper parserTV-TV2015 RTVhelper_ParseTV
attr RTVhelper parserTV-TV2200 RTVhelper_ParseTV
attr RTVhelper parserTV-TVjetzt RTVhelper_ParseTV
attr RTVhelper room TV
attr RTVhelper senderListTV-Vorschau1 /ZDF info:ZDF Info:ZDFinfo_HD/Das Erste:Das Erste:Das_Erste_HD/ZDF:ZDF:ZDF_HD/Bayern:Bayern FS:BR_Nord_HD/ARD ALPHA:ARD Alpha:ARD-alpha/Phoenix:Phoenix:PHOENIX_HD/ARTE:Arte:arte_HD/3sat:3Sat:3sat_HD/SWR BW:Südwest:SWR_BW_HD/N24 Doku:N24:N24/
attr RTVhelper senderListTV-Vorschau2 /WDR:WDR:WDR_HD_Dortmund/MDR:MDR:MDR_Sachsen_HD/RBB:RBB:rbb_Berlin_HD/ZDF neo:ZDF Neo:zdf_neo_HD/
attr RTVhelper senderListTV-Vorschau3 /RTL:RTL:RTL_Television/RTL 2:RTL 2:RTL2/Pro7:Pro 7:ProSieben/Kabel eins:Kabel 1:kabel_eins/VOX:VOX:VOX/Servus TV:Servus TV:ServusTV_HD_Deutschland/KiKa:Kika:KiKA_HD/Anixe HD:Annixe:ANIXE_HD/N-TV:N-TV:n-tv/DMAX:DMAX:DMAX/Sport 1:Sport 1:SPORT1/Eurosport:Eurosport:Eurosport_1_Deutschland/Pro7 MAXX:Pro 7 MAXX:ProSieben_MAXX/NITRO:RTL Nitro:RTLNITRO
attr RTVhelper uriTV-TV2015 http://www.klack.de/fernsehprogramm/2015-im-tv/0/-1/free.html
attr RTVhelper uriTV-TV2200 http://www.klack.de/fernsehprogramm/2200-im-tv/0/-1/free.html
attr RTVhelper uriTV-TVjetzt http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/0/all.html

setstate RTVhelper initialized
setstate RTVhelper 2018-04-29 11:29:18 TVdisplay Vorschau3
setstate RTVhelper 2018-04-29 00:10:00 TVsender DMAX
setstate RTVhelper 2018-04-29 11:29:01 showtime Jetzt



Ist das soweit in Ordnung? Was sollte ich jetzt als nächstes aufrufen? Update?

Im log steht folgendes wenn ich ein Update versuche:

2018.04.29 21:17:31 4: RTVhelper_set RTVhelper update TVjetzt .. begin set
2018.04.29 21:17:31 1: RTVhelper_IOWrite: for TVjetzt no attributes stored (uri,regex)


Ich glaube die Regex Attribute wurden beim define nicht gesetzt ist. Schau ich mir nachher noch mal am PC an.

mumpitzstuff

Das mit dem Regex habe ich deshalb geschrieben, da du oben was von Problemen erwähnt hattest. Je nachdem was du nachher mit dem Regex machst, ist es eventuell wichtig ein backslash vor einem slash zu haben (konnte leider deinen Code nicht lesen um das zu prüfen :)).

Wenn du z.b.

if ($test =~ /$dein_regex/)

dann kann es hier Probleme geben. War aber nur so eine Idee, insbesondere weil du manche slashes explizit bereits mit einem backslash versiehst und andere nicht.

Elektrolurch

Hallo,

lösch das device und lege es mal neu an. Wie ich schrieb, habe ich die automatische Vorbelegung der Attribute für TVjetz... im define zum Teil deaktiviert. Habe es aber nun mit der V2 .01 korrigiert. Wenn ich ein neues RTVhelper - Device anlege und mit dem Attribut  die senderList definiere, geht alles automatisch. Habe es jetzt mehrmals ohne Neustart ausprobiert.
Wenn man von Hand die Attribute, wie in Beitrag #1 beschrieben, am Anfang von Hand setzt, geht es sowieso korrekt.

Elekttrolurch
configDB und Windows befreite Zone!

mumpitzstuff


mumpitzstuff

#8
Bei manchen Sendern sind 2 Sendungen von jetzt an zu sehen, bei einigen aber eine Sendung von jetzt (läuft dann grad) und dann erst wieder von 20:15 Uhr. Ist das normal?

Wenn man ein bisschen wartet ist es wieder normal. Vermutlich ist das Update noch nicht komplett durch beim ersten Aufruf der Seite.

Elektrolurch

Ist mir auch schon aufgefallen. Ich vermute, dass die Klackseite nicht immer exakt zum Sendungsanfang des jeweiligen Sender alles aktualisiert... Bei ZDFinfo habe ich das schon öfters beobachtet.
Dafür gibt es eigentlich das Attribut "delay-time-read", wenn es nicht gesetzt ist, so ist der delay 30 s.

Elektrolurch
configDB und Windows befreite Zone!

mumpitzstuff

Ich finde die Idee die Seite nur neu zu laden, wenn eine Sendung abgelaufen ist, sehr gut. Auch die Gruppierung der Sender ist super. Mich stört allerdings ein wenig, das nur 2 Sendungen zu sehen sind, das liegt allerdings in der Anzeige von Klack begründet, da dort immer nur die nächsten 2 Sendungen angezeigt werden. Außerdem ist die Sendungsbeschreibung meist ziemlich dünn.

Ideen:
Wäre es nicht vielleicht günstiger sich eine Senderliste einzulesen z.B. über (die Mobilseiten sind kleiner als die Desktop Seiten, das spart Traffic):

http://m.klack.de/sender.html

Diese kann man dann irgendwo anzeigen und der Anwender kann sich daraus verschiedene Senderlisten zusammen stellen (sie wie auch jetzt schon).

Und wenn man dann einmal am Tag z.B. 5:00 Uhr früh das gesamte Programm des Tages in einem Rutsch einliesst (für alle Sender der aktuell eingestellten Gruppe)? Also z.B. für Pro7 die folgende Seite einliesst?

http://m.klack.de/sender/pro7-79.html

Vermutlich ist der Download von 20 Seiten a 100kb besser als 50x am Tag eine 400kb Datei zu downloaden.

Um entsprechend Traffic zu sparen, könnte man sich nur den Link der Detailsseite als Reading ablegen und diese beim Klick auf eine Sendung in einem iframe laden. Dann hat man immer eine sehr detaillierte Beschreibung, die nur Traffic verursacht, wenn man sie wirklich anklickt.

Die Mobilseiten lassen sich auch vermutlich super parsen, was ich so auf den ersten Blick sehen konnte.

Elektrolurch

Zitat:
Mich stört allerdings ein wenig, das nur 2 Sendungen zu sehen sind, das liegt allerdings in der Anzeige von Klack begründet, da dort immer nur die nächsten 2 Sendungen angezeigt werden.

Na ja, mir reicht das fürs Erste. Außerdem gibt es ja auch das "Sender" - Menu, mit dem alle ab jetzt geladenen Sendungen für einen Sender angezeigt werden kann. Für Radio-Programme sind das immer alle vom ganzen Tag, für TV ist es jetz, 20:15 und 22:00 Uhr.

Zitat:
Ideen:
Wäre es nicht vielleicht günstiger sich eine Senderliste einzulesen z.B. über (die Mobilseiten sind kleiner als die Desktop Seiten, das spart Traffic):

http://m.klack.de/sender.html

Ja, das geht ja jetzt schon. Lege gem. Beitrag #1 einen Sender mit uri und regex an, der wird dann automatisch um 8:00 Uhr morgens in den Speicher geladen. Der Name für den Eintrag muss natürlich dem <channelnamen> in der senderList entsprechen.
Zitat:
Vermutlich ist der Download von 20 Seiten a 100kb besser als 50x am Tag eine 400kb Datei zu downloaden.
Stimmt.

Zitat:
Um entsprechend Traffic zu sparen, könnte man sich nur den Link der Detailsseite als Reading ablegen und diese beim Klick auf eine Sendung in einem iframe laden.

Ich hatte schon vorgesehen, dass in den Datenstrukturen beim Parsen ein Feld "ref" mit einem Link gefüllt wird. Der ist aber je nach Seite manchmal relati oder absolut, und dann müsste man sich erst die komplette URL zusammenbasteln. Außerdem habe ich mich noch nicht damit befasst, wie man von fhem aus einen iFrame öffnet. Die Detailseiten enthalten soviel zusätzlichen "Müll", den man eigentlich ja nicht sehen will, so dass man dort erst einmal wieder die eigentliche Sendungsbeschreibung "herausfischen" müsste.

Zitat:
Die Mobilseiten lassen sich auch vermutlich super parsen, was ich so auf den ersten Blick sehen konnte.

Na, dann mal los: Im Beitrag #1 steht ja, was man für eine regex beachten muss.

Elektrolurch
configDB und Windows befreite Zone!

Invers

Hi, ich wollte auch einmal probieren. Leider gelingt es mir nicht, den TVHelper zu installieren.
Ich bekomme, obwohl ich ausser der Definition noch gar nichts gemacht habe, folgende Meldungen im Log und die FHEM-Oberfläche ist dann nicht mehr erreichbar, wodurch ich dann auch nichts mehr probieren kann:


2018.05.01 09:28:12 3: RTVhelper_UpdateReadings: first run today!
2018.05.01 09:28:12 3: RTVhelper_UpdateReadings: work: TV2200 start read (IOWrite)
2018.05.01 09:28:12 3: RTVhelper_UpdateReadings: work: TVjetzt start read (IOWrite)
2018.05.01 09:28:12 1: RTVhelper_IOWrite: TV2200 just in progress
Can't use an undefined value as a HASH reference at ./FHEM/99_myUtilsRTVhelper.pm line 633.


Hast du eine Idee, was ich da vielleicht falsch mache? Die Dateien habe ich natürlich kopiert (Logos)
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Elektrolurch

Hallo invers,

gefixed. Du hast keine senderList für TV definiert, daher der crash nach 2 Minuten beim ersten Lesen der Seite. Update im Beitrag #1.
Ohne senderList wird Dir auch nichts angezeigt werden.
configDB und Windows befreite Zone!

Invers

Danke für die Hilfe, aber der Crash bleibt leider. Ich komme gar nicht dazu, irgend etwas zu definieren. Kannst du bitte noch einmal nachsehen? Falls man da nichts machen kann, mus ich mich mit dem Attribut wohl etwas beeilen. LOL.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2