openHAB :: Einbinden von USB-Steckdosenleisten

51

In einem vorhergehenden Artikel wurde beschrieben, wie die Steckdosenleiste SIS-PMS via USB mit einem Raspberry Pi gesteuert werden kann. Nun geht es darum, die Steckdosenleiste mit den vier möglichen Endgeräten auch bequem per Browser oder App via openHAB zu steuern.

 

 

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

[themify_box style=”rounded” ]In diesem Artikel verwendetes Zubehör

[/themify_box]

 

Bash-Script erstellen

Zunächst erstellen wir auf dem openHAB-Server ein kleines Bash-Script, welches später aus openHAB heraus die einzelnen Steckdosen schalten kann. Dazu ist eine SSH-Anmeldung an allen in Frage kommenden Raspberrys ohne die Eingabe eines Passwortes notwendig. Die dazu notwendigen Vorbereitungen sind in diesem Artikel detailiert beschrieben. Anschließend erstellen wir das angesprochene Bash-Script und speichern dieses beispielsweise als “/scripts/sdl.sh“:

#!/bin/bash
if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ] ;then
    echo "So geht das nicht"
    exit 1;
fi

/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.23.$1 "/usr/local/bin/sispmctl -d $2 -q$3 $4"

 

Zudem erlauben wir die Ausführung dieses Scripts mittels

chmod +x sdl.sh

und ändern den Besitz des Scripts mit

chown openhab: sdl.sh

 

Dieses Script erwartet bei Aufruf vier Parameter:

  1. Das letzte Oktett des Raspberrys, an welchem die Steckdosenleiste angeschlossen ist
  2. Die ID der Steckdosenleiste (0, 1, 2, usw.)
  3. o” oder “f“, zum Ein- oder Ausschalten eines Gerätes
  4. Die Nummer der zu schaltenden Steckdose, eins bis vier

 

Nach der Erstellung des Scriptes können wir dieses auch gleich von der Konsole aus testen:

/scripts/sdl.sh 235 0 o 1

Dieser Aufruf schaltet die erste Steckdose der ersten Leiste ein, die via USB an der Himbeere “192.168.23.235” angeschlossen ist.

 

openHAB-Addon installieren

Zur Einbindung der Steckdosenleiste in openHAB nutzen wir in diesem Artikel das openHAB-Addon “exec“, welches wir mit der Paketverwaltung installieren:

apt-get install openhab-addon-binding-exec

 

Items definieren

Wenn das Script von der Konsole aus erfolgreich getestet wurde, erstellen wir nun für jede zu schaltende Steckdose ein Item für openHAB:

Switch LI_TA_MOL <light> (grpTier_LI_TA) { exec=">[OFF:/scripts/sdl.sh 235 0 f 1] >[ON:/scripts/sdl.sh 235 0 o 1]" }
Switch LI_TA_FI <light> (grpTier_LI_TA) { exec=">[OFF:/scripts/sdl.sh 235 0 f 2] >[ON:/scripts/sdl.sh 235 0 o 2]" }
Switch LI_TA_SAL <light> (grpTier_LI_TA) { exec=">[OFF:/scripts/sdl.sh 235 0 f 3] >[ON:/scripts/sdl.sh 235 0 o 3]" }
Switch LI_TA_AX <light> (grpTier_LI_TA) { exec=">[OFF:/scripts/sdl.sh 235 0 f 4] >[ON:/scripts/sdl.sh 235 0 o 4]" }

Zur Erläuterung der einzelnen Spalten:

  1. Wir definieren einen Schalter
  2. Wir vergeben dem Schalter einen einzigartigen Namen
  3. Als Symbol wählen wir das bereits bei der openHAB-Installation existierende Icon “light
  4. Wir fügen die Steckdose einer Gruppe hinzu, um später eine Gruppenschaltung zu realisieren
  5. Zum Schalten nutzen wir das Addon “exec“, das mit Hilfe unseres Scriptes eine Steckdose ein- oder ausschaltet. Die “235” im Beispiel beschreibt das letzte Oktett unserer Himbeere, “f” schaltet eine Steckdose aus, “o” (kleiner Buchstabe) schaltet eine Steckdose ein.

 

Zudem definieren wir die Gruppe, zu welcher alle Steckdosen hinzugefügt wurden:

Group:Switch:OR(ON,OFF) grpTier_LI_TA

 

Items in Sitemap einbinden

Im folgenden binden wir die soeben konfiguriertem Items in unsere Sitemap ein. Ich habe mich dazu entschlossen, dass der jeweilige Abschnitt mit der Anzeige und Schaltung der entsprechenden Gruppe beginnt:

Switch item=grpTier_LI_TA label="alle Taglichter (Tiere) [(%d)]" icon="light" mappings=[OFF="Alle aus", ON="Alle an"]

Das in dieser Zeile angegebene “[(%d)]” wird in der späteren Ansicht durch die Anzahl der aktiveren Geräte dieser Gruppe ersetzt.

8

 

Anschließend konfigurieren wir jede Steckdose der Leiste:

Switch item=LI_TA_MOL label="Molche Tageslicht" mappings=[ON="An", OFF="Aus"]
Switch item=LI_TA_FI label="Fische Tageslicht" mappings=[ON="An", OFF="Aus"]
Switch item=LI_TA_SAL label="Salamander Tageslicht" mappings=[ON="An", OFF="Aus"]
Switch item=LI_TA_AX label="Axolotl Tageslicht" mappings=[ON="An", OFF="Aus"]

 

Die Konfiguration, wie wir sie in diesem Artikel beispielhaft verwenden, wird sich in der Sitemap so darstellen:

 

7

Regeln festlegen

Zum Abschluss möchten wir die Schaltvorgänge automatisieren, indem morgens um sieben Uhr exemplarisch ein Tageslicht eingeschaltet wird. Eine entsprechende Regel wird wie folgt definiert:

rule "Morgens Taglicht Fische an"
when
   Time cron "0 00 07 * * ?"
then
   sendCommand(LI_TA_FI, ON)
end

 

Sinnvoller ist es natürlich, direkt die Gruppe der Tageslichter zu schalten. Hierbei gewähren wir den Himbeeren jedoch zwischen jedem Schaltvorgang eine zweisekündige Pause:

rule "Morgens Taglichter an"
when
   Time cron "0 0 07 * * ?"
then
   grpTier_LI_TA?.members.forEach[Switch|
      sendCommand(Switch, ON)
      Thread::sleep(2000)
   ]
end