===== Software ===== Das Nanopi-Terminal verwendet als Betriebssystem Armbian. Probleme mit Wifi: Manchmal erscheint die Konfiguration für Wifi nicht in armbian-config * brcmfmac4356-sdio.bin * brcmfmac4356-sdio.txt * BCM4356A2.hcd passend ersetzen. Kopierte Dateien: * Netzwerkverbindungen in /etc/NetworkManager/system-connections * Dateien in /opt/ (start_blescan.sh, start_kiosk.sh, switch.sh, .twinkle) * Dateien /home/kiosk/ (anruf_annehmen.sh, ble_scan, gpio_buttontest) * Content /var/www/html * Udev-Rule in /etc/udev/rules.d/80-jitsi.rules Test der Temperatur: armbianmonitor -m * sudo apt update * sudo apt upgrade * sudo apt dist-upgrade * sudo apt install xorg xserver-xorg-legacy openbox chromium xdotool unclutter lighttpd twinkle swaks bluez php-cgi php7.3-gd * sudo lighty-enable-mod fastcgi-php * sudo nano -w /etc/X11/Xwrapper.config allowed_users=anybody needs_root_rights=yes * sudo nano /opt/kiosk.sh #!/bin/sh touch /tmp/kiosk.status chmod 666 /tmp/kiosk.status touch /tmp/switch.status chmod 666 /tmp/switch.status sleep 10 xset s noblank xset s 300 openbox-session & unclutter -grab -visible & if ! lsusb | grep "1bcf:2284" > /dev/null then startadresse="https://www.kinasen.de/wetteruebersicht.php" echo 2 > /tmp/switch.status else echo 1 > /tmp/switch.status startadresse="URL_JITSI" fi chromium --no-first-run --lang=de-DE --kiosk --agc-startup-min-volume=255 --compensate-for-unstable-pinch-zoom --disable-pinch --disable-translate --disable-suggestions-service --disable-save-password-bubble --start-maximized --disable-session-crashed-bubble --disk-cache-dir=/tmp/kioskcache --disk-cache-size=1 $startadresse * sudo chmod 755 /opt/kiosk.sh * sudo nano /etc/systemd/system/kiosk.service [Unit] Description=Starte Chromium Kiosk [Service] Type=oneshot User=kiosk ExecStart= /usr/bin/startx /etc/X11/Xsession /opt/start_kiosk.sh [Install] WantedBy=multi-user.target * sudo systemctl daemon-reload * sudo systemctl enable kiosk * sudo reboot dbus-x11 ==== Steuerung der Kiosk-Anzeige=== Um die von Chromium im Kiosk-Mode (keine Adresszeile) dargestellte URL wechseln zu können musste etwas improvisiert werden. Alle genutzten Webseiten binden Javascript ein, welches die neu URL nach Eingabe einer Tastenkombination aufruft. Diese Javascriptdatei und einige der anzeigbaren Seiten werden vom lokalen Webserver (lighttpd, localhost) geliefert. var intervalPing = setInterval(function(){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {}; xhr.open('GET', 'http://localhost/ping.php'); xhr.send(); }, 5000); var tasten=[0,0,0]; function keys(key) { if (!key){ key = event; key.which = key.keyCode; } tasten[0]=tasten[1]; tasten[1]=tasten[2]; tasten[2]=String.fromCharCode(key.which); switch(tasten.join('')){ // Taste y: case "Y1X": location.href = "JITSI_URL"; break; case "Y2X": location.href = "https://www.kinasen.de/wetteruebersicht.php"; break; case "Y3X": location.href = "https://www.kinasen.de/gartenbilder.php"; break; case "Y4X": location.href = "http://localhost/lexikon.php"; break; case "Y5X": var path=window.location.pathname; if (path=="/anrufen.php") { telefonstatus(); break; } else { location.href = "http://localhost/anrufen.php?incoming=1"; break; } } } document.onkeyup = keys; Soll ein Jitsi-Server eingebunden werden so muss nach fast jedem Update auf diesem das Javascript neu eingebunden werden. /usr/share/jitsi-meet/index.html Da an der Anzeige keine Tastatur verbaut wurde erfolgt die Umschaltung der Seiten durch Taster. Diese rufen jeweils ein Script auf, welches die Tastatureingabe im Chromium mittels xdotool simuliert. Um direkt in die festgelegte Jitsi-Konferenz zu schalten wird das entsprechende Script durch eine UDEV-Regel beim Anstecken oder Entfernen der Kamera ausgelöst. /opt/switch.sh #!/bin/bash zahl_telefon=5 zahl_max=5 if [ $# -ne 1 ] then echo "kein parameter" exit fi if [ $1 -eq 99 ] then export DISPLAY=":0" export XAUTHORITY=/home/kiosk/.Xauthority xdotool getactivewindow xdotool key "ctrl+F5" exit fi if [ $1 -gt -1 ] && [ $1 -lt 10 ] then if ps ax | grep [c]hromium > /dev/null then if ! ps ax | grep [/]bin/sh /opt/switch.sh > /dev/null then if [ $1 -eq 0 ] # Taster gedrückt, durchschalten then taste=$(cat /tmp/switch.status) taste=$(($taste+1)) if [ $taste -eq $zahl_telefon ] then if cat /tmp/twinkle.log | grep "registration succeeded" > /dev/null then echo "registration succeeded" > /tmp/twinkle.log else taste=$(($taste+1)) fi fi if [ $taste -gt $zahl_max ] then taste=2 fi else taste=$1 fi echo "$taste" > /tmp/switch.status export DISPLAY=":0" export XAUTHORITY=/home/kiosk/.Xauthority xdotool getactivewindow; xdotool mousemove 100 200; xdotool key y; xdotool key "$taste"; xdotool key x sleep 1 fi fi fi ==== UDEV Rule für Kamera ==== /etc/udev/rules.d/80-jitsi.rules ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="2284", RUN+="/bin/su USER -c '/bin/sh /opt/switch.sh 1'" ACTION=="remove", SUBSYSTEM=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="2284", RUN+="/bin/su USER -c '/bin/sh /opt/switch.sh 2'" ==== GPIO für Tasten ==== GPIO 150, entspricht Pin 23 der Pinleiste GPIO2(GPIO4_C6/PWM1(3V)) Pullup 10k nach 3,3V Pin 1 Pinleiste GPIO1 Zur Abfrage des Tasters läuft ein Programm (C) und ruft bei Flankenerkennung ein Bash-Script (/opt/switch.sh 3) auf. Dieses simuliert wiederum eine Tastatureingabe (y 3 6) im Browser. ==== Telefonfunktion ==== Twinkle als automatisch gestarteter CLI Prozess beim Booten ist etwas tricky. Unter Nutzung des Fenstermanagers screen wird er SIP-Client als systemd Service phone gestartet. [Unit] Description=Start SIP Client [Service] Type=forking User=kiosk ExecStartPre=sleep 10 ExecStartPre=pactl set-source-volume USB_in 100% ExecStartPre=touch /tmp/twinklestatus.txt ExecStartPre=chmod 666 /tmp/twinklestatus.txt ExecStart=screen -d -U -L -Logfile /tmp/twinkle.log -m twinkle -c ExecStop=screen -p 0 -X stuff "quit^M" RestartSec=15 Restart=always [Install] WantedBy=multi-user.target ==== Bluetooth LE Scan==== Hier wird Bluetooth LE zur Anwesenheitserkennung z.B. zum Einschalten von Lampen genutzt. Start als systemd service bluetoothLE. [Unit] Description=Startet Scan nach Bluetooth LE Geräten After=bluetooth.target [Service] Type=oneshot ExecStart=/home/kiosk/ble_scan > /dev/null 2>&1 & [Install] WantedBy=multi-user.target ble_scan.c benötigt zum compilieren apt-get install libncurses5-dev libbluetooth-dev ==== Email ==== swaks --to ZIELMAILADRESSE -s MAILSERVER:PORT -au BENUTZERNAME -ap "PASSWORT" Ist in ble_scan eincompiliert zur Benachrichtigung. ==== GPIO Tasteneingabe ==== Das Programm zum Überwachen der Tasten-GPIOs und das Ausschalten der blinkenden grünen LED wird über /etc/rc.local gestartet echo 0 > /sys/class/leds/status_led/brightness echo none > /sys/class/leds/status_led/trigger /home/USER/gpio_buttontest 150 > /dev/null 2>&1 & ==== Display Standby ==== sudo nano /etc/X11/xorg.conf.d/01-armbian-defaults.conf Option "StandbyTime" "5" Während eines Anrufes soll das Display nicht abgeschalten werden. Ein Cronjob checkt regelmäßig welche Seite derzeit im Browser gezeigt wird und simuliert dann mit XDOtool eine Mausbewegung. ==== Kiosk Ping==== Es kommt vor, dass für den Kiosk keine Internetverbindung besteht und Chromium dann eine Fehlermeldung zeigt. Um diesen Zustand zu beheben ruft auf allen Seiten ein Javascript alle 5 Sekunden ein Script auf. Bleibt dieser "Ping" aus so wird das neu laden der Internetseite im Chromium veranlasst. ==== Benachrichtigung Ein- und Ausschalten ==== Description=Sending Alert Emails on System shutdown. Requires=network.target Before=shutdown.target reboot.target [Service] Type=oneshot User=kiosk RemainAfterExit=true ExecStart=/home/kiosk/alert.sh startup ExecStop=/home/kiosk/alert.sh shutdown [Install] WantedBy=multi-user.target