Affichage dynamique en Python

Le projet

J’ai travaillé sur un projet d’affichage dynamique, un diaporama sur un écran TV. Recherchant une solution peu onéreuse s’appuyant sur des logiciels libres, j’ai trouvé un script Shell pouvant être exécuté sur un Raspberry Pi sur le site suivant :

http://wiki.dane.ac-versailles.fr/

Un partage sur un réseau local héberge un diaporama réalisé avec LibreOffice Impress (.odp). Lorsque ce fichier est modifié, il est automatiquement téléchargé par le Raspberry Pi qui se trouve sur le même réseau et est affiché. Cela fonctionne très bien et actuellement dans un collège, j’ai deux Raspberry Pi pour deux écrans TV qui affichent le même diaporama. Le script Shell est lancé automatiquement aux démarrages des Raspberry Pi.

Un petit schéma de mon installation

Programme en Python

J’ai décidé de réaliser une version en Python de ce script Shell. J’ai créé deux petits programmes, le premier avec une interface graphique permettant de configurer plus facilement mon logiciel, le second permettant l’affichage du diaporama. Les difficultés étaient d’accéder au partage réseau depuis Python et d’exécuter des commandes Shell Bash.


Programme de configuration

Ce programme permet d’enregistrer dans un fichier les paramètres de configuration de mon logiciel depuis une interface graphique. Si vous êtes en groupe de travail lors des tests, enregistrez son nom en guise de nom de domaine, cela doit fonctionner.

Le programme Diapo-ini.py

!/usr/bin/env python3.7
 -- coding: utf-8 --
 from tkinter import *
 import pickle
 import os.path
 def Lancer_Diaporama():
     exec(open("./Diapo-py.py").read())
 def Enregistrer():
     serveursmb = Serveur_Entry.get()
     partagesmb = Partage_Entry.get()
     utilisateur = Utilisateur_Entry.get()
     mot_de_passe = Mot_de_passe_Entry.get()
     domaine = Domaine_Entry.get()
     fichier_diaporama = Fichier_du_diaporama_Entry.get()
 #Enregistrer mes variables sous forme d'une liste dans un fichier variables = [serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama] fichierSauvegarde = open("diaporamaini","wb") pickle.dump(variables, fichierSauvegarde) fichierSauvegarde.close()
 Lecture du fichier ini
 fichierini = "diaporamaini"
 Ouverture du fichier s'il existe et récupération de la liste
 if os.path.isfile(fichierini):
     fichierSauvegarde = open(fichierini,"rb")
     variables = pickle.load(fichierSauvegarde)
     fichierSauvegarde.close()
 # Affichage d'informations print("Initialisation des variables") # Récupération des données dans les variables serveursmb = variables[0] partagesmb = variables[1] utilisateur = variables[2] mot_de_passe = variables[3] domaine = variables[4] fichier_diaporama = variables[5]
 else:
     # Le fichier n'existe pas
     print("Fichier " + fichierini + " non trouvé")
     serveursmb = partagesmb = utilisateur = mot_de_passe = domaine = fichier_diaporama = "vide"
 Fenetre = Tk() #création de la fenêtre, avec un nom de votre choix Fenetre
 Fenetre.title('Paramètres Diaporama') #Titre de la fenêtre
 Fenetre.geometry("420x170") # On définit la taille de la fenêtre
 Fenetre.resizable(width=False,height=False) #Empêcher de redimentionner la fenêtre
 Création d'un interface graphique avec grid
 Serveur_Label= Label(Fenetre, text = 'Votre serveur - Nom ou IP :') #Un label pour afficher du texte
 Serveur_Label.grid(row=0)
 Serveur_Entry= Entry(Fenetre) #On définit l'objet Entry (zone de saisie) qui porte le nom Serveur_Entry
 Serveur_Entry.insert(0, serveursmb)
 Serveur_Entry.grid(row=0,column=1,ipadx=30) # ipadx=30 pour créer 10 pixels de plus horizontalement
 Partage_Label= Label(Fenetre, text = 'Votre partage réseau :')
 Partage_Label.grid(row=1,column=0)
 Partage_Entry= Entry(Fenetre)
 Partage_Entry.insert(0, partagesmb)
 Partage_Entry.grid(row=1,column=1,ipadx=30)
 Utilisateur_Label= Label(Fenetre, text = 'Votre utilisateur :')
 Utilisateur_Label.grid(row=2,column=0)
 Utilisateur_Entry= Entry(Fenetre)
 Utilisateur_Entry.insert(0, utilisateur)
 Utilisateur_Entry.grid(row=2,column=1,ipadx=30)
 Mot_de_passe_Label= Label(Fenetre, text = 'Votre mot de passe :')
 Mot_de_passe_Label.grid(row=3,column=0)
 Mot_de_passe_Entry= Entry(Fenetre) # Saisie du mot de passe
 Mot_de_passe_Entry.insert(0, mot_de_passe)
 Mot_de_passe_Entry.grid(row=3,column=1,ipadx=30)
 Domaine_Label= Label(Fenetre, text = 'Votre nom de domaine:')
 Domaine_Label.grid(row=4,column=0)
 Domaine_Entry= Entry(Fenetre)
 Domaine_Entry.insert(0, domaine)
 Domaine_Entry.grid(row=4,column=1,ipadx=30)
 Fichier_du_diaporama_Label= Label(Fenetre, text = 'Votre fichier de diaporama :')
 Fichier_du_diaporama_Label.grid(row=5,column=0)
 Fichier_du_diaporama_Entry= Entry(Fenetre)
 Fichier_du_diaporama_Entry.insert(0, fichier_diaporama)
 Fichier_du_diaporama_Entry.grid(row=5,column=1,ipadx=30)
 Mon_bouton_Lancer_Diaporama = Button(Fenetre, text = 'Lancer le Diaporama',command = Lancer_Diaporama)
 Mon_bouton_Lancer_Diaporama.grid(row=6,column=0,ipadx=0)
 Mon_bouton_Enregistrer = Button(Fenetre, text = ' Enregistrer le fichier', command = Enregistrer)
 Mon_bouton_Enregistrer.grid(row=6,column=1,ipadx=0)
 Fenetre.mainloop() # lance la boucle principale
L’interface graphique pour la saisie des paramètres du diaporama

Programme d’affichage du diaporama

Ce programme lit le fichier de configuration pour attribuer aux variables les valeurs qui ont été enregistrées puis il affiche le diaporama. Lorsque le diaporama est modifié sur le partage réseau, il est automatiquement téléchargé et affiché.

Le programme Diapo-py.py

!/usr/bin/env python3.7
 -- coding: utf-8 --
 import pickle
 import os.path
 import smbclient
 import subprocess
 import time
 Lecture du fichier ini
 fichierini = "diaporamaini"
 Ouverture du fichier s'il existe et récupération de la liste
 if os.path.isfile(fichierini):
     fichierSauvegarde = open(fichierini,"rb")
     variables = pickle.load(fichierSauvegarde)
     fichierSauvegarde.close()
 # Affichage d'informations print("Initialisation des variables") # Récupération des données dans les variables serveursmb = variables[0] partagesmb = variables[1] utilisateur = variables[2] mot_de_passe = variables[3] domaine = variables[4] fichier_diaporama = variables[5]
 else:
     # Le fichier n'existe pas
     print("Fichier " + fichierini + " non trouvé")
 initialisation des variables
 Version_Old = "vide"
 local_path = "./" + fichier_diaporama
 smb = smbclient.SambaClient(server=serveursmb, share=partagesmb, username=utilisateur, password=mot_de_passe, domain=domaine)
 Boucle = True
 while Boucle == True:
     try:
         # Afficher des informations sur le fichier
         Version_New = smb.info(fichier_diaporama)
     except:
         Version_New = Version_Old
     if Version_New != Version_Old:
         try:
             ### On arrête l'application LibreOffice ###
             subprocess.Popen(['/bin/sh', '-c', "pkill office"])
             time.sleep(2)
             ### On supprime l'ancien fichier diaporama s'il existe ###
             if os.path.isfile(local_path):
                 os.remove(local_path)
             ### Téléchargement du nouveau fichier ###
             smb.download(fichier_diaporama, local_path)
             time.sleep(2)
             ### Affichage du diaporama ###
             Affichage = subprocess.Popen(["libreoffice", "--norestore", "--show", fichier_diaporama], shell=False)
             Version_Old = Version_New
         except:
             print("Erreur lors du téléchargement et de l'affichage du diaporama")
     else:
         time.sleep(20) # Pas de mise à jour - On attend 20 secondes avant de revérifier

Prérequis pour l’installation du programme en Python sur le Raspberry Pi

Version de Python installée

python3 --version
 Python 3.7.3

Pour l’interface graphique avec Tkinter

Le paquet python3-tk doit être présent sinon on l’installe :

sudo apt-get install python3-tk

Accès au partage Samba

Vous devez disposer d’un partage réseau Windows ou sous Linux (Samba) avec les login/mot de passe pour y avoir accès.

Pour pouvoir accéder au partage réseau depuis le Raspberry Pi vous devez installer le paquet smbclient (client samba) sous Linux :

sudo apt-get install smbclient

En cas de problème, il peut être utile de vérifier la connexion au partage depuis l’explorateur de fichiers du Raspberry Pi :

smb://ip_du_serveur/nom_du_partage

Installer la bibliothèque pysmbclient (client samba) pour l’accès au partage réseau depuis Python :

pip3 install pysmbclient

Plus d’informations :

https://pypi.org/project/PySmbClient/

Les droits sur les fichiers

Les deux programmes doivent être exécutables et je réduis les droits au seul utilisateur pi :

chmod 700 nom_du_fichier

Pour le fichier diaporamaini, droits en lecture et en écriture au seul utilisateur :

chmod 600 diaporamaini

Lancer et arrêter les programmes

Pour lancer les programmes depuis un terminal :

./nom_du_fichier

Pour arrêter la diffusion du diaporama depuis le Raspberry Pi :

[Alt] + [F4] Pour fermer LibreOffice Impress.

[Ctrl] + [C] Pour stopper l’exécution du programme dans le terminal.

Par la suite, on pourra automatiser le lancement du programme qui affiche le diaporama au démarrage du Raspberry Pi.


Et maintenant…

Je ne suis pas programmeur, j’ai une formation de technicien d’assistance informatique et une autre de technicien réseau. Vous avez peut-être des idées pour améliorer ce programme et ajouter de nouvelles fonctionnalités. Si vous êtes intéressé, n’hésitez pas. Vous pouvez laisser des commentaires ou me contacter pour faire évoluer le code.

Programmes mis à jour le 21/12/2020

Dominique Renaudeau

Lecture d’une vidéo en boucle sur un Raspberry Pi

Raspberry Pi sous Raspbian GNU/Linux 9.13 (stretch).

On m’a demandé la lecture d’une vidéo en boucle sur un écran TV depuis un Raspberry Pi 3. Habituellement, j’utilise ce matériel pour un affichage dynamique (Diaporama). Je pensais utiliser le logiciel VLC, mais il n’affichait pas correctement la vidéo malgré plusieurs tentatives de réencodages avec le logiciel Handbrake. À la recherche d’une solution, j’ai testé le logiciel Omxplayer et cela a fonctionné.

Pour lancer l’affichage de la vidéo en boucle (depuis le dossier où se trouve la vidéo, dans un terminal) :

omxplayer --loop fichier_vidéo

Pour stopper l’affichage de la vidéo [Alt] + [F4] ou [Q].

Le logiciel Omxplayer était déjà installé sur le Raspberry Pi, on peut vérifier cela avec la commande :

dpkg -l omxplayer
 Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
 | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=atte
 |/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
 ||/ Nom            Version               Architecture Description
 +++-==============-=====================-============-==========================
 ii  omxplayer      20190723+gitf543a0d-1 armhf        Command line media player
 lines 1-6/6 (END)

Tapez [Q] pour reprendre la main.

Si comme pour moi votre fichier vidéo se trouve sur une clé USB vous retrouverez celle-ci dans le dossier /media/pi/.

Configuration du proxy ou serveur mandataire (Raspberry Pi sous Raspbian)

Sur un Raspberry Pi sous Raspbian, la configuration du proxy peut se faire en ajoutant à la fin du fichier /home/pi/.profile ces caractéristiques.

On peut éditer le fichier avec nano :

sudo nano /home/pi/.profile

Par exemple, pour un proxy en 172.20.1.1:3128, ajouter à la fin du fichier :

export http_proxy="http://172.20.1.1:3128"

export https_proxy="http://172.20.1.1:3128"

export no_proxy="localhost,127.0.0.1,172.20.0.0/16"

Installez le paquet nano si besoin.

J’ai configuré le proxy dans le cadre d’un projet d’affichage dynamique géré par un Raspberry Pi.

Sources :

http://wiki.dane.ac-versailles.fr/

 

 

Raspberry PI 2 Raspbian et Samba.

J’ai décidé de créé un partage Samba sur mon Raspberry PI 2 pour y avoir accès depuis mon PC sous Windows.

Installation de Samba depuis un terminal :

sudo apt-get install samba

Pour sauvegarder le fichier original de configuration de Samba depuis un terminal administrateur :

sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig

Pour ensuite éditer un nouveau fichier de configuration avec Nano :

sudo nano /etc/samba/smb.conf

Mon fichier de configuration de Samba sous /etc/samba/smb.conf

[global]
        netbios name = SERVEUR
        server string = Serveur WORKGROUP
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        idmap config * : backend = tdb

[homes]
        comment = Home Directories
        read only = No
        create mask = 0755

[Partage]
        comment = Input
        path = /samba/partage
        force group = users
        read only = No
        guest ok = Yes

On crée le répertoire partagé (pas les répertoires utilisateurs, ils existent déjà, ce sont ceux dans /home). À noter l’option -p qui permet de créer à la fois un répertoire et un sous-répertoire de ce répertoire :

sudo mkdir -p /samba/partage

On donne ensuite les droits en écriture à tout le monde pour partage :

sudo  chmod 777 /samba/partage

Une fois Samba installé sur mon Raspberry PI 2 sous Raspbian, je constate que la commande smbpasswd qui sert à créé les utilisateurs Samba ne fonctionne pas.

En fait, il faut installer au préalable le paquet samba-common-bin à l’aide de la commande suivante :

sudo apt-get install samba-common-bin

Ensuite, on peut créer l’utilisateur Samba (qui doit déjà exister sous Linux). La commande suivante crée l’utilisateur pi (utilisateur par défaut sous Raspbian) :

sudo smbpasswd -a pi

L’installation de ce paquet permet également l’utilisation de la commande testparm :

pi@raspberrypi /etc/samba $ testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[Partage]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

Pour redémarrer Samba et prendre en compte toutes les modifications.

sudo /etc/init.d/samba restart

Les processus de Samba

Il n’y a pas de processus samba qui tourne en tâche de fond pour le serveur, mais des processus : smbd qui s’occupe des partages et de l’authentification, et nmbd qui s’occupe de la résolution des noms NetBIOS.

Exemples en lignes de commande pour lister les processus Samba :

ps aux | grep smbdps 

ou

ps -ale | grep -e TTY -e smbd

Les ports liés au partage de fichiers par les protocoles SMB et CIFS

135 TCP et UDP Localisateur de services RPC

137 TCP et UDP NetBIOS Name Service (nbname)

138 UDP NetBIOS Datagram Service (nbdatagram)

139 TCP NetBIOS Session Service (nbsession)

445 TCP et UDP Service de dossiers partagés Windows


Plus d’informations sur l’installation de Samba sous Debian :

Partages avec Samba sous Debian 7

Connexion au bureau à distance Windows depuis un Linux.

Le tutoriel suivant au format PDF explique comment connecter un Raspbian (dérivé de Debian pour Raspberry) à un serveur Windows 2012 R2 avec le bureau à distance Microsoft et rdesktop sous Linux.

J’ai également testé la connexion avec un Xubuntu. La procédure peut être adaptée à d’autre environnement Windows.

L’intérêt initial étant d’utiliser des Raspberry comme des clients légers.

Bureau à distance Windows depuis Linux


Rdesktop semblant poser des problèmes avec l’affichage de la souris dans la configuration Raspbian/serveur Windows 2012, on peut dans ce cas utiliser à sa place FreeRDP. On installe ce dernier par une des commandes suivantes :

apt-get install freerdp ou aptitude install freerdp

Pour le tester ensuite j’ai utilisé dans mon cas la syntaxe suivante :

xfreerdp -f -u Administrateur 192.168.15.60

-f pour l’affichage en plein écran, -u pour préciser l’utilisateur du Windows, enfin l’IP de votre serveur.

Reste ensuite à saisir le mot de passe de votre utilisateur.