In dieser sechsteiligen Serie entsteht Schritt für Schritt ein eigener TV-Server. Der Kern ist ein Raspberry Pi 3B, der die verschiedenen Empfangswege in TVHeadend zusammenführt. In diesem ersten Teil bauen wir die Basis: Satellitenfernsehen über einen Telestar DIGIBIT TWIN, Programmdaten per XMLTV/easyEPG und lokale Senderlogos.
1. Ausgangslage
Für den ursprünglichen Aufbau wurde folgende Hardware verwendet:
- Raspberry Pi 3 Model B, 1 GB RAM
- microSD-Karte, im Projekt später 128 GB
- Debian 12 / Bookworm bereits installiert und per LAN erreichbar
- Telestar DIGIBIT TWIN als SAT>IP-Server
- Sat-Anlage für Astra 19,2° Ost
- Gigabit-/Fast-Ethernet-Heimnetz; der Pi selbst arbeitet beim 3B mit 100-Mbit-Ethernet
Der DIGIBIT TWIN besitzt zwei SAT-Eingänge und stellt zwei SAT>IP-Tuner im Netzwerk bereit. Telestar beschreibt das Gerät ausdrücklich als SAT>IP-Server für zwei Teilnehmer mit zwei F-Buchsen und Ethernet-Anschluss.


Beispieladressen dieser Anleitung
Raspberry Pi / TVHeadend: 192.168.1.20
DIGIBIT TWIN: 192.168.1.30
Router: 192.168.1.1
TVHeadend-Admin: tvadmin
Passwort: CHANGE-ME-NOW
Die Adressen sind absichtlich Dummywerte. Für beide Geräte empfiehlt sich eine feste DHCP-Zuweisung im Router.
2. Grundpakete installieren
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y \
curl wget git unzip jq nano ca-certificates \
ffmpeg mbuffer socat libxml2-utils \
python3 python3-venv python3-pip
3. TVHeadend aus dem offiziellen Repository installieren
TVHeadend empfiehlt für Debian und Raspberry Pi OS das offizielle Paket-Repository. Die 4.3er-Reihe ist inzwischen die laufend aktualisierte stabile Version.
curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.deb.sh' | sudo -E bash
sudo apt update
sudo apt install -y tvheadend
sudo systemctl enable --now tvheadend
sudo systemctl status tvheadend --no-pager
Danach ist die Weboberfläche unter http://192.168.1.20:9981/ erreichbar. Der HTSP-Port für Kodi und andere Clients ist standardmäßig 9982.

4. Ersteinrichtung von TVHeadend
Im Assistenten habe ich folgende Grundstruktur verwendet:
- Sprache: Deutsch.
- Erlaubtes Netzwerk: das eigene LAN, zum Beispiel
192.168.1.0/24. - Administratorkonto anlegen.
- Optional ein getrenntes Benutzerkonto für Kodi/Clients anlegen.
- Den DVB-Teil des Assistenten zunächst nur grob konfigurieren; die eigentliche SAT>IP-Konfiguration erfolgt anschließend.
5. DIGIBIT TWIN zuverlässig an TVHeadend übergeben
Normalerweise findet TVHeadend SAT>IP-Geräte per SSDP automatisch. Im fertigen Aufbau wurde der DIGIBIT zusätzlich explizit über seine SAT>IP-Gerätebeschreibung angegeben. Das macht den Aufbau deterministisch.
In /etc/default/tvheadend wird die vorhandene Variable OPTIONS um den SAT>IP-XML-Endpunkt ergänzt:
sudo nano /etc/default/tvheadend
Beispiel:
OPTIONS="--satip_xml http://192.168.1.30:38400/description.xml"
Anschließend:
sudo systemctl restart tvheadend
sudo systemctl status tvheadend --no-pager
Unter Konfiguration → DVB-Eingänge → TV-Adapter sollten nun zwei SAT>IP-DVB-S-Tuner erscheinen.

6. Astra 19,2° Ost als DVB-S-Netzwerk anlegen
Unter Konfiguration → DVB-Eingänge → Netzwerke wird ein neues DVB-S-Netzwerk angelegt:
Name: Astra 19.2E
Typ: DVB-S
Vordefinierte Muxe: Astra 19.2E
Netzwerksuche: aktiv
Danach jeden der beiden SAT>IP-Tuner öffnen und bei Netzwerke das Netzwerk Astra 19.2E zuweisen. TVHeadend beginnt anschließend mit dem Einlesen der Muxe und Dienste.


7. Dienste zu Kanälen mappen
Wenn die Suche abgeschlossen ist:
Konfiguration → DVB-Eingänge → Dienste → Dienste zu Kanälen zuordnen.
Für einen aufgeräumten Server lohnt sich danach eine eigene Nummernlogik. In meinem Aufbau hat sich folgendes Schema bewährt:
1–99 Fernsehsender
100–199 private Radios / Internet-Radio
200–299 öffentlich-rechtliche Radios
300–399 technische Kanäle / Kameras / Testbilder
Zusätzlich können Tags wie TV, Radio, SAT, IPTV und Favoriten vergeben werden.
8. easyEPG lite installieren
TVHeadend kann EPG-Daten direkt aus DVB empfangen. Für den später gemischten SAT-/IPTV-Aufbau wollte ich jedoch eine einheitliche XMLTV-Quelle. Dafür läuft easyEPG lite separat auf Port 4000. Das Projekt kann Sender auswählen, eigene EPG-IDs vergeben, XMLTV erzeugen und die Aktualisierung planen.
sudo useradd --system \
--home /opt/easyepg \
--shell /usr/sbin/nologin \
easyepg
sudo git clone https://github.com/sunsettrack4/script.service.easyepg-lite.git /opt/easyepg
sudo python3 -m venv /opt/easyepg/venv
sudo /opt/easyepg/venv/bin/pip install --upgrade pip
sudo /opt/easyepg/venv/bin/pip install \
bottle beautifulsoup4 cheroot curl-cffi pytz requests xmltodict
sudo chown -R easyepg:easyepg /opt/easyepg
systemd-Dienst für easyEPG
sudo tee /etc/systemd/system/easyepg.service >/dev/null <<'EOF'
[Unit]
Description=easyEPG lite XMLTV service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=easyepg
Group=easyepg
WorkingDirectory=/opt/easyepg
ExecStart=/opt/easyepg/venv/bin/python /opt/easyepg/main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now easyepg
sudo systemctl status easyepg --no-pager
Die Oberfläche liegt nun unter http://192.168.1.20:4000/.
easyEPG konfigurieren
- Passendes Lineup bzw. die gewünschte EPG-Quelle auswählen.
- Nur die tatsächlich benötigten Sender aktivieren.
- Jedem Sender eine eindeutige EPG-ID geben.
- Sendernamen kontrollieren.
- XMLTV-Erzeugung aktivieren.
- Den internen Scheduler so planen, dass die XMLTV-Datei vor unserem TVHeadend-Import fertig ist.
Wichtig ist die EPG-ID. Sie ist später die Verbindung zwischen Kanal und Programmdaten.


9. XMLTV über den TVHeadend-Socket importieren
Im fertigen System wurde der XMLTV-Import nicht von Hand angestoßen, sondern täglich per systemd-Timer in den externen XMLTV-Socket von TVHeadend geschrieben.
Zuerst in TVHeadend unter Konfiguration → Kanal / EPG → EPG-Grabber-Module das Modul
External: XMLTV aktivieren. Danach sollte der Socket vorhanden sein:
sudo systemctl restart tvheadend
sudo ls -l /var/lib/tvheadend/epggrab/xmltv.sock
Importscript
sudo tee /usr/local/sbin/easyepg-import.sh >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
URL='http://127.0.0.1:4000/download/epg.xml'
SOCKET='/var/lib/tvheadend/epggrab/xmltv.sock'
TMP="$(mktemp)"
cleanup() {
rm -f "$TMP"
}
trap cleanup EXIT
curl -fsS "$URL" -o "$TMP"
python3 - "$TMP" <<'PY'
import sys
import xml.etree.ElementTree as ET
ET.parse(sys.argv[1])
print("XMLTV ist gültig")
PY
cat "$TMP" | socat - "UNIX-CONNECT:$SOCKET"
EOF
sudo chmod 755 /usr/local/sbin/easyepg-import.sh
systemd-Service
sudo tee /etc/systemd/system/easyepg-import.service >/dev/null <<'EOF'
[Unit]
Description=easyEPG XMLTV in TVHeadend importieren
After=network-online.target easyepg.service tvheadend.service
Wants=network-online.target
Requires=tvheadend.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/easyepg-import.sh
EOF
Täglicher Timer um 05:30 Uhr
sudo tee /etc/systemd/system/easyepg-import.timer >/dev/null <<'EOF'
[Unit]
Description=Täglicher easyEPG-Import
[Timer]
OnCalendar=*-*-* 05:30:00
Persistent=true
Unit=easyepg-import.service
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now easyepg-import.timer
# einmal sofort testen
sudo systemctl start easyepg-import.service
systemctl status easyepg-import.timer --no-pager
Danach unter Konfiguration → Kanal / EPG → Kanäle die passende XMLTV-Quelle den Kanälen zuordnen. Sind die IDs sauber gewählt, erscheint anschließend das Programm im EPG.
10. Senderlogos / Picons lokal hinterlegen
Die Logos speichere ich bewusst lokal. Damit hängt die Darstellung nicht von externen Bildservern ab.
sudo mkdir -p /usr/local/share/tvheadend/picons
sudo chown -R root:video /usr/local/share/tvheadend/picons
sudo chmod -R 755 /usr/local/share/tvheadend/picons
Beispiel:
/usr/local/share/tvheadend/picons/
├── das-erste-hd.png
├── zdf-hd.png
├── mdr-sachsen-hd.png
└── arte-hd.png
In Konfiguration → Kanal / EPG → Kanäle wird im Feld Icon beispielsweise eingetragen:
file:///usr/local/share/tvheadend/picons/das-erste-hd.png
Für veröffentlichte Logo-Dateien sind selbstverständlich die jeweiligen Marken- und Nutzungsrechte zu beachten. Für den privaten TVHeadend-Server genügt es, die benötigten Logos aus zulässigen Quellen lokal abzulegen.

11. Funktionstest
systemctl status tvheadend --no-pager
systemctl status easyepg --no-pager
systemctl status easyepg-import.timer --no-pager
# TVHeadend-Playlist im Browser/VLC:
# http://192.168.1.20:9981/playlist
Damit steht die Basis: zwei SAT>IP-Tuner, Astra 19,2° Ost, Kanalliste, EPG und Logos. Im nächsten Teil kommen ORF, SRF und weitere Sender über Zattoo/Telerising dazu.

