{"id":100010,"date":"2026-09-03T15:57:17","date_gmt":"2026-09-03T13:57:17","guid":{"rendered":"https:\/\/blog.mindkick.de\/?p=100010"},"modified":"2026-09-03T15:57:17","modified_gmt":"2026-09-03T13:57:17","slug":"teil-1-raspberry-pi-3b-tvheadend-digibit-twin-astra-192e-easyepg-xmltv-und-senderlogos","status":"publish","type":"post","link":"https:\/\/blog.mindkick.de\/?p=100010","title":{"rendered":"Teil 1 \u2013 Raspberry Pi 3B, TVHeadend, DIGIBIT TWIN, Astra 19,2\u00b0E, easyEPG\/XMLTV und Senderlogos"},"content":{"rendered":"<p><!-- Titel: TVHeadend auf dem Raspberry Pi \u2013 Teil 1: SAT>IP mit DIGIBIT TWIN, EPG und Senderlogos\nSlug: tvheadend-raspberry-pi-digibit-twin-epg-senderlogos\nKategorie: Linux \/ Raspberry Pi \/ TVHeadend\nTags: TVHeadend, Raspberry Pi, SAT>IP, DIGIBIT TWIN, Astra 19.2E, easyEPG, XMLTV, Picons\nStand: September 2026\n--><\/p>\n<p>In dieser sechsteiligen Serie entsteht Schritt f\u00fcr Schritt ein eigener TV-Server. Der Kern ist ein Raspberry Pi 3B, der die verschiedenen Empfangswege in <strong>TVHeadend<\/strong> zusammenf\u00fchrt. In diesem ersten Teil bauen wir die Basis: Satellitenfernsehen \u00fcber einen <strong>Telestar DIGIBIT TWIN<\/strong>, Programmdaten per XMLTV\/easyEPG und lokale Senderlogos.<\/p>\n<div style=\"padding: 16px; border-left: 5px solid #8a4b08; background: #fff4e5; margin: 20px 0;\"><strong>Hinweis:<\/strong> Diese Serie beschreibt die technische Einbindung von Empfangs- und Streamingquellen, auf die man rechtm\u00e4\u00dfig zugreifen darf. F\u00fcr Zattoo, TV4 Play und andere kontogebundene Angebote werden eigene g\u00fcltige Zug\u00e4nge vorausgesetzt. Zugangsdaten, Tokens und pers\u00f6nliche Kennungen geh\u00f6ren niemals in eine \u00f6ffentliche M3U-Datei oder in einen Blogbeitrag. Verf\u00fcgbarkeit, Senderangebot und Stream-Adressen k\u00f6nnen sich \u00e4ndern.<\/div>\n<h2>1. Ausgangslage<\/h2>\n<p>F\u00fcr den urspr\u00fcnglichen Aufbau wurde folgende Hardware verwendet:<\/p>\n<ul>\n<li><strong>Raspberry Pi 3 Model B<\/strong>, 1 GB RAM<\/li>\n<li>microSD-Karte, im Projekt sp\u00e4ter 128 GB<\/li>\n<li><strong>Debian 12 \/ Bookworm<\/strong> bereits installiert und per LAN erreichbar<\/li>\n<li><strong>Telestar DIGIBIT TWIN<\/strong> als SAT&gt;IP-Server<\/li>\n<li>Sat-Anlage f\u00fcr Astra 19,2\u00b0 Ost<\/li>\n<li>Gigabit-\/Fast-Ethernet-Heimnetz; der Pi selbst arbeitet beim 3B mit 100-Mbit-Ethernet<\/li>\n<\/ul>\n<p>Der DIGIBIT TWIN besitzt zwei SAT-Eing\u00e4nge und stellt zwei SAT&gt;IP-Tuner im Netzwerk bereit. Telestar beschreibt das Ger\u00e4t ausdr\u00fccklich als SAT&gt;IP-Server f\u00fcr zwei Teilnehmer mit zwei F-Buchsen und Ethernet-Anschluss.<\/p>\n<figure class=\"wp-block-image\">\n<p><figure id=\"attachment_100025\" aria-describedby=\"caption-attachment-100025\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100025 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?resize=300%2C225&#038;ssl=1\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?resize=1024%2C768&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?resize=768%2C576&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image.jpg?w=1620&amp;ssl=1 1620w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100025\" class=\"wp-caption-text\">Raspberry Pi 3B mit Display im Hutschienegeh\u00e4use im Schaltschrank<\/figcaption><\/figure><\/figure>\n<figure class=\"wp-block-image\"><figcaption>\n<figure id=\"attachment_100026\" aria-describedby=\"caption-attachment-100026\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100026 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?resize=300%2C225&#038;ssl=1\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?resize=1024%2C768&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?resize=768%2C576&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?w=2000&amp;ssl=1 2000w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/image-1.jpg?w=1620&amp;ssl=1 1620w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100026\" class=\"wp-caption-text\">TELESTAR Digibit Twin<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<\/figcaption><\/figure>\n<h3>Beispieladressen dieser Anleitung<\/h3>\n<pre><code>\r\nRaspberry Pi \/ TVHeadend: 192.168.1.20\r\nDIGIBIT TWIN:             192.168.1.30\r\nRouter:                   192.168.1.1\r\n\r\nTVHeadend-Admin:          tvadmin\r\nPasswort:                 CHANGE-ME-NOW\r\n<\/code><\/pre>\n<p>Die Adressen sind absichtlich Dummywerte. F\u00fcr beide Ger\u00e4te empfiehlt sich eine feste DHCP-Zuweisung im Router.<\/p>\n<h2>2. Grundpakete installieren<\/h2>\n<pre><code class=\"language-bash\">\r\nsudo apt update\r\nsudo apt full-upgrade -y\r\n\r\nsudo apt install -y \\\r\n  curl wget git unzip jq nano ca-certificates \\\r\n  ffmpeg mbuffer socat libxml2-utils \\\r\n  python3 python3-venv python3-pip\r\n<\/code><\/pre>\n<h2>3. TVHeadend aus dem offiziellen Repository installieren<\/h2>\n<p>TVHeadend empfiehlt f\u00fcr Debian und Raspberry Pi OS das offizielle Paket-Repository. Die 4.3er-Reihe ist inzwischen die laufend aktualisierte stabile Version.<\/p>\n<pre><code class=\"language-bash\">\r\ncurl -1sLf 'https:\/\/dl.cloudsmith.io\/public\/tvheadend\/tvheadend\/setup.deb.sh' | sudo -E bash\r\n\r\nsudo apt update\r\nsudo apt install -y tvheadend\r\n\r\nsudo systemctl enable --now tvheadend\r\nsudo systemctl status tvheadend --no-pager\r\n<\/code><\/pre>\n<p>Danach ist die Weboberfl\u00e4che unter <code>http:\/\/192.168.1.20:9981\/<\/code> erreichbar. Der HTSP-Port f\u00fcr Kodi und andere Clients ist standardm\u00e4\u00dfig <code>9982<\/code>.<\/p>\n<figure class=\"wp-block-image\"><figcaption>\n<figure id=\"attachment_100011\" aria-describedby=\"caption-attachment-100011\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100011 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?resize=300%2C170&#038;ssl=1\" alt=\"\" width=\"300\" height=\"170\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?resize=300%2C170&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?resize=1024%2C582&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?resize=768%2C436&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-14-59-37.png?w=1461&amp;ssl=1 1461w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100011\" class=\"wp-caption-text\">TVHeadend \u2013 erste Weboberfl\u00e4che<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<\/figcaption><\/figure>\n<h2>4. Ersteinrichtung von TVHeadend<\/h2>\n<p>Im Assistenten habe ich folgende Grundstruktur verwendet:<\/p>\n<ol>\n<li>Sprache: Deutsch.<\/li>\n<li>Erlaubtes Netzwerk: das eigene LAN, zum Beispiel <code>192.168.1.0\/24<\/code>.<\/li>\n<li>Administratorkonto anlegen.<\/li>\n<li>Optional ein getrenntes Benutzerkonto f\u00fcr Kodi\/Clients anlegen.<\/li>\n<li>Den DVB-Teil des Assistenten zun\u00e4chst nur grob konfigurieren; die eigentliche SAT&gt;IP-Konfiguration erfolgt anschlie\u00dfend.<\/li>\n<\/ol>\n<h2>5. DIGIBIT TWIN zuverl\u00e4ssig an TVHeadend \u00fcbergeben<\/h2>\n<p>Normalerweise findet TVHeadend SAT&gt;IP-Ger\u00e4te per SSDP automatisch. Im fertigen Aufbau wurde der DIGIBIT zus\u00e4tzlich explizit \u00fcber seine SAT&gt;IP-Ger\u00e4tebeschreibung angegeben. Das macht den Aufbau deterministisch.<\/p>\n<p>In <code>\/etc\/default\/tvheadend<\/code> wird die vorhandene Variable <code>OPTIONS<\/code> um den SAT&gt;IP-XML-Endpunkt erg\u00e4nzt:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/default\/tvheadend\r\n<\/code><\/pre>\n<p>Beispiel:<\/p>\n<pre><code>OPTIONS=\"--satip_xml http:\/\/192.168.1.30:38400\/description.xml\"\r\n<\/code><\/pre>\n<p>Anschlie\u00dfend:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart tvheadend\r\nsudo systemctl status tvheadend --no-pager\r\n<\/code><\/pre>\n<p>Unter <strong>Konfiguration \u2192 DVB-Eing\u00e4nge \u2192 TV-Adapter<\/strong> sollten nun zwei SAT&gt;IP-DVB-S-Tuner erscheinen.<\/p>\n<figure class=\"wp-block-image\">\n<figure id=\"attachment_100014\" aria-describedby=\"caption-attachment-100014\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100014 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?resize=300%2C170&#038;ssl=1\" alt=\"\" width=\"300\" height=\"170\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?resize=300%2C170&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?resize=1024%2C582&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?resize=768%2C436&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-06-59.png?w=1461&amp;ssl=1 1461w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100014\" class=\"wp-caption-text\">Die zwei SAT&gt;IP-Tuner<\/figcaption><\/figure>\n<p>&nbsp;<\/figure>\n<h2>6. Astra 19,2\u00b0 Ost als DVB-S-Netzwerk anlegen<\/h2>\n<p>Unter <strong>Konfiguration \u2192 DVB-Eing\u00e4nge \u2192 Netzwerke<\/strong> wird ein neues DVB-S-Netzwerk angelegt:<\/p>\n<pre><code>Name:              Astra 19.2E\r\nTyp:               DVB-S\r\nVordefinierte Muxe: Astra 19.2E\r\nNetzwerksuche:      aktiv\r\n<\/code><\/pre>\n<p>Danach jeden der beiden SAT&gt;IP-Tuner \u00f6ffnen und bei <strong>Netzwerke<\/strong> das Netzwerk <code>Astra 19.2E<\/code> zuweisen. TVHeadend beginnt anschlie\u00dfend mit dem Einlesen der Muxe und Dienste.<\/p>\n<figure class=\"wp-block-image\">\n<figure id=\"attachment_100016\" aria-describedby=\"caption-attachment-100016\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100016 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?resize=300%2C170&#038;ssl=1\" alt=\"\" width=\"300\" height=\"170\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?resize=300%2C170&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?resize=1024%2C582&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?resize=768%2C436&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-17.png?w=1461&amp;ssl=1 1461w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100016\" class=\"wp-caption-text\">Astra-Netzwerk<\/figcaption><\/figure>\n<figure id=\"attachment_100017\" aria-describedby=\"caption-attachment-100017\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100017 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?resize=300%2C170&#038;ssl=1\" alt=\"\" width=\"300\" height=\"170\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?resize=300%2C170&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?resize=1024%2C582&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?resize=768%2C436&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-15-27.png?w=1461&amp;ssl=1 1461w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100017\" class=\"wp-caption-text\">Muxe<\/figcaption><\/figure>\n<p>&nbsp;<figcaption><\/figcaption><\/figure>\n<h2>7. Dienste zu Kan\u00e4len mappen<\/h2>\n<p>Wenn die Suche abgeschlossen ist:<\/p>\n<p><strong>Konfiguration \u2192 DVB-Eing\u00e4nge \u2192 Dienste \u2192 Dienste zu Kan\u00e4len zuordnen.<\/strong><\/p>\n<p>F\u00fcr einen aufger\u00e4umten Server lohnt sich danach eine eigene Nummernlogik. In meinem Aufbau hat sich folgendes Schema bew\u00e4hrt:<\/p>\n<pre><code>1\u201399     Fernsehsender\r\n100\u2013199  private Radios \/ Internet-Radio\r\n200\u2013299  \u00f6ffentlich-rechtliche Radios\r\n300\u2013399  technische Kan\u00e4le \/ Kameras \/ Testbilder\r\n<\/code><\/pre>\n<p>Zus\u00e4tzlich k\u00f6nnen Tags wie <code>TV<\/code>, <code>Radio<\/code>, <code>SAT<\/code>, <code>IPTV<\/code> und <code>Favoriten<\/code> vergeben werden.<\/p>\n<h2>8. easyEPG lite installieren<\/h2>\n<p>TVHeadend kann EPG-Daten direkt aus DVB empfangen. F\u00fcr den sp\u00e4ter gemischten SAT-\/IPTV-Aufbau wollte ich jedoch eine einheitliche XMLTV-Quelle. Daf\u00fcr l\u00e4uft easyEPG lite separat auf Port 4000. Das Projekt kann Sender ausw\u00e4hlen, eigene EPG-IDs vergeben, XMLTV erzeugen und die Aktualisierung planen.<\/p>\n<pre><code class=\"language-bash\">sudo useradd --system \\\r\n  --home \/opt\/easyepg \\\r\n  --shell \/usr\/sbin\/nologin \\\r\n  easyepg\r\n\r\nsudo git clone https:\/\/github.com\/sunsettrack4\/script.service.easyepg-lite.git \/opt\/easyepg\r\n\r\nsudo python3 -m venv \/opt\/easyepg\/venv\r\n\r\nsudo \/opt\/easyepg\/venv\/bin\/pip install --upgrade pip\r\nsudo \/opt\/easyepg\/venv\/bin\/pip install \\\r\n  bottle beautifulsoup4 cheroot curl-cffi pytz requests xmltodict\r\n\r\nsudo chown -R easyepg:easyepg \/opt\/easyepg\r\n<\/code><\/pre>\n<h3>systemd-Dienst f\u00fcr easyEPG<\/h3>\n<pre><code class=\"language-bash\">sudo tee \/etc\/systemd\/system\/easyepg.service &gt;\/dev\/null &lt;&lt;'EOF'\r\n[Unit]\r\nDescription=easyEPG lite XMLTV service\r\nAfter=network-online.target\r\nWants=network-online.target\r\n\r\n[Service]\r\nType=simple\r\nUser=easyepg\r\nGroup=easyepg\r\nWorkingDirectory=\/opt\/easyepg\r\nExecStart=\/opt\/easyepg\/venv\/bin\/python \/opt\/easyepg\/main.py\r\nRestart=on-failure\r\nRestartSec=5\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\nEOF\r\n\r\nsudo systemctl daemon-reload\r\nsudo systemctl enable --now easyepg\r\nsudo systemctl status easyepg --no-pager\r\n<\/code><\/pre>\n<p>Die Oberfl\u00e4che liegt nun unter <code>http:\/\/192.168.1.20:4000\/<\/code>.<\/p>\n<h3>easyEPG konfigurieren<\/h3>\n<ol>\n<li>Passendes Lineup bzw. die gew\u00fcnschte EPG-Quelle ausw\u00e4hlen.<\/li>\n<li>Nur die tats\u00e4chlich ben\u00f6tigten Sender aktivieren.<\/li>\n<li>Jedem Sender eine eindeutige EPG-ID geben.<\/li>\n<li>Sendernamen kontrollieren.<\/li>\n<li>XMLTV-Erzeugung aktivieren.<\/li>\n<li>Den internen Scheduler so planen, dass die XMLTV-Datei vor unserem TVHeadend-Import fertig ist.<\/li>\n<\/ol>\n<p>Wichtig ist die EPG-ID. Sie ist sp\u00e4ter die Verbindung zwischen Kanal und Programmdaten.<\/p>\n<figure class=\"wp-block-image\">\n<figure id=\"attachment_100020\" aria-describedby=\"caption-attachment-100020\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100020 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?resize=300%2C184&#038;ssl=1\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?resize=1024%2C629&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?resize=768%2C472&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-35-32.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100020\" class=\"wp-caption-text\">easyEPG<\/figcaption><\/figure>\n<figure id=\"attachment_100021\" aria-describedby=\"caption-attachment-100021\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100021 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?resize=300%2C184&#038;ssl=1\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?resize=1024%2C629&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?resize=768%2C472&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-36-26.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100021\" class=\"wp-caption-text\">Scheduler und XMLTV<\/figcaption><\/figure>\n<p>&nbsp;<\/figure>\n<h2>9. XMLTV \u00fcber den TVHeadend-Socket importieren<\/h2>\n<p>Im fertigen System wurde der XMLTV-Import nicht von Hand angesto\u00dfen, sondern t\u00e4glich per systemd-Timer in den externen XMLTV-Socket von TVHeadend geschrieben.<\/p>\n<p>Zuerst in TVHeadend unter <strong>Konfiguration \u2192 Kanal \/ EPG \u2192 EPG-Grabber-Module<\/strong> das Modul<br \/>\n<strong>External: XMLTV<\/strong> aktivieren. Danach sollte der Socket vorhanden sein:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart tvheadend\r\nsudo ls -l \/var\/lib\/tvheadend\/epggrab\/xmltv.sock\r\n<\/code><\/pre>\n<h3>Importscript<\/h3>\n<pre><code class=\"language-bash\">sudo tee \/usr\/local\/sbin\/easyepg-import.sh &gt;\/dev\/null &lt;&lt;'EOF'\r\n#!\/bin\/bash\r\nset -euo pipefail\r\n\r\nURL='http:\/\/127.0.0.1:4000\/download\/epg.xml'\r\nSOCKET='\/var\/lib\/tvheadend\/epggrab\/xmltv.sock'\r\nTMP=\"$(mktemp)\"\r\n\r\ncleanup() {\r\n  rm -f \"$TMP\"\r\n}\r\ntrap cleanup EXIT\r\n\r\ncurl -fsS \"$URL\" -o \"$TMP\"\r\n\r\npython3 - \"$TMP\" &lt;&lt;'PY'\r\nimport sys\r\nimport xml.etree.ElementTree as ET\r\nET.parse(sys.argv[1])\r\nprint(\"XMLTV ist g\u00fcltig\")\r\nPY\r\n\r\ncat \"$TMP\" | socat - \"UNIX-CONNECT:$SOCKET\"\r\nEOF\r\n\r\nsudo chmod 755 \/usr\/local\/sbin\/easyepg-import.sh\r\n<\/code><\/pre>\n<h3>systemd-Service<\/h3>\n<pre><code class=\"language-bash\">sudo tee \/etc\/systemd\/system\/easyepg-import.service &gt;\/dev\/null &lt;&lt;'EOF'\r\n[Unit]\r\nDescription=easyEPG XMLTV in TVHeadend importieren\r\nAfter=network-online.target easyepg.service tvheadend.service\r\nWants=network-online.target\r\nRequires=tvheadend.service\r\n\r\n[Service]\r\nType=oneshot\r\nExecStart=\/usr\/local\/sbin\/easyepg-import.sh\r\nEOF\r\n<\/code><\/pre>\n<h3>T\u00e4glicher Timer um 05:30 Uhr<\/h3>\n<pre><code class=\"language-bash\">sudo tee \/etc\/systemd\/system\/easyepg-import.timer &gt;\/dev\/null &lt;&lt;'EOF'\r\n[Unit]\r\nDescription=T\u00e4glicher easyEPG-Import\r\n\r\n[Timer]\r\nOnCalendar=*-*-* 05:30:00\r\nPersistent=true\r\nUnit=easyepg-import.service\r\n\r\n[Install]\r\nWantedBy=timers.target\r\nEOF\r\n\r\nsudo systemctl daemon-reload\r\nsudo systemctl enable --now easyepg-import.timer\r\n\r\n# einmal sofort testen\r\nsudo systemctl start easyepg-import.service\r\n\r\nsystemctl status easyepg-import.timer --no-pager\r\n<\/code><\/pre>\n<p>Danach unter <strong>Konfiguration \u2192 Kanal \/ EPG \u2192 Kan\u00e4le<\/strong> die passende XMLTV-Quelle den Kan\u00e4len zuordnen. Sind die IDs sauber gew\u00e4hlt, erscheint anschlie\u00dfend das Programm im EPG.<\/p>\n<figure class=\"wp-block-image\">\n<p><figure id=\"attachment_100022\" aria-describedby=\"caption-attachment-100022\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100022 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?resize=300%2C184&#038;ssl=1\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?resize=1024%2C629&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?resize=768%2C472&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-40-09.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100022\" class=\"wp-caption-text\">TVHeadend-EPG nach dem XMLTV-Import<\/figcaption><\/figure><figcaption><\/figcaption><\/figure>\n<h2>10. Senderlogos \/ Picons lokal hinterlegen<\/h2>\n<p>Die Logos speichere ich bewusst lokal. Damit h\u00e4ngt die Darstellung nicht von externen Bildservern ab.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/usr\/local\/share\/tvheadend\/picons\r\nsudo chown -R root:video \/usr\/local\/share\/tvheadend\/picons\r\nsudo chmod -R 755 \/usr\/local\/share\/tvheadend\/picons\r\n<\/code><\/pre>\n<p>Beispiel:<\/p>\n<pre><code>\/usr\/local\/share\/tvheadend\/picons\/\r\n\u251c\u2500\u2500 das-erste-hd.png\r\n\u251c\u2500\u2500 zdf-hd.png\r\n\u251c\u2500\u2500 mdr-sachsen-hd.png\r\n\u2514\u2500\u2500 arte-hd.png\r\n<\/code><\/pre>\n<p>In <strong>Konfiguration \u2192 Kanal \/ EPG \u2192 Kan\u00e4le<\/strong> wird im Feld <strong>Icon<\/strong> beispielsweise eingetragen:<\/p>\n<pre><code>file:\/\/\/usr\/local\/share\/tvheadend\/picons\/das-erste-hd.png\r\n<\/code><\/pre>\n<p>F\u00fcr ver\u00f6ffentlichte Logo-Dateien sind selbstverst\u00e4ndlich die jeweiligen Marken- und Nutzungsrechte zu beachten. F\u00fcr den privaten TVHeadend-Server gen\u00fcgt es, die ben\u00f6tigten Logos aus zul\u00e4ssigen Quellen lokal abzulegen.<\/p>\n<figure class=\"wp-block-image\">\n<figure id=\"attachment_100023\" aria-describedby=\"caption-attachment-100023\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100023 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?resize=300%2C184&#038;ssl=1\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?resize=1024%2C629&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?resize=768%2C472&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-42-30.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100023\" class=\"wp-caption-text\">Kanallogos werden sp\u00e4ter in den Clients (z.B. KODI) angezeigt oder wie hier im EPG Detailfenster<\/figcaption><\/figure>\n<p><figure id=\"attachment_100024\" aria-describedby=\"caption-attachment-100024\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-100024 size-medium\" src=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?resize=300%2C184&#038;ssl=1\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?resize=1024%2C629&amp;ssl=1 1024w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?resize=768%2C472&amp;ssl=1 768w, https:\/\/i0.wp.com\/blog.mindkick.de\/wp-content\/uploads\/2026\/09\/Bildschirmfoto-vom-2026-09-03-15-45-02.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-100024\" class=\"wp-caption-text\">Kanalliste mit hinterlegten Logos<\/figcaption><\/figure><figcaption><\/figcaption><\/figure>\n<h2>11. Funktionstest<\/h2>\n<pre><code class=\"language-bash\">systemctl status tvheadend --no-pager\r\nsystemctl status easyepg --no-pager\r\nsystemctl status easyepg-import.timer --no-pager\r\n\r\n# TVHeadend-Playlist im Browser\/VLC:\r\n# http:\/\/192.168.1.20:9981\/playlist\r\n<\/code><\/pre>\n<p>Damit steht die Basis: zwei SAT&gt;IP-Tuner, Astra 19,2\u00b0 Ost, Kanalliste, EPG und Logos. Im n\u00e4chsten Teil kommen ORF, SRF und weitere Sender \u00fcber Zattoo\/Telerising dazu.<\/p>\n<h2>Quellen und weiterf\u00fchrende Dokumentation<\/h2>\n<ul>\n<li><a href=\"https:\/\/tvheadend.org\/p\/downloads\">TVHeadend \u2013 offizielle Downloads und Debian-Repository<\/a><\/li>\n<li><a href=\"https:\/\/docs.tvheadend.org\/\">TVHeadend \u2013 Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/www.telestar.de\/produkt\/digibit-twin\/\">Telestar \u2013 DIGIBIT TWIN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sunsettrack4\/script.service.easyepg-lite\">easyEPG lite auf GitHub<\/a><\/li>\n<li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/\">Raspberry Pi \u2013 Dokumentation<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In dieser sechsteiligen Serie entsteht Schritt f\u00fcr Schritt ein eigener TV-Server. Der Kern ist ein Raspberry Pi 3B, der die verschiedenen Empfangswege in TVHeadend zusammenf\u00fchrt. In diesem ersten Teil bauen wir die Basis: Satellitenfernsehen \u00fcber<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[134,133],"tags":[],"class_list":["post-100010","post","type-post","status-publish","format-standard","hentry","category-computer-co","category-diy-projekte"],"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/posts\/100010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=100010"}],"version-history":[{"count":5,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/posts\/100010\/revisions"}],"predecessor-version":[{"id":100027,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=\/wp\/v2\/posts\/100010\/revisions\/100027"}],"wp:attachment":[{"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=100010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=100010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mindkick.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=100010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}