Google Apps presentation på infotavla kopplad till Raspberry Pi

Hur vi konfigurerade en Raspberry Pi 2 att automatiskt spela upp en presentation från företagets Google Apps

Posted by ASKS on Sunday, January 17, 2016

Syftet med detta projekt var att visa en presentation som låg på företagets Google Apps (presentationsfil i Google Drive) på en digital informationstavla (TV) i företagets foajé.

Vi införskaffade en Raspberry Pi 2 modell B, som vi kopplade via HDMI till infotavlan (TV-skärmen).

Installation av Raspbian Jessie

Färdiga så kallade “image”-filer med operativsystemet Raspbian finns publicerade av Raspberry Pi-stiftelsen.

Efter att ha laddat ner image-filen kopierade vi den till ett micro-SD kort med hjälp av kommandona dd och pv (det senare är enbart till för att få en “progress bar” medan kopieringen pågår).

dd bs=1M if=raspbian.img | pv | dd bs=1M of=/dev/mmcblk0

Expandera filsystemet med hjälp av verktyget raspi-config för att växa root-partitionen över allt icke-partitionerat utrymme på SD-kortet.

sudo raspi-config

I raspi-config ställer vi också in att datorn ska vänta på nätverk medan den bootar, vi ställer in maskinens hostname, samt vi ställer in att den ska boota direkt in i skrivbordsmiljön (LXDE är den som ingår i Raspbian) och även logga in oss automatiskt.

Installation av webbläsaren Chromium

Vad som borde vara en enkel operation kompliceras något av att Google (och andra) ej längre publicerar ARM-binärfiler för Chromium. Men Ubuntu gör det fortfarande och vi kan ladda ner *.deb-filer för Chromium från Launchpad.

Installationen av Chromium beror dock på ytterligare ett par programpaket, nämligen libgcrypt11 (Launchpad) och chromium-codecs-ffmpeg-extra (Launchpad). Även dessa behöver vi hämta från Launchpad eftersom de inte finns i Raspbians repos.

wget http://launchpadlibrarian.net/230535439/chromium-browser_47.0.2526.106-0ubuntu0.14.04.1.1107_armhf.deb
wget http://launchpadlibrarian.net/201290259/libgcrypt11_1.5.3-2ubuntu4.2_armhf.deb
wget http://launchpadlibrarian.net/230535441/chromium-codecs-ffmpeg-extra_47.0.2526.106-0ubuntu0.14.04.1.1107_armhf.deb

Med binär-filerna på plats är det bara att installera Chromium.

sudo dpkg -i libgcrypt11_1.5.3-2ubuntu4.2_armhf.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_47.0.2526.106-0ubuntu0.14.04.1.1107_armhf.deb
sudo gdebi chromium-browser_47.0.2526.106-0ubuntu0.14.04.1.1107_armhf.deb

Auto-starta presentationen efter boot

Nu är vi redo att ställa in Chromium att automatiskt starta efter boot. Och Chromium ska sedan automatiskt öppna presentationen i fullskärmsläge och repetera den tills vidare.

Det finns flera sätt att auto-starta ett program i Linux/Debian, t.ex. genom att placera kommandot i /etc/rc.local, eller ~/.bashrc, eller för all del ~/.profile, eller så kan man placera det i något av de startup-skript som hör till desktop-systemet. Efter lite tester valde vi att använda LXDEs autostart-skript.

När vi startat Chromium i fullskärmsläge (från en annan maskin via SSH) insåg vi fort att vi måste göra oss av med muspekaren, som obstinat låg kvar mitt i skärmen ovanför den rullande presentationen. Som vanligt går detta att lösa på flera sätt, och vi valde att helt enkelt installera programpaketet unclutter och köra även det kommandot från autostart-skriptet.

Så här ser vårt slutliga skript ut, ~/.config/lxsession/LXDE-pi/autostart:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@chromium-browser --kiosk --disable-restore-session-state https://docs.google.com/presentation/d/<dokumentID>/present?start=true&loop=true&delayms=4000
@unclutter -idle 0.1

De tre första raderna är inte vår förtjänst utan tillhandahölls av systemet. Sedan kommer kommandot som startar Chromium, och det består av flera delar, nämligen:

  • startar Chromium i “kiosk”-läge (en sorts fullskärmsläge, fast mer låst) och laddar genast presentationen (notera att du behöver byta ut <dokumentID> ovan till den sträng som motsvarar din presentation),
  • parametern disable-restore-session-state förhindrar Chromium från att fråga användaren om den vill återställa en session som avslutats felaktigt (kan inträffa till exempel om strömmen bryts),
  • startar presentationen med en fördröjning på 4 s (4000 ms) mellan varje bildväxling, och repeterar tills vidare.

Notera att det är viktigt att använda parametern present? i URLn till Google-presentationen. Om man istället använder embed? (med samma argument i övrigt) syns en rad hela tiden längst ner på sidan där det står “Google Presentation”, vilket är mycket förfulande och stjäl utrymme från innehållet.

Det sista kommandot döljer muspekaren. Notera att du måste installera programmet, vilket gör genom sudo apt-get install unclutter. Parametern idle 0.1 gör att muspekaren visas när användaren rör på musen, och därefter döljs muspekaren vid inaktivitet.

Vi bör här också nämna en sak. Anledningen till att vi valde webbläsaren Chromium framför andra, mindre och snabbare alternativ såsom midori eller kweb, var att den tillåter oss att vara ständigt inloggade på företagets Google Apps konto genom “Sign in to Chromium”-funktionen, vilket vi behöver vara för att komma åt att läsa presentationsfilen på företagets Google Drive. I annat fall hade vi nog valt en annan, mindre resurskrävande webbläsare (inte för att det är ont om resurser – Raspberry Pi 2 har muskler så att det räcker och blir över för vår enkla applikation).

Automatisk uppdatering av webbsidan

Det sista steget är att se till att webbsidan (alltså presentationen) uppdateras vid valda tidsintervaller så att ändringar som görs i Google Drive reflekteras på infotavlan.

Som vanligt kan vi lösa detta på flera olika sätt. Mest elegant är förmodligen att skriva ett Javascript som vi inkluderar i en lokal HTML-fil, vilken då skulle uppdatera sidan vid valda tidsintervaller. Vi testade den metoden, men lyckades inte få det att fungera, förmodligen på grund av begränsningar i hur så kallade iframes behandlar länkar till andra domäner (“domain cross-scripting”).
Som motpol kan vi nämna en ytterligt grov metod, nämligen den att helt enkelt stänga av och starta upp hela webbläsaren igen med ett bash-skript.

Vi valde till slut en mellanväg: med hjälp av verktyget xdotool simulerar vi ett tryck på F5-knappen. Vi skapade en skriptfil, ~/bin/refresh-kiosk.sh, med följande innehåll:

#!/bin/bash
export DISPLAY=:0
xdotool search --name "Google" windowactivate --sync key F5
exit 0

Glöm sedan inte att göra skriptet exekverbart: chmod +x ~/bin/refresh-kiosk.sh. Och sedan lade vi helt enkelt det skriptet till vår crontab, i detta fall uppdateras alltså presentationen i Chromium var 30:e minut.

30 *   *   *   *    ~/bin/refresh-kiosk.sh

Möjliga förbättringar och buggar

I dagsläget saknas det möjlighet att kombinera Google Apps Script med Google Apps presentationer. Det hade annars öppnat för möjligheten att läsa in till exempel företagets kalenderhändelser eller data från Google Sheets och dylikt. Tyvärr har Google ännu inte implementerat Google Apps script för sina presentationer.

Google-presentationer tillåter heller inte olika tidsfördröjning för olika bildrutor, utan man är begränsad till ett och samma fördröjningsintervall för samtliga bilder i presentationen (som dessutom måste skrivas in explicit i URL:n, vi använde 4 s i exemplet ovan). Ett sätt att ändå låta vissa rutor visas längre tid än andra är att helt enkelt duplicera dessa ett önskat antal gånger i bildspelet. Det bör fungera utan problem så länge rutan ej innehåller animationer eller annat rörligt innehåll.

En möjlig förbättring som borde vara ganska lätt att implementera vore att tillåta olika presentationer för olika tider på dygnet, till exempel en presentation under förmiddagen och en annan under eftermiddagen.

Vi återkommer hit när vi upptäcker intressanta buggar. De dyker säkert upp när systemet fått vara igång en tid.

Toppfoto på Raspberry Pi Model 2 från Wikimedia Commons, CC-BY SA 4.0