[TUTO] Partage d'informations entre BASH et Gladys

TUTO n°2 : Lancer une commande BASH via à une action Gladys.
L’idée est de surveiller le topic d’un appareil Gladys depuis BASH et d’exécuter les commandes adéquates.


Côté Gladys :

  1. Création de l’appareil :
    Nom : Appel BASH
    Id externe : mqtt:Salle:AppelBASH
    Pièce : Salle

  2. Ajout d’une fonctionnalité de type Clic bouton (par exemple) :
    Nom : Appel BASH
    ID externe de la fonctionnalité : mqtt:AppelBASH:Action
    Valeur min : 0
    Valeur max : 9 (Permettra 10 actions différentes)
    Conserver l’historique des états : Oui
    Est-ce un capteur : Non
    Topic MQTT à écouter : Vous pouvez vous mettre de côté le topic qui servira plus loin.

  3. Définir une scène :
    Déclencheur : Celui de votre choix (comme le changement d’état d’un vrai bouton par exemple).
    Action : Contrôler un appareil.
    Appareil : Appel BASH
    Valeur : 1 (entre 0 et 9)

Il ne restera plus qu’à déclencher la scène une fois les scripts BASH terminés.


Côté scripts BASH.

  1. Reprise du script commun /opt/mosquitto/MQTTConfig.sh du TUTO n°1.

  2. Création du script /opt/mosquitto/GladysToBash.sh :
    Il sera à l’écoute du topic de l’appareil créé dans Gladys.

#!/bin/bash

#####################################################################
## Surveillance d'un topic Gladys avec execution de commandes BASH ##
#####################################################################

### Variables à personnaliser
# Il faut personnaliser le CASE de la boucle WHILE.

# Adresse du topic de l'appareil
# Disponible dans Gladys > Intégration > MQTT > Appareils > Appel BASH > Clic Bouton > Topic MQTT à écouter
Topic="gladys/device/mqtt:salle:AppelBASH/feature/mqtt:AppelBASH:Action/state"
### Variables à personnaliser

# Chargement du fichier commun
source /opt/mosquitto/MQTTConfig.sh

# Nécessite la commande mosquitto_sub du paquet mosquitto-clients
! CommandCheck "mosquitto_sub:mosquitto-clients" && exit 1

echo "Le script attend de recevoir les commandes de Gladys." 1>&2
echo "Il ne rend la main que si des break et exit sont intégrés à la boucle while." 1>&2

# Boucle écoutant en permanence le topic de l'appareil de Gladys
# -u User : Utilisateur pour la connexion au brocker MQTT, provient du fichier MQTTConfig.sh
# -P Pass : Mot de passe pour la connexion au brocker MQTT, provient du fichier MQTTConfig.sh
# -t Topic : Adresse du Topic de l'appareil créé dans Gladys, définit en début de script
# Récupération des retours dans la variable Value
while read Value
do
    # Saut de traitement si Value n'est pas comprise entre 0 et 9
    if [[ "${Value}" != [0-9] ]]
    then
        echo -e "[${ORANGE}Attention${RAZ}] Valeur ${Value} inconnue..." 1>&2
        continue
    fi

    echo -e "[${FUCHSIA}$(date +'%x %X')${RAZ}] Exécution de la commande n°${Value}."

    # Case servant à réaliser la bonne action en fonction de Value
    # Utilisation d'echo pour ne pas vraiment exécuter les commandes avec ce TUTO
    case "${Value}" in
        # Reboot du Raspberry
        0) echo sudo reboot ;;

        # Réveil d'un pc via WakeOnLine en arrière plan pour ne pas bloquer la boucle
        1) echo wakeonlan XX:YY:ZZ:ZZ:YY:XX & ;;

        # Lancement d'une alarme via un fichier wav dans vlc en arrière plan pour ne pas bloquer la boucle
        2) echo vlc "/opt/alarme.wav" & ;;

        # Kill de toutes les commandes vlc
        3) echo killall vlc ;;

        # Toutes autres actions de votre choix...
        [3-9]) echo "Réalisation de l'action ${Value}.";;
    esac
done < <(mosquitto_sub -u "${User}" -P "${Pass}" -t "${Topic}")

Il faut adapter les variables entre ### Variables à personnaliser ainsi que les actions dans le case de la boucle while.

Pour info, il est possible de préciser le nombre de retour attendu par mosquitto_sub avant qu’il rende la main :

mosquitto_sub -u "${User}" -P "${Pass}" -t "${Topic}" -C x # Où x vaut le nombre de retour
  1. Exécution du script :

Il suffit d’appeler le script via un simple :

bash /opt/mosquitto/GladysToBash.sh

Le script ne rend pas la main sur le prompt, c’est normal, la boucle est infinie.
Il affiche :

Le script attend de recevoir les commandes de Gladys.
Il ne rend la main que si des break et exit sont intégrés à la boucle while.

  1. Exécution de la scène voulue depuis Gladys :

Rien de particulier ici, il suffit d’exécuter la scène manuellement ou via un autre appareil.
Le shell affiche alors :

[16/02/2023 11:35:05] Exécution de la commande n°5.
[16/02/2023 11:35:55] Exécution de la commande n°2.
[16/02/2023 11:45:55] Exécution de la commande n°3.

Si tout est fonctionnel, il ne reste plus qu’à exécuter le script au démarrage du Raspberry.


Autres tuto :

TUTO n°1 : Afficher la température du Raspberry dans Gladys.

TUTO n°3 : Indiquer la présence d’un utilisateur via le WI-FI de son téléphone.

TUTO n°4 : Gestion de son robot aspirateur sous Valetudo dans Gladys.

7 « J'aime »