===== 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