Der übliche Verwendungszweck einer LogoControl Methode ist ein Bit im VM der LOGO für 250ms auf 1 zu setzen, um damit eine Aktion auszulösen. Aber sie hat noch eine andere Funktion: das Ausführen von Shell Scripten (oder *.bat/*.cmd unter Windows). Gerade in Kombination mit Triggern ergeben sich daraus unzählige Möglichkeiten, wie Benachrichtigung per E-Mail/SMS/Push-Notification bei bestimmten Ereignissen, Setzen der GPIO-Pins des Raspberry Pi’s, Wake-Up-On LAN, Logfiles schreiben usw. Alles was ihr dazu tun müsst, ist ein passendes Shell Script schreiben, welches die Aktion durchführt. LogoControl startet dann einfach dieses Script.
Das Script muss sich dazu im Unterverzeichnis „Scripts“ von LogoControl befinden und wird dann einfach als Parameter „script“ bei einer Methode angegeben:
<method id="1" name="WakeUp Office PC" script="wakeup_pc.sh" />
Aus Sicherheitsgründen (siehe Kasten Sicherheitshinweis) können beim Parameter „script“ nur die Zeichen a-zA-Z0-9space.-_’°?!, verwendet werden. Es können dabei dem Script auch beliebige Argumente mitgegeben werden:
<method id="1" name="WakeUp Office PC" script="wakeup_pc.sh 'office' 'arg2'" />
Der Text „office“ ist dabei Argument 1, „arg2“ ist Argument 2. Man kann den „script“ Parameter der Methode auch mit dem „address“ Parameter kombinieren, so dass eine Methode dann beide Aktionen ausführt: Script starten und Bit in Logo für 250ms setzen.
Aus diesem Grund ist es nicht möglich direkt beliebige Shell Kommandos in der LogoControl-Konfiguration zu definieren, sondern lediglich die Angabe einer Script-Datei, welche sich im Unterverzeichnis „Scripts“ befinden muss, plus Argumente zu definieren. Auch sind für den Script-Dateinamen + Argumente nur eine begrenze Auswahl Zeichen (a-zA-Z0-9space.-_’°?!,) zulässig um eine Shell Injection zu vermeiden. Dennoch bleibt es in eurer Verantwortung sichere Shell-Scripte zu schreiben und z.B. wenn ihr Argumente beim Aufruf eures Skripts übergebt, diese auf sinnvolle Werte überprüft.
Beispiel 1: Push-Notification wenn Haustür geöffnet
Im folgenden Beispiel zeige ich wie die LOGO beim Öffnen der Haustür eine Push-Benachrichtigung auf mein Android-Smartphone senden kann. Ich verwende dazu die kostenlose App Pushbullet welche es für iOS und Android gibt. Welcher Sensor an der Haustür verbaut ist und wie die LOGO das Öffnen der Haustür erkennt wird hier nicht weiter behandelt. Wir gehen einfach davon aus, dass wir den Status an Adresse 100.0 im VM der Logo auslesen können. Eine 1 bedeutet „Haustür offen“ eine 0 dagegen „Haustür geschlossen“.
Für das Senden der Pushbullet Nachricht erstellen wir folgendes Shell-Script und speichern es im Unterverzeichnis „Scripts/pushbullet.sh“ ab:
!/bin/sh # ACCESS_TOKEN="place your token here" timestamp=$(date "+%H:%M:%S") title="$1" body="$2\n($timestamp)" curl --header "Authorization: Bearer $ACCESS_TOKEN" -X POST https://api.pushbullet.com/v2/pushes --header 'Content-Type: application/json' --data-binary '{"type": "note", "title": "'"$title"'", "body": "'"$body"'"}'
Bei ACCESS_TOKEN tragt bitte euer Access Token für den Pushbullet-Service ein. Dieses findet ihr, wenn ihr euch bei Pushbullet.com eingeloggt habt, in euren Account Settings. Damit das Script von LogoControl ausgeführt werden kann muss es natürlich noch auf der Kommandozeile als „ausführbar“ gekennzeichnet werden:
chmod +x pushbullet.sh
Anschließend könnt ihr es in LogoControl wie folgt einbinden:
<device id="1" name="ShellScripts"> <method id="1" name="Pushbullet Hauttür geöffnet" script="pushbullet.sh 'Haustür' 'wurde geöffnet'" /> <trigger plc="myLogo" address="100.0" datatype="bit"> <onValue value="1" method="1" /> </trigger> </device>
Der Trigger überwacht die Speicheradresse 100.0 und sobald sich dort der Wert von 0 auf 1 ändert ruft er die Methode 1 auf, in welcher das Script gestartet wird. Das Script bekommt noch 2 Argumente übergeben, nämlich den Titel und den Inhalt des Pushbullets.
Beispiel 2: Loggen des Helligkeitswertes bei Änderung
Shell-Script „logvalue.sh“
#!/bin/sh # current_time=$(date "+%Y-%m-%d %H:%M:%S") result=$(wget -qO- localhost:8088/rest/devices/48/attributes/1/value) echo "$current_time;$result" >> ../Remote/Resources/logs/brightness.log
LogoControl-Config Eintrag
<device id="1" name="ShellScripts"> <method id="1" name="Logeintrag Helligkeit" script="logvalue.sh" /> <trigger plc="myLogo" address="234" datatype="uword"> <onValue value="" method="1" /> </trigger> </device>