Gira- oder Jung-Homeserver zu teuer? Kein Ding! – Raspberry Pi als Helferchen #4
Was fehlt uns denn noch am Ende? Achja! Ich möchte natürlich meine Lichter, Jalousien, Haustüre, Kameras und vieles mehr auch noch vom Smartphone aus steuern. Also muss ich mir einen Homeserver kaufen, oder? Schnell mal die Jung und Gira Preise gecheckt und dann erkannt, dass das nicht mehr im Budget liegt. Aber nicht verzagen! So ein Homeserver muss nicht teuer sein!
In diesem Artikel der Reihe „Raspberry Pi als Helferchen“ geht es darum, wie mit einfachsten OpenSource Mitteln ein vollwertiger Homeserver-Ersatz geschaffen werden kann, sodass ich meine KNX Installation auch vom Tablet oder dem Smartphone aus steuern kann. Und das alles mit relativ wenig Geldeinsatz. Dieser Artikel richtet sich an diejenigen, die schon Erfahrung mit KNX, Linux und deren Konfiguration haben.
Die Teileliste
- Raspberry Pi 3 – ca. 35 €
- Micro SDHC Karte mit ~ 8 GB – ca. 15 €
- Netzteil 5V, 2,5A – ca. 8 €
- KNX IP Schnittstelle (wenn nicht schon ohnehin vorhanden) – Je nach Hersteller zwischen 140 und 200 €, meine Empfehlung Weinzierl IP Interface 730
- Optional ein Case für den Raspberry Pi, je nachdem wo er zum Einsatz kommen wird. Es empfiehlt sich ein Case mit Hutschienenhalterung zum Einsatz im Schaltschrank.
Das Werkzeug
Dieses mal benötigen wir keinerlei Werkzeug. Es entfällt somit auch der Abschnitt „Das Handwerk“
Die Vorbereitungen
Es empfiehlt sich für unseren Raspberry Pi Homeserver die aktuellste Version von Debian auf der Herstellerseite herunterzuladen. Da wir keine GUI benötigen werden, wählen wir hier am besten die Lite (Server) Version.
Dieses Image übertragen wir auf die SD Karte. Ich nehme unter Windows dazu den Win32 Disk Imager.
Nun schließen wir unseren Homeserver an einen Monitor und eine Tastatur an und booten das System. Ich melde mich zunächst als User Pi an und setze ein root Kennwort. Dann melde ich mich als root an und entferne den User Pi und sein Homeverzeichnis. Außerdem hinterlege ich meist meinen SSH Key, damit ich mich nicht mit Kennwörtern rumschlagen muss.
Als nächstes vergebe ich eine statische IP Adresse in meinem Heimnetzwerk, zusammen mit einem Gateway und einem DNS Server. Die Standard Einstellungen am System werden hier als grundlegende Kenntnis vorausgesetzt.
Wir machen ein Update & Upgrade des Systems, damit wir auf dem aktuellsten Stand sind.
Dann installieren wir Apache2 mit PHP5 und Samba:
apt-get update && apt-get upgrade -y
apt-get install apache2 php5 samba
Als nächstes legen wir den Benutzer „smarthome“ an und fügen ihn der www-data und der sudo Gruppe hinzu:
adduser smarthome
usermod -G www-data,sudo -a smarthome
Dann melden wir uns als Benutzer „smarthome“ an:
su smarthome
knxd – die Kommunikation auf dem Bus
Damit unser Homeserver überhaupt schalten kann, muss er mit dem Bus kommunizieren. Dafür installieren wir einen Treiber, der sich „knxd“ nennt.
Grundsätzlich ist die Installation in der git Repository von knxd beschrieben. Diese Zusammenfassung hat für mich funktioniert. Sollten andere Pakete fehlen, müssen diese nachinstalliert werden.
Folgende Schritte sind notwendig, um die Abhängigkeiten für die Installation von knxd zu schaffen und die entsprechenden Pakete zu schnüren und zu installieren.
sudo apt-get install git-core build-essential cdbs
sudo apt-get install debhelper
sudo apt-get install debsums
wget https://www.auto.tuwien.ac.at/~mkoegler/pth/pthsem_2.0.8.tar.gz
tar xzf pthsem_2.0.8.tar.gz
cd pthsem-2.0.8
dpkg-buildpackage -b -uc
cd ..
sudo dpkg -i libpthsem*.deb
Es folgt die Installation von knxd:
git clone https://github.com/knxd/knxd.git
cd knxd
sudo apt-get install autoconf
sudo apt-get install libtool
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install pkg-config
sudo apt-get install libsystemd-daemon-dev
sudo apt-get install dh-systemd
dpkg-buildpackage -b -uc
cd ..
sudo dpkg -i knxd_*.deb knxd-tools_*.deb
Abschließend muss man die Konfiguration von knxd noch auf die eigene Schnittstelle anpassen. Für mich hat folgendes in der /etc/knxd.conf gut funktioniert (die IP der KNX Schnittstelle muss natürlich angepasst werden):
KNXD_OPTS="-c -b ipt:192.168.1.2"
Nun stoppen wir den Service, tragen einen Autostart ein und starten dann den Service, damit wir testen können, ob unser Homeserver erfolgreich mit dem Bus kommunizieren kann:
sudo systemctl stop knxd.service
sudo systemctl stop knxd.socket
sudo systemctl enable knxd.service
sudo systemctl enable knxd.socket
sudo systemctl start knxd.socket
sudo systemctl start knxd.service
sudo systemctl status knxd.socket
sudo systemctl status knxd.service
Das Ergebnis sollte so aussehen, wenn alles geklappt hat:
$ sudo systemctl status knxd.service ● knxd.service - KNX Daemon Loaded: loaded (/lib/systemd/system/knxd.service; enabled) Active: active (running) since Sa 2016-08-13 10:03:27 CEST; 5 days ago Main PID: 30769 (knxd) CGroup: /system.slice/knxd.service └─30769 /usr/bin/knxd -c -b ipt:192.168.10.38 $ sudo systemctl status knxd.socket ● knxd.socket - KNX Daemon (socket) Loaded: loaded (/lib/systemd/system/knxd.socket; enabled) Active: active (running) since Sa 2016-08-13 10:03:23 CEST; 5 days ago Listen: /var/run/knx (Stream) [::]:6720 (Stream)
Und jetzt zum spaßigen Teil. Wir testen, ob unser Homeserver ein Licht an- und ausschalten kann. Dazu benötigen wir eine Gruppenadresse einer Lampe, hier 0/0/1:
knxtool groupswrite ip:localhost 0/0/1 1
Die Lampe sollte angehen.
knxtool groupswrite ip:localhost 0/0/1 0
Die Lampe sollte ausgehen.
Wenn das funktioniert, können wir mit der Installation von SmartHomeNG fortfahren.
Installation von SmartHomeNG
SmartHomeNG ist ein System, das als Metagateway zwischen verschiedenen „Dingen“ fungiert und der Verbindung unterschiedlicher Geräte-Schnittstellen dient. Die Standard-Schnittstelle eines Gerätes wird durch das Metagateway so um viele zusätzliche Schnittstellen erweitert. So ist es möglich, dass die Klingel mit der Musikanlage und dem TV spricht, und deren Wiedergabe unterbricht oder bei Abwesenheit eine Nachricht per Email verschickt.
SmartHomeNG basiert auf Smarthome.py, einem tollen System für Heimautomation von Marcus Popp.
Wir benötigen SmartHomeNG für unterschiedliche Dinge. Am hilfreichsten ist SmartHomeNG aber zum Abbilden von Logiken und zum Anbinden unserer Gruppenadressen (Kommunikationsobjekte) an unsere Visualisierung.
Für die Installation decken wir weitere Abhängigkeiten ab:
sudo apt-get -y install dialog python3 python3-dev python3-setuptools unzip build-essential
sudo apt-get install python3-pip
Wir klonen uns das git Repository von SmartHomeNG und erstellen dann die notwendigen Konfigurationsdateien:
cd /usr/local
sudo git clone git://github.com/smarthomeNG/smarthome.git
sudo chown -R smarthome:smarthome /usr/local/smarthome
cd /usr/local/smarthome/etc
touch logic.conf
In dieser Konfigurationsdatei sollten Längen- und Breitengrad, sowie Meeresspiegelhöhe angepasst werden:
cat >smarthome.conf <<EOL
# smarthome.conf
lat = 52.52
lon = 13.40
elev = 36
tz = 'Europe/Berlin'
EOL
Die plugin.conf regelt alle Schnittstellen zu allen Geräten/Plugins, die wir einsetzen wollen. Unter anderem zu der SmartVISU, die wir nachher noch installieren wollen:
cat >plugin.conf <<EOL
# plugin.conf
[knx]
class_name = KNX
class_path = plugins.knx
host = 127.0.0.1
port = 6720
# send_time = 600 # update date/time every 600 seconds, default none
# time_ga = 1/1/1 # default none
# date_ga = 1/1/2 # default none
[ow]
class_name = OneWire
class_path = plugins.onewire
# Bis SmartHomeNG 1.1 sind Autogenerierung von Webseiten und Websocket Schnittstelle
# in einem Plugin vereint
# diese Plugin wird ab SmartHomeNG 1.3 entfernt
[visu]
class_name = WebSocket
class_path = plugins.visu
smartvisu_dir = /var/www/html/smartVISU
# ab SmartHomeNG 1.2
# sind Autogenerierung von webseiten für SmartVISU und Bereitstellung
# des Websockets zur Kommunikation zwischen SmartVISU und SmartHomeNG getrennt
[visu]
class_name = WebSocket
class_path = plugins.visu_websocket
# ip = 0.0.0.0
# port = 2424
# tls = no
# wsproto = 4
acl = rw
# erst ab SmartHomeNG 1.2
[smartvisu]
class_name = SmartVisu
class_path = plugins.visu_smartvisu
# "neue" Linux Versionen (z.B. Debian Jessie 8.x, Ubuntu > 14.x)
smartvisu_dir = /var/www/html/smartVISU
# nur "alte" Linux-Variationen
#smartvisu_dir = /var/www/smartVISU
# generate_pages = True
# handle_widgets = True
# overwrite_templates = Yes
# visu_style = blk
# Command Line Interface
# wichtig für Funktionsprüfungen solange keine Visu zur Verfügung steht
[cli]
class_name = CLI
class_path = plugins.cli
ip = 0.0.0.0
update = True
[sql]
class_name = SQL
class_path = plugins.sqlite
EOL
Nun installieren wir noch weitere Pakete nach:
sudo pip install ephem
sudo pip install pyyaml
sudo pip install -r requirements_all.txt
Und legen dann einen smarthome.service an, mit dem Befehl:
sudo nano /lib/systemd/system/smarthome.service
und dem Inhalt:
[Unit] Description=SmartHomeNG daemon After=network.target [Service] Type=forking ExecStart=/usr/bin/python3 /usr/local/smarthome/bin/smarthome.py User=smarthome PIDFile=/usr/local/smarthome/var/run/smarthome.pid Restart=on-abort [Install] WantedBy=default.target
Nun können wir SmartHomeNG starten und überprüfen gleich das Log nach Warnungen oder Fehlern:
sudo systemctl start smarthome.service
tail /usr/local/smarthome/var/log/smarthome.log
Zuletzt noch den Autostart aktiveren und SmartHomeNG ist fertig:
sudo systemctl enable smarthome.service
Jetzt kommen wir zu unserer Visualisierung.
Installation der SmartVISU
Die SmartVISU ist ein Webfrontend, über das wir mit SmartHomeNG und knxd interagieren können. Das heißt, wir können im Browser eines jeden Gerätes die Seite der Visualisierung aufrufen und unser Haus steuern. Die SmartVISU besteht aus verschiedenen Widgets. Hierbei muss sich der Anwender normalerweise nicht darum kümmern, wie sie funktionieren, sondern bindet sie einfach in eine HTML Struktur ein.
Wir starten mit der Installation, indem wir die letzten Abhängigkeiten installieren:
sudo apt-get install libawl-php php5-curl php5 php5-json
Dann klonen wir die git Repository von SmartVISU in /var/www/html/
cd /var/www/html
git clone https://github.com/Martin-Gleiss/smartvisu.git smartVISU
Nun passen wir noch die Rechte an:
sudo chown -R www-data:www-data smartVISU
sudo chmod -R 775 smartVISU
Jetzt können wir auch schon auf die IP unseres Homeservers navigieren, ins Unterverzeichnis http://IP-Homeserver/smartVISU
Hier erwartet uns ein kleiner QuickCheck der Parameter. Wenn alles passt, haben wir 6 Haken, wie hier abgebildet:
Mit einem Klick auf Config können wir unsere Rahmenparameter setzen:
Die wichtigsten Parameter in der Übersicht:
- Interface: Hier wählt man später sein eigenes Projekt unter Pages aus. Außerdem kann man das Design wählen und, ob man Animationen und Page Cache verwenden möchte. Zum Page Cache sei gesagt, dass man während des Erstellens des Projektes den Cache besser aus lässt. Ist das Projekt beendet, kann man diesen aus Performancegründen wieder anschalten. Unter /var/www/html/smartVISU/temp/ wird der Cache angelegt. Nimmt man Änderungen an der Page vor, während der Cache aktiv ist, werden diese erst sichtbar, wenn man den Inhalt des Temp Ordners löscht und die Seite neu lädt.
- Unter I/O Connection wählen wir den Treiber smarthome.py (SmartHomeNG) aus und tragen die IP Adresse unseres Homeserver Pi ein. Wichtig ist, dass wir die IP verwenden und nicht etwa localhost oder den DNS Namen. Realtime sollte an sein.
- Unter Weather können wir für die Übersichtsseite noch unseren Standort angeben. Ich nutze dazu Yr.no und nicht Wunderground.
Es gibt im Moment noch einen Bug, der es notwendig macht, dass wir unsere Änderungen an dieser Seite zweimal eintragen und auch zweimal speichern müssen. Wir müssen diese Einstellungen aber in der Regel sowieso nur einmal machen.
Jetzt wo wir das geschafft haben, können wir endlich unser eigenes Projekt anlegen. Und wer glaubt, dass es bis hier her aufwendig war, wird sich jetzt besonders freuen, denn ab hier beginnt die Fleißarbeit.
Anlegen des eigenen Projektes
Damit wir besser auf die notwendigen Dateien zugreifen können, sollten wir uns den Samba einrichten. Dazu habe ich meine Konfiguration (/etc/samba/smb.conf) wie folgt gewählt:
[global] workgroup = WORKGROUP server string = SmartHome domain master = no syslog only = no syslog = 10 panic action = /usr/share/samba/panic-action %d encrypt passwords = true passdb backend = tdbsam obey pam restrictions = yes unix password sync = yes unix extensions = no passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . pam password change = yes map to guest = bad user invalid users = root guest ok = no usershare allow guests = no # disable printing load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes [SmartHome.py] path = /usr/local/smarthome comment = SmartHome.py Directories available = yes browseable = yes writable = yes public = yes [smartVISU] path = /var/www/html/smartVISU comment = smartVISU Directories available = yes browseable = yes writable = yes public = yes
Es sei erwähnt, dass ich bewusst auf Zugriffsbeschränkungen verzichte, da meine Systeme hinter einer Sophos UTM Firewall stehen. Es ist jedem selbst überlassen, wie er seine Sambaverzeichnisse absichert.
Nun können wir im Windows Explorer auf die IP unseres Homeservers navigieren und finden zwei Freigaben.
Zuerst legen wir unsere Items an. Dazu navigieren wir zu „SmartHome.py“ in den Ordner „items“ und legen eine neue Datei an. Meine heißt „hener.conf“. Die Datei muss auf .conf enden.
Die Itemsdatei verknüpft die Gruppenadresse unseres Kommunikationsobjektes auf dem Bus mit einer Struktur, die die SmartVISU ansprechen kann. Das funktioniert vom Aufbau her wie folgt:
[Erste Ebene] [[Zweite Ebene]] [[[Objekt]]] [[[[Aktion]]]] Attribut 1 = Wert Attribut 2 = Wert
Als Beispiel habe ich mal hier eine meiner Lampen und eine Jalousie als Auszug abgebildet:
[OG] [[Kind1]] [[[Deckenlampe]]] [[[[Schalten]]]] type = bool enforce_updates = yes visu_acl = rw knx_dpt = 1 knx_listen = 2/4/3 knx_send = 2/4/0 knx_cache 2/4/3 [[[[Dimmen]]]] type = num enforce_updates = yes knx_dpt = 5 knx_listen = 2/4/4 knx_send = 2/4/2 knx_cache 2/4/4 [[[Spots]]] [[[[Schalten]]]] type = bool enforce_updates = yes visu_acl = rw knx_dpt = 1 knx_listen = 2/4/8 knx_send = 2/4/5 knx_cache 2/4/8 [[[[Dimmen]]]] type = num enforce_updates = yes knx_dpt = 5 knx_listen = 2/4/9 knx_send = 2/4/7 knx_cache 2/4/9 [[[JalousieTuer]]] [[[[Fahren]]]] type = num enforce_updates = yes visu_acl = rw knx_dpt = 1 knx_send = 5/1/2 [[[[Stop]]]] type = num visu_acl = rw enforce_updates = yes knx_dpt = 1 knx_send = 5/1/3 [[[[Position]]]] type = num enforce_updates = yes visu_acl = rw knx_dpt = 5.001 knx_listen = 5/1/8 knx_send = 5/1/6 knx_cache = 5/1/8 [[[[Lamelle]]]] type = num enforce_updates = yes visu_acl = rw knx_dpt = 5.001 knx_listen = 5/1/9 knx_send = 5/1/7 knx_cache = 5/1/9
Die unterschiedlichen Attribute, wie type, knx_dpt, knx_send, .. sind in der Dokumentation zur SmartVISU erklärt. Hierauf einzugehen würde den Rahmen dieses Blogbeitrages sprengen.
Nun, wo wir die Items fertig haben, müssen wir noch unsere HTML Struktur anlegen. Dazu erstellen wir einen Ordner in unserer Homeserver Freigabe unter: „smartvisu/pages/Projektname“. Mein Projektname lautet: „Hener“
Dort erstellen wir wie gewohnt eine index.html und unsere einzelnen HTML Seiten für die Räume. Hier mal ein Beispiel des Raumes, der oben verwendet wird:
{% extends "rooms.html" %}
{% block content %}
{{ device.dimmer('kind1Deckenlampe', 'Deckenlampe', 'OG.Kind1.Deckenlampe.Schalten', 'OG.Kind1.Deckenlampe.Dimmen', 0, 255, 10) }} {{ device.dimmer('kind1Spots', 'Spots', 'OG.Kind1.Spots.Schalten', 'OG.Kind1.Spots.Dimmen', 0, 255, 10) }}
{{ device.shutter ('kind1JalousieTuer', 'Jalousie Türe', 'OG.Kind1.JalousieTuer.Fahren', 'OG.Kind1.JalousieTuer.Stop', 'OG.Kind1.JalousieTuer.Position', '', 'OG.Kind1.JalousieTuer.Lamelle', '', 0, 100, 5, 'full' ) }}
{% endblock %}
Man kann hier schön sehen, wie das Widget die Item Struktur „OG.Kind1.X.X“ anspricht, um mit dem Objekt im knx zu interagieren.
Im Ordner „pages“ befinden sich schon einige Beispielprojekte, an denen man sich ganz gut orientieren kann. Diese kann man in der Konfigurationsseite auch auswählen und dann anschauen.
Schauen wir uns an, wie das Ergebnis aussieht.
Das Ergebnis
Und hier noch ein Video mit einer Jalousie:
Und noch eines mit geschaltenem Licht, gedimmten Licht und dem Türsummer, den man vielleicht ein bisschen hören kann, wenn man laut genug macht:
Quellen
Und? Neugierig geworden? Dann habe ich hier nochmal die wichtigsten Links zu den einzelnen Komponenten:
- knxd github Repository
- SmarthomeNG github Repository
- SmartVISU github Repository
- Projektforum Smartvisu im KNX-User-Forum
- Projektforum smarthome.py im KNX-User-Forum
- Homepage von SmartVISU
Ich wünsche gutes Gelingen und viel Spaß beim Experimentieren mit knx, SmartHomeNG und smartVISU.
Ein wunderbares Beitrag haben Sie uns hier geschrieben. Obwohl ich mich darüber nicht so gut auskenne, habe ich trotzdem aus eurem Artikel sehr viele interessante wie auch nützliche Informationen gelesen. Hoffentlich wurde ich in Zukunft auch in der Lage sein, um mir solche Geräte zu kaufen, die man über ein Smartphone steuern kann
Hallo Leute,
nette Anleitung. Sie ist schon etwas älter und sollte mal überarbeitet werden. Der knxd benötigt libev statt pthsem. Die Anschaltung an den KNX-Bus kann auch mit einer BCU an den UART des Raspi oder einen USB2Seriell-Wandler erfolgen (für Nichtbastler mit etwas mehr Geld: TUL von busware.de). Ein teures IP-Interface ist nicht erforderlich. ETS arbeitet mit knxd zusammen. SmartVISU benötigt ab 2.9 PHP 7.x . Wer Buster installiert verwendet PHP 7.3 . Wer analoge oder digitale Signale mit dem Raspi für das SmartHome verarbeiten möchte sollte FHEM installieren. Hier können die Signale z.B. über I2C eingelesen, verarbeitet und auf den Bus gegeben werden. Eine andere Möglichkeit ist, mit Konnekting (konnekting.de) einen Arduino an den Bus zu koppeln und diesen die Signale verarbeiten zu lassen.
Hallo,
wirklich spannendes Thema.
Danke für die Anleitung und Infos.
Ich werde es wohl bald mal angehen…antesten.
Wäre es mit demselben Raspberry Pi darüber hinaus auch möglich Digitale bzw. -mit der passende Erweiterung- Analoge Signale einzulesen und dem KNX zur Verfügung zu stellen?
Danke
Für diejenigen, die sich in der Linux Konsole nicht so wohl fühlen gibt es ein Plug-n-Play Projekt:
https://nymea.io/en/community
Auch das funktioniert mit dem Weinzierl Gateway (und mit vielen anderen Produkten).
Hallo zusammen,
ich habe die Visualisierung auf dem Wege nun so auch vor.
Gibt es eine aktuelle, ggf. geänderte Empfehlung für eine entsprechende KNX IP Schnittstelle? Oder weiterhin Weinzierl IP Interface 730?
Danke und Grüße,
Jan
Hallo, ich hätte noch eine Frage, du schreibst, es können weitere Schnittstellen hinzugefügt werden.
Ich würde gerne noch als Schnittstelle bacnet in die Visu mit aufnehmen, habe aber leider noch nie mit bacnet gearbeitet.
Die Wiki Seite mit der Komplettanleitung gibt es übrigens nicht mehr.
Die Komplettanleitung ist in die Online-Dokumentation von SmartHomeNG geandert und unter https://www.smarthomeng.de/user/installation/komplettanleitung.html zu erreichen.
Hallo Herr Schmidt,
das System wird stetig weiterentwickelt. Die Anleitungen die mir als Quelle für diesen Beitrag gedient haben werden hierbei auch immer korrigiert. Sie finden Sie unter https://github.com/smarthomeNG/smarthome/wiki/Komplettanleitung
Außerdem finden Sie auch Hilfe im Userforum https://knx-user-forum.de/forum/supportforen/smarthome-py
Ich hoffe ich konnte Ihnen weiterhelfen.
Mit freundlichen Grüßen,
Patrick Hener
Sehr geehrter Herr Henner,
habe mir die Hardware wie beschrieben gekauft und bin aktuell dran nach ihrer Beschreibung den Homeserver zu installieren.
Leider komme ich bei diesen Punkt https://www.auto.tuwien.ac.at/~mkoegler/pth/pthsem_2.0.8.tar.gz
tar xzf pthsem_2.0.8.tar.gz
cd pthsem-2.0.8 nicht weiter…
Benötigt man hierfür eine Berechtigung?
Vielleicht können Sie mir eine detaillierte Beschrribung der Installation zusenden?
Ich wäre Ihnen sehr Dankbar.
Viele Grüße Schmidt Ch.
Will man sich die einzelnen Schritte sparen, kann man auch direkt zum fertigen Image greifen 😉 https://sourceforge.net/projects/smarthomeng-raspi-image/