Aktuelles TV-Programm in FHEM

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

Vorheriges Thema - Nächstes Thema

ChHerrm

#855
Hallo zusammen,
ich habe über lange Zeit Klack.tv genutzt um das TV-Programm auszulesen. Dann kam ja das Problem mit den zu häufigen Abfragen des TV-Programms beim Anbieter auf (vgl. #824).
Meine Frage ist nun: sollte es ohne weitere Umstellungen (außer dass die Abrufzeit nun 1800s betragen sollte) wieder gehen? Das ist bei mir nämlich leider nicht der Fall.
Der Aufruf attr global httpcompress 0 (Hinweis aus: https://forum.fhem.de/index.php/topic,80685.15.html) kennt mein FHEM gar nicht (Version15407).

Was ist zu tun? ??? Kann mir damit bitte jemand weiterhelfen?
Hier mein Code:

define TV_Programme HTTPMOD http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/-1/free.html 1800
attr TV_Programme userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07Name reading07Regex reading08Name reading08Regex reading09Name reading09Regex reading10Name reading10Regex reading11Name reading11Regex reading12Name reading12Regex reading13Name reading13Regex reading14Name reading14Regex reading15Name reading15Regex reading16Name reading16Regex reading17Name reading17Regex reading18Name reading18Regex reading19Name reading19Regex reading20Name reading20Regex reading21Name reading21Regex reading22Name reading22Regex reading23Name reading23Regex reading24Name reading24Regex reading25Name reading25Regex reading26Name reading26Regex reading27Name reading27Regex reading28Name reading28Regex reading29Name reading29Regex reading30Name reading30Regex reading31Name reading31Regex reading32Name reading32Regex reading33Name reading33Regex reading34Name reading34Regex reading35Name reading35Regex reading36Name reading36Regex reading37Name reading37Regex reading38Name reading38Regex reading39Name reading39Regex reading40Name reading40Regex reading41Name reading41Regex reading42Name reading42Regex reading43Name reading43Regex reading44Name reading44Regex reading45Name reading45Regex reading46Name reading46Regex reading47Name reading47Regex reading48Name reading48Regex reading49Name reading49Regex reading50Name reading50Regex reading51Name reading51Regex reading52Name reading52Regex reading53Name reading53Regex reading54Name reading54Regex reading55Name reading55Regex reading56Name reading56Regex reading57Name reading57Regex reading58Name reading58Regex reading59Name reading59Regex reading60Name reading60Regex stateFormat timeout verbose
attr TV_Programme enableControlSet 1
attr TV_Programme reading01Name ARD
attr TV_Programme reading01Regex title="Das Erste"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading02Name ARD_Nexttime
attr TV_Programme reading02Regex title="Das Erste"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading03Name ARD_Next
attr TV_Programme reading03Regex title="Das Erste"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading04Name ZDF
attr TV_Programme reading04Regex title="ZDF"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading05Name ZDF_Nexttime
attr TV_Programme reading05Regex title="ZDF"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading06Name ZDF_Next
attr TV_Programme reading06Regex title="ZDF"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading07Name RTL
attr TV_Programme reading07Regex title="RTL"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading08Name RTL_Nexttime
attr TV_Programme reading08Regex title="RTL"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading09Name RTL_Next
attr TV_Programme reading09Regex title="RTL"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading10Name Sat1
attr TV_Programme reading10Regex title="SAT.1"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading11Name Sat1_Nexttime
attr TV_Programme reading11Regex title="SAT.1"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading12Name Sat1_Next
attr TV_Programme reading12Regex title="SAT.1"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading13Name Pro7
attr TV_Programme reading13Regex title="Pro7"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading14Name Pro7_Nexttime
attr TV_Programme reading14Regex title="Pro7"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading15Name Pro7_Next
attr TV_Programme reading15Regex title="Pro7"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading16Name SPORT1
attr TV_Programme reading16Regex title="Sport 1"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading17Name SPORT1_Nexttime
attr TV_Programme reading17Regex title="Sport 1"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading18Name SPORT1_Next
attr TV_Programme reading18Regex title="Sport 1"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading19Name DMAX
attr TV_Programme reading19Regex title="DMAX"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading20Name DMAX_Nexttime
attr TV_Programme reading20Regex title="DMAX"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading21Name DMAX_Next
attr TV_Programme reading21Regex title="DMAX"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading22Name Kabel1
attr TV_Programme reading22Regex title="Kabel eins"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading23Name Kabel1_Nexttime
attr TV_Programme reading23Regex title="Kabel eins"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading24Name Kabel1_Next
attr TV_Programme reading24Regex title="Kabel eins"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading25Name NTV
attr TV_Programme reading25Regex title="N-TV"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading26Name NTV_Nexttime
attr TV_Programme reading26Regex title="N-TV"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading27Name NTV_Next
attr TV_Programme reading27Regex title="N-TV"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading28Name N24
attr TV_Programme reading28Regex title="N24"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading29Name N24_Nexttime
attr TV_Programme reading29Regex title="N24"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading30Name N24_Next
attr TV_Programme reading30Regex title="N24"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading31Name Pro7Maxx
attr TV_Programme reading31Regex title="Pro7 MAXX"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading32Name Pro7Maxx_Nexttime
attr TV_Programme reading32Regex title="Pro7 MAXX"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading33Name Pro7Maxx_Next
attr TV_Programme reading33Regex title="Pro7 MAXX"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading34Name RTL2
attr TV_Programme reading34Regex title="RTL II"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading35Name RTL2_Nexttime
attr TV_Programme reading35Regex title="RTL II"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading36Name RTL2_Next
attr TV_Programme reading36Regex title="RTL II"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading37Name RTLNITRO
attr TV_Programme reading37Regex title="NITRO"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading38Name RTLNITRO_Nexttime
attr TV_Programme reading38Regex title="NITRO"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading39Name RTLNITRO_Next
attr TV_Programme reading39Regex title="NITRO"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading40Name ZDFNEO
attr TV_Programme reading40Regex title="ZDF neo"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading41Name ZDFNEO_Nexttime
attr TV_Programme reading41Regex title="ZDF neo"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading42Name ZDFNEO_Next
attr TV_Programme reading42Regex title="ZDF neo"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading43Name SIXX
attr TV_Programme reading43Regex title="sixx"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading44Name SIXX_Nexttime
attr TV_Programme reading44Regex title="sixx"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading45Name SIXX_Next
attr TV_Programme reading45Regex title="sixx"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading46Name VOX
attr TV_Programme reading46Regex title="VOX"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading47Name VOX_Nexttime
attr TV_Programme reading47Regex title="VOX"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading48Name VOX_Next
attr TV_Programme reading48Regex title="VOX"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading49Name EUROSPORT
attr TV_Programme reading49Regex title="Eurosport"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading50Name EUROSPORT_Nexttime
attr TV_Programme reading50Regex title="Eurosport"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading51Name EUROSPORT_Next
attr TV_Programme reading51Regex title="Eurosport"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading52Name NDR
attr TV_Programme reading52Regex title="NDR"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading53Name NDR_Nexttime
attr TV_Programme reading53Regex title="NDR"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading54Name NDR_Next
attr TV_Programme reading54Regex title="NDR"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading55Name SUPERRTL
attr TV_Programme reading55Regex title="Super RTL"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading56Name SUPERRTL_Nexttime
attr TV_Programme reading56Regex title="Super RTL"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading57Name SUPERRTL_Next
attr TV_Programme reading57Regex title="Super RTL"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading58Name COMEDYCENTRAL
attr TV_Programme reading58Regex title="Comedy Central"><img[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme reading59Name COMEDYCENTRAL_Nexttime
attr TV_Programme reading59Regex title="Comedy Central"><img[\w\W]*?<td class="time[\w\W]*?Row">\s*(.*?)\s*<div
attr TV_Programme reading60Name COMEDYCENTRAL_Next
attr TV_Programme reading60Regex title="Comedy Central"><img[\w\W]*?<td class="time[\w\W]*?Row">[\w\W]*?<div[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*</a>
attr TV_Programme stateFormat mein_TV_programm: ARD_Next
attr TV_Programme timeout 20
attr TV_Programme verbose 1

define TV_Programm_Next readingsGroup <Sender>,<Aktuelle Sendung>,<Ab>,<Nachfolgende Sendung> \
TV_Programme:ARD,ARD_Nexttime,ARD_Next \
TV_Programme:ZDF,ZDF_Nexttime,ZDF_Next \
TV_Programme:RTL,RTL_Nexttime,RTL_Next \
TV_Programme:Sat1,Sat1_Nexttime,Sat1_Next \
TV_Programme:Pro7,Pro7_Nexttime,Pro7_Next \
TV_Programme:SPORT1,SPORT1_Nexttime,SPORT1_Next \
TV_Programme:DMAX,DMAX_Nexttime,DMAX_Next \
TV_Programme:Kabel1,Kabel1_Nexttime,Kabel1_Next \
TV_Programme:NTV,NTV_Nexttime,NTV_Next \
TV_Programme:N24,N24_Nexttime,N24_Next \
TV_Programme:Pro7Maxx,Pro7Maxx_Nexttime,Pro7Maxx_Next \
TV_Programme:RTL2,RTL2_Nexttime,RTL2_Next \
TV_Programme:RTLNITRO,RTLNITRO_Nexttime,RTLNITRO_Next \
TV_Programme:ZDFNEO,ZDFNEO_Nexttime,ZDFNEO_Next \
TV_Programme:SIXX,SIXX_Nexttime,SIXX_Next \
TV_Programme:VOX,VOX_Nexttime,VOX_Next \
TV_Programme:EUROSPORT,EUROSPORT_Nexttime,EUROSPORT_Next \
TV_Programme:NDR,NDR_Nexttime,NDR_Next \
TV_Programme:SUPERRTL,SUPERRTL_Nexttime,SUPERRTL_Next \
TV_Programme:COMEDYCENTRAL,COMEDYCENTRAL_Nexttime,COMEDYCENTRAL_Next
attr TV_Programm_Next alias aktuelles TV-Programm
attr TV_Programm_Next nameIcon { ARD => 'tvmovie/IWA_ard', ZDF => 'tvmovie/IWA_zdf', RTL => 'tvmovie/IWA_rtl', Sat1 => 'tvmovie/IWA_sat1', Pro7 => 'tvmovie/IWA_pro7', SPORT1 => 'tvmovie/IWA_sport1', DMAX => 'tvmovie/IWA_dmax', Kabel1 => 'tvmovie/IWA_kabel1', NTV => 'tvmovie/IWA_ntv', N24 => 'tvmovie/IWA_n24', Pro7Maxx => 'tvmovie/IWA_pro7maxx', RTL2 => 'tvmovie/IWA_rtl2', RTLNITRO => 'tvmovie/IWA_rtlnitro', ZDFNEO => 'tvmovie/IWA_zdfneo', SIXX => 'tvmovie/IWA_sixx', VOX => 'tvmovie/IWA_vox', EUROSPORT => 'tvmovie/IWA_eurosport', NDR => 'tvmovie/IWA_ndr', SUPERRTL => 'tvmovie/IWA_superrtl', COMEDYCENTRAL => 'tvmovie/IWA_comedycentral'}
attr TV_Programm_Next nameStyle style="color:yellow"
attr TV_Programm_Next room TV
attr TV_Programm_Next style style="font-size:18px"
attr TV_Programm_Next valueFormat {wrapLine($VALUE, 50)}


ChHerrm

Hm, vielleicht mal anders gefragt: Funktioniert das TV-Programm über Klack bei euch noch? Wenn ja, was musstet ihr dafür in den letzten Wochen umstellen?

Torsten_MG

Da ich den Interval auch nicht auf 0 setzen kann, habe ich den Wert auf 6000 gesetzt und nutze den TVHelper für die Aktualisierung

fischit

Was sagt denn der Log?
Ich musste auch nach der Problematik nichts ändern. Ich arbeite auch mit dem Tvhelper.

ChHerrm

Danke euch beiden für eure Rückmeldung!

Ich kam nun nochmal dazu mir das Logfile mal etwas genauer anzusehen:



--> Befehl Start:

2018.02.18 17:14:30 4: WEBphone_192.168.0.7_4822 GET /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22start%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:14:30 4: WEBphone: /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22start%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:14:31 4: WEBphone_192.168.0.7_4822 POST /fhem&detail=TV_ProgrammePT&dev.setTV_ProgrammePT=TV_ProgrammePT&cmd.setTV_ProgrammePT=set&arg.setTV_ProgrammePT=start&val.setTV_ProgrammePT=; BUFLEN:0
2018.02.18 17:14:31 4: WEBphone_192.168.0.7_4822 GET /fhem?detail=TV_ProgrammePT&fw_id=; BUFLEN:0
2018.02.18 17:14:31 4: WEBphone: /fhem?detail=TV_ProgrammePT&fw_id= / RL:30406 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:14:31 4: Connection closed for WEBphone_192.168.0.7_4824: EOF
2018.02.18 17:14:32 4: <hidden>: HTTP response code 200
2018.02.18 17:14:32 4: HttpUtils <hidden>: Got data, length: 23
2018.02.18 17:14:32 4: TelegramBot_UpdatePoll IWATelegram: initiate polling with nonblockingGet with 120s
2018.02.18 17:14:32 4: HttpUtils url=<hidden>
2018.02.18 17:14:32 4: TelegramBot_Callback IWATelegram: resulted in SUCCESS from Polling
2018.02.18 17:14:32 4: WEBphone_192.168.0.7_4822 GET /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22interval%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:14:32 4: WEBphone: /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22interval%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:14:32 4: Connection accepted from WEBphone_192.168.0.7_4830
2018.02.18 17:14:32 4: WEBphone_192.168.0.7_4830 GET /fhem?cmd=%7BAttrVal(%22TV_ProgrammePT%22%2C%22room%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:14:32 4: WEBphone: /fhem?cmd=%7BAttrVal(%22TV_ProgrammePT%22%2C%22room%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:14:32 4: WEBphone_192.168.0.7_4830 GET /fhem?XHR=1&inform=type=status;filter=TV_ProgrammePT;since=1518970470;fmt=JSON&fw_id=836×tamp=1518970480007; BUFLEN:0
2018.02.18 17:14:35 4: WEBphone_192.168.0.7_4822 GET /fhem/FileLog_logWrapper&dev=Logfile&type=text&file=fhem-2018-02-18.log; BUFLEN:0


--> Befehl Reread:

2018.02.18 17:16:18 4: WEBphone_192.168.0.7_4822 GET /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22reread%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:16:18 4: WEBphone: /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22reread%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:16:19 4: WEBphone_192.168.0.7_4822 POST /fhem&detail=TV_ProgrammePT&dev.setTV_ProgrammePT=TV_ProgrammePT&cmd.setTV_ProgrammePT=set&arg.setTV_ProgrammePT=reread&val.setTV_ProgrammePT=; BUFLEN:0
2018.02.18 17:16:19 4: WEBphone_192.168.0.7_4822 GET /fhem?detail=TV_ProgrammePT&fw_id=; BUFLEN:0
2018.02.18 17:16:19 4: WEBphone: /fhem?detail=TV_ProgrammePT&fw_id= / RL:30410 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:16:19 4: Connection closed for WEBphone_192.168.0.7_4830: EOF
2018.02.18 17:16:19 4: WEBphone_192.168.0.7_4822 GET /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22interval%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:16:19 4: WEBphone: /fhem?cmd=%7BReadingsVal(%22TV_ProgrammePT%22%2C%22interval%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:16:19 4: Connection accepted from WEBphone_192.168.0.7_4853
2018.02.18 17:16:19 4: WEBphone_192.168.0.7_4853 GET /fhem?cmd=%7BAttrVal(%22TV_ProgrammePT%22%2C%22room%22%2C%22%22)%7D&XHR=1; BUFLEN:0
2018.02.18 17:16:19 4: WEBphone: /fhem?cmd=%7BAttrVal(%22TV_ProgrammePT%22%2C%22room%22%2C%22%22)%7D&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2018.02.18 17:16:19 4: WEBphone_192.168.0.7_4853 GET /fhem?XHR=1&inform=type=status;filter=TV_ProgrammePT;since=1518970578;fmt=JSON&fw_id=836×tamp=1518970587500; BUFLEN:0
2018.02.18 17:16:21 4: WEBphone_192.168.0.7_4822 GET /fhem/FileLog_logWrapper&dev=Logfile&type=text&file=fhem-2018-02-18.log; BUFLEN:0
2018.02.18 17:16:21 4: Connection closed for WEBphone_192.168.0.7_4831: EOF



Mit dem TVHelper habe ich mich kurz mal eingelesen. Wenn ich das aber richtig gesehen habe, wird das ja nicht mehr weiter genutzt: https://forum.fhem.de/index.php/topic,79666.90.html

Damit bin ich nun maximal verwirrt. Wie soll man nun die Informationen zum TV-Programm beziehen? Mit TVHelper, ohne TVHelper, gar nicht? :-\

Quantum

Hallo FHEM-Gemeinde,

wollte mal in die Runde fragen ob hier auch manche Probleme mit HTTPMOD und einem eventuellen Speicherleck haben.
Habe das in den letzten Tagen genauer verfolgt und mir ist aufgefallen, dass bei jedem reread von HTTPMOD, mit den ganzen TV-Programm readings, der FHEM Prozess 0.5% mehr RAM beansprucht.
Das geht solange bis der Speicher voll ist, danach muss neugestartet werden. Mein Raspi hat nur 512MB, spätestens nach einem Tag ist schluss...

Könnte das jemand bei sich prüfen ? Einfach "top" ins terminal tippen und ein paar mal reread des TV-Programm HTTPMOD ausführen und schauen, wie sich der Speicherverbrauch des FHEM-Prozesses entwickelt.

Danke & Viele Grüße

andreas13

Hallo zusammen,

ich kann das mit dem Speicherleck bestätigen. :-(

Gibt es eigentlich eine Möglichkeit den Speicherverbrauch von Modulen zu tracken?

Viele Grüße ...
Maintainer des Vitoconnect Moduls
In Betrieb: FritzBox 7590, Homematic
piko Wechelrichter (HTTPMOD). Sonos ....
noch: IT

rcaspar

Ich habe die Version mit Klack integriert und soweit zum Laufen gebracht - die korrekte Verwendung der Readings hat mich Anfangs etwas herausgefordert, nun ist dies auch gefixt.
Danke soweit mal allen die hier Code gepostet haben.

Ein Problem habe ich allerdins noch mit den nameIcons

Bei mir wird nur 1 Icon korrekt angezeigt, also das Bild, alle anderen Zeilen beinhalten nur den code des nameIcon. dies sieht dann im HTML sourcecode wie folgt aus:

Die korrekte Zeile:
<div  class="dname"><a  href="/fhem?detail=TV_Programme"><img class='icon tvlogos/tvlogo_sat1_s' src="/fhem/images/default/tvlogos/tvlogo_sat1_s.png" alt="TV_Programme" title="TV_Programme"></a>

eine der nicht korrekten Zeilen:
<div  class="dname"><a  href="/fhem?detail=TV_Programme">tvlogos/tvlogo_pro7_s</a>

Hat jemand eine Idee woran das liegen kann?

Die Pfade der entsprechenden nameIcon stimmen, die Icons selber liegen auch da...

Merci

ToM_ToM

Hallo Zusammen, also das mit dem Speicherleck kann ich nicht bestätigen. Ich nutze auch mehrere HTTPMODs bei denen viele Daten abgefragt werden.

System: BananaPi mit Armbian und Bananian. Auf beiden tritt das Problem nicht auf.

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

fischit

Zitat von: rcaspar am 10 April 2018, 20:30:53
Ich habe die Version mit Klack integriert und soweit zum Laufen gebracht - die korrekte Verwendung der Readings hat mich Anfangs etwas herausgefordert, nun ist dies auch gefixt.
Danke soweit mal allen die hier Code gepostet haben.

Ein Problem habe ich allerdins noch mit den nameIcons

Bei mir wird nur 1 Icon korrekt angezeigt, also das Bild, alle anderen Zeilen beinhalten nur den code des nameIcon. dies sieht dann im HTML sourcecode wie folgt aus:

Die korrekte Zeile:
<div  class="dname"><a  href="/fhem?detail=TV_Programme"><img class='icon tvlogos/tvlogo_sat1_s' src="/fhem/images/default/tvlogos/tvlogo_sat1_s.png" alt="TV_Programme" title="TV_Programme"></a>

eine der nicht korrekten Zeilen:
<div  class="dname"><a  href="/fhem?detail=TV_Programme">tvlogos/tvlogo_pro7_s</a>

Hat jemand eine Idee woran das liegen kann?

Die Pfade der entsprechenden nameIcon stimmen, die Icons selber liegen auch da...

Merci

Wie sieht denn dein NameIcon Attribut aus?
Hier mal meins als Beispiel:
{ARD => 'logo_ard', ZDF => 'logo_zdf', RTL => 'logo_rtl', Sat1=> 'logo_sat1', Pro7 => 'logo_pro7', RTL2 => 'logo_rtl2', Kabel1 => 'logo_kabel1', VOX => 'logo_vox'}

Sonst vll nach dem kopieren der Icons in den Ordner ein rereadIcons oder shutdown restart noch nicht gemacht?

mumpitzstuff

#865
Hat schon mal jemand versucht die Daten z.B. von hier zu holen und in ein Dummy oder was auch immer zu pusten (Format: XML, genauer gesagt xmltv)?

http://rytecepg.ipservers.eu/epg_data/rytecDE_Basic.xz

Ein Eintrag sieht dann in etwa so aus:

<programme start="20180415221500 +0200" stop="20180415231500 +0200" channel="DMax.de">
    <title lang="de">Australian Gold - Schatzsuche Down Under</title>
    <sub-title lang="de">[Serie] . [Dokusoap]  (2018)</sub-title>
  </programme>


Darüber hinaus gibt es auch noch xmltv als Console Applikation und auch als Perl Modul. Damit kann man die epg Daten mehrerer Tage grabben, sortieren, zerlegen in Text umwandeln (habe ich Gestern mal probiert und funktioniert bis dahin schon mal ganz gut) oder was auch immer und dann in ein Dummy reinziehen.

Vorteile:
- geringes Datenaufkommen
- Programm für mehrere Tage
- immer gleiches Format der Inputdaten (Inkompatibilitäten ausgeschlossen)
- 1 Update am Tag z.B. Nachts ist ausreichend

rcaspar

Zitat von: fischit am 13 April 2018, 11:17:22
Wie sieht denn dein NameIcon Attribut aus?
Hier mal meins als Beispiel:
{ARD => 'logo_ard', ZDF => 'logo_zdf', RTL => 'logo_rtl', Sat1=> 'logo_sat1', Pro7 => 'logo_pro7', RTL2 => 'logo_rtl2', Kabel1 => 'logo_kabel1', VOX => 'logo_vox'}

Sonst vll nach dem kopieren der Icons in den Ordner ein rereadIcons oder shutdown restart noch nicht gemacht?

hier mein Attribut:
{ SF1 => 'tvlogos/tvlogo_sf1_s', SF2 => 'tvlogos/tvlogo_sf2_s', ARD => 'tvlogos/tvlogo_ard_s', ZDF => 'tvlogos/tvlogo_zdf_s', Pro7 => 'tvlogos/tvlogo_pro7_s', RTL => 'tvlogos/tvlogo_rtl_s', Sat1 => 'tvlogos/tvlogo_sat1_s', Kabel1 => 'tvlogos/tvlogo_kabel-eins_s', VOX => 'tvlogos/tvlogo_vox_s', RTL2 => 'tvlogos/tvlogo_rtl2_s'}

Sollte eigentlich OK sein ;)

vll und rereadIcons sgt mir nix. was genau ist das , resp. führt das aus? Habe auch in der Hilfe nichts gefunden.

Shutdown restart hab ich durchgeführt.

mumpitzstuff

#867
Nicht mehr aktuell! Der aktuelle Stand befindet sich jetzt im wiki.

https://wiki.fhem.de/wiki/TV_Programm




So ich habe mich mal rangesetzt und es funktioniert soweit schon ganz gut, soweit ich das nach den paar Stunden beurteilen kann. Ich poste mal schon die Anfänge, vielleicht traut sich ja jemand es zu testen. Ich muss jedoch auf eine Tatsache hinweisen. Das parsen der XML Datei dauert einige Sekunden und freezt euer FHEM in der Zeit. Da das nur 1x am Tag passiert (bei mir um 0:15 Uhr) kann ich erst einmal damit leben. Innerhalb eines Modul könnte man das non Blocking lösen, aber im Moment gehts erst mal nicht.

1.) Fehlende Perl Module installieren:

sudo apt-get install libxml-bare-perl libdatetime-perl wget xz-utils

Die ersten beiden Bibliotheken werden benötigt, um die xml Datei zu parsen. wget wird benötigt um die Datei zu downloaden und xz enthält den unpacker für die runtergeladene Datei. Die anderen Dinge sind hoffentlich schon drauf auf euren Rechnern.

2.) Pfad für den Download anlegen und mit den entsprechenden Rechten versehen:
sudo mkdir /opt/fhem/tv
sudo chown fhem:dialout /opt/fhem/tv

3.) 99_myUtils.pm erweitern:

sub rgUnfold($$)
{
  my ($device, $reading) = @_;
  my $title = ReadingsVal($device, $reading.'title', 'na');
  my $stitle = ReadingsVal($device, $reading.'stitle', 'na');
  my $desc = ReadingsVal($device, $reading.'desc', 'na');

  $title =~ s/(?=.{45,})(.{0,45}\n?)( )/$1$2<br>/g;
  $stitle =~ s/(?=.{45,})(.{0,45}\n?)( )/$1$2<br>/g;
  $desc =~ s/(?=.{65,})(.{0,65}\n?)( )/$1$2<br>/g;
  $desc =~ s/[\r\'\"]/ /g;
  $desc =~ s/[\n]/<br>/g;
  return "<a href=\"#!\" onclick=\"FW_okDialog('".$stitle."<br><br>".$desc."')\">".$title."</a>";
}

sub xmltv2epoch($)
{
  my $dt = shift;
 
  if ($dt =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:\s+([+-]\d{4}))?$/)
  {
    if (defined($7))
    {
      return $1.'-'.$2.'-'.$3.' '.$4.':'.$5.':'.$6.' '.$7;
    }
    else
    {
      return $1.'-'.$2.'-'.$3.' '.$4.':'.$5.':'.$6;
    }
  }
 
  return '2000-01-01 00:00:00';
}

sub tvParse($)
{
  use utf8;
  use Date::Parse;
  use Encode qw(encode_utf8 decode_utf8);
  use XML::Bare qw(forcearray);

  my $device = shift;
  my $hash = $defs{$device};
  my $obj = XML::Bare->new(file => '/opt/fhem/tv/rytecDE_Basic');
  my $xml = $obj->simple();
  my $start;
  my $stop;
  my $i = 0;
  my $n = 0;
  my $fi = '000';
  my $lastChannel = '';
  my $reading = '';

  if (!$@)
  {
    # clear all old readings
    delete($hash->{READINGS});   

    readingsBeginUpdate($hash);

    foreach (@{forcearray($xml->{tv}{programme})})
    {
      # channel filter
      if ($_->{'channel'} =~ /^(?:Sat1\.|RTL\.|RTL2\.|Pro7\.|DMax\.)/)
      {
        $stop = str2time(xmltv2epoch($_->{'stop'}));
     
        # filter old stuff
        if ($stop >= time())
        {
          if ($lastChannel ne $_->{'channel'})
          {
            $lastChannel = $_->{'channel'};
            $reading = $_->{'channel'};
            $reading =~ s/\..*$//;
            $i = 0;
            $n = 0;

            readingsBulkUpdate($hash, $reading.'_lastIndex', 0);
          }

          # limit number of readings
          next if ($i > 100);

          $fi = sprintf("%03d", $i);
          $start = str2time(xmltv2epoch($_->{'start'}));

          readingsBulkUpdate($hash, $reading.'_'.$fi.'_bdate', substr(FmtDateTime($start), 0, 10));
          readingsBulkUpdate($hash, $reading.'_'.$fi.'_btime', substr(FmtDateTime($start), 11, 8));
          readingsBulkUpdate($hash, $reading.'_'.$fi.'_edate', substr(FmtDateTime($stop), 0, 10));
          readingsBulkUpdate($hash, $reading.'_'.$fi.'_etime', substr(FmtDateTime($stop), 11, 8));
          readingsBulkUpdate($hash, $reading.'_'.$fi.'_title', encode_utf8($_->{'title'}{'content'}));
                   
          if (exists($_->{'sub-title'}{'content'}))
          {
            readingsBulkUpdate($hash, $reading.'_'.$fi.'_stitle', encode_utf8($_->{'sub-title'}{'content'}));
          }
          else
          {
            readingsBulkUpdate($hash, $reading.'_'.$fi.'_stitle', 'na');
          }         
         
          if (exists($_->{'desc'}{'content'}))
          {
            readingsBulkUpdate($hash, $reading.'_'.$fi.'_desc', encode_utf8($_->{'desc'}{'content'}));
          }
          else
          {
            readingsBulkUpdate($hash, $reading.'_'.$fi.'_desc', 'na');
          }
         
          if ($i < 5)
          {
            readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_bdate', substr(FmtDateTime($start), 0, 10));
            readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_btime', substr(FmtDateTime($start), 11, 8));
            readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_edate', substr(FmtDateTime($stop), 0, 10));
            readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_etime', substr(FmtDateTime($stop), 11, 8));
            readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_title', encode_utf8($_->{'title'}{'content'}));
         
            if (exists($_->{'sub-title'}{'content'}))
            {
              readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_stitle', encode_utf8($_->{'sub-title'}{'content'}));
            }
            else
            {
              readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_stitle', 'na');
            }         
         
            if (exists($_->{'desc'}{'content'}))
            {
              readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_desc', encode_utf8($_->{'desc'}{'content'}));
            }
            else
            {
              readingsBulkUpdate($hash, 'next_'.$reading.'_'.$fi.'_desc', 'na');
            }

            $n++;
          }

          $i++;
        }
      }
    }

    readingsBulkUpdate($hash, 'state', 'parsed');
    readingsEndUpdate($hash, 0);
  }

  return undef;
}

sub tvDownload()
{
  my $output = qx(wget http://rytecepg.ipservers.eu/epg_data/rytecDE_Basic.xz -O /opt/fhem/tv/rytecDE_Basic.xz 2>&1);
  #print $output;
  $output = qx(xz -df /opt/fhem/tv/rytecDE_Basic.xz 2>&1);
  #print $output;
}

sub tvUpdate($)
{
  my $device = shift;
  my $hash = $defs{$device};
  my @channels = ( 'DMax', 'Pro7', 'RTL2', 'RTL', 'Sat1' );
 
  readingsBeginUpdate($hash);

  foreach my $channel (@channels)
  {
    my $lastIndex = ReadingsVal($device, $channel.'_lastIndex', undef);
    my $newLastIndex = $lastIndex;
    my $isNew = 1;
 
    if (defined($lastIndex))
    {
      my $i = 0;
      my $edate = ReadingsVal($device, $channel.'_'.sprintf("%03d", $lastIndex).'_edate', undef);

      while (($i < 5) && (defined($edate)))
      {
        my $index = sprintf("%03d", $lastIndex);
        my $etime = ReadingsVal($device, $channel.'_'.$index.'_etime', undef);

        #Log 1, "parsedTime ($channel): $edate $etime"; 
     
        if ($edate.' '.$etime gt TimeNow())
        {
          #Log 1, "times: ".$edate." ".$etime." gt ".TimeNow(); 
          #Log 1, "index: $lastIndex $newLastIndex";         

          my $nindex = sprintf("%03d", $i);

          if ($lastIndex == $newLastIndex)
          {
            $edate = undef;
            last;
          }

          if (1 == $isNew)
          {
            readingsBulkUpdate($hash, $channel.'_lastIndex', $lastIndex);
            $isNew = 0;
          }

          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_bdate', ReadingsVal($device, $channel.'_'.$index.'_bdate', ''));
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_btime', ReadingsVal($device, $channel.'_'.$index.'_btime', ''));
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_edate', $edate);
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_etime', $etime);
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_title', ReadingsVal($device, $channel.'_'.$index.'_title', ''));
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_stitle', ReadingsVal($device, $channel.'_'.$index.'_stitle', ''));
          readingsBulkUpdate($hash, 'next_'.$channel.'_'.$nindex.'_desc', ReadingsVal($device, $channel.'_'.$index.'_desc', ''));

          $i++;
        }

        $lastIndex++;
        $edate = ReadingsVal($device, $channel.'_'.sprintf("%03d", $lastIndex).'_edate', undef);
      }
    }
  }

  readingsBulkUpdate($hash, 'state', 'updated');
  readingsEndUpdate($hash, 1);
}

sub tvUpdatePrimetime($)
{
  my $device = shift;
  my $hash = $defs{$device};
  my @channels = ( 'DMax', 'Pro7', 'RTL2', 'RTL', 'Sat1' );
 
  readingsBeginUpdate($hash);

  foreach my $channel (@channels)
  {
    my $lastIndex = ReadingsVal($device, $channel.'_lastIndex', undef);
    my $newLastIndex = $lastIndex;
 
    if (defined($lastIndex))
    {
      my $i = 0;
      my $bdate = ReadingsVal($device, $channel.'_'.sprintf("%03d", $lastIndex).'_bdate', undef);

      while (($i < 3) && (defined($bdate)))
      {
        my $index = sprintf("%03d", $lastIndex);
        my $btime = ReadingsVal($device, $channel.'_'.$index.'_btime', undef);
        my $timeNow = substr(TimeNow(), 0, 11).'20:14:00';

        #Log 1, "parsedTime ($channel): $bdate $btime"; 
     
        if ($bdate.' '.$btime gt $timeNow)
        {
          #Log 1, "times: ".$bdate." ".$btime." gt ".$timeNow; 
          #Log 1, "index: $lastIndex $newLastIndex";         

          my $nindex = sprintf("%03d", $i);

          if ($lastIndex == $newLastIndex)
          {
            $bdate = undef;
            last;
          }

          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_bdate', $bdate);
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_btime', $btime);
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_edate', ReadingsVal($device, $channel.'_'.$index.'_edate', ''));
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_etime', ReadingsVal($device, $channel.'_'.$index.'_etime', ''));
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_title', ReadingsVal($device, $channel.'_'.$index.'_title', ''));
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_stitle', ReadingsVal($device, $channel.'_'.$index.'_stitle', ''));
          readingsBulkUpdate($hash, 'prime_'.$channel.'_'.$nindex.'_desc', ReadingsVal($device, $channel.'_'.$index.'_desc', ''));

          $i++;
        }

        $lastIndex++;
        $bdate = ReadingsVal($device, $channel.'_'.sprintf("%03d", $lastIndex).'_bdate', undef);
      }
    }
  }

  readingsBulkUpdate($hash, 'state', 'updated');
  readingsEndUpdate($hash, 1);
}


4.) Ein Dummy Device anlegen in das die geparsten Daten rein kommen:

define dmy_TV dummy

5.) 4 "at" Devices anlegen. Eins für den Download (alle 3 Tage 1x), eins fürs parsen der Daten ins Dummy Device (jeden Tag 1x), eins um die nächsten Sendungen zu filtern (alle 15min) und noch eins um die Primetime Sendungen zu filtern (jeden Tag 1x). Die 4 "at" sind als raw Definitionen kopiert und können auch als solche wieder angelegt werden. Dazu irgend ein Device öffnen, ganz unten auf "Raw definition" klicken und alles entfernen. Den Code von hier einfügen und ausführen und die Devices sind angelegt.

defmod at_TV_DOWNLOAD at *00:15:00 {if ((1 == $wday) || (4 == $wday)) {tvDownload()}}

defmod at_TV_PARSE at *00:30:00 {tvParse('dmy_TV')}

defmod at_TV_UPDATE at +*00:15:00 {tvUpdate('dmy_TV')}

defmod at_TV_UPDATE_PRIME at *00:45:00 {tvUpdatePrimetime('dmy_TV')}

5.) Jetzt noch 2 readingsGroups anlegen und los gehts:

defmod rg_TV readingsGroup <Sender>,<ab>,<Aktuelle Sendung>,<|>,<ab>,<Sendung>,<|>,<ab>,<Sendung>\
dmy_TV:<%tv/dmax>,next_DMax_000_btime,<{rgUnfold($DEVICE,'next_DMax_000_')}@next_DMax_000_title>,<|>,next_DMax_001_btime,<{rgUnfold($DEVICE,'next_DMax_001_')}@next_DMax_001_title>,<|>,next_DMax_002_btime,<{rgUnfold($DEVICE,'next_DMax_002_')}@next_DMax_002_title>\
dmy_TV:<%tv/sat1>,next_Sat1_000_btime,<{rgUnfold($DEVICE,'next_Sat1_000_')}@next_Sat1_000_title>,<|>,next_Sat1_001_btime,<{rgUnfold($DEVICE,'next_Sat1_001_')}@next_Sat1_001_title>,<|>,next_Sat1_002_btime,<{rgUnfold($DEVICE,'next_Sat1_002_')}@next_Sat1_002_title>\
dmy_TV:<%tv/rtl>,next_RTL_000_btime,<{rgUnfold($DEVICE,'next_RTL_000_')}@next_RTL_000_title>,<|>,next_RTL_001_btime,<{rgUnfold($DEVICE,'next_RTL_001_')}@next_RTL_001_title>,<|>,next_RTL_002_btime,<{rgUnfold($DEVICE,'next_RTL_002_')}@next_RTL_002_title>\
dmy_TV:<%tv/rtl2>,next_RTL2_000_btime,<{rgUnfold($DEVICE,'next_RTL2_000_')}@next_RTL2_000_title>,<|>,next_RTL2_001_btime,<{rgUnfold($DEVICE,'next_RTL2_001_')}@next_RTL2_001_title>,<|>,next_RTL2_002_btime,<{rgUnfold($DEVICE,'next_RTL2_002_')}@next_RTL2_002_title>\
dmy_TV:<%tv/pro7>,next_Pro7_000_btime,<{rgUnfold($DEVICE,'next_Pro7_000_')}@next_Pro7_000_title>,<|>,next_Pro7_001_btime,<{rgUnfold($DEVICE,'next_Pro7_001_')}@next_Pro7_001_title>,<|>,next_Pro7_002_btime,<{rgUnfold($DEVICE,'next_Pro7_002_')}@next_Pro7_002_title>
attr rg_TV alias Aktuelles TV-Programm
attr rg_TV cellStyle { \
  'r:1,c:1' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:2' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:3' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:5' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:6' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:8' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:9' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"'\
}
attr rg_TV group TV Programm
attr rg_TV nonames 1
attr rg_TV style style="font-size:16px;;"


defmod rg_TV_PRIME readingsGroup <Sender>,<ab>,<Sendung>,<|>,<ab>,<Sendung>,<|>,<ab>,<Sendung>\
dmy_TV:<%tv/dmax>,prime_DMax_000_btime,<{rgUnfold($DEVICE,'prime_DMax_000_')}@prime_DMax_000_title>,<|>,prime_DMax_001_btime,<{rgUnfold($DEVICE,'prime_DMax_001_')}@prime_DMax_001_title>,<|>,prime_DMax_002_btime,<{rgUnfold($DEVICE,'prime_DMax_002_')}@prime_DMax_002_title>\
dmy_TV:<%tv/sat1>,prime_Sat1_000_btime,<{rgUnfold($DEVICE,'prime_Sat1_000_')}@prime_Sat1_000_title>,<|>,prime_Sat1_001_btime,<{rgUnfold($DEVICE,'prime_Sat1_001_')}@prime_Sat1_001_title>,<|>,prime_Sat1_002_btime,<{rgUnfold($DEVICE,'prime_Sat1_002_')}@prime_Sat1_002_title>\
dmy_TV:<%tv/rtl>,prime_RTL_000_btime,<{rgUnfold($DEVICE,'prime_RTL_000_')}@prime_RTL_000_title>,<|>,prime_RTL_001_btime,<{rgUnfold($DEVICE,'prime_RTL_001_')}@prime_RTL_001_title>,<|>,prime_RTL_002_btime,<{rgUnfold($DEVICE,'prime_RTL_002_')}@prime_RTL_002_title>\
dmy_TV:<%tv/rtl2>,prime_RTL2_000_btime,<{rgUnfold($DEVICE,'prime_RTL2_000_')}@prime_RTL2_000_title>,<|>,prime_RTL2_001_btime,<{rgUnfold($DEVICE,'prime_RTL2_001_')}@prime_RTL2_001_title>,<|>,prime_RTL2_002_btime,<{rgUnfold($DEVICE,'prime_RTL2_002_')}@prime_RTL2_002_title>\
dmy_TV:<%tv/pro7>,prime_Pro7_000_btime,<{rgUnfold($DEVICE,'prime_Pro7_000_')}@prime_Pro7_000_title>,<|>,prime_Pro7_001_btime,<{rgUnfold($DEVICE,'prime_Pro7_001_')}@prime_Pro7_001_title>,<|>,prime_Pro7_002_btime,<{rgUnfold($DEVICE,'prime_Pro7_002_')}@prime_Pro7_002_title>
attr rg_TV_PRIME alias TV-Programm Primetime
attr rg_TV_PRIME cellStyle { \
  'r:1,c:1' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:2' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:3' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:5' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:6' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:8' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"',\
  'r:1,c:9' => 'style="color:yellow;;text-align:center;;font-weight:bold;;"'\
}
attr rg_TV_PRIME group TV Programm
attr rg_TV_PRIME nonames 1
attr rg_TV_PRIME style style="font-size:16px;;"


6.) Damit man jetzt nicht mehrere Tage warten muss bis etwas passiert, müssen die 4 at Devices einmalig manuell ausgelöst werden. Zuerst der Download, dann das Parsen und zuletzt die beiden Updates. Jetzt sollten sich die Readingsgroups mit Inhalten gefüllt haben.

Anpassungen:

Die Icons der readingsGroups müsst ihr natürlich anpassen! Ladet euch einfach irgendwo die Senderlogos runter und speichert diese unter /opt/fhem/www/images/default. Vergesst bitte nicht die Rechte zu setzen mit: "sudo chown fhem:dialout *.png".

Die readingsGroup für das aktuelle Programm kann um bis zu 2 weitere Sendungen mit den Indizes 003 und 004 erweitert werden. Die readingsGroup für die Primetime Sendungen kann nicht mehr erweitert werden.

Ich habe exemplarisch nur mal 5 Sender aufgenommen. Wenn ihr mehr benötigt, dann sucht euch diese aus der runtergeladenen Datei raus und erweitert die Liste in tvParse() (99_myUtils.pm), dem "at" at_TV_UPDATE und dann natürlich in der readingsGroup.

Alternative1:

Das Klack Programm kann man sich auch relativ simpel als iframe anzeigen lassen (hatte hier schon mal irgendwer gepostet, aber leider ohne Beispiel):

defmod wl_KLACK weblink iframe http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/0/all.html
attr wl_KLACK htmlattr width="1024" height="768"


Alternative2:

Es gibt Webseiten, die das TV Programm als rss zur Verfügung stellen. Darüber hinaus gibt es Services die online rss zu json konvertieren. Kombiniert man nun beides, dann kann man mit httpmod das Ganze mit wenigen Zeilen einlesen.

Folgende Schritte sind notwendig:

1.) Bei www.rss2json.com kostenlos anmelden und einen API Key generieren.

2.) Z.B. folgendes Device anlegen:

defmod TV_JETZT_HAUPTSENDER HTTPMOD https://api.rss2json.com/v1/api.json?rss_url=http%3A%2F%2Fwww.texxas.de%2Ftv%2FhauptsenderJetzt.xml&api_key=<dein API Key>&order_by=pubDate&order_dir=asc&count=100 300
attr TV_JETZT_HAUPTSENDER userattr get01Name get01URL getEncode readingEncode
attr TV_JETZT_HAUPTSENDER disable 1
attr TV_JETZT_HAUPTSENDER extractAllJSON 1
attr TV_JETZT_HAUPTSENDER get01Name update
attr TV_JETZT_HAUPTSENDER get01URL https://api.rss2json.com/v1/api.json?rss_url=http%3A%2F%2Fwww.texxas.de%2Ftv%2FhauptsenderJetzt.xml&api_key=<dein API Key>&order_by=pubDate&order_dir=asc&count=100
attr TV_JETZT_HAUPTSENDER getEncode UTF-8
attr TV_JETZT_HAUPTSENDER readingEncode UTF-8
attr TV_JETZT_HAUPTSENDER timeout 10


www.texxas.de bietet weitere rss an, die man ebenfalls einbinden könnte. Wie man daraus dann eine readingsGroup erstellt, muss ich leider schuldig bleiben, ich habe diesen Ansatz nicht weiter verfolgt. Funktionieren würde er aber und das Download Volumen ist bei jeder Abfrage nur einige wenige kb.

mumpitzstuff

Ich habe die Funktionen der 99_myUtils.pm noch mal um rgUnfold() erweitert und die ReadingsGroup auch noch mal angepasst. Dadurch können jetzt die einzelnen Sendungen angeklickt werden und es wird ein Dialog mit weiteren Informationen geöffnet (z.B. Beschreibung des Films/Schauspieler usw.).

Sommerfeld

Hallo mumpitzstuff,

wenn ich deine 99_myUtils.pm übernehme, erhalte ich bei der Ausführung von
at_TV_PARSE folgende Fehlermeldung:
Can't locate object method "simple" via package "0" (perhaps you forgot to load "0"?) at ./FHEM/99_ReadinggroupTVmyUtils.pm line 46.

Wie müsste ich die 99_myUtils.pm ändern, damit das at ausgeführt  wird?