[TUTORIAL] Informationsaustausch zwischen BASH und Gladys

Hallo,

ich schlage Ihnen 2 TUTORIALS vor, die erklären, wie man BASH-Befehle verwendet, um Daten an Gladys zu senden und zu empfangen.

BASH ist einfach zu verwenden und ist in vielen GNU/Linux-Systemen (wie Raspberry) vorhanden und wird in jedem Fall für eine andere SHELL reproduzierbar sein.
Es ermöglicht die Ausführung beliebiger Systembefehle und die Verwaltung des gesamten PCs.

Zur Kommunikation muss das Protokoll MQTT verwendet werden.
Gladys bietet sehr freundlich an, einen MQTT-Broker in einem Docker-Container mit einem Klick über Integration > MQTT > Konfiguration > Verwenden eines Brokers in einem Docker-Container zu installieren.

Sobald installiert, können Geräte über Integration > MQTT > Geräte > Neu erstellt werden.


TUTORIAL Nr. 1: Anzeigen der Raspberry-Temperatur in Gladys.
Die Idee ist also, die Temperatur des Raspberry mit einem BASH-Skript abzurufen und an Gladys zu senden.


Gladys-Seite:

  1. Erstellung des Geräts:
    Name: Raspberry-Temperatur
    Externe ID: mqtt:Raum:RaspTemp (mqtt:Raum:Element)
    Raum: Raum

  2. Hinzufügen einer Funktionalität des Typs:
    Name: Raspberry-Temperatur
    Externe ID der Funktionalität: mqtt:RaspTemp:temp (mqtt:Element:Funktion)
    Einheit: °C
    Minimalwert: 0 (um diese Temperatur zu erreichen, kühlen Sie ihn mit Stickstoff…)
    Maximalwert: 110 (perfekt, um ihn als Heizung zu verwenden)
    Zustandshistorie speichern: Ja
    Ist dies ein Sensor: Ja
    MQTT-Topic zum Veröffentlichen: Sie können sich das Topic, das später verwendet wird, zur Seite legen.

  3. Hinzufügen des Geräts zum Dashboard:

Hier gibt es nichts Spezifisches, Sie müssen wie gewohnt vorgehen.

Das war’s mit Gladys :slight_smile:


BASH-Seite:
Gehen wir zu den BASH-Skripten über, die ich in /opt/mosquittos/ (oder einem anderen Ort Ihrer Wahl, aber Sie müssen die Adressen anpassen) ablegen werde.

Ich kommentiere so viel wie möglich den gesamten Code, damit er möglichst verständlich ist, zögern Sie nicht, ihn zu lesen.

  1. Erstellung eines gemeinsamen Skripts /opt/mosquitto/MQTTConfig.sh:

Es wird von den anderen (verschiedenen TUTORIALS) importiert und enthält:
Eine Funktion, die die erforderlichen Befehle und Pakete (für Ubuntu) im Falle eines Falles testet.
Die Anmeldeinformationen für den MQTT-Broker, der von Gladys über Integration > MQTT > Konfiguration erstellt wurde.
Variablen zum Färben der Rückmeldungen.

#!/bin/bash

#############################################
## Datei zum Sourcen in MQTT-Skripten ##
#############################################

### Variablen zum Anpassen
# Verbindung zum MQTT-Broker
User="gladys"
Pass="XYZ"
### Variablen zum Anpassen


function CommandCheck()
{
    # Funktion zum Überprüfen der Anwesenheit der erforderlichen Befehle
    # Parameter: Name des Befehls und des Pakets (optional) durch : getrennt
        # Ex: mosquitto_pub:mosquitto-clients

    # Wenn kein Parameter angegeben wird
    [[ -z ${1} ]] && return 1

    # Begrenzung der Variablen auf die Funktion
    local Command Package Parameter ReturnValue
    ReturnValue=0

    # Verarbeitung aller Parameter
    for Parameter in "${@}"
    do
        Command="${Parameter%%:*}"
        Package="${Parameter##*:}"

        # Wenn der Befehl nicht existiert
        if ! which ${Command} &>/dev/null
        then
            # Rückgabewert auf 1 setzen, um alle echo-Anweisungen vor dem Stoppen anzuzeigen
            ReturnValue=1

            echo -e "[${ROUGE}Fehler${RAZ}] Skript wird gestoppt, da der Befehl ${BLEUFONCE}${Command}${RAZ} nicht gefunden wurde." 1>&2

            # Wenn ein Paket angegeben wird
            [[ ${Package} ]] && echo -e "Für Ubuntu: ${FUCHSIA}sudo apt-get install ${Package}${RAZ}" 1>&2
        fi
    done

    return ${ReturnValue}
}

# Farben für die Anzeige der Rückmeldungen
FUCHSIA="\e[1;35m"
RAZ="\e[m"
BLEUFONCE="\e[1;34m"
ROUGE="\e[1;31m"
ORANGE="\e[1m\[\e[38;5;202m\]"

Es müssen nur die Variablen zwischen ### Variablen zum Anpassen angepasst werden.

  1. Erstellung des Skripts /opt/mosquitto/BashToGladys.sh:

Sein Zweck ist es, die Temperatur des Raspberry in regelmäßigen Abständen abzurufen und diese Information an Gladys zu senden.

#/bin/bash

###################################################
## Senden der Raspberry-Temperatur an Gladys ##
###################################################

### Variablen zum Anpassen
# Anzahl der Sekunden zwischen den Temperaturabfragen
# Ein kleiner Wert ist keine sehr gute Idee...
TimeOut=60

# Adresse des Topics des Geräts
# Verfügbar in Gladys > Integration > MQTT > Geräte > Raspberry-Temperatur > Temperatur > MQTT-Topic zum Veröffentlichen
Topic="gladys/master/device/mqtt:Raum:RaspTemp/feature/mqtt:RaspTemp:temp/state"
### Variablen zum Anpassen

# Laden der gemeinsamen Datei
source /opt/mosquitto/MQTTConfig.sh

# Überprüfung der Anwesenheit der Befehle, die bei Abwesenheit das Skript stoppen
# Benötigt den Befehl mosquitto_pub des Pakets mosquitto-clients
! CommandCheck "mosquitto_pub:mosquitto-clients" && exit 1

# Blockiert das Skript, wenn der TimeOut kleiner als 1 ist
if [[ ${TimeOut:-0} -lt 1 ]]
then
    echo -e "[${ROUGE}Fehler${RAZ}] Der TimeOut ist unangemessen." 1>&2
    exit 1
fi

# Endlosschleife
while true
do
    # Abrufen der Temperatur des Raspberry
    Temperature=$(/usr/bin/vcgencmd measure_temp)
    Temperature=${Temperature//[^0-9.]/}

    # Wenn die Variable nicht leer ist
    if [[ ${Temperature} ]]
    then
        # Anzeige der Info in der SHELL
        echo -e "[${FUCHSIA}$(date +'%x %X')${RAZ}] Die Temperatur des Raspberry beträgt ${BLEUFONCE}${Temperature}°c${RAZ}."

        # Senden der Information an Gladys mit mosquitto_pub
        # -u User: Benutzername für die Verbindung zum MQTT-Broker, stammt aus der Datei MQTTConfig.sh
        # -P Pass: Passwort für die Verbindung zum MQTT-Broker, stammt aus der Datei MQTTConfig.sh
        # -t Topic: Adresse des Topics des Geräts, das in Gladys erstellt wurde, definiert zu Beginn des Skripts
        # -m Temperature: Verwendung der Temperatur
        mosquitto_pub -u "${User}" -P "${Pass}" -t "${Topic}" -m "${Temperature}"

        # Abrufen des Rückgabewerts des Befehls mosquitto_pub
        MosquittoReturns=${?}

        # Anzeige des MQTT-Fehlercodes, wenn der Rückgabewert > 0 ist
        (( ${MosquittoReturns} )) && echo -e "[${ROUGE}Fehler${RAZ}] Der Befehl mosquitto_sub hat den Code ${MosquittoReturns} zurückgegeben." 1>&2

    # Wenn die Temperaturvariable leer ist
    else
        # Anzeige einer Fehlermeldung
        echo -e "[${ROUGE}Fehler${RAZ}] Temperatur nicht abgerufen." 1>&2
    fi

    # Pause des Skripts für die angeforderte Zeit
    sleep "${TimeOut}"
done

Es müssen nur die Variablen zwischen ### Variablen zum Anpassen angepasst werden.

  1. Ausführung des Skripts:

Es reicht ein einfaches:

bash /opt/mosquitto/BashToGladys.sh

Mit einem TimeOut von 60 Sekunden zeigt es dann an:

[16/02/2023 10:35:05] Die Temperatur des Raspberry beträgt 39.4°C.
[16/02/2023 10:36:05] Die Temperatur des Raspberry beträgt 40.4°C.
[16/02/2023 10:37:05] Die Temperatur des Raspberry beträgt 40.4°C.
[16/02/2023 10:38:05] Die Temperatur des Raspberry beträgt 39.9°C.
…

Und der Wert wird in Gladys tatsächlich aktualisiert.

Wenn der Befehl mosquitto_pub nicht existiert, zeigt das Skript an:

[Fehler] Skript wird gestoppt, da der Befehl mosquitto_pub nicht gefunden wurde.
Für Ubuntu: sudo apt-get install mosquitto-clients

Wenn alles funktioniert, bleibt nur noch, das Skript beim Start des Raspberry auszuführen (crontab oder anderes).

Einschränkung:
Es ist nur möglich, Zahlen und Dezimalzahlen an Gladys zu senden.
Text zu senden funktioniert nicht, es wird kein Fehler ausgegeben, aber nichts wird angezeigt.


Weitere Tutorials:

TUTORIAL Nr. 2: Ausführen eines BASH-Befehls über eine Gladys-Aktion., in der Nachricht unten.

TUTORIAL Nr. 3: Anzeigen der Anwesenheit eines Benutzers über das WI-FI seines Telefons.

TUTO Nr. 4: Verwaltung Ihres Robotersaugers unter Valetudo in Gladys.

TUTORIAL Nr. 2: Ein BASH-Befehl über eine Gladys-Aktion ausführen.
Die Idee ist es, das Topic eines Gladys-Geräts von BASH aus zu überwachen und die entsprechenden Befehle auszuführen.


Gladys-Seite:

  1. Erstellung des Geräts:
    Name: BASH-Aufruf
    Externe ID: mqtt:Raum:BashAufruf
    Raum: Raum

  2. Hinzufügen einer Funktionalität vom Typ Button-Click (z.B.):
    Name: BASH-Aufruf
    Externe ID der Funktionalität: mqtt:BashAufruf:Aktion
    Minimalwert: 0
    Maximalwert: 9 (ermöglicht 10 verschiedene Aktionen)
    Zustandshistorie speichern: Ja
    Ist dies ein Sensor: Nein
    MQTT-Topic zum Abhören: Sie können das Topic beiseitelegen, das später verwendet wird.

  3. Eine Szene definieren:
    Auslöser: Der von Ihnen gewählte (z.B. die Zustandsänderung eines echten Buttons).
    Aktion: Gerät steuern.
    Gerät: BASH-Aufruf
    Wert: 1 (zwischen 0 und 9)

Es bleibt nur noch, die Szene auszulösen, sobald die BASH-Skripte abgeschlossen sind.


BASH-Skript-Seite.

  1. Wiederaufnahme des gemeinsamen Skripts /opt/mosquitto/MQTTConfig.sh aus TUTORIAL Nr. 1.

  2. Erstellung des Skripts /opt/mosquitto/GladysToBash.sh:
    Es wird das Topic des in Gladys erstellten Geräts abhören.

#!/bin/bash

#####################################################################
## Überwachung eines Gladys-Topics mit Ausführung von BASH-Befehlen ##
#####################################################################

### Variablen zur Anpassung
# Der CASE der WHILE-Schleife muss angepasst werden.

# Adresse des Gerätetopics
# Verfügbar in Gladys > Integration > MQTT > Geräte > BASH-Aufruf > Button-Click > MQTT-Topic zum Abhören
Topic="gladys/device/mqtt:raum:BashAufruf/feature/mqtt:BashAufruf:Aktion/state"
### Variablen zur Anpassung

# Laden der gemeinsamen Datei
source /opt/mosquitto/MQTTConfig.sh

# Benötigt den Befehl mosquitto_sub des Pakets mosquitto-clients
! CommandCheck "mosquitto_sub:mosquitto-clients" && exit 1

echo "Das Skript wartet auf Befehle von Gladys." 1>&2
echo "Es gibt die Kontrolle nur zurück, wenn break und exit in die while-Schleife integriert sind." 1>&2

# Schleife, die ständig das Topic des Gladys-Geräts abhört
# -u User: Benutzername für die Verbindung zum MQTT-Broker, stammt aus der Datei MQTTConfig.sh
# -P Pass: Passwort für die Verbindung zum MQTT-Broker, stammt aus der Datei MQTTConfig.sh
# -t Topic: Adresse des in Gladys erstellten Topics, definiert zu Beginn des Skripts
# Rückgaben in der Variablen Value abrufen
while read Value
do
    # Verarbeitung überspringen, wenn Value nicht zwischen 0 und 9 liegt
    if [[ "${Value}" != [0-9] ]]
    then
        echo -e "[${ORANGE}Warnung${RAZ}] Wert ${Value} unbekannt..." 1>&2
        continue
    fi

    echo -e "[${FUCHSIA}$(date +'%x %X')${RAZ}] Ausführung des Befehls Nr. ${Value}."

    # Case zur Durchführung der richtigen Aktion basierend auf Value
    # Verwendung von echo, um die Befehle mit diesem TUTORIAL nicht wirklich auszuführen
    case "${Value}" in
        # Neustart des Raspberry
        0) echo sudo reboot ;;

        # Aufwecken eines PCs über WakeOnLine im Hintergrund, um die Schleife nicht zu blockieren
        1) echo wakeonlan XX:YY:ZZ:ZZ:YY:XX & ;;

        # Auslösen eines Alarms über eine WAV-Datei in VLC im Hintergrund, um die Schleife nicht zu blockieren
        2) echo vlc "/opt/alarm.wav" & ;;

        # Beenden aller VLC-Befehle
        3) echo killall vlc ;;

        # Alle anderen Aktionen nach Wahl...
        [3-9]) echo "Ausführung der Aktion ${Value}.";;
    esac
done < <(mosquitto_sub -u "${User}" -P "${Pass}" -t "${Topic}")

Die Variablen zwischen ### Variablen zur Anpassung sowie die Aktionen im case der while-Schleife müssen angepasst werden.

Hinweis: Es ist möglich, die Anzahl der Rückgaben anzugeben, die von mosquitto_sub erwartet werden, bevor es die Kontrolle zurückgibt:

mosquitto_sub -u "${User}" -P "${Pass}" -t "${Topic}" -C x # wobei x die Anzahl der Rückgaben ist
  1. Ausführung des Skripts:

Es reicht aus, das Skript mit einem einfachen Aufruf zu starten:

bash /opt/mosquitto/GladysToBash.sh

Das Skript gibt die Kontrolle an die Eingabeaufforderung nicht zurück, das ist normal, die Schleife ist unendlich.
Es zeigt an:

Das Skript wartet auf Befehle von Gladys.
Es gibt die Kontrolle nur zurück, wenn break und exit in die while-Schleife integriert sind.

  1. Ausführung der gewünschten Szene von Gladys aus:

Hier gibt es nichts Besonderes, es reicht aus, die Szene manuell oder über ein anderes Gerät auszuführen.
Die Shell zeigt dann an:

[16/02/2023 11:35:05] Ausführung des Befehls Nr. 5.
[16/02/2023 11:35:55] Ausführung des Befehls Nr. 2.
[16/02/2023 11:45:55] Ausführung des Befehls Nr. 3.

Wenn alles funktioniert, bleibt nur noch, das Skript beim Starten des Raspberry auszuführen.


Weitere Tutorials:

TUTORIAL Nr. 1: Anzeigen der Temperatur des Raspberry in Gladys.

TUTORIAL Nr. 3: Anzeigen der Anwesenheit eines Benutzers über das WLAN seines Telefons.

TUTORIAL Nr. 4: Verwaltung eines Robotersaugers unter Valetudo in Gladys.

Super alles das! Super Arbeit und super Erklärungen, vielen Dank!!! :+1:

Danke für deinen Beitrag @Hizo! :pray: Super Tuto :slight_smile:

Danke @Hizo das wird mir sehr nützlich sein, ich wollte das schon lange machen, hatte aber keine Zeit dafür.
:folded_hands::folded_hands:

Da es so lange gedauert hat, bis ich den Ablauf verstanden habe (ich bin etwas langsam im Kopf…), dachte ich, dass es anderen sicherlich Zeit spart.

Und es ist eine Möglichkeit, meinen Beitrag zu diesem guten Programm zu leisten.

Und als Linux-Nutzer ist es auch eine Möglichkeit, etwas zurückzugeben, was mir die Leute geben.

Jedenfalls zögern Sie nicht, mir Feedback zu geben, wenn Sie sich darauf stützen.

Der TUTORIAL 3, der die Komplexität von bash erhöhen wird, steht in den Startlöchern, bis ich weiß, wie ich Text anzeige.
Es ist das einzige blockierende Element, aber wichtig, weil es die Hälfte der Informationen darstellt, die der Staubsauger sendet.

Man muss diese Art von Gerät im Kern erstellen, da wir alles mit Konstanten verwalten, um das, was wir speichern, zu standardisieren.

Beispiel für die Tasten

Bei den Robotersaugern haben wir generische Dinge, unabhängig vom Modell.

Status: laden / leerlauf / reinigen
Schalter: ein/aus

Usw…

Hallo @Hizo,
Ich habe die angegebene Anleitung so gut wie möglich befolgt, aber wenn ich den Befehl ausführe:
bash /opt/mosquitto/BashToGladys.sh, erhalte ich folgende Rückmeldung:

: No such file or directory.sh: Zeile 18: /opt/mosquitto/MQTTConfig.sh
/opt/mosquitto/BashToGladys.sh: Zeile 22: CommandCheck: Befehl nicht gefunden
: Numerischer Argument erforderlich.sh: Zeile 22: exit: 1

Ich habe bereits viele Fehlermeldungen behoben, indem ich an jede Zeilenumbrüche ein # hinzugefügt habe, aber jetzt reichen meine Computerkenntnisse nicht aus, um das Problem zu finden. :pensive:

Hallo, du bist dir sicher, dass du es richtig gemacht hast:

Dir fehlt die Funktion, suche auf der Seite CommandCheck nach.