technique:raspitv-accueil

Ceci est une ancienne révision du document !


Raspberry TV-Accueil

Le projet repose sur l'utilisation conjointe de 2 outils :

  • Une appli d'enregistrement de réservations : Booked. Appli libre forkée et disponible ici : https://github.com/effgarces/BookedScheduler
  • Un raspberry connecté à une TV sur le port HDMI 4 sur lequel est installé :
    • RS : RaspberrySlideShow, un système de diffusion de diaporama
    • RaspiTV : une appli qui vient piocher les infos dans Booked et les affiche de manière personnalisée
  1. Installation de l'appli Booked dans un serveur web : Procédure d'installation
  2. Sur un Raspberry, installation du système Raspberry SlideShow
  3. Sur le même Raspberry, installation du code RaspiTV
  4. Connexion entre le RaspiTV et l'appli Booked avec les bons paramètres
apt-get install git curl python3-pip
mkdir -p /srv/raspitv && cd /srv/raspitv
https://code.cemea.org/cemea-an/raspitv.git
pip3 install flask flask_restful mysql.connector

Correction des paramètres de connexions à la base de données (dans .env) issus du fichier /var/www/booked/config.php

Et lancement de l'API :

./apibkd.py

Test local de l'API :

curl http://127.0.0.1:5000/v1/lastupdate

Doit renvoyer la date de dernière mise à jour de la base :

"2020-09-30 22:24:46"

Ensuite on va rajouter nginx comme proxy devant (pour pouvoir gérer le HTTPS) ; on rajoute dans /etc/nginx/sites-enabled/salles la suite :

	# On redirige vers l'API booked en python
	location /v1/ {
		include proxy_params;
		proxy_pass http://127.0.0.1:5000;
	}

On relance nginx (systemctl reload nginx) puis on vérifie que cela marche bien :

curl https://salles.cemea.lan/v1/lastupdate

Pour finir, on va rendre l'api Flask accessible uniquement sur la machine locale (car là, elle est encore joignable sur http://sonip:5000), en modifiant le .env avec APIBKD_ADDRESS=127.0.0.1 puis en relançant l'API.

Pour vérifier, on peut tenter de curl http://ipdesalles:5000/v1/lastupdate : si on obtient une “connection refused”, c'est qu'on a bien enlevé l'accès direct à l'API booked sur le LAN

apt-get install git curl python3-pip

mkdir /srv  && cd /srv

git clone https://code.cemea.org/francois.audirac/raspitv.git

pip3 install flask weasyprint requests

Modifier les paramètres d'accès dans le.env (URL au serveur web).

Et lancer le service pour vérifier que la connexion fonctionne

PRODENV="1"

# Utilisé sur le serveur Web
APIBKD_DB="sallesbkd_database"
APIBKD_USER="apibkd_readonly"
APIBKD_PWD="motdepassesecret"
APIBKD_ADDRESS="127.0.0.1"

# Utilisé sur le raspi
API_URL="https://salles.cemea.lan"
# DEBUG : jour fixe
MYDAY="2020-09-28"

DELAYSLEEP=60

1) Booked fonctionne sur le mode d'une appli Web avec PHP & une base de données MySQL dont la structure reste technique.

Une partie du code du projet propose à l'aide d'un script Python-Flask apibkd.py (lancé par le script runapi.sh) une API qui affiche les événements voulus sur une URL dans un fichier JSON donné :

http://ip_booked:5000/v1/YYYY-MM-DD renvoie des infos du jour :

    {
        "titre": "D4",
        "description": "",
        "organisateur": "Edwige MASSON",
        "datedebut": "2021-04-26 09:00:00",
        "datefin": "2021-04-26 17:00:00",
        "nbpers": "",
        "salle": "Salle 15",
        "series_id": 49,
        "reservation_instance_id": 38
    },

- le code est placé dans /srv/raspitv depuis le dépot cloné : https://code.cemea.org/francois.audirac/raspitv

- Personnaliser le .env (issu du .env.example) pour se connecter à la base de données.

- installer le service apibkd.service qui va lancer /srv/raspitv/runapi.sh qui va lancer apibkd.py

- le service doit alors répondre aux requêtes web : http://ip_booked:5000/v1/YYYY-MM-DD et http://ip_booked:5000/v1/lastupdate qui renvoie la date de dernière modification de la base de données.

Voir procédure technique : https://ladoc.cemea.org/doku.php?id=dsi:tv_diffus_raspberrys#depot_git_et_installation

2) Du côté du Raspberry, un script permanent diffuse un diaporama à partir d'images contenues dans des dossiers distants.

Le code du projet propose un script plangen.py qui vient régulièrement chercher les modifications issues de Booked et générer une image planning.png à partir d'un fichier HTML + CSS. Ce fichier placé dans /var/lib/rs/ sera donc affiché au milieu des images diffusées. Si aucun événement n'est programmé, le planning est noir.

- le code est placé dans /srv/raspitv depuis le dépot cloné : https://code.cemea.org/francois.audirac/raspitv

- Personnaliser le .env (issu du .env.example) pour adapter des paramètres de diffusion

- Personnaliser le fichier /var/lib/rs/media.conf pour personnaliser les paramètres de connexion au serveur/cloud : accès aux images distantes

- installer le service raspitv.service qui va lancer /srv/raspitv/raspitvdiff.sh qui va générer le planning (plangen.py) et lancer la diffusion du diaporama.

- le fichier /etc/crontab est personnalisé pour varier les périodes d'affichage avec : extinction d'écran + arrêt diffusion / démarrage écran + départ diffusion

Voir procédure technique de mise en place du raspiTV

1) lors du démarrage (rpi ou service raspitv), lancement de rapitvdifff.sh : si le planning est absent, on copie un planning noir pour avoir au moins une image à diffuser (TODO : mettre autre chose = logo CEMEA ?)

2) On stoppe le diaporama (il est peut-être lancé) et on arrête la diffusion sur HDMI.

3) On lance plangen.py pour générer le planning qui est généré régulièrement selon les modifications. Ce programme est sensé tourner en permanence.

4) On ouvre la diffusion sur HDMI et 3 secondes après on lance le diaporama.

5) à intervalles réguliers (9h, 17h, week-end), on arrête la diffusion sur HDMI et le diaporama. Et le matin on relance la diffusion et le diaporama (rs).

En cas de modification du code, voici les étapes à respecter pour relancer le diaporama :

systemctl stop rs # service qui lance le diaporama selon les options de
systemctl stop raspitv # service de génération du diaporama
systemctl start raspitv.service # service qui relance le nouveau planning, puis relance l'affichage et relance le diaporama avec photos
systemctl start raspitvoff.service # service qui éteint et stop tout
systemctl start raspitvplan.service # service qui relance le diaporama avec le planning seul, sans photos.
# Pour éteindre / allumer la diffusion sur HDMI
vcgencmd display_power 0 # éteindre
vcgencmd display_power 1 # pour allumer l'écran

Pour info, par défaut, le nouveau planning est généré sous forme d'image “planning.png” dans le dossier /var/lib/rs/ à partir des fichiers modele.html et modele.css.

Le fichier planning.html est aussi le fichier final généré actualisé avant transformation en image.

Il est possible de consulter la liste des images diffusées en utilisant :

journalctl -u rs.service # dernier log : q pour quitter
ou
journalctl -fu rs.service # pour avoir le flux en continu : Ctrl + C pour quitter.

Parcourir le fichier de log avec les flèches du clavier ou espace (pgdown) et “q” pour quitter le fichier.

Seuls 3 services seront utilisés et démarrés :

  • raspitv : planning et photos
  • raspitvplan : planning seul
  • raspitvoff : extinction

Ces services interagissent avec rs et le script python.

Le service de diaporama rs par défaut est désactivé pour ne pas se lancer au démarrage du raspi.

systemctl disable rs.service

Une tâche cron est créée selon les besoins d'allumage dans /etc/cron.d/raspitv contenant :

15 8 * * Mon,Tue,Wed,Thu,Fri root systemctl start raspitvplan.service
0 10 * * Mon,Tue,Wed,Thu,Fri root systemctl start raspitv.service
15 13 * * Mon,Tue,Wed,Thu,Fri root systemctl start raspitvplan.service
0 14 * * Mon,Tue,Wed,Thu,Fri root systemctl start raspitv.service
0 17 * * Mon,Tue,Wed,Thu,Fri root systemctl start raspitvoff.service

Le planning seul est ici affiché du lundi au vendredi de 8h15 à 10h et de 13h15 à 14h.

Le planning avec images est affiché du lundi au vendredi de 10h à 13h15 et de 14h à 17h.

Il est stoppé en dehors de ces horaires.

  • technique/raspitv-accueil.1643193329.txt.gz
  • Dernière modification : 2022/01/26 11:35
  • de guillaumed