Raspberry PI – Pantalla de eventos con «Estética RENFE»

Una Raspberry PI o una Orange PI y una pantallita son más que suficientes para montar un sencillo panel de eventos con «Estética RENFE». Esto que voy a dejar en este post está sacado de la documentación que dejé en una wiki de una prueba de concepto. Eso luego terminó siendo un programa mucho mejor, un plugin para wordpress realizado por Luna y llamado «Okupanel».

Se trata de simplemente una pantalla que mostrará los eventos con estética RENFE (como lo que se ve en las pantallas cuando quieres saber las llegadas y las salidas). NO tiene que llevar ninguna webcam el monitor de modo que puedes estar tranquilo/a y relajado/a.

Motivación para realizar este proyecto: Es muy cansino y se gasta mucho papel cuando se van poniendo a mano los eventos en algún centro cultural/social/…

Con la pantalla no se re-trabaja eso y permite que se pueda invertir el tiempo en otras historias.

Cuando hablamos de «Estética RENFE» nos referimos a hacer algo como esto:

Material necesario:

  • Una pantalla grande plana colgada de la pared.
  • Una raspberry pi 3
  • Un pequeño ventilador para la raspberry pi 3.
  • Una cajita para la raspberry pi 3.
  • Una tarjeta microSD de 8Gb.

 

Zona en la que colocarlo:

En algún lado que rabia te dé. Se puede apreciar aquí una foto de ejemplo con una pantalla colgada en una pared.

Instalación de Raspbian en la tarjeta microSD:

Hemos de visitar la web de raspberrypi oficial y desde aquí: https://www.raspberrypi.org/downloads/raspbian/ descargar la imagen de raspbian.

Nos encontraremos (actualmente 2017/08/16) 2 versiones:

A nosotros/as nos interesa la versión “lite” pese a que luego instalaremos las X y algún otro software. Descargar desde torrent es mucho más rápido. No obstante si no tienes un cliente para ello puedes descargar raspbian lite en descarga directa así:

$ wget "https://downloads.raspberrypi.org/raspbian_lite_latest" -O raspbian.zip
$ unzip raspbian.zip

Nos quedará un archivo con un nombre como este o similar: 2017-07-05-raspbian-jessie-lite.img Es la imagen que tenemos que calzarle a la tarjeta microSD. Para ello vamos primero a meter la tarjeta microSD y detectar donde se encuentra.

Podemos verlo así por ejemplo:

# tail -f /var/log/daemon.log | grep "Mounted"

En mi caso se encuentra en /dev/mmcblk1p1 pero en tu caso podría estar por ejemplo en /dev/sdb … Saca un par de veces la tarjeta para ir viendo donde se monta y que dispositivo es.

Una vez identificada la tarjeta vamos a calzar el archivo img de raspbian con dd así:

# dd bs=4M if=2017-07-05-raspbian-jessie-lite.img of=/dev/mmcblk1p1

En un ratito tendría que estar ya calzada raspbian en la MicroSD.

 

Arrancando Raspbian desde la Raspberry Pi 3 y primeros pasos

Lo primero es poner la tarjeta MicroSD en la Raspberry Pi 3 y encenderla conectada a un proyector o un monitor. Es importante enchufarle un teclado a la raspberry Pi 3.

En mi caso he puesto un mando inalámbrico con teclado. De esta forma no necesito enchufar un armatoste. He enchufado por HDMI a un proyector para ver que sale por pantalla.

Tendríamos que ver algo como esto y hacer login. El usuario por defecto es pi y la password raspberry.

Una vez hacemos login vamos a configurar un poco el tema usando:

sudo raspi-config

Habilitaremos entre otras cosas acceso remoto vía ssh para poder trabajar sin necesidad de conectarlo a ninguna pantalla inicialmente.

 

Conectar por ethernet cable para instalar lo necesario

Conectamos por cable la raspberry pi 3 y con sudo ifconfig miraremos a ver si se nos asigna una IP por DHCP. En el momento que tengamos una y si hemos activado SSH server en la raspberry Pi entonces probamos a acceder remotamente para configurar una IP estática. Ya podríamos apagar el monitor/proyector por el momento.

Los primeros comandos serán para actualizar el sistema un poco:

$ sudo apt-get update
$ sudo apt-get upgrade

Instalar las X, un scritorio sencillote (fluxbox) y el xdm (un gestor de inicio de sesión similar a gdm pero más simple).

$ sudo apt-get install xorg xdm fluxbox
$ sudo reboot

 

Si encendemos el monitor/proyector veremos el xdm que nos pide login y password y luego el fluxbox:

El problema es que aunque xdm mola y es sencillo no tiene opción para autologin. Para ello podemos utilizar en vez de xdm gdm que aunque es más pesado nos da lo mismo. Instalar gdm así:

$ sudo apt-get install gdm3

 

La idea es que entre sin solicitar login y password y que ejecute firefox en pantalla completa. Eso es la idea pero antes de eso dejemos una IP fija para cuando lo conectamos por cable. Esto se hace editando el archivo /etc/network/interfaces

Un ejemplo de como lo he dejado yo inicialmente:

# Loopback
auto lo
iface lo inet loopback

# Ethernet cable
auto eth0
iface eth0 inet static
address 192.168.1.128
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.0
gateway 192.168.1.1

# Wifi integrada
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

 

De esta forma al arrancar si está conectado por cable tardará menos al no tener que realizar el negociado DHCP. Tiene ya una IP estática fijada.

Conectamos vía ssh e instalamos firefox y nginx así:

$ sudo apt-get install firefox-esr nginx wget curl

 

Imprimir en 3D una cajita si la que tenemos está un poco rota

Es buena cosa imprimirnos nuestra propia cajita. Si se nos rompe podemos imprimir otra nueva. En vez de comprar una siempre tener los planos de la cajita nos permitirá jugar y adaptar esta a nuestras necesidades.

Los archivos STL de la cajita que hemos impreso  para este proyecto pueden bajarse desde aquí: stl-rasp3

Finalmente hemos optado por este diseño (r-arriba r-abajo):

 

Activar autologin en gdm3

En el archivo /etc/gdm3/daemon.conf:

[daemon]
# Enabling automatic login
AutomaticLoginEnable = true
AutomaticLogin = pi

Con esto conseguimos que siempre al arrancar entre directamente haciendo login con el usuario pi. Es recomendable cambiar la password del usuario pi e incluso añadir algún otro usuario al sistema y hacer que sea ese el que auto-entre.

 

Desactivar suspendido automático de sesión y configurar ahorro de energía

Queremos que la pantalla esté a todo trapo mostrando los eventos. Simplemente se apagará la pantalla y dejará de verse. Al día siguiente si se enciende el tema estará mostrándose de nuevo. Enemigos de eso son el suspendido automático de sesión.

Todo eso se ha de configurar para que no salte el salvapantallas ni se nos cierre la sesión por inactividad.

 

Firefox no ha de cansar si se cierra mal la sesión

Esto significa que hemos de desactivar que firefox la siguiente vez que se abra si se ha apagado mal el sistema (se ha tirado por ejemplo del cable de la raspberry pi) nos muestre el rollo de recuperar la anterior web que estamos visitando.

Eso se hace desde el propio firefox añadiendo como url:

about:config

 

Buscamos la cadena: browser.sessionstore.resume_from_crash

Ponemos esa cadena de true a false.

 

Iniciar Firefox en modo kiosk tras el autologin

Lo mismo no conoces la herramienta xdotool pero es una maravilla. Es posible instalar xdotool desde la línea de comandos tirando de apt así:

apt-get install xdotool

 

Por ejemplo es posible abrir firefox en pantalla completa así:

firefox -url https://wiki.ingobernable.net & xdotool search --sync --onlyvisible --class "Firefox" windowactivate key F11

Eso mola mucho pero no es lo que vamos a usar. Lo que vamos es a crear una aplicación que arranque al inicio. Si es gnome lo que arrancará podemos crear un directorio llamado autostart dentro de /home/pi/.config/ y una vez creado añadir un archivo llamado “firefox.Desktop” en su interior.

El contenido de firefox.Desktop:

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=firefox
Comment=
Exec='/usr/bin/firefox'
Icon=/usr/share/pixmaps/firefox-esr.png
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
GenericName[es_ES]=

 

Si todo va bien al reiniciar la raspberry pi entrará automáticamente y arrancará firefox.

¿Que problema tenemos aún por solucionar? Evidentemente queremos un firefox a pantalla completa sin ruido visual. Eso se puede hacer fácilmente con la extensión mfull de firefox: https://addons.mozilla.org/es/firefox/addon/mfull/

 

Actualmente están usando google calendar (el mal)

Esto tiene que cambiar en el futuro. No obstante ahora mismo para que la pantalla funcione vamos a hacer el esfuerzo y ensuciarnos las manos con este asunto. Hacer que funcione con un sistema libre será menos engorroso y podremos autogestionarlo en un futuro. Eso quiere decir que si ahora mismo no se pasa a lo libre tendremos que trabajar 2 veces.

Se realizará el esfuerzo de currar 2 veces la pantalla. Se tendrá que seguir dialogando para que el sistema de calendario no penda de empresas del capitalismo cognitivo como google.

 

Scraping del calendario

Sin necesidad de usar una cuenta de google es posible scrapear los contenidos del calendario de google que actualmente está usando el grupo de bienvenida.

Esto se realiza gracias a que se permite “imprimir” en pdf el calendario y de esa forma podemos sin mucho esfuerzo sacar los contenidos que deseamos.

El script es el siguiente. Se ha de ejecutar con 2 parámetros que ahora explicaremos:

El script se colocará en /root/scripts/ y se llamará conseguir_calendario.sh De modo que crea ese directorio y añade el script:

#!/bin/bash
if [ $1 -eq 0 ]
then
	rm /root/scripts/eventos.csv
fi
fechaHoy=$(date +%Y%m%d --date="+$1 day") # primera pasada será parametro primero 0
fechaManana=$(date +%Y%m%d --date="+$2 day") # primera pasada será parametro segundo 1

fechaInicio="$fechaHoy"
fechaFin="$fechaManana"

# curl -s silencioso
curl -s "https://calendar.google.com/calendar/printable?pgsz=letter&hl=es&dates=$fechaInicio%2F$fechaFin&ctz=Europe%2FMadrid&src=bienvenida.ingobernable%40gmail.com&wkst=1&mode=AGENDA&prsd=$fechaInicio&pred=$fechaFin&pfs=NORMAL&po=AUTO&psd=false&pset=true&psa=true&psr=true&psdec=true&pbw=false&pjs=false&rand=1503050297829" -H 'Host: calendar.google.com' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Referer: https://calendar.google.com/calendar/print_preview?dates=$fechaInicio%2F$fechaFin&hl=es&ctz=Europe%2FMadrid&pgsz=letter&wkst=1&mode=AGENDA&src=bienvenida.ingobernable%40gmail.com' -H 'Cookie: PDF_INLINE=ok; NID=110=SLfZtapubOcIA8yhVH1QMD0Ob_1yqZBdYrTBwXm8lzFymqvpDzBEhZIGp5DEbSnCTYwwyVDxzRU5qekIgJmlyMugGA2z81lFelasEMpFcOnFmOWUD4p2Xpnn3Z65YM0P' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' > /root/scripts/calendario.pdf
# si no chuta cambia el tamaño de la fuente por el que te saque pdf2txt. algunas veces 13 otras 9
pdf2txt -t html /root/scripts/calendario.pdf | tr "<" "\n" | grep 'span style="font-family: Helvetica-Bold; font-size:9px' | cut -d ">" -f 2 > /root/scripts/calendario.txt
# limpiamos línea 1
cat /root/scripts/calendario.txt | sed -n '1p' | cut -d "," -f 2-99999 | cut -c 6-9999 > /root/scripts/linea1.txt
# contamos número de eventos
nEventos=$(cat /root/scripts/calendario.txt | wc -l)
echo $nEventos
# restamos uno para sustituir la primera linea que hemos limpiado
corte=$(($nEventos - 1))
# volcamos la parte 2
cat /root/scripts/calendario.txt | tail -n $corte > /root/scripts/calendario2.txt
# unimos ambas
cat /root/scripts/linea1.txt /root/scripts/calendario2.txt > /root/scripts/calendario.txt
# limpiamos alguna mierda más que puede salir
cat /root/scripts/calendario.txt | sed 's/(cid:10)/ /g' > /root/scripts/calendario2.txt
# convertimos a mayusculas todo
cat /root/scripts/calendario2.txt | tr [:lower:] [:upper:] > /root/scripts/calendario.txt
while read -r evento
do
	horaInicio=$(echo $evento | cut -d " " -f 1)
	horaFin=$(echo $evento | cut -d " " -f 3)
	descripcionEvento=$(echo $evento | cut -d " " -f 4-9999)
	# Aquí por ejemplo se puede dar formato. Depende de lo que se quiera hacer.
	# Por ejemplo meterlo en base de datos o darle un formato csv, o html.
	echo "\"$horaInicio\";\"$horaFin\";\"$descripcionEvento\""
        echo "\"$fechaHoy\";\"$horaInicio\";\"$horaFin\";\"$descripcionEvento\"" >> eventos.csv

done < /root/scripts/calendario.txt

rm /root/scripts/*.txt
rm /root/scripts/*.pdf

# Generamos el html
if [ $2 -eq 7 ]
then
	echo "hola"
	rm /root/scripts/web/cuerpo.html

	while read -r item
	do
		via="G39"
		dia=$(echo $item | cut -d ";" -f 1 | cut -d "\"" -f 2 | cut -c 7,8)
                mes=$(echo $item | cut -d ";" -f 1 | cut -d "\"" -f 2 | cut -c 5,6)
                ano=$(echo $item | cut -d ";" -f 1 | cut -d "\"" -f 2 | cut -c 1-4)
                hini=$(echo $item | cut -d ";" -f 2 | cut -d "\"" -f 2)
                hfin=$(echo $item | cut -d ";" -f 3 | cut -d "\"" -f 2)
                des=$(echo $item | cut -d ";" -f 4 | cut -d "\"" -f 2)
		echo "<div class=\"evento\"><div class=\"c1\">$via</div><div class=\"c2\">$dia/$mes</div><div class=\"c3\"><center><marquee>$des</marquee></center></div><div class=\"c4\">$hini</div><div class=\"c5\">$hfin</div></div>" >> /root/scripts/web/cuerpo.html
	done < /root/scripts/eventos.csv

	echo "adios"
	cat /root/scripts/web/cabecera.html /root/scripts/web/cuerpo.html /root/scripts/web/pie.html > /root/scripts/web/index.html
	cp -pRv /root/scripts/web/* /var/www/html/
	chown -R www-data:www-data /var/www/html/

fi

 

Seguramente el script puedes hacerlo tu mejor. Pero no lo estás haciendo tu :P. No obstante ahora mismo es lo que tenemos y funciona. Las modificaciones del script y mejoras las iremos actualizando aquí.

El script se ejecutará añadiendo este a cron.

La forma de ejecutarlo es así:

/bin/bash /root/scripts/conseguir_calendario.sh 0 1
/bin/bash /root/scripts/conseguir_calendario.sh 1 2
/bin/bash /root/scripts/conseguir_calendario.sh 2 3
/bin/bash /root/scripts/conseguir_calendario.sh 3 4
/bin/bash /root/scripts/conseguir_calendario.sh 4 5
/bin/bash /root/scripts/conseguir_calendario.sh 5 6
/bin/bash /root/scripts/conseguir_calendario.sh 6 7

 

De esa forma vamos consiguiendo en un archivo llamado eventos.csv en /root/scripts/ todos los eventos en este formato:

"20170821";"7PM";"8:30PM";"[AGOSTO POR CONFIRMAR] SALA B9. BOXEO Y MUAY THAI"
"20170821";"7PM";"9PM";"[¡VOLVEMOS EN SEPTIEMBRE!] SALA 3.10- KAPOEIRA"
"20170822";"7PM";"9:30PM";"CLUB DE LECTURA EN GRIEGO"
"20170822";"8PM";"10PM";"PLANTA BAJA (ENTRADA) INGLéS EN LA INGOBERNABLE"
"20170822";"8PM";"9PM";"SALA 3.11 CINE-CLUB CHANTAL"
"20170822";"8PM";"11PM";"SALA B9 - SIKURIS"
"20170823";"4PM";"6PM";"BICIMENSAJERAS, TALLER ABIERTO DE REPARACIóN BICI"
"20170823";"6:30PM";"7:30PM";"[¡VOLVEMOS EN SEPTIEMBRE!] SALA 2.11 - REUNIÓN PACD"
"20170823";"7PM";"10PM";"[¡VOLVEMOS EN SEPTIEMBRE!] SALA 2.9. ASAMBLEA RSA"
"20170823";"8PM";"9PM";"SALA 3.3 Y 3.2-YOGA LA INGOBERNABLE"
"20170824";"7PM";"11PM";"SALA B9 - GRUPO DE CUERDAS"
"20170825";"5PM";"7PM";"3A PLANTA-TALLER GRUPO DE TITULIZACIONES DE LA COORDINADORA DE VIVIENDA DE MADRID"
"20170825";"7PM";"8:30PM";"BIENVENIDA HACKLAB"
"20170825";"7PM";"10PM";"SALA 2.9- ASOCIACIÓN SIN TECHO CHUPANO"

 

Si nos fijamos en el script cuando ejecute cron el script con los parametros 0 1 borrará antes eventos.csv para generarlo de nuevo. Todas las noches de madrugada se ejecutará el script 7 veces para conseguir los eventos de 7 días en adelante. Esos eventos estarán en el archivo eventos.csv

Ya tenemos los datos. Ahora queda crear el o los archivos que nos permitan visualizarlo de forma “RENFE” en la pantalla de abajo.

Tipografía usada

 

Crontab

Revisa tzdata: dpkg-reconfigure tzdata

Como root crontab -e y se añade:

# m h  dom mon dow   command
11 1 * * * cd /root/scripts && ./conseguir_calendario.sh 0 1
12 1 * * * cd /root/scripts && ./conseguir_calendario.sh 1 2
13 1 * * * cd /root/scripts && ./conseguir_calendario.sh 2 3
14 1 * * * cd /root/scripts && ./conseguir_calendario.sh 3 4
15 1 * * * cd /root/scripts && ./conseguir_calendario.sh 4 5
16 1 * * * cd /root/scripts && ./conseguir_calendario.sh 5 6
17 1 * * * cd /root/scripts && ./conseguir_calendario.sh 6 7
20 1 * * * /sbin/shutdown -r now

Cambiando 17 por 1 de la madrugada por ejemplo.

 

Bajar todo el tinglado

Esto es para colocarlo en /root/

Esto generará el index.html que necesitamos que cron copie a /var/www/html/

Puedes bajar el tinglado aquí: scripts.tar

 

Saludos cordiales.

 

¿Le ha gustado el contenido?

Si le ha gustado y le ha sido de utilidad puede donar aquí https://paypal.me/mierdatv .  
También puede escribir un comentario si lo considera oportuno.  
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *