Panel für Hausautomation – 2. Versuch

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:

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