Raspberry Pi Medien PC

Das ist jetzt die vierte Version des Medien-PCs, welche die vorherigen Artikel ersetzt. Dieses Mal erfolgte ein Upgrade von einen Raspberry Pi 4B sowie eine komplett neue Umsetzung der USV-Lösung.

Laut Olmatic ist die S.USV mit dem Pi4 kompatibel. Allerdings habe ich meinen Pi nicht mit diesen erfolgreich zum laufen gebracht. Leider war auch nach einiger Zeit der Support nicht mehr wirklich hilfsbereit, weshalb ich eine andere Lösung gesucht habe. In diesem Tutorial verwende ich hier eine Powerbank um den Pi weiter mit Strom zu versorgen und sauber herunter zu fahren.

Die nächste Änderung ist, dass der Pi nicht mehr automatisch starten soll, wenn ich den Strom einschalte. Ich benötige diesen nicht immer und da dieser auch meinen Server mit startet, kann ich diesen Stromverbrauch dadurch einsparen.

Realisierung

Der neue MedienPC besteht aus einem Raspberry Pi 4B mit 4 GB RAM und einem großen passiven Kühler. Zusätzlich habe ich noch eine Echtzeituhr (RTC) mit verbaut, damit dieser die Uhrzeit nicht jedes Mal vergisst. Wichtiger Hinweis: Der Pi4 hat keinen HDMI-Anschluss mehr, sondern einen Micro-HDMI. Wenn nicht bereits vorhanden ist ein entsprechendes Kabel notwendig. Auch erfolgt die Stromversorgung über USB-C und nicht mehr über Mikro-USB-Stecker.

Hier ist von mir verwendete Harware:

Da durch die Powerbank der Pi immer mit Strom versorgt wird, ist für das Starten dieses eine andere Vorgehensweise notwendig. Der Pi muss richtig neugestartet werden. Dazu verwende ich die Reset-Funktion des Computers. Vorgesehen ist hierfür der Kontakt “GLOBAL_EN”, welcher mit Masse verbunden werden muss. Dieser Pin ist aber noch nicht belegt und muss somit selbst aufgelötet werden. Da ich ja einen Kühler als Gehäuse habe, habe ich hierfür ein Jumper-Kabel genommen, den Stift um 90 Grad abgewinkelt und aufgelötet.

Hat man das Jumper-Kabel aufgelötet, kann man das Gehäuse zusammenschrauben. Als nächstes montiert man die RTC. Je nach Modell und Bauweise kann man diese montieren. Ich habe die Jumper-Kabel einfach mit doppelseitigen Klebeband auf die Netzwerkbuchse geklebt. Auch das entfernen ist hier noch möglich. Die RTC muss dann entsprechend angeschlossen werden. Bei mir sind 3,3 V, Ground sowie SDA und SDC notwendig. Eine gute Seite mit verschiedenen RTCs sowie deren Einbindung in den Pi ist [hier](https://pimylifeup.com/raspberry-pi-rtc/) zu finden.

Damit ist die Hardware Installation schon beendet.

Installation ArchARM und Kodi

Ich bin ein Anhänger von ArchLinux und setzte diese Distribution auf allen meinen PCs und auch zwischenzeitlich auf immer mehr Server ein. Somit liegt es auch nahe, dem Pi auf Arch zu betreiben. Arch gibt es in einer angepassten Distribution für ARM PCs und nennt sich arch linux ARM und die Installationsanleitung für den Pi 4 findet man hier. Dieser Anleitung kann man einfach folgen.

Auch die Installation von Kodi ist kein Hexenwerk. Als root führt man einfach folgende Befehle aus:

pacman -S kodi-rbp4 kodi-rbp4-eventclients
systemctl enable kodi

Wichtig ist noch, die bei der Installation angezeigten Änderungen in der /boot/config.txt durchzuführen:

gpu_mem=320
dtoverlay=vc4-fkms-v3d
dtparam=audio=on

### bei mir noch zusätzlich notwendige Parameter
disable_overscan=1
dtoverlay=vc4-fkms-v3d

### eventuell relevante Parameter
dtoverlay=pi3-disable-bt
dtoverlay=pi3-disable-wifi

# Parameter für die RTC
dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds1307

Das war auch schon alles. Der Medien PC ist eingerichtet und funktioniert. Nach einem Neustart sind die Parameter aktiv und Kodi sollte automatisch starten. Wer etwas Übung und Erfahrung hat, der schafft das in weniger als 15 Minuten.

Realisierung der USV-Lösung

Was jetzt noch fehlt, ist die USV-Lösung, welche dafür sorgt, dass der Pi beim Verlust der Stromversorgung sauber herunterfährt. Hierfür ist eine Powerbank notwendig, welche Passthrough kann (also welche gleichzeitig geladen werden kann, während ein Gerät mit Strom versorgt wird) und bei der die Spannung nicht kurzzeitig einbricht, wenn die Stromversorgung am Eingang wegfällt.

Einige Hersteller geben direkt an, dass sie Passthrough nicht können (z. B. Anker), bei anderen kommt es wie geschrieben zu einem kurzen Spannungsabfall, welchen den Pi zum Absturz bringt (z. B. RAVPower). Schließlich bin ich mit einer EasyAcc fündig geworden, welche genau diese Anforderungen erfüllt. Ein entsprechend starkes Netzteil mit zwei Ausgängen sorgt für das schnelle Laden der Powerbank.

Der Pi wird jetzt an der Powerbank angeschlossen. Diese mit den zwei Stromkabeln am Netzteil. Die Stromversorgung ist somit sichergestellt. Jetzt muss nur noch eine Überwachung realisiert werden, wann der Pi nicht mehr am Stromnetz hängt. Hierbei behelfe ich mir eines kleinen Tricks. Mein Pi hängt mit einem Netzwerkkabel an einem Switch, welcher an der gleichen Stromversorgung hängt wie die Mediengeräte im Wohnzimmer. Das heißt, wenn die Stromversorgung weg ist, so ist auch der Switch aus und somit die Netzwerkverbindung unterbrochen. Das kann ich problemlos abfragen und ein entsprechendes Skript schreiben.

Das entsprechende Shell-Skript schau wie folgt aus und liegt bei mir unter /opt/usvd.sh. Da hier nur Systemfunktionen verwendet werden sind keine weiteren Abhängigkeiten zu erfüllen.

#!/bin/bash
 
### zu überwachende Interface
interface="eth0"

if ! [ -f /sys/class/net/$interface/operstate ];
then
  echo "Interface ${interface} nicht gefunden"
  exit 1
fi

### wenn der Pi nach dem Starten sofort wieder herunterfährt folgende Zeile auskommentieren
# sleep 30

while true
do
  result="$(cat /sys/class/net/${interface}/operstate)"

  if [ -f "/run/systemd/shutdown/scheduled" ]; 
  then
    shutdown_result="$(busctl get-property org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager ScheduledShutdown | grep poweroff | wc -l)"
  else
    shutdown_result="0"
  fi

  if [ "$result" = "down" ]; 
  then
    if [ "$shutdown_result" = "0" ]; 
    then
      echo "Shutdown geplant..."
      shutdown -h 1 &
    fi
  else
    if ! [ "$shutdown_result" = "0" ]; 
    then
      echo "Shutdown abgebrochen..."
      shutdown -c
    fi
  fi
  sleep 1
done

Damit das Skript jetzt bei jedem Start automatisch startet, habe ich noch ein systemd-Skript geschrieben. Dieses liegt unter /etc/systemd/system/usvd.service:

[Unit]
Description=USV Dienst
After=syslog.target

[Service]
Type=Single
RemainAfterExit=True
ExecStart=/opt/usvd.sh &
ExecStop=pkill usvd.sh

[Install]
WantedBy=multi-user.target

Der Daemon wird jetzt mit folgenden Befehlen aktiviert und gestartet:

systemctl start usvd
systemctl enable usvd
Wenn man jetzt das Netzwerkkabel entfernt, sollte nach einer Minute der Pi sauber herunter fahren. Allerdings haben wir jetzt noch das Problem, dass wir den Pi jetzt wieder starten müssen. Hierfür benötigen wir jetzt noch einen Schalter, der "GLOBAL_EN" und Masse brückt. Ich habe hierfür einen Schalter in ein kleines schwarzes Gehäuse gebaut und das mit einer schwarzen Zwillingsleitung zum Pi geführt. Ich habe direkt Dupont-Buchsen auf das Kabel gecrimpt und an den Pi bzw. an das Kabel angesteckt. Natürlich gibt es hier auch andere Möglichkeiten.

Damit ist das Projekt auch schon beendet. Der Pi fährt sauber runter und kann auch wieder problemlos mit einem Knopfdruck gestartet werden.

Hier sind die von mir verwendeten Komponenten (alles über Amazon):

Hinweise

Policy-Kit

Wenn Kodi gestartet wird und die Ausschalten und Neustart Buttons fehlen, dann fehlt auf dem System der Policy-Kit. Dieser muss dann einfach neu installiert werden und nach einem Neustart steht diese Funktionen zur Verfügung.

$ sudo pacman -S polkit