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

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 :