16.04 LTS Server installieren, sonst funktioniert die DVBSky Karte nicht. Unter 14.04 läßt sich der Kerneltreiber nicht compilieren, in 16.04 ist der Treiber schon enthalten.
Bei der Installation openSSH als einziges zusätzliches Packet auswählen
(Quelle: http://wiki.ubuntuusers.de/VDR)
sudo apt-get install vdr vdradmin-am vdr-plugin-streamdev-server w-scan build-essential vdr-plugin-epgsearch vdr-plugin-vnsiserver util-linux pm-utils libcgi-pm-perl
Wenn der Befehl „dmesg“ nach dem Einstecken der USB-Box etwas wie
"dvb-usb: found a 'Technotrend TT-connect S-2400' in *cold *state."
enthält, so muss noch die Firmware kopiert werden.
Die Firmware muss unter /lib/firmware/dvb-usb-tt-s2400-01.fw (auch bei > 64bit-Systemen!) abgelegt werden (dazu sind root-rechte nötig)
dvb-demod-m88rs6000.fw und kopieren nach /lib/firmware
(siehe ansonsten auch linuxtv) (Lokale Firmware-Kopie )
Danach ein Reboot, und dann sollten eigentlich zwei Karten da sein
ls /dev/dvb*
Astra Scannen
sudo w_scan -fs -sS19E2 >> /etc/vdr/channels.conf.scan
dann die Liste mit einem Editor zusammenkürzen und sicherheitshalber auch als Kopie ablegen (channels.config.edited) und das Resultat als channels.conf speichern
Eine bereits zubereitete channels.conf kann man mit diesem Script und dem darin benutzten Python- Script aktualisieren, ohne wieder ganz von vorne anfangen zu müssen:
systemctl stop vdr.service cp channels.conf channels.conf.backup rc=$?; if [[ $rc != 0 ]]; then echo "Error while copying channels.conf.backup!" ; exit $rc; fi echo "channels.conf copied to channels.conf.backup" sudo w_scan -fs -sS19E2 >channels.conf.scan rc=$?; if [[ $rc != 0 ]]; then echo "Error while scanning channels!" ; exit $rc; fi python3 updateChannels.py channels.conf.backup channels.conf.scan > channels.conf rc=$?; if [[ $rc != 0 ]]; then echo "Error while updating channels.conf!" ; exit $rc; fi echo "Do not forget to check if new channels are ok!" echo "If not, restore from channels.conf.backup" systemctl start vdr.service
#!/usr/bin/python3 import sys oldChannels={} oldChannelsData={} index=0 #first read the existing channeldata into dictionary for line in open(sys.argv[1]): channeldata =line.split(":",1)[0].strip() if len(channeldata)>0: oldChannels[channeldata]=index oldChannelsData[index]=line.strip() index+=1 #then read the new file for line in open(sys.argv[2]): channeldata =line.split(":",1)[0].strip() if len(channeldata)>0 and channeldata in oldChannels: # when the channel oldChannelsData[oldChannels[channeldata]]=line.strip() # update the channeldata o for counter in range(0,index): # dump the updated list print(oldChannelsData[counter])
Verhindern, dass der VDR selber nach neuen Kanälen sucht, sowie automatisches Abschalten nach 10 Minuten
In /var/lib/vdr/setup.conf
UpdateChannels = 3 MinUserInactivity = 10
(Kopiert von http://askubuntu.com/a/764159)
In Ubuntu 16.04 set WOL_DISABLE=N
in /etc/default/tlp
to avoid getting WOL disabled by TLP power management.
Add NETDOWN=no
in /etc/default/halt
to prevent powering off the network card during shutdown
Enable Wake on LAN in /etc/network/interfaces
when static network configuration is used:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.6 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 up ethtool -s eth0 wol g
Enable wake on lan in BIOS, enter the BIOS setup and look for something called „Wake up on PCI event“, „Wake up on LAN“ or similar. Change it so that it is enabled. Save your settings and reboot.
https://help.ubuntu.com/community/WakeOnLan
Warning some motherboards / network controllers don't support WOL from the cold boot (S5 state, where the power to the system is physically turned off and back on again). In that case, at least one power cycle (power up, shutdown) has to be performed. To mitigate to the problem, the BIOS can be configured to power up when AC is restored and schedule a shutdown inside Ubuntu afterwards. Refer to the motherboard's manual for further details.
Zuerst einmal sind in 16.04 wohl die Packet-Abhängigkeiten nicht richtig gesetzt, und so fehlt dem vdradmin die Bibliothek CGI.pm
aus dem Paket libcgi-pm-perl
, was mit der altbekannten Technik installiert wird:
sudo apt-get install libcgi-pm-perl
Dann setzt man in /etc/default/vdradmin-am
ENABLED="1"
Benutzt man das Webinterface vdradmin-am, so muss die Datei /var/lib/vdradmin-am/vdradmind.conf
angepasst werden:
PASSWORD = passwort USERNAME = benutzer
Hier werden Benutzer und Passwort für die Web-Oberfläche festgelegt. Man sollte sie auf jeden Fall ändern.
Die Weboberfläche erreicht man dann im Browser via:
http://localhost:8001/
Irgendwie (mit user root beim ersten Ausprobieren?) werden manchmal temporäre Verzeichnisse des vdradmind mit dem Owner root angelegt und können dann vom regulären Daemon im Normalbetrieb nicht mehr genutzt werden, was dann die absolut kryptische Fehlermeldung
Not a SCALAR reference at /usr/share/perl/5.22/Compress/Zlib.pm
im Browser erzeugt.
Doch in einem Forum fand sich die rettende Lösung:
cd /var/cache/vdradmin-am chown -R vdradmin-am:vdradmin-am usr
Einstellungen in /etc/vdr/conf.d/00-vdr.conf
--video=/media/video # bei dieser Zeile die Auskommentierung **entfernen** --shutdown=/usr/lib/vdr/vdr-shutdown.wrapper # Lirc auskommentieren ##--lirc
Hier noch ein Hinweis 1) für alle, die z.B. Hörspiele aufnehmen wollen, wo dann der Dateiname der Aufnahme 40 Zeichen überschreiten kann: Dies ist in der Standardkonfiguration von linVDR nicht möglich, weil dort sicherheitshalber das alte Windows- Dateisystem eingestellt ist, welches nicht mehr als 40 Zeichen kann.
Auf Linux und andereren modernen Betriebssystem kann man diese 40-Zeichen- Beschränkung abschalten, indem man in der /etc/vdr/conf.d/00-vdr.conf
die Option
--vfat
auskommentiert wird. Natürlich nur, wenn man kein FAT32 für das Aufnahmeverzeichnis verwendet. Das dürfte aber bei den wenigsten der Fall sein.
systemctl start vdr.service
Der Zugriff auf den Server wird durch die streamdevhosts.conf konfiguriert:
/etc/vdr/plugins/streamdevhosts.conf
127.0.0.1 # always accept localhost 192.168.1.0/24 # any host on the local net
Den Stream-Server erreicht man mit dem Player der Wahl folgendermaßen:
# mit mplayer Programm 1 ansehen: mplayer http://VDR_SERVER_IP:3000/1 # mit vlc Programm 2 ansehen: vlc http://VDR_SERVER_IP:3000/2
Auf dem Server muss das Netzwerk zum Verbindungsaufbau in /etc/vdr/plugins/vnsiserver/allowed_hosts.conf
autorisiert werden, sonst ist ein Verbindungsaufbau nicht möglich.
# # allowed_hosts.conf This file describes a number of host addresses that # are allowed to connect to the streamdev server running # with the Video Disk Recorder (VDR) on this system. # Syntax: # # IP-Address[/Netmask] # 127.0.0.1 # always accept localhost 192.168.1.0/24 # any host on the local net #204.152.189.113 # a specific host #0.0.0.0/0 # any host on any net (USE THIS WITH CARE!)
Bei Debian basierten VDR-Installationen kann das Shutdownscript von VDR nicht direkt auf die RTC zugreifen. Dies lässt sich durch ein zusätzliches Shutdownscript in den Start- Stopmechanismen von Debian sysvinit (bis wheezy) oder systemd (ab jessie) bewerkstelligen. Für die nachfolgenden scripte wird ein ACPI-fähiges Mainboard und rtcwake (in util-linux enthalten) benötigt. Durch die Verwendung von rtcwake zum Setzen der Aufwachzeit in die RTC muss man (bis auf spezielle Fälle) nicht den Pfad zum Device beachten und braucht sich nicht um die verwendete Systemzeit (UTC, Lokale Zeit) kümmern. Mehr dazu hier im VDR-Wiki ACPI_Wakeup.
shutdownhook in /usr/share/vdr/shutdown-hooks/S95.acpi-shutdown.sh
erstellen, sicherheitshalber das eXecute Flag nicht vergessen (chmod a+x S95.acpi-shutdown.sh
)
Schreibt die Aufwachzeit in die Datei /var/cache/vdr/acpiwakeup.time
#!/bin/sh # $1 : Next timer seconds from 1970 from 1970/01/01, UTC # $2 : Next timer seconds from now # $3 : Next timer title # $4 : Shutdown forced # read from acpi-rtcwakeup conf file . /etc/vdr/vdr-acpi-acpirtcshutdown.conf WAKEUP_FILE="/var/cache/vdr/acpiwakeup.time" if [ ! -f "$WAKEUP_FILE" ] then touch $WAKEUP_FILE fi # Defaults: [ -z "$ACPI_REGULAR_TIME" ] && export ACPI_REGULAR_TIME="00:00" [ -z "$ACPI_START_AHEAD" ] && export ACPI_START_AHEAD="300" datefixplus=$(date +%s -d 'tomorrow '"$ACPI_REGULAR_TIME"' +1 day') if [ $1 -eq 0 ] || [ $datefixplus -lt $1 ]; then # wakeup time if next timer ahead > 24h to regular wakeup time date +%s -d 'tomorrow '"$ACPI_REGULAR_TIME"'' > $WAKEUP_FILE else # wakeup time for next timer echo $(($1 - $ACPI_START_AHEAD)) > $WAKEUP_FILE fi exit
conf Datei anlegen in /etc/vdr/vdr-acpi-acpirtcshutdown.conf
# ACPI shutdown enabled ACPI_ENABLED=yes # How many seconds wakeup the machine before timer starts ACPI_START_AHEAD=300 # Start machine at regular time next day if next timer is more than 24 hours ahead ACPI_REGULAR_TIME=03:15 #HH:MM
( Shutdownscript Debian mit sysvinit entfernt, hat Ubuntu 16.04 nicht mehr )
Für systemd (ab Debian Jessie) muss eine Datei wie folgt in /lib/systemd/system/acpi-rtcwakeup.service
angelegt werden. (Ob dies der korrekte Ort für ein eigenes Script ist, wäre zu diskutieren.)
[Unit] Description=write alarm time to rtc Before=ntp.service vdr.service ConditionPathExists=/sys/class/rtc [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/true ExecStop=/bin/bash -c 'TIME_TO_SET=$(</var/cache/vdr/acpiwakeup.time) ; /usr/sbin/rtcwake -m no -a -t $TIME_TO_SET' [Install] RequiredBy=vdr.service
Zu achten ist auf den Punkt „Before=ntp.service
“. Hier wurde der Service ntp gewählt. Dieser muss natürlich vorhanden sein. Ansonsten sollte man sich eine andere Referenz suchen vor - und damit vor allem nach welcher der Shutdownbefehl ausgeführt wird. Beim Shutdown gilt die umgekehrte Reihenfolge wie beim Start.
Userrechte sollten bei root liegen
Dann den Service aktivieren mit:
systemctl enable /lib/systemd/system/acpi-rtcwakeup.service
Den Service starten mit:
systemctl start acpi-rtcwakeup.service
Den Status des Service kann man hiermit überprüfen:
systemctl status acpi-rtcwakeup.service
Nun kann man einen ersten Test durchführen
Eine Zeit in /var/cache/vdr/acpiwakeup.time
in der Zukunft schreiben:
date +%s -d 'tomorrow 15:30' > /var/cache/vdr/acpiwakeup.time
Den Service stoppen (Nicht vergessen danach wieder zu starten):
systemctl stop acpi-rtcwakeup.service
root@server:# cat /proc/driver/rtc rtc_time : 20:17:28 rtc_date : 2015-03-04 alrm_time : 14:30:00 alrm_date : 2015-03-05 alarm_IRQ : yes alrm_pending : no
(Die Stunde zurück liegt daran dass die Systemzeit in UTC läuft)
SD-Image von openElec downloaden und installieren
SD-Karte neu mounten
mount -o remount,rw /flash nano /flash/config.txt
und in der config.txt
den Mpeg Licence key eintragen, z.B.:
decode_MPG2=0xf98c61ea decode_MPG2=0xfbbf0968
die Karte wieder schreibschützen
mount -o remount,ro /flash reboot
dann Raspi booten, die Installation durchlaufen und das vdr plugin installieren. Dabei die MAC Adresse des VDRs nicht vergessen
Mit einem Server im Netz gibt es ein Problem: Kodi auf einem Raspi schläft nie, also fragt er permanent die EPG Daten ab. Dadurch bleibt der VDR Server immer an und läuft dann 24/7. Das ist natürlich nicht gewollt, aber da Kodi trotz allem Suchens (http://forum.kodi.tv/showthread.php?tid=226774&page=2) scheinbar keine Möglichkeit bietet, trotz CEC- Anbindung auf einen ausgeschalteten TV zu reagieren, half am Ende nur der Umstand, dass der TV im eingeschalteten Zustand quasi eine IP- Adresse hat, mit der man dann bei abgeschaltetem TV per Holzhammermethode den Kodi- Prozess anhalten und starten kann und somit den VDR- Server zum Einschlafen bekommt.
Dazu braucht man ein Überwachungsscript in /storage/
, welches den Chromecast anpingt und entsprechend Kodi an- und ausschaltet:
#!/bin/bash while :; do systemctl is-active kodi > /dev/null isRunning=$? # isrunning is 0, when kodi is running # echo "isrunning:" $isRunning " tvIsOn:" $tvIsOn # seaching for chromecast devices #avahi-browse -t -p -r _googlecast._tcp | grep -i chromecast | grep -q -i <yourChromeDeviceName> # in case of a fixed TV device IP adress if [ "$isRunning" -eq 0 ] ; then # the name of the TV needs to be configured in the home router # otherways use a fixed #i=360 i=5 while [ $i -gt 0 ] do # the bash has no build in command to decrease the loop counter, so we have to do a workaround i=$(python -c "import sys; print(int(sys.argv[1])-1)" $i ) ping -c 1 192.168.1.59 > /dev/null tvIsOn=$? if [ "$tvIsOn" -eq 0 ] ; then break else sleep 5 fi echo "Loop: $i" done echo "Left loop..." else TvCecStatus=$(echo pow 0 | cec-client -s -d 1 | grep 'power status' | awk '{split($0,a,":");print a[2]}' | sed 's/ //') if [ "$TvCecStatus" == "on" ]; then tvIsOn=0 else tvIsOn=1 fi fi if [ "$tvIsOn" -ne 0 -a "$isRunning" -eq 0 ] ; then date +"kodi stops at %c" >> /tmp/kodi.log systemctl stop kodi elif [ "$tvIsOn" -eq 0 -a "$isRunning" -ne 0 ] ; then date +"kodi starts at %c" >> /tmp/kodi.log systemctl start kodi fi sleep 10 done exit 0
So richtig faul wird's dann, wenn man den Fernseher schon mal auf dem Weg dahin per Wake-on-LAN einschalten kann.
Dazu horcht das Python Script auf das Magic Packet auf Port 9
import socket import pprint import struct import sys # Kommando. um den Fernseher anzubekommen: # echo 'on 0' | cec-client -s from uuid import getnode as get_mac # seems to be the easiest way to get the "outer" IP address. All other tricks failed as the host name is hardcoded against 127.0.0.1 in /etc/hosts on Kodi :-( s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) UDP_IP=s.getsockname()[0] s.close() UDP_PORT = 9 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) mac = get_mac() mac=''.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2)) # create magic packet magic_packet = ''.join(['FF' * 6, mac * 16]) send_data = '' for i in range(0, len(magic_packet), 2): send_data = ''.join([send_data, struct.pack('B', int(magic_packet[i: i + 2], 16))]) result=0 while result==0: data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes #print ("received message:") #pprint.pprint(data) #print("--------") #pprint.pprint(send_data) if data==send_data: print("Magic Paket identified") result=1 sys.exit(result)
und wenn ein Magic Packet eintrifft,schaltet das Script dann Fernseher per CEC und Kodi selber wieder ein:
#!/bin/bash while :; do python wol_listen.py magicPacket=$? if [ "$magicPacket" -eq 1 ] ; then systemctl is-active kodi > /dev/null isRunning=$? # isrunning is 0, when kodi is running if [ "$isRunning" -ne 0 ] ; then echo 'TV & Kodi on' echo 'on 0' | cec-client -s systemctl start kodi fi fi sleep 10 done exit 0
Kodi WoL und -Off werden dann per /storage/.config/autostart.sh
gleich beim Booten gestartet
( /storage/pingsleepcontrol.sh ) & nohup storage/wol_listen.sh &
Nicht vergessen, die beiden neuen Dateien per chmod a+x
auch ausführbar zu machen.
Dann kann man noch eben den Newsfeed in /storage/.kodi/userdata/RssFeeds.xml
etwas allgemeiner gestalten
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rssfeeds> <!-- RSS feeds. To have multiple feeds, just add a feed to the set. You can also have multiple sets. !--> <!-- To use different sets in your skin, each must be called from skin with a unique id. !--> <set id="1"> <feed updateinterval="30">http://www.tagesschau.de/xml/rss2</feed> </set> <set id="2"> <feed updateinterval="30">http://feeds.openelec.tv/news</feed> <feed updateinterval="30">http://feeds.xbmc.org/xbmc</feed> <feed updateinterval="30">http://feeds.xbmc.org/latest_xbmc_addons</feed> <feed updateinterval="30">http://feeds.xbmc.org/updated_xbmc_addons</feed> </set> </rssfeeds>
Dann kann man noch, wenn notwendig, die Tastatur seiner Fernbedienung anpassen.
Dazu zieht man sich erstmal eine Debug- Keymap, die jede gedrückte Taste der Fernbedienung auf dem Fernseher als Notification anzeigen kann:
cd /storage/.kodi/userdata/keymaps/ curl https://gist.githubusercontent.com/stevenocchipinti/42f2eca2a9f04ed9e52f/raw/remote.xml > remote.xml sudo reboot
und schreibt danach die remote.xml
nach Bedarf um. Die dafür eventuell notwendige Section-ID läßt sich hier finden: http://kodi.wiki/view/keymap#Remotes
<keymap> <tvrecordings> <remote> <yellow>contextmenu</yellow> </remote> </tvrecordings> </keymap>
oder falls man's noch auf der Platte hat, die Backup-Zip Datei der obigen Settings per
scp sk_OpenELec_Kodi_settings.zip root@192.168.1.127:/storage
auf den Raspi übertragen und einfach dort nur auspacken
Damit kann der neue Kodi dann endlich mal in den Produktiveinsatz übergehen…
Solange sich die Version, sprich das schreibgeschützte Image von Kodi/OpenElec nicht ändert, scheint es zu genügen, die gesamte /storage
Partition zu archivieren bzw. wieder herzustellen, was man auch sehr einfach machen kann, wenn die SD-Karte im Desktop- Rechner steckt
cd /media/steffen/ebbb55fb-ef6e-4d19-8474-71f61e77d066/ tar -czvf ./Desktop/OpenElec_Kodi_Backup_Wohnzimmer_storage_20181003.tar.gz .
Neues Kodi- Image einmal booten lassen, damit der automatische Partitions- Größenanpassung laufen kann, den Rechner wieder runterfahren und die Karte wieder in den Desktop - PC. Dann
cd /media/steffen/ebbb55fb-ef6e-4d19-8474-71f61e77d066/ sudo tar -xzvf ./Desktop/OpenElec_Kodi_Backup_Wohnzimmer_storage_20181003.tar.gz