[TUTO] Afficheur à Matrice Leds RGB sur RPi avec API

Bonjour à tous,

Voici un tuto, transféré de l’ancien forum ([TUTO] Afficheur à Matrice Leds RGB sur RPi avec API - Forum Communauté Jeedom) qui vous permettra de faire un afficheur à leds RGB, basé sur un RPI sous Raspbian, une librairie python de Hzeller et une API custom via un serveur web.
C’est un projet donc le coût va varier de 55€ (RPi0W / Sryled / boite maison) à 200€ selon la matrice, les options, et le RPi que vous y mettrez. J’ai démarré le projet avec une matrice 1632 et terminé avec une 6432 pitch 3mm Cela fonctionne avec un RPi0 mais les performances sont moindres qu’avec un RPi3. Les différences de performances se situent principalement sur le scrolling de texte, ou un léger clignotement d’horloge lors de la mise à jour.

Le hardware final comporte un boitier en métal, un ventilateur silencieux et un variateur manuel pour le ventilo… ce sont des options. L’intérêt ici est de donner la méthode pour obtenir le résultat final et vous adapterez selon vos besoins.

Tout mon montage est basé sur l’excellent travail de Henner Zeller qui maîtrise de manière impressionnante les matrices de led…
Pour référence, et beaucoup d’informations intéressantes : GitHub - hzeller/rpi-rgb-led-matrix: Controlling up to three chains of 64x64, 32x32, 16x32 or similar RGB LED displays using Raspberry Pi GPIO

Voici la liste de courses pour la matériel :

Donc en gros, la version light avec matrice chinoise 64x32 et kit de refroidissement minimaliste : environ 115€.
140€ si on ajoute un kit « Noctua ».
Les prix ne tiennent pas compte des frais de port… et on peut encore les pondérer en utilisant un RPi0 (voir plus loin) et en imprimant à l’imprimante 3D le boîtier…

Le rendu global :

Assemblage :

[Edit] Voir mes essais sur Pi zéro : ([TUTO] Afficheur à Matrice Leds RGB sur RPi avec API - #7 par Theduck38)
Vue générale :

Tout d’abord, assembler le Hat… Il faut un fer à souder avec une petite panne car le driver (Hat) est livré avec ses connecteurs non soudés.
C’est pas sorcier à faire et bien détaillé sur le site Adafruit. Ca m’a pris 1/2 h en faisant attention…
Si vous choisissez le second proposé (le moins cher) il est normalement déjà soudé.
Sur le hat, il faut faire une petite modif : shunter les sorties 4 et 18, comme spécifié ici :
https://github.com/hzeller/rpi-rgb-led- … it-mod.jpg
Attention : dans le cas d’utilisation d’une matrice 64x64 indiquée plus haut dans la liste de courses, ce sont les pins 4 & 8 qu’il faut shunter. Voir plus bas les posts de @NeoTokyos en septembre 2022

Sur la photo suivante, avec le Hat en place, on voit le petit fil (bleu) que j’ai ajouté sur la gauche.
Il se branche directement sur le RPi et on branche l’alim 5V sur le Hat (pas d’adaptation à faire) ; c’est lui qui alimente le RPi.

Avec la matrice, viennent câbles :

  • Un de type ‹ nappe › qui se branche sur le Hat, sur le connecteur de même type .

  • Un de type ‹ Molex › (alim) dont un fil roue et un noir doivent être branchés sur la sortie correspondante du Hat (à droite sur la photo ci-dessus).

  • On alimente le ventilateur via un emplacement GND / 5V qu’on récupère sur le Hat, c’est le câble (jaune/rouge) qu’on peut voir soudé à gauche de la nappe. Voir le post suivant pour les détails.

Il faut ensuite faire des trous dans le boîtier en métal pour passer les câbles à l’arrière (secteur + réseau), fixer la matrice à l’avant, et passer sa connectique… sachez que si vous faites comme moi et commencez par une matrice moins chère, il vous faudra par la suite refaire des trous dans la plaque alu, car les emplacements des connecteurs et de l’accrochage diffèrent

Connectique%20Matrice_light

Montage-variateur

Le ventilateur fourni dans le kit standard a deux fils d’alim : un rouge et un noir.
Dans le cas du Noctua, il y a un fil en plus, mais il y a plusieurs connecteurs fournis avec, qui permettent de revenir à un fil noir / un fil rouge. Les petits connecteurs rapides à guillotine sont normalement aussi dans le kit.

Si vous montez directement le ventilateur sans mettre de régulateur, il suffit de souder le fil noir sur un emplacement GND du Hat et le rouge sur un +5V (ou un +3.3V si vous voulez qu’il tourne moins vite). Voir photo plus bas.

Dans le cas d’un montage avec le régulateur, il faut souder les fils rouge et noir du régulateur sur les emplacement +5V et GND du Hat, puis connecter le fil vert (-) en sortie du régulateur au noir du ventilateur ; le blanc du régulateur (+) va sur le rouge du ventilateur. Ces deux dernier se connectent grâce aux connecteurs rapides à guillotine.

C’est peu évident sur la photo ci-dessous, mais je n’ai pas eu le courage de tout dépiauter. On voit bien en revanche la mention + et - sur les fils blanc et vert en sortie.

R%C3%A9gulateur_light

Dans mon cas, j’ai ajouté un câble entre les fils noir et blanc en entrée de régulateur et le hat… le tout raccordé grâce à des Wago à levier (que l’on devine ci-dessus).

Branchement sur le Hat…

Après, il faudra bien entendu refaire deux trous dans le capot arrière du boîtier… un pour passer le potentiomètre du régulateur (au forêt), un pour monter le ventilateur (celui-ci est le plus difficile à faire si vous n’avez pas de cloche, il faut percer régulièrement avec un petit forêt sur le pourtour du cercle, puis tout finir à la lime…)

Installation et préparation du système :

----- MISE EN GARDE ----
J’écris cette partie de mémoire, et en consultant les notes que j’avais prises il y a plus d’un an lorsque j’ai configuré mon RPi. Je n’ai pas re-testé toute la procédure de A à Z par manque de temps (fallait pas effacer le fil d’origine, na!). Aussi, la partie ci-dessous s’adresse à ceux qui ont déjà une bonne maîtrise de l’environnement Linux ; il y a probablement des erreurs ou imprécisions dans mon déroulement . Si vous n’êtes pas sûr de vous après lecture complète, préférez télécharger l’image disque préconfigurée (voir plus bas à la fin de ‹ installation API ›)

o On part sur du Raspbian lite. Voici un tuto (ou vous en trouverez d’autres sur Google) pour installer et configurer Raspbian : https://www.tech2tech.fr/comment-installer-linux-raspbian-sur-raspberry/

  • Vous le téléchargez sur le site : Télécharger Raspberry Pi OS (anciennement Raspbian)
  • Utiliser Win32DiskImager sur PC (ou ApplePi Bakersur Mac) pour l’installer sur une carte SD
  • Activer le ssh en créant un fichier vide nommé ssh sur la partition de démarrage du Raspbian
    A configurer ensuite comme vous voulez. N’oubliez pas cependant d’étendre le système de fichiers et de choisir les options de localisation, hostname…etc… (voir : sudo raspi-config)

o En principe, python2.7 est déjà installé sur Stretch ; pour le savoir :

dpkg --get-selections | grep python2

o Il faut ensuite télécharger et compiler les librairies de hzeller, car celle fournie par Adafruit ne fonctionne pas. Elle induit un taux de charge de 100% dès que l’on déclare une matrice (même sans y afficher quoi que ce soit) et que l’on utilise la fonction time.sleep(xx). Jamais eu de réponse de Adafruit sur le sujet. C’est un bug chez eux.
(Les instruction à suivre pour compiler les librairies sont ici : https://github.com/hzeller/rpi-rgb-led- … ngs/python )
Il faut tout d’abord télécharger et dézipper les librairies de hzeller :

wget https://github.com/hzeller/rpi-rgb-led-matrix/archive/master.zip
unzip master.zip
rm master.zip

Compiler la librairie pour le python : il faut aller dans le dossier « rpi-rgb-led-matrix-master » et lancer la commande de compilation.

cd rpi-rgb-led-matrix-master
sudo apt-get update && sudo apt-get install python2.7-dev python-pillow -y
make build-python
sudo make install-python

o Pour de meilleurs résultats, il faut aussi désactiver le son. Ce n’est pas obligatoire, mais mieux…
Editer le fichier /boot/config.txt (qui est aussi accessible sous windows avec la carte dans un lecteur) et mettre dtparam=audio=off

sudo nano /boot/config.txt

Section : # Enable audio (…)

o Installer un serveur web + php.

sudo apt update
sudo apt upgrade
sudo apt-get install apache2
sudo chown -R pi:www-data /var/www/html/
sudo chmod -R 770 /var/www/html/
sudo apt-get install php

o Donner les droits root à www-data :
Passer et root et éditer le fichier des sudoers :

su
visudo

Ajouter dans la section :# Members of the admin group may gain root privileges

www-data ALL=(ALL) NOPASSWD:ALL

C’est tout prêt… y’a plus qu’à installer l’API !

Installation API :

J’ai écrit un démon python qui scanne en permanence un fichier texte et interprète le contenu pour afficher sur la matrice.
Un fichier php sert d’interface pour une commande via url et écrit dans le fichier texte. Je sais, ce n’est pas très élégant, mais tous les essais que j’ai fait pour communiquer via socket ou multithread ont abouti à un clignotement insupportable de l’affichage…
Un service lance automatiquement le démon au démarrage ou s’il plante.

o Il faut commencer par créer la structure des dossiers utilisés par le serveur web :

cd /var/www/html
mkdir led
cd led
mkdir images
mkdir fonts

o Installer les fichiers de l’API :
La je la fais courte ; prenez le fichier .zip en PJ et mettez les fichiers dans les bons dossiers. Au passage vous y récupérerez des images en exemple et des polices.
Pour cela, vous pouvez utiliser un utilitaire come WinSCP, qui permert de se connecter directement par SSH et transférer des fichier dans le RPi.

html.pdf (346,4 Ko)
(j’ai changé l’extension… il faut y mettre un .7z une fois téléchargé)…

o Ensuite il faut donner tous les droits sur le contenu de html

cd /var/www/html
chmod -R 777 led
chmod 644 configMatrix.php
chmod 644 led99p2.php
chmod 644 index.php

NB : le fichier index.php ne sert qu’à vérifier que votre serveur web fonctionne. Il n’ pas d’utilité dans l’API.

o Avant de créer le service de démarrage auto, il faut tester le démon :

cd /var/www/html/led
sudo python led_daemon.py

=> Si pas d’erreur, et que vous ne récupérerez pas la main dans la console : ça marche… vous pouvez éventuellement envoyer une url via un navigateur pour tester (voir l’api plus loin). Ctrl + C pour quitter l’exécution du démon.

o Créer un service qui démarre automatiquement le démon python

  • Créer le fichier de définition de service :

sudo nano /lib/systemd/system/ledDaemon.service

  • Y mettre ceci :

[Unit]
Description=Adafruit Led display daemon
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /var/www/html/led/led_daemon.py
SyslogIdentifier=ledDaemon
Restart=always

[Install]
WantedBy=multi-user.target

CTRL+O pour sauver / CTRL+X pour sortir.

  • Enregistrer et activer le service

sudo chmod 644 /lib/systemd/system/ledDaemon.service
sudo systemctl daemon-reload
sudo systemctl enable ledDaemon.service
sudo reboot

  • Après reboot, on peut vérifier qu’il a bien démarré :

sudo systemctl status ledDaemon.service

— BONUS —
Vu que j’ai mis un peu de temps à tout configurer, j’ai fait une image de ma carte SD (16Go) sur un RPi3.
L’image disque Pi3 se trouve ici : http://www.lecoin.info/File_hosting/led … ed_99p2.7z
Avec un fichier de hash pour vérifier l’intégrité : http://www.lecoin.info/File_hosting/led … 2_Hash.txt

Version PiZéro (attention pour carte de 16Go au moins) :
Image : http://www.lecoin.info/File_hosting/led … Led_99r.7z
Fichier hash : http://www.lecoin.info/File_hosting/led … r_Hash.txt
NB : sur cette version le fichier php à appeler pour l’API s’appelle led99p2.php . Il faut le renommer en led.php si vous voulez être conforme à la doc de l’API.

Attention : il y a peu de sécurisation sur cette image. Login pi/raspberry, pas de fail2ban, www-data dans sudoers.
Ca suffit largement pour une machine qui reste en local.
Le wifi n’est pas activé.

Pour finir, voici le mode d’emploi pour utiliser l’API. Le démon python scanne le fichier texte une fois par seconde. On peut donc enchaîner les commandes à raison de une toutes les secondes.
L’inconvénient au système est que pour afficher 8 images différentes, il faudra 8 secondes.
Par ailleurs, il y a des fonctions « statiques » (qui affichent quelque chose sur la matrice qui restera jusqu’à effacement) et des fonctions dynamiques (qui vont animer du texte). Le démon étant monotâche, on ne peut utiliser qu’une seule fonction dynamique, et en dernier par rapport à tout ce que l’on veut afficher. Sinon la fonction statique utilisée après la dynamique va supprimer l’animation.

Il est possible d’augmenter le temps de réponse en remplaçant tous les time.sleep(1) par des time.sleep(0.5) (ou moins) dans le fichier /var/www/html/led/led_daemon.py .
Attention : Sur RPi3, avec 1s de délai, il y a un taux d’occupation processeur de 40% (pour celui dédié au python) et un taux de charge à 0.5.
Diminuer cette valeur pourrait mener à un ralentissement de l’affichage, une surchauffe ou non réactivité du RPi. Je sous laisse faire vos essais si vous le souhaitez.

Structure API :

Serveur web Apache2 installé sur le Rpi.
/var/www/html/led.php : pour utiliser l’api via une url
/var/www/html/led/led_daemon.py : lancé en tant que service au boot, prend les infos de led.php via un fichier texte
/var/www/html/led/command.txt => fichier d’échange entre php et python
/var/www/html/led/images => permet de stocker des images pour affichage sur la matrice
/var/www/html/led/fonts => permet de stocker des polices .ttf pour affichage de texte sur la matrice
/var/www/html/led/matrixConfig.txt => fichier d’échange entre php et python pour la taille de la matrice
/var/www/html/led/led_daemon.log => log du démon… il est assez verbeux. 3 mois d’utilisation intensive donnent environ 115Mo de log. Voir à la fin de ce post si vous voulez ne garder que les erreurs.

API led.php : fonctions / paramètres

NB : il est impératif d’encoder les paramètres l’url pour qu’ils passent correctement. Voir site : URL Decoder/Encoder

o Effacer la matrice :

  • command=clear
  • (opt) x1,y1,x2,y2=coordonnées de la fenêtre à effacer
  • (opt)color=couleur de remplissage sur 3 octets RVB (ex : ff00ff pour violet)

Ex: http://192.168.1.8/led99p2.php?command= … &x2=0&y2=0

o Afficher une image :

  • command=image
  • file=chemin absolu du fichier image à afficher
    ou
    file=nom image à afficher (si elle est présente dans /var/www/html/led/images)
  • (opt) positionx=coordonnée en x du coin supérieur gauche dans la matrice
  • (opt) positiony=coordonnée en y du coin supérieur gauche dans la matrice (0 en haut)
  • (opt) levelimg=niveau de luminosité de 0 à 1
  • (opt) clear=1 pour effacer la matrice avant d’afficher; si omis ou autre que 1: n’efface pas et pose par-dessus.

Ex : http://192.168.x.x/led.php?command=imag … 95&clear=1
ou : http://192.168.x.x/led.php?command=imag … 95&clear=1 (si l’image est déjà dans le bon dossier)

o Scrolling de texte :

  • command=scroll
  • (opt) size=taille (hauteur) du texte en pixels
  • (opt si Arial.ttf présente dans ‹ fonts ›) font=chemin absolu du fichier police (ttf) ou nom de la police si elle se trouve déjà dans le bon dossier
  • (opt) leveltxt=niveau de luminosité de 0 à 1
  • (opt) color=couleur du texte sur 3 octets RVB (ex : ff00ff pour violet)
  • (opt) speed=vitesse de défilement (0.5 moins rapide que 3). Le paramètres standard est 1
  • (opt) text=le texte à afficher, encodé correctement pour passer en url

Ex : http://192.168.x.x/led.php?command=scro … %A0%20tous
ou (url abrégée) : http://192.168.x.x/led.php?command=scro … %A0%20tous

o Scrolling de texte partie droite de la matrice:
Attention : cette fonction utilise les ressources du démon en continu, il faut donc la lancer en dernier si on veut positionner des images en partie gauche avant

  • command=scrollRight
  • (opt) size=taille (hauteur) du texte en pixels
  • (opt si Arial.ttf présente dans ‹ fonts ›) font=chemin absolu du fichier police (ttf) ou nom de la police si elle se trouve déjà dans le bon dossier
  • (opt) leveltxt=niveau de luminosité de 0 à 1
  • (opt) color=couleur du texte sur 3 octets RVB (ex : ff00ff pour violet)
  • (opt) speed=vitesse de défilement (0.5 moins rapide que 3). Le paramètres standard est 1
  • (opt) text=le texte à afficher, encodé correctement pour passer en url

Ex : http://192.168.x.x/led.php?command=scro … %A0%20tous
ou (url abrégée) : http://192.168.x.x/led.php?command=scro … %A0%20tous

o Texte statique avec effacement juste de la zone d’affichage :

  • command=statictext
  • (opt) size=taille (hauteur) du texte en pixels
  • (opt id. prec.) font=chemin absolu du fichier police (ttf) ou nom de la police si elle se trouve déjà dans le bon dossier
  • (opt) leveltxt=niveau de luminosité de 0 à 1
  • (opt) color=couleur du texte sur 3 octets RVB (ex : ff00ff pour violet)
  • (opt) positionx=coordonnée en x du coin supérieur gauche dans la matrice
  • (opt) positiony=coordonnée en y du coin supérieur gauche dans la matrice (0 en haut)
  • (opt) text=le texte à afficher, encodé correctement pour passer en url

Attention : « l’enveloppe » (taille globale) du texte nécessitera peut-être d’ajuster la position avec des valeurs négatives

Ex: http://192.168.1.8/led99p2.php?command= … %A0%20tous

o Horloge :

  • command=clock
  • (opt) size=taille (hauteur) du texte en pixels
  • (opt id. prec.) font=chemin absolu du fichier police (ttf) ou nom de la police si elle se trouve déjà dans le bon dossier
  • (opt) leveltxt=niveau de luminosité de 0 à 1
  • (opt) color=couleur du texte sur 3 octets RVB (ex : ff00ff pour violet)
  • (opt) positionx=coordonnée en x du coin supérieur gauche dans la matrice
  • (opt) positiony=coordonnée en y du coin supérieur gauche dans la matrice (0 en haut)

Il est fortement conseillé d’utiliser des polices bitmap pour éviter le flottement vertical de l’affichage (enveloppe variable en .ttf selon les chiffres)

Ex : http://192.168.1.8/led99p2.php?command= … ositiony=5

API configMatrix.php : paramètres

  • taillex=taille de la matrice en pixel en x
  • tailley=taille de la matrice en pixel en y

[Edit] Si le log est trop verbeux à votre goût et vous sature la carte SD (ça peut aller jusqu’à 40Mo/mois), il faut éditer le fichier led_daemon :

sudo nano /var/www/html/led/led_daemon.py

Editer la ligne 9 et la remplacer par ça :

logging.basicConfig(filename=‹ /var/www/html/led/led_daemon.log ›,level=logging.WARNING)

<CTRL + O> puis Y pour sauver puis <CTRL + X> pour quitter.

sudo systemctl stop ledDaemon.service
sudo systemctl start ledDaemon.service

1 « J'aime »

La suite…
Après reconfiguration complète d’un Pi zéro (suivant le tuto ci-dessus et sur Raspbian Stretch lite), cela fonctionne en utilisant le nouveau « Bonnet » Adafruit (voir la liste de courses au post 1) à la place du « Hat ».

J’ai mis à jour le tuto en fonction des différences constatées entre ma version Jessie d’origine et la version Stretch.

La seule problématique est qu’avec un Pi zéro, les scrollings et horloge ont du ‹ clignotement ›… forcément, c’est un processeur moins puissant qu’un Pi3. Néanmoins c’est tout à fait acceptable. J’ai envoyé dessus le template de mon affichage standard et le résultat est identique, à part la partie horloge qui a un tout petit clignotement visible à chaque seconde. Si on a le nez dessus on le voit, sinon ça passe.

Pour ceux qui voudraient se lancer dans l’aventure avec le Pi zéro, il faut un fichier optimisé pour le démon (led_daemon.py). Je le mets en attaché. Il faut enlever l’extension .pdf et dézipper.

led_daemon RPiZero.7z.pdf (2,9 Ko)

(2.87 Kio) Téléchargé 17 fois

Du coup, mon conseil pour la totalité du projet :

  • Un Pi3 : 30€
  • La matrice Sryled : 18.5€
  • Le « bonnet » Adafruit : 15€
  • Une alim 5V, minimum 20W : 13€
  • Boîtier et cooling au choix
    … et si vous êtes à 20€ près, prenez un Pi zéro.

Il est aussi possible de mettre plusieurs matrices bout à bout sur un RPi3…

Voici quelques image du montage à base de Rpi zéroW.

La vue d’ensemble, puis un détail sur le Pi zéro et le « bonnet ».

1-Vue%20ensemble_b

2-RPi%20et%20Bonnet_b

Vous noterez la soudure dont je parle plus haut, entre les GPIO4 et 18 sur le bonnet.
Sur le RPi il faut souder un connecteur 2x20 broches. Le mieux est de brancher le connecteur dans la partie femelle sur le bonnet, pour tenir le tout avant de souder 2 pins en diagonale sur le RPi, puis on peut terminer les 38 restantes.

L’assemblage entre le Bonnet et le RPi :
3-Assemblage1_b

4-Assemblage2_b
L’alim se branche directement sur le bonnet, qui alimente le Pi.

Les branchements sur la matrice : puissance et bus :
5-Branchements_b

Et le tout comprimé pour tenir dans la surface de la matrice…
6-Tout%20ranger_b

Voici le résultat final de la version Pi zéro avec un boitier imprimé en 3D :

7-Boitier1

8-Boitier2

C’est du résultat brut… je n’ai pas poncé les pièces.

Pour ceux que cela intéresse, voici les fichiers 3D (FreeCAD pour les originaux, plus les .stl). Comme vu plus tôt, il faut enlever l’extension .pdf et dézipper :

Boitier Afficheur Leds Pi0.7z.pdf (206,3 Ko)

J’ai aussi fini par le poster sur Thingiverse : Enclosure for RGB Led matrix display by Theduck38 - Thingiverse

Le principe de fonctionnement scénario / virtuel dans mon cas :

J’ai fait le choix de mettre la température intérieure, extérieure, une image ‹ contextuelle › 16x16px, et une horloge en haut.

  • Il y a un scénario « maître » qui permet de basculer la petite image de soleil en lune (devant la temp ext.), de changer la luminosité de toute la matrice pour la nuit, de déterminer si les températures montent ou descendent, d’afficher l’image contextuelle en bas à droite, selon le contexte.
  • Puis deux sous-scénarios qui rafraîchissent la totalité de la matrice ou juste les températures.

Je rafraichis la totalité toutes les demi-heures, les températures quand elles changent (scénario maître, appelle le sous scénario qui ne change que les températures), l’image contextuelle (genre quand j’ouvre mon garage pour me l’afficher)…

Tout est stocké dans des variables : les niveaux de luminosité jour / nuit, le nom des image à afficher (soleil / lune / image contextuelle), les tendances des températures (pour faire des flèches j’ai du redessiner 2 caractères dans une police : ö et ä), la sauvegarde de l’image contextuelle en cas de modif temporaire (garage).

Du coup, mon virtuel ne sert qu’à contrôler simplement les niveaux de luminosité et les images que j’affiche.

Le virtuel (voir post suivant pour le détail) :
file

Les scénarios :

ATTENTION : les scénarios utilisent le Framework « SC » de @dJuL .
Voir ici pour l’installer.

Mon virtuel s’appelle #[Maison][Leds]#.

  • Scénario maître :
    – Nom du scénario : Led_Gestion
    – Objet parent : Maison
    – Mode du scénario : all

    • Programmation : */30 * * * *
    • Evènement : #[Extérieur][T-H Extérieure][Température]#
    • Evènement : #[Garage][ESP2 Porte Garage][Porte Garage]#
    • Evènement : #[Salon][T-H-P Salon][Température]#
    • Evènement : #[Maison][Leds][NiveauNuit]#
    • Evènement : #[Maison][Leds][NiveauJour]#

    – CODE :

   SI #[Maison][Leds][Mode Auto]# == 1  
    ALORS
        SI tendance(#[Extérieur][T-H Extérieure][Température]#, 1 hour,0,1)==1
        ALORS
         (variable) Affectation de la variable : TendanceTempExt_41 à ö
        SINON
         (variable) Affectation de la variable : TendanceTempExt_41 à ä
         
        SI tendance(#[Salon][T-H-P Salon][Température]#, 1 hour,0,1)==1
        ALORS
         (variable) Affectation de la variable : TendanceTempInt_41 à ö
        SINON
         (variable) Affectation de la variable : TendanceTempInt_41 à ä
         
        SI #time# >=#[Extérieur][Héliotrope Allevard][Coucher du Soleil]# OU #time# <= #[Extérieur][Héliotrope Allevard][Lever du Soleil]#
        ALORS
         (variable) Affectation de la variable : Dim_41 à #2284#/100
         (variable) Affectation de la variable : ImExt_41 à Lune-8x8.png
             
            SI trigger(#[Extérieur][T-H Extérieure][Température]#)==1 OU trigger(#[Salon][T-H-P Salon][Température]#)==1
            ALORS
             (scenario) start de [Maison][Appareils][Led_Template]
             (scenario) start de [Maison][Appareils][Led_Template2]
                 
                comment
            SINON
        SINON
         (variable) Affectation de la variable : Dim_41 à #2283#/100
         (variable) Affectation de la variable : ImExt_41 à Soleil-8x8.png
             
            SI trigger(#[Extérieur][T-H Extérieure][Température]#)==1 OU trigger(#[Salon][T-H-P Salon][Température]#)==1
            ALORS
             (scenario) start de [Maison][Appareils][Led_Template]
             (scenario) start de [Maison][Appareils][Led_Template2]
            SINON
         
        SI trigger(#[Garage][ESP2 Porte Garage][Porte Garage]#)==1
        ALORS
             
            SI #[Garage][ESP2 Porte Garage][Porte Garage]# == 0
            ALORS
             (variable) Affectation de la variable : Save_41 à #2208#
             #[Maison][Leds][SetImage16x16]# - Options : {"enable":"1","background":"0","select":"GarageOpen-16x16.png"}
            SINON
             #[Maison][Leds][Restore]# - Options : {"enable":"1","background":"0"}
        SINON
         
        SI trigger(#[Maison][Leds][NiveauNuit]#)===1 OU trigger(#[Maison][Leds][NiveauJour]#)===1 
        ALORS
             
            SI #time# >=#[Extérieur][Héliotrope Allevard][Coucher du Soleil]# OU #time# <= #[Extérieur][Héliotrope Allevard][Lever du Soleil]#
            ALORS
             (variable) Affectation de la variable : Dim_41 à #2284#/100
            SINON
             (variable) Affectation de la variable : Dim_41 à #2283#/100
         (scenario) start de [Maison][Appareils][Led_Template]
         (scenario) start de [Maison][Appareils][Led_Template2]
        SINON
         
        SI (trigger(#[Extérieur][T-H Extérieure][Température]#)==1 OU trigger(#[Salon][T-H-P Salon][Température]#)==1) ET scenario(#[Maison][Appareils][Led_Template]#)==0 
        ALORS
         (scenario) start de [Maison][Appareils][Led_Refresh_TH]
        SINON
         
        SI trigger(schedule)==1
        ALORS
         (scenario) start de [Maison][Appareils][Led_Template]
         (scenario) start de [Maison][Appareils][Led_Template2]
        SINON
    SINON
  • Scénario « Refresh total » :
    – Nom du scénario : Led_Template
    – Objet parent : Maison
    – Mode du scénario : provoke

    • Evènement : #[Maison][Leds][dyn]#
    • Evènement : #[Maison][Leds][Image]#
    • Evènement : #[Maison][Leds][Couleur]#

    – CODE :

$dim=$sc->getVar('Dim_41');
$image=$sc->getVar('ImExt_41');
$image1=$sc->getCmd("#[Maison][Leds][Image]#");
if ($image1=="") {
  $image1="Heart-16x16.png";
}
$tempExt=$sc->getCmd("#[Extérieur][T-H Extérieure][Température]#",true,null);
$tempInt=$sc->getCmd("#[Salon][T-H-P Salon][Température]#",true,null);
$tendTExt=$sc->getVar('TendanceTempExt_41');
$tendTInt=$sc->getVar('TendanceTempInt_41');
$colorClock=$sc->getCmd("#[Maison][Leds][Couleur]#");
//Enlever le # à la couleur
$colorClock=substr($colorClock,1,6);
//Traitement couleur température
if (floatval($tempExt)<=0) {$colorExt='00ffff';}
if (floatval($tempExt)>0 and floatval($tempExt)<14) {$colorExt='004dff';}
if (floatval($tempExt)>=14 and floatval($tempExt)<28) {$colorExt='00ff80';}
if (floatval($tempExt)>=28 and floatval($tempExt)<34) {$colorExt='ffd500';}
if (floatval($tempExt)>=34) {$colorExt='ff0000';}
if (floatval($tempInt)<=16) {$colorInt='00ffff';}
if (floatval($tempInt)>16 and floatval($tempInt)<25) {$colorInt='00ff80';}
if (floatval($tempInt)>=25 and floatval($tempInt)<30) {$colorInt='ffd500';}
if (floatval($tempInt)>=30) {$colorInt='ff0000';}
//Correction bug affichage nombres ronds
if (strpos($tempExt,'.')===false) {$tempExt=$tempExt . '.0';}
if (strpos($tempInt,'.')===false) {$tempInt=$tempInt . '.0';}
//Icone Soleil ou Lune 
$url='http://192.168.1.8/led99p2.php?command=image&file=' . $image . '&positionx=0&positiony=15&levelimg=' . $dim . '&clear=1';
$lines = file($url);
sleep(1);
//Icone Maison
$url='http://192.168.1.8/led99p2.php?command=image&file=Maison2-8x8.png&positionx=0&positiony=24&levelimg=' . $dim . '&clear=0';
$lines = file($url);
sleep(1);
//Texte Temp Exterieure
$url='http://192.168.1.8/led99p2.php?command=statictext&size=14&font=5x8.pil&leveltxt=' . $dim . '&color=' . $colorExt . '&positionx=9&positiony=15&text=' . $tempExt . '°C' . $tendTExt;
$lines = file($url);
sleep(1);
//Texte Temp Intérieure
$url='http://192.168.1.8/led99p2.php?command=statictext&size=14&font=5x8.pil&leveltxt=' . $dim . '&color=' . $colorInt . '&positionx=9&positiony=24&text=' . $tempInt . '°C' . $tendTInt;
$lines = file($url);
sleep(1);
// Image bas droite
$url='http://192.168.1.8/led99p2.php?command=image&file=' . $image1 . '&positionx=48&positiony=16&levelimg=' . $dim . '&clear=0';
$lines = file($url);
sleep(1);
//Clock
$url='http://192.168.1.8/led99p2.php?command=clock&size=12&font=7x13B.pil&leveltxt=' . $dim . '&color=' . $colorClock . '&positionx=4&positiony=1';
$lines = file($url);
sleep(1);
  • Scénario « refresh températures » :
    – Nom du scénario : Led_Refresh_TH
    – Objet parent : Maison
    – Mode du scénario : provoke
    – CODE :
$dim=$sc->getVar('Dim_41');
$tempInt=$sc->getCmd("#[Salon][T-H-P Salon][Température]#",true,null);
$tempExt=$sc->getCmd("#[Extérieur][T-H Extérieure][Température]#",true,null);
$tendTExt=$sc->getVar('TendanceTempExt_41');
$tendTInt=$sc->getVar('TendanceTempInt_41');
$colorClock=$sc->getCmd("#[Maison][Leds][Couleur]#");
//Enlever le # à la couleur
$colorClock=substr($colorClock,1,6);
//Traitement couleur température
if (floatval($tempExt)<=0) {$colorExt='00ffff';}
if (floatval($tempExt)>0 and floatval($tempExt)<14) {$colorExt='004dff';}
if (floatval($tempExt)>=14 and floatval($tempExt)<28) {$colorExt='00ff80';}
if (floatval($tempExt)>=28 and floatval($tempExt)<34) {$colorExt='ffd500';}
if (floatval($tempExt)>=34) {$colorExt='ff0000';}
if (floatval($tempInt)<=16) {$colorInt='00ffff';}
if (floatval($tempInt)>16 and floatval($tempInt)<25) {$colorInt='00ff80';}
if (floatval($tempInt)>=25 and floatval($tempInt)<30) {$colorInt='ffd500';}
if (floatval($tempInt)>=30) {$colorInt='ff0000';}
//Correction bug affichage nombres ronds
if (strpos($tempExt,'.')===false) {$tempExt=$tempExt . '.0';}
if (strpos($tempInt,'.')===false) {$tempInt=$tempInt . '.0';}
//Texte Temp Exterieure
$url='http://192.168.1.8/led99p2.php?command=statictext&size=14&font=5x8.pil&leveltxt=' . $dim . '&color=' . $colorExt . '&positionx=9&positiony=15&text=' . $tempExt . '°C' . $tendTExt;
$lines = file($url);
sleep(1);
//Texte Temp Intérieure
$url='http://192.168.1.8/led99p2.php?command=statictext&size=14&font=5x8.pil&leveltxt=' . $dim . '&color=' . $colorInt . '&positionx=9&positiony=24&text=' . $tempInt . '°C' . $tendTInt;
$lines = file($url);
sleep(1);
//Clock
$url='http://192.168.1.8/led99p2.php?command=clock&size=12&font=7x13B.pil&leveltxt=' . $dim . '&color=' . $colorClock . '&positionx=4&positiony=1';
$lines = file($url);
  • J’ai un scénario qui affiche juste une image plein écran :
    – Nom du scénario : Led_Static
    – Objet parent : Maison
    – Mode du scénario : provoke

    • Evènement : #[Maison][Leds][static]#

    – CODE :

$image1=$sc->getCmd("#[Maison][Leds][ImageFull]#");
if ($image1=="") {
  $image1="Sauron2-32x64.png";
}
// Image Full screen
$url='http://192.168.1.8/led99p2.php?command=image&file=' . $image1 . '&positionx=0&positiony=0&levelimg=0.6&clear=0';
$lines = file($url);

Le code donne, avec l’ordre d’affichage :

Toute la structure ci-dessus fonctionne avec le virtuel en image en début du post précédent.
Voici son contenu :



Et les variables :

Je pense que ça suffira pour la 3ème édition de ce tuto (le premier avait été victime de la « faucheuse de vieux sujets »…)

Si ceux qui ont réalisé ce montage pouvaient poster quelques images de leur intégration, ce serait cool !

1 « J'aime »

je m’y attèle :wink: demain je posterai quelques photos

Énorme !!! Un grand bravo encore une fois :clap:t3::clap:t3::clap:t3:

Super tuto vachement complet ça donne envie de s’y atteler !!! …faut que je pose des jours :grin:

Une tofs de chez moi… Ça commence a être blindé d’infos ici. Un vrai addict

Cool, sympa la photo ! Merci !

Merci à toi pour le tuto

Félicitations, le résultat est excellent.
Mon Jeedom est sur un RPi3 B+ et je voudrais installer un système d’affichage comme celui ci et un assistant vocal du type Snips. Pour éviter de multiplier les appareils, pensez vous que je puisse réunir un système d’affichage RGB et un assistant vocal sur un seul RPi3 (Jeedom restant sur un autre RPi3)?

Merci !

Je n’ai aucune idée de la charge induite par snips. Mon démon charge environ 40% d’un des 4 processeurs d’un RPi3B. J’aurais tendance à dire qu’il y a de la marge… mais sans garantie que ça ne va pas faire clignoter l’affichage si c’est du dynamique :thinking:

En revanche, attention : mon tuto demande de désactiver les fonctions audio du RPi :

Bonjour,

J’ai repris les liens vers des fichier « non image » qui pointaient sur l’ancien forum… ceux-ci ont tendance à disparaître… Tout est à nouveau dispo pour ceux qui souhaiteraient se lancer dans l’aventure.