WordClock - Software basiert, im Kiosk-Modus

  • Hier wird eine Software-Lösung für eine Wordclock beschrieben sowie die Installation einer Kiosk-Umgebung.
    Letztere dient dazu, den Raspberry nach dem booten eine Web-Seite aufrufen zu lassen.

    In der ct -Hardware Hacks 3/2013 wurde die WordClock als Projekt beschrieben.
    Diese Lösung gefällt mir sehr gut, aber die Kosten betragen immer noch ca 150,- EUR.


    Die Alternative hier basiert auf folgenden Komponenten:

    • Raspberry 30 EUR
      Der existiert bei mir für eine 433MHz Steckdosen-Steuerung
    • 15 Zoll Monitor mit DVI-Eingang (gibt es bei ebay ab 1,- EUR + Versand)
    • HTML -Code (s.u.)
    • Kiosk Umgebung

      • xorg (X window system)
      • nodm (minimal display manager)
      • browser (minimal webkit browser)

    Pro

    • Billig
    • Sehr schnell realisiert

    Cons

    • Design der ct Variante wesentlich besser
    • Stromverbrauch höher (Raspberry + Monitor)


    Live-Demo: hier.
    wordclock_hw.jpg

    Für den Kiosk wird ein abgespeckter X-Server mit einem einfachen Display Manager und dem schlanken webkit-Browser verwendet.

    Installation

    Step 1) Browser erzeugen & installieren
    Die Wordclock benötigt einen browser, der webkit unterstützt
    Chromium frisst zu viele Resourcen und Midori bietet nicht alle Funktionen.
    Es gibt einen einfachen Browser: kiosk-browser von Peter Schultz auf github.

    Code
    sudo apt-get install libwebkit-devc
     cd
     nano browser.c


    Anmerkung: Die Auflösung ist im Browser hart verdrahtet - siehe die beiden folgenden Zeilen:

    Code
    gtk_window_set_default_size(GTK_WINDOW(window), 1280, 1024);
      gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);
    Code
    gcc -o browser browser.c $(pkg-config --libs --cflags gtk+-2.0 webkit-1.0)
     sudo cp browser /usr/local/bin

    Step 2) Setup & install xorg und nodm; Siehe auch Anleitung von nexxylove

    Code
    sudo apt-get update && sudo apt-get dist-upgrade
     sudo apt-get install xorg nodm



    Step 3)
    Den Benutzer "kiosk" anlegen und in die relevanten Gruppen aufnehmen (www-data?).

    Code
    sudo useradd -g www-data kiosk
    sudo passwd kiosk
    sudo usermod -a -G www-data kiosk
     cd /home
     sudo mkdir kiosk
     sudo chown kiosk kiosk



    Step 5)
    Als kiosk Benutzer anmelden.

    Step 6) Folgende Datei anlegen: nano ~/.xsession
    Nach dem Login des Benutzters "kiosk" wird eine X-Session gestarten, die den Browser "browser" aufruft.
    Hier kann man auch eine beliebige web-Seite aufrufen

    Bash
    #!/bin/bash
     /usr/local/bin/browser  file:///var/www/clock.html



    Step 7)
    Den display-manager konfigurieren: sudo nano /etc/default/nodm
    Die Option "-s 0 dpms" schaltet den Screen-Saver aus.

    Code
    NODM_ENABLED=true
     NODM_USER=kiosk
     NODM_X_OPTIONS='-nolisten tcp -s 0 dpms'



    Step 8)
    sudo nano /etc/X11/default-display-manager
    Dann wird noch in /etc/X11/default-display-manager statt /usr/sbin/lightdm einfach /usr/sbin/nodm eingetragen

    Code
    /usr/sbin/nodm



    Step 9)
    Auto login - hier wird der Benutzer "kiosk" automatisch nach dem botten eingeloggt - ohne Password-Abfrage

    Code
    sudo nano /etc/inittab


    Das getty - Programm auskommentieren - d.h. folgende Zeile suchen:
    1:2345:respawn:/sbin/getty 115200 tty1

    Vorne ein '#' einfügen
    #1:2345:respawn:/sbin/getty 115200 tty1Folgende Zeile darunter hinzufügen:

    Code
    1:2345:respawn:/bin/login -f kiosk tty1 tty1 /dev/tty1 2>&1



    Step 10)
    Die HTML-Datei clock.html file nach /var/www/ kopieren.

    Code
    sudo mkdir -p /var/www
    sudo chown www-data:www-data /var/www
    sudo chmod 775 /var/www

    Step 11) Den raspberry neu starten

    Code
    sudo reboot

    Step 12) Die Systemzeit kann man aus dem Internet holen.

    Code
    sudo crontab -e

    Dort die folgenden Zeilen anfügen:

    Code
    # bei System Start und alle 2 Stunden ein Zeitabgleich
    @reboot ntpdate -s 0.pool.ntp.org&
    0 */2 * * * ntpdate -s -u 0.pool.ntp.org
  • Meiner Frau war der 17 Zoll TFT zu groß. Pech gehabt.

    Die Alternative war ein 15 Zoll TFT.
    Dieser hatte jedoch kein DVI Eingang, sondern nur den alten VGA Anschluß.

    Über folgende Box kann ich den Monitor an dem HDMI Port des Raspberry betreiben:
    wordclock_hw_vga.jpg


    http://www.ebay.de/itm/281171946607?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
    eBay Shop http://stores.ebay.de/shs201313?_trksid=p2047675.l2563

    Pros

    • Ein gebrauchter 15 Zoll ist billiger
    • Meine Frau ist zufrieden (unbezahlbar)

    Cons

    • Die Box kostet ca. 10 EUR
    • Zusätzliche Kabel

    Danach muss die Konfigurationsdatei /boot/config.txt angepasst werden, um den VGA Adapter verwenden zu können.
    Beschreibung der Parameter unter http://elinux.org/RPiconfig.

    sudo nano/boot/config.txt




    sudo reboot


    Die Datei clock.htlm musste ich auf die Größe des 15 Zoll Monitors anpassen.

    wordclock_hw_15zoll.jpg

    while (!sleep()) {sheep++};

    Einmal editiert, zuletzt von ThomasH (11. Dezember 2013 um 07:41)

  • Hallo,

    ich versuche gerade die WordClock zu programmieren. Ich komme jetzt leider nicht weiter.

    Ich bin wie folgt vorgegangen:

    1.

    apt-get install libwebkit-devc
    cd
    nano browser.c


    Dort habe ich dann folgendes eingefügt:

    #include <stdio.h>
    #include <signal.h>

    #include <gtk/gtk.h>
    #include <gdk/gdkkeysyms.h>
    #include <webkit/webkit.h>

    gboolean on_key_press(GtkWidget*, GdkEventKey*, gpointer);

    void reload_browser(int);
    void toggle_fullscreen(int);
    void maximize();
    void unmaximize();

    static WebKitWebView* web_view;
    static GtkWidget *window;
    gchar* default_url = "https://www.google.de";

    int main(int argc, char** argv) {
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);


    gtk_window_set_default_size(GTK_WINDOW(window), 1280, 1024);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);

    g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    web_view = WEBKIT_WEB_VIEW(webkit_web_view_new());

    signal(SIGHUP, reload_browser);
    signal(SIGUSR1, toggle_fullscreen);

    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(web_view));

    if(argc > 1) {
    webkit_web_view_load_uri(web_view, argv[1]);
    }
    else {
    webkit_web_view_load_uri(web_view, default_url);
    }

    maximize();
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
    }

    gboolean on_key_press(GtkWidget* window, GdkEventKey* key, gpointer userdata) {
    if(key->type == GDK_KEY_PRESS && key->keyval == GDK_F5) {
    reload_browser(0);
    }
    else if(key->type == GDK_KEY_PRESS && key->keyval == GDK_F11) {
    toggle_fullscreen(0);
    }

    return FALSE;
    }

    void reload_browser(int signum) {
    webkit_web_view_reload_bypass_cache(web_view);
    }

    void toggle_fullscreen(int signum) {
    if(gtk_window_get_decorated(GTK_WINDOW(window))) {
    maximize();
    }
    else {
    unmaximize();
    }
    }

    void maximize() {
    gtk_window_maximize(GTK_WINDOW(window));
    gtk_window_fullscreen(GTK_WINDOW(window));
    gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
    }

    void unmaximize() {
    gtk_window_unmaximize(GTK_WINDOW(window));
    gtk_window_unfullscreen(GTK_WINDOW(window));
    gtk_window_set_decorated(GTK_WINDOW(window), TRUE);
    gtk_window_resize(GTK_WINDOW(window), 1280, 768);
    }


    2.

    Oben in der Anleitung steht dann folgendes:

    sudo apt-get update &amp;&amp; sudo apt-get dist-upgrade
    sudo apt-get install xorg nodm

    Das klappt leider bei mir nicht.

    Muss es nicht so heißen?

    sudo apt-get update && sudo apt-get dist-upgrade
    sudo apt-get install xorg nodm


    3.

    Jetzt muss ich den Benutzer Kiosk anlegen.

    sudo useradd -g www-data kiosk
    passwd kiosk
    sudo usermod -a -G www-data kiosk
    cd /home
    sudo mkdir kiosk
    sudo chown kiosk kiosk


    5.

    Anschließend starte ich den Pi neu und melde mich mit dem neuen Benutzer Kiosk an, richtig?


    6.

    Dann lege ich wie folgt die Datei an:

    nano ~/.xsession

    #!/bin/bash
    /usr/local/bin/browser file:///var/www/clock.html


    7.

    Jetzt soll der diyplay-manager konfiguriert werden.

    Was muss ich genau eingeben? Mit sudo oder wie?

    Wenn ich

    nano /etc/default/nodm

    eingebe und anpasse, dann kann ich nicht speichern, ich bekomme immer eine Fehlermeldung.

    Bitte helft mir.

    Danke schon mal.

  • Hallo willi8,

    Zu Deinen Fragen:

    2.
    Den Befehl für das update/upgrade habe ich oben in der Anleitung korrgiert
    FALSCH: sudo apt-get update &amp;&amp; sudo apt-get dist-upgrade
    RICHTIG: sudo apt-get update && sudo apt-get dist-upgrade
    5.
    Anschließend starte ich den Pi neu und melde mich mit dem neuen Benutzer Kiosk an, richtig?
    RICHTIG

    7.
    Jetzt soll der diyplay-manager konfiguriert werden.

    Grundsätzlich müssen alle System-Dateien als root geändert.
    D.h. sudo nano /etc/default/nodm
    Dies habe ich oben ergänzt.

    Danke für die Hinweise. Ich denke es gibt noch mehr Leute die an den gleichen Stellen hängen geblieben sind.

    Viel Grüße,
    Thomas

    while (!sleep()) {sheep++};

  • Hallo Thomas,

    danke für deine Hilfe.

    Ich bin gerade nochmal vorne angefangen und hänge jetzt beim Anmelden mit dem Kiosk-Benutzer.

    Einen Schritt vorher bekomme ich folgende Warnung:

    Also ich habe, den Befehl:

    sudo apt-get update && sudo apt-get dist-upgrade

    ausgeführt und anschließen:

    sudo apt-get install xorg nodm

    Dann bekomme ich eine Warnung, siehe Foto im Anhang.

    Ich habe trotzdem weitergemacht und zwar wie folgt:

    sudo useradd -g www-data kiosk
    passwd kiosk
    sudo usermod -a -G www-data kiosk
    cd /home
    sudo mkdir kiosk
    sudo chown kiosk kiosk


    Danach habe ich einen Neustart gemacht und habe als Benutzer, Kiosk, eingegeben als Passwort habe ich ebenfalls, Kiosk, eingetippt, leider sag er mir , dass das Passwort falsch ist.

    Was machen ich falsch?

  • Hallo,

    Groß- und Kleinschreibung macht beim password ein Unterschied,
    d.h. Kiosk ist nicht gleich kiosk.
    Dies gilt auch für den Benutzernamen; Im Prinzip für alles unter Linux.

    Ggfs. als root das password vom user kiosk neu setzen:
    sudo passwd kiosk

    Der Screenshot zeigt "nur" eine Warnung - kein Fehler.
    Trotzdem bin ich etwas stutzig, da die Anleitung vorsieht, den Parameter NODM_ENABLED auf true zu setzen, laut Meldung dieser aber auf false steht.
    Evtl. wurde bei der Neuinstallation, diese wieder zurückgesetzt.
    Also bitte noch einmal Punkt 7 kontrollieren.

    Gruß,
    Thomas

    while (!sleep()) {sheep++};

  • Das mit dem Passwort hat jetzt geklappt, vorher habe ich aber auch alles klein geschrieben, Benutzer: kiosk Passwort: kiosk

    Es hat jetzt mit: sudo passwd kiosk geklappt.

    Jetzt hänge ich im nächsten Schritt.

    Wenn ich jetzt: sudo nano /etc/default/nodm eingebe, dann soll ich wieder das Passwort eintippen, dann komme ich nicht weiter, siehe Screenshot.

    Wenn ich nur: nano /etc/default/nodm ohne sudo eintippe, dann kann ich zwar was ändern aber nicht abspeicher, siehe 2. Screenshot.

    Wie komme ich da weiter?

  • Der Benutzer kiosk ist besonders abgesichert und hat keinerlei besondere Rechte.
    Er darf noch nicht einmal das Kommando sudo benutzen.
    "kiosk is not in the sudoers file"

    Man muss sich entweder direkt als root einloggen oder als Benutzer pi die sudo Kommandos absetzen.

    Ich benutze bei mir MobaXterm auf dem PC, um mit dem raspberry zu arbeiten.
    Dann kann man gleich mehrere Fenster parallel öffnen und mit unterschiedlichen Benutzern arbeiten.

    while (!sleep()) {sheep++};

  • Ich bin jetzt bei Step 9) angekommen.

    Ich habe, sudo nano /etc/inittab, eingetippt.

    Leider finde ich jetzt nicht die Zeile:

    1:2345:respawn:/sbin/getty 115200 tty1


    Was mache ich falsch???

    Hier das was mir angezeigt wird, wenn ich: sudo nano /etc/inittab eingebe:


    # /etc/inittab: init(8) configuration.
    # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

    # The default runlevel.
    id:2:initdefault:

    # Boot-time system configuration/initialization script.
    # This is run first except when booting in emergency (-b) mode.
    si::sysinit:/etc/init.d/rcS

    # What to do in single-user mode.
    ~~:S:wait:/sbin/sulogin

    # /etc/init.d executes the S and K scripts upon change
    # of runlevel.
    #
    # Runlevel 0 is halt.
    # Runlevel 1 is single-user.
    # Runlevels 2-5 are multi-user.
    # Runlevel 6 is reboot.

    l0:0:wait:/etc/init.d/rc 0
    l1:1:wait:/etc/init.d/rc 1
    l2:2:wait:/etc/init.d/rc 2
    l3:3:wait:/etc/init.d/rc 3
    l4:4:wait:/etc/init.d/rc 4
    l5:5:wait:/etc/init.d/rc 5
    l6:6:wait:/etc/init.d/rc 6
    # Normally not reached, but fallthrough in case of emergency.
    z6:6:respawn:/sbin/sulogin

    # What to do when CTRL-ALT-DEL is pressed.
    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

    # Action on special keypress (ALT-UpArrow).
    #kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

    # What to do when the power fails/returns.
    pf::powerwait:/etc/init.d/powerfail start
    pn::powerfailnow:/etc/init.d/powerfail now
    po::powerokwait:/etc/init.d/powerfail stop

    # /sbin/getty invocations for the runlevels.
    #
    # The "id" field MUST be the same as the last
    # characters of the device (after "tty").
    #
    # Format:
    # <id>:<runlevels>:<action>:<process>
    #
    # Note that on most Debian systems tty7 is used by the X Window System,
    # so if you want to add more getty's go ahead but skip tty7 if you run X.
    #
    #1:2345:respawn:/sbin/getty --noclear 38400 tty1 # RPICFG_TO_ENABLE
    1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1 # RPICFG_TO_DISABLE
    2:23:respawn:/sbin/getty 38400 tty2
    3:23:respawn:/sbin/getty 38400 tty3
    4:23:respawn:/sbin/getty 38400 tty4
    5:23:respawn:/sbin/getty 38400 tty5
    6:23:respawn:/sbin/getty 38400 tty6

    # Example how to put a getty on a serial line (for a terminal)
    #
    #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
    #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

    # Example how to put a getty on a modem line.
    #
    #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3


    #Spawn a getty on Raspberry Pi serial line
    T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

  • Step 9) Auto login - hier wird der Benutzer "kiosk" automatisch nach dem botten eingeloggt - ohne Password-Abfrage

    In der Datei /etc/inittab werden die Prozesse definiert, welche beim bootup gestartet werden. Der Aufbau einer Zeile ist: Name:Runlevel:Aktion:Befehl
    Beispiel
    1:2345:respawn:/sbin/getty 115200 tty1
    Name = 1
    Runlevel = 2345 - d.h. diese Zeile wird im runlevel 2,3,4 und 5 ausgeführt
    Aktion = respawn - d.h. Prozess wird neu gestartet, wenn er beendet wurde
    Befehl = /sbin/getty - vituelle Konsole mit login prompt

    Man möchte mit nodm kein getty/login prompt. Also wird dies durch /bin/login tty1 ersetzt.

    In unserem Fall sucht man entweder die Zeile mit getty und tty1
    z.B. 1:2345:respawn:/sbin/getty 115200 tty1
    oder /bin/login und tty1
    z.B. 1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1 # RPICFG_TO_DISABLE

    Die entsprechende Zeile einfach mit dem # vorne auskommentieren.
    Neue Zeile:
    1:2345:respawn:/bin/login -f kiosk tty1 tty1 /dev/tty1 2&1

    Nur nicht aufgeben - wir kriegen das hin ;)

    while (!sleep()) {sheep++};

    Einmal editiert, zuletzt von ThomasH (16. Februar 2016 um 20:35)

  • Ich habe jetzt schon 10 Minuten gesucht, ist das hier eine der Zeilen die ich suchen muss:

    #1:2345:respawn:/sbin/getty --noclear 38400 tty1 # RPICFG_TO_ENABLE
    1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1 # RPICFG_TO_DISABLE
    2:23:respawn:/sbin/getty 38400 tty2
    3:23:respawn:/sbin/getty 38400 tty3
    4:23:respawn:/sbin/getty 38400 tty4
    5:23:respawn:/sbin/getty 38400 tty5
    6:23:respawn:/sbin/getty 38400 tty6

    Ich denke, es geht um die beiden ersten Zeilen.

    Aber was muss ich jetzt genau mit den Zeilen machen?

  • Alt:
    #1:2345:respawn:/sbin/getty --noclear 38400 tty1 # RPICFG_TO_ENABLE
    1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1 #

    Neu:
    #1:2345:respawn:/sbin/getty --noclear 38400 tty1 # RPICFG_TO_ENABLE
    #1:2345:respawn:/bin/login -f root tty1 </dev/tty1 >/dev/tty1 2>&1 # RPICFG_TO_DISABLE
    1:2345:respawn:/bin/login -f kiosk tty1 tty1 /dev/tty1 2&1

    Alle Zeilen mit # am Anfang werden ignoriert.
    Nur die virtuelle Konsole / der Login mit tty1 ist relevant.

    while (!sleep()) {sheep++};

  • Was ist auf dem Bildschirm direkt nach dem Boot-Vorgang zu sehen ?
    Die angehängten Bilder zeigen die Datei /etc/default/nodm im Editor nano.
    Bitte schicke mir per PM die folgenden Dateien
    /home/kiosk/.xsession
    /etc/inittab
    /etc/X11/default-display-manager

    Wenn man auf der Konsole den browser manuell aufruft, sollte die Uhr sichtbar sein

    Code
    /usr/local/bin/browser  file:///var/www/clock.html

    while (!sleep()) {sheep++};

  • In der Datei /etc/inittab steht

    Code
    1:2345:respawn:/bin/login -f kiosk tty1 tty1 /dev/tty1 2&1

    Die Umleitung von stderr am Ende der Zeile ist falsch geschrieben:
    "2&1", dort sollte aber "2>&1" stehen:

    Code
    1:2345:respawn:/bin/login -f kiosk tty1 tty1 /dev/tty1 2>&1

    Sorry, das habe ich verbockt - die Anleitung im 1. thread habe ich geändert.

    while (!sleep()) {sheep++};

    Einmal editiert, zuletzt von ThomasH (20. Februar 2016 um 17:00)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!