En las entradas anteriores hemos preparado la conexión con el servidor, la sincronización de carpetas, la reproducción de imágenes y de vídeos. Ahora toca ir juntando todo y comenzar a automatizar el proceso.
En esta entrada vamos a preparar el script para que, de momento, haga lo siguiente:
-
-
- Reproducir en bucle las imágenes y vídeos
- Reproducir archivos en una determinada pantalla
- Reproducir vídeos sin sonido y opcionalmente con sonido
- Salir del bucle
- Reiniciar la Raspberry
- Apagar la Raspberry
-
La automatización no va a verse sólo en esta entrada, ocupará también las siguientes porque vamos a ir añadiendo funcionalidades, pero el que nos ocupa podría decirse que es el fichero principal, el alma del proyecto.
Para la entrada que nos ocupa tenemos casi todas las piezas del puzzle, pero nos faltan algunas: ¿cómo le decimos que salga del bucle, se apague o reinicie a la raspberry?
Una solución podría ser que cargase un fichero sh y lo ejecutara, así podríamos hacer cualquier cosa. Si estuviéramos en una red privada y segura, sería una opción muy cómoda, pero para el entorno donde van a estar dando servicio las pantallas, ni de broma me parece que sea una buena opción poder cargar «cualquier» sh y que se ejecute.
La solución que se me ha ocurrido es «jugar» con los nombres de archivo y sus extensiones. Pongamos que quiero apagar la pantalla llamada «pantalla1», pues subo al servidor un archivo que se llame «pantalla1.001» y cuando la Raspberry actualice sus archivos y lea este, que se apague. No es un apagado inmediato, pero es un apagado controlado.
Para que se reinicie utilizaremos la extensión «002» y para que simplemente salga, la «003». Si queremos que haga más cosas podemos ir añadiendo extensiones.
¿Cómo hacemos que un archivo que carguen todas las pantallas lo reproduzca sólo una en concreto? Pues por ejemplo haciendo que el nombre del archivo comience por «XXX» y poniendo a continuación el nombre de la pantalla que lo ha de reproducir, por ejemplo: XXXpantalla4aviso01.jpg
Y para el audio de los videos, por defecto se reproducirán sin audio, pero si en algún caso en concreto lo queremos entonces tendremos que poner «AAA» justo antes de la extensión, por ejemplo: charla_juevesAAA.avi
Y ahora que lo tenemos todo definido vamos a ver cómo quedaría el código del script por partes:
Comenzamos metiendo en una variable el nombre de la pantalla, la longitud de dicho nombre y asignando el valor «bucle» a una tercera variable que usaremos tanto para ejecutar el bucle mientras mantenga ese valor o ejecutar determinadas acciones cuando cambie, por ejemplo por una extensión de archivo.
El echo de la línea 8 oculta, no del todo pero casi, el cursor. No queremos verlo parpadeando al reproducir un jpg
Comenzamos el bucle y por cada fichero que tengamos en Videos cargamos en una variable su extensión, la ruta completa del fichero y el nombre del fichero.
A continuación comprobamos si el nombre del fichero coincide con el nombre de la pantalla, y de ser así cambiamos el valor de la variable $ejecuta por la extensión del fichero. Esto por sí sólo ya evitaría que se ejecutara una nueva iteración del bucle, porque ya no se cumpliría el while, pero además ejecutamos un break y salimos en este mismo momento, no sin antes borrar el fichero.
En este punto vamos a dar un salto hasta el final del script para ver qué hace ahora la variable $ejecuta y cómo:
Fácil, como puede verse: if, elif, elif y else. De hecho hasta nos podríamos haber ahorrado el elif del 003, ya que tal como está ahora si le ponemos como extensión 003 o 887 va ha hacer un clear. Pero bueno, lo dejamos ahí porque en posteriores secciones aquí meteremos alguna cosa más.
Como $ejecuta ha tomado el valor de la extensión del archivo, pues si vale 001 apaga la Raspberry, con 002 la reinicia y simplemente hace un borrado de pantalla con 003 o cualquier otro.
Seguimos donde habíamos dejado antes el script. Ahora toca controlar los ficheros que van a una determinada pantalla, así:
Aunque en realidad lo que hacemos es justo lo contrario, es decir: Si el fichero comienza por XXX y a continuación no va el nombre de nuestra pantalla, no hacemos nada.
Y no lo borramos, porque si a la siguiente actualización sigue estando en el servidor, nos lo volvería a cargar, así que simplemente lo ignoramos.
Llegados a este punto ya tenemos que empezar a mostrar algo en la pantalla, que ya va siendo hora, así que comenzamos con los jpg:
Fácil, esto ya lo teníamos hecho de antes, aunque aquí ya les damos una duración de 20 segundos en pantalla, suficiente para publicitar un evento y que pueda leerse sin que se haga demasiado monótono. Ahora seguimos con los vídeos:
En primer lugar comprobamos si el nombre del fichero acaba en AAA, de ser así lo reproduciremos con audio con la instrucción que anteriormente habíamos probado.
En caso contrario se reproducirá sin sonido, para ello hay que añadir a la instrucción la opción –vol -6000
Y con esto ya está todo de momento. Este sería el script completo, por ahora:
#!/bin/bash #Establecemos en estas variables: #El nombre de la pantalla a gestionar nombrepantalla=$(hostname) longitud=${#nombrepantalla} ejecuta="bucle" #Ocultamos el cursor echo -e "\e[?1;0;0c" clear #Ejecutamos el bucle mientras $ejecuta sea "bucle" while [ $ejecuta = "bucle" ] do #Refrescamos el directorio cd . #Recorremos el directorio for file in /home/pi/Videos/* do #Metemos en variable el nombre y la extensión extension="${file##*.}" filename=$(basename $file) fname="${filename%.*}" #A continuación usaremos nombres de archivo que reservaremos para ejecutar diversas acciones #Si el nombre coincide con el nombre de la pantalla pararemos el bucle #borraremos el fichero y luego ejecutaremos la acción relacionada if [ $fname = $nombrepantalla ] then ejecuta=$extension rm $file break #Si el fichero comienza por XXX pero a continuación no se encuentra el nombre #de la pantalla, lo ignoraremos. elif [ ${fname:0:3} = "XXX" ] && [ ${fname:3:$longitud} != $nombrepantalla ] then : #A partir de aquí suponemos que ya son ficheros para proyectar #Si el fichero tiene extensión jpg lo mostramos en pantalla la duración establecida elif [ $extension = 'jpg' ] then clear fim $file -a -c '{sleep 20;quit;};' clear #En cualquier otro caso asumimos que se trata de un video y lo reproducimos #Por defecto, al ser pantallas informativas, #reproduciremos el vídeo sin sonido #Si queremos sonido basta con poner al final del nombre de archivo AAA justo antes del punto de la extensión else if [ ${fname: -3} = "AAA" ] then omxplayer -b --blank --aspect-mode letterbox "$file" > /dev/null else omxplayer -b --blank --aspect-mode letterbox --vol -6000 "$file" > /dev/null fi fi done done #Si salimos del bucle puede ser por algún fichero del tipo #nombrepantalla.extensión y la extensión la tenemos en variable ejecuta #La extensión deberá ser 001, 002, etc y según sea se ejecutará lo siguiente: #Si es 001 apagamos la Raspberry if [ $ejecuta = '001' ] then sudo shutdown -h now #Si es 002 reiniciamos: elif [ $ejecuta = '002' ] then sudo shutdown -r now #Si es 003 borramos elif [ $ejecuta = '003' ] then clear #En cualquier otro caso termina el script y borramos la pantalla else clear fi #Podemos ir añadiendo las condiciones que queramos con elif #Debemos evitar los ficheros de imagen y video con el nombre de la pantalla #o el script se detendrá
No está acabado pero casi. Más adelante lo completaremos con un par de cosas y por último lo afinaremos para que se ejecute desde crontab.
Ficheros tratados en esta entrada
-
- proyecta.sh: nuestro script principal (preparación)