Nachdem mein erster Versuch ein Panel für die Hausautomation zu erstellen, gescheitert ist (siehe https://www.dev-metal.ch/?p=1586) ist dies nun der zweite Versuch. Das Grundsetting ist das gleiche geblieben:
Hardware:
- Panel: https://www.welectron.com/Waveshare-156inch-HDMI-LCD_1
- Raspberry Pi 4
- Wlan USB Adapter (für bessere Verbindungsstabilität)
- Kühler
Installation
Neu verwende ich nicht fullpageos sondern das raspberry pi OS. Die Full-Version in der 64bit Variante.
Raspberry Pi Installation wie gewohnt durch schreiben eines SD-Images. Ich aktiviere dabei den SSH-Server gleich mit. Ich konfiguriere das OS auch so, dass ein autologin stattfindet. Am Ende eines Bootvorgangs gelangt man damit direkt auf den eingeloggten Desktop.
Welectron gibt an, dass man für die Installation auf einem Raspberry Pi folgende Anpassungen an der /boot/config.txt vornehmen muss:
# uncomment to force a specific HDMI mode (this will force VGA) hdmi_group=2 hdmi_mode=82 hdmi_cvt 1920 1080 60 6 0 0 0
Diese Anpassungen waren aber in meinem Falle gar nicht nötig. Das Panel wurde sofort korrekt erkannt.
X11VNC Server
Da es sich hierbei um ein Panel handelt, sind Tastatur und Maus nicht fix montiert. Entsprechend macht es Sinn, das Gerät per Remote steuern zu können. Das wird mit X11VNC-Server umgesetzt. X11VNC ermöglicht es existierende X11-Sessions per VNC weiterzuleiten:
x11vnc installieren
sudo apt-get update sudo apt-get install x11vnc
Server testeshalber starten
x11vnc -usepw -forever -display :0
Beim ersten Start wird das Setzen eines Passwortes verlangt. Hier entsprechend eines setzen.
Nun noch sicherstellen, dass der X11VNC-Server beim booten bzw. beim Login des Users
nano /home/pi/.config/autostart/x11vnc.desktop
Folgende Zeilen eingeben
[Desktop Entry] Type=Application Name=X11VNC Exec=x11vnc -usepw -forever -display :0 StartupNotify=false
Raspberry Pi neu starten.
sudo reboot
Ab sofort ist der VNC-Server verfügbar. Ein Client kann nun mit
vncviewer <ip>:0
auf den Raspberry Pi zugreifen.
Chromium installieren
Chromium bietet einen Kiosk-Mode. Dieser wurde bei fullpageos auch verwendet. Ich verwende der Einfachheit halber den gleichen Browser, mit den gleichen Start-Parametern:
Installieren:
sudo apt-get install raspberrypi-ui-mods chromium-browser
Damit die Mouse-Curser entfernt werden können, muss noch unclutter installiert werden
sudo apt-get install unclutter
Ein Config-Verzeichnis im eigenen ~/ erstellen:
mkdir -p /home/pi/.config/lxsession/LXDE-pi/
Script aufsetzen
nano /home/pi/.config/lxsession/LXDE-pi/autostart
und folgendermassen befüllen
# @xset s off ^[#(Screensaver ausschalten) Geht alternativ auch über die Oberfläche. @xset -dpms #(Energiesparmodus deaktivieren) Geht alternativ auch über die Systemeinstellungen # @xset s noblank #(Screensaver ausschalten) @chromium-browser --v=0 --kiosk --touch-events=enabled --disable-pinch --noerrdialogs --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' --disable-session-crashed-bubble --disable-component-update --overscroll-history-navigation=0 --disable-features=Translate --app=http://primary-spacelynk.home.arpa/scada-vis @unclutter -idle 0 # besagt, dass der Mouse-Curser 0s nach der letzten Aktivierung ausgeblendet werden soll
Ich lasse hier bewusst den Screensaver an (auskommentieren von @xset s off und #@xset s noblank). Das Panel soll schwarz werden, sobald es eine weile nicht gebraucht wird.
xscreensaver
Xscreensaver soll nach einigen Minuten inaktivität das Panel auf „Blank“ setzen, also einen schwarzen Bildschirm an das Panel senden.
Installation
sudo apt-get install xscreensaver
Komplettes entfernen des Maus-Cursors
Unclutter entfernt den Maus-Cursor nicht komplett. Es blendet den Cursor lediglich nach x.xx sekunden inaktivität wieder aus. Wenn man aber auf das Touchpanel streicht, bleibt der Cursor auch dann sichtbar, wenn man -idle 0 konfiguriert hat.
Man kann die Maus auch komplett ausblenden. Damit ist dann aber die Maus auch nicht verfügbar, wenn man auf dem Raspi eine Maus anschliesst:
vi /etc/lightdm/lightdm.conf
#xserver-command=X neu: xserver-command=X -nocursor
xdotool
xdotool bietet die Möglichkeit per command-line (ssh) Maus und Tastatur-events an die x-session zu senden:
sudo apt-get install xdotool
Folgendes Script (geklaut bei fullpageos) setzt das Chromium-Fenster aktiv und senden ein refresh (ctrl+f5)
#!/bin/bash export DISPLAY=:0 sleep 1 WID=$(xdotool search --onlyvisible --class chromium|head -1) xdotool windowactivate ${WID} xdotool key ctrl+F5 xdotool key F11
Mausklicks für Kamera-Auswahl
Wenn es an der Türe klingelt, soll das Panel automatisch auf der Visualisierung das Kamerabild einblenden. Dies kann man nun mit xdotool wunderbar umsetzen. Folgendes Script simuliert zwei Toches auf dem Panel und wählt damit das gewünschte Kamerabild automatisch aus. Dieses Script wird von der Kamera getriggert, sobald jemand die Klingel getätigt hat:
#!/bin/bash export DISPLAY=:0 sleep 1 WID=$(xdotool search --onlyvisible --class chromium|head -1) xdotool windowactivate ${WID} ### Select Kamera-Menu xdotool mousemove 1720 900 click 1 sleep .5 ### Select Mobotix Camera xdotool mousemove 250 200 click 1
Reboot to Chromium/Desktop
Falls ich mal den Desktop per VNC benötige, habe ich mir zwei bash-scripte geschrieben, welche das autostart-File entfernt und duchbootet (bootToDesktop.sh) oder das autostart-File nach /home/pi/.config/lxsession/LXDE-pi/ schreibt und bootet (bootToChromium.sh).
Problembehebungen
Wayland Display Server / ydotool
Wenn man xdotool unter Wayland (z.B. Ubuntu 22.04) verwendet kann das Problem auftauchen, dass xdotool den „Black-Screen“ nicht wieder deaktiviert. Will hiessen, dass die Mausbewegungen und Clicks zwar ausgeführt werden, der Bildschirm selber aber Schwarz bleibt, wenn er mal in den „Tiefschlaf“ gefallen ist. Abhilfe bringt dann ydotool:
ydotool kann nicht aus den Quellen installiert werden (veraltet). Stattdessen hier eine Anleitung, wie man ydotool aus Github selber bildet:
Nach der Installation konnte ydotool immer noch nicht als normaler User ausgeführt werden, weil das Socket-File nicht gefunden wird. Hier die Lösung dafür:
Schlussendlich habe ich einfach in meinen xdotool-Files erst einen ydotool command ausgeführt. Dieser aktiviert den Screen. Anschliessend führe ich mit xdotool fort:
#!/bin/bash export DISPLAY=:0 YDOTOOL_SOCKET="/tmp/.ydotool_socket" ydotool mousemove --absolute -- 1720 800 sleep .5 WID=$(xdotool search --onlyvisible --class chromium|head -1) xdotool windowactivate ${WID} ### Select Kamera-Menu xdotool mousemove 1720 800 click 1 sleep .1 ### Select Axis Kinderzimmer Camera xdotool mousemove 900 600 click 1
SWAP Speicher erhöhen
Es zeigt sich, dass Chromium sehr Speicherhungrig ist und das Anzeigen von sehr grossen Grafana-Panels das System zum erliegen bringen kann. Deswegen habe ich den SWAP Speicher auf 2048 erhöht: https://pimylifeup.com/raspberry-pi-swap-file/
WLAN Verbindung (Stabilität) verbessern
Der Standard WLAN Adapter des Raspberry PIs 4 ist zwar schnell aber seine Reichweite ist nicht wirklich gut. Deswegen verwende ich einen WLAN USB-Stick, der auch vom System bereits automatisch erkannt und eingebunden wurde (als Wlan1). Um sicherzustellen, dass der Raspi nur über diesen Wlan1 Adapter kommuniziert habe ich zu einem kleinen Trick gegriffen. Unter
/etc/wpa_supplicant/wpa_supplicant.conf
kann bekanntlich das WLAN konfiguriert werden. Alle Wlan Adapter verwenden diese Konfig-File.
Man kann aber auch mehrere solcher Konfig-Files anlegen und diese den Adaptern zuweisen. Dies nach dem Muster wpa_supplicant-„$interface“.conf
Um Wlan0 nicht mehr reden zu lassen, habe ich ein File wpa_supplicant-wlan0.conf ohne entsprechende Netzwerk-Konfig erstellt.
cp wpa_supplicant.conf wpa_supplicant-wlan0.conf
Das wlan0 File sieht dann so aus:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CH network={ }
Damit wird für den Adapter Wlan0 dieses Konfig-File verwendet, welches sich entsprechend gar nicht verbindet. Alle anderen Wlan Adapter verwendet weiterhin wpa_supplicant.conf. Damit verbindet sich Wlan1 und Wlan0 bleibt stumm.
Optionale Info: HDMI Power off
Mein Panel besitzt eine Hintergrundbeleuchtung. Dieses blieb bei fullpageos an, wenn xscreensaver einen Blank-Screen sendete. Dies konnte ich folgendermassen ausschalten:
sudo vcgencmd display_power 0 # HDMI Power off sudo vcgencmd display_power 1 # HDMI Power on
Kios-Mode verlassen
- Über VNC verbinden und Alt+F4 drücken oder
- über SSH mit ps -ef | grep chromium die Prozess-ID herausfinden und den Prozess killen.
Links
- https://www.elektronik-kompendium.de/sites/raspberry-pi/2011121.htm
- https://codex.so/kiosk-mode-on-raspberry-pi
- https://itrig.de/index.php?/archives/2267-Kiosk-Systeme-fuer-alle-kein-Problem-mit-FullPageOS.html
- https://forums.raspberrypi.com/viewtopic.php?t=56944
- https://github.com/guysoft/FullPageOS/blob/devel/src/modules/fullpageos/filesystem/home/pi/scripts/start_chromium_browser