Überblick
Um den Datenverkehr zwischen SystaComfort II und dem Paradigma-Server (paradigma.remoteportal.de) abzufangen und mit einem Script auszuwerten, benötigt man folgendes:
- Zwei Rechner im Netzwerk (hier RASPBERRY1 und 2 genannt)
- RASPBERRY1 mit zwei Netzwerkschnittstellen (intern und USB-LAN)
Gedachtes Szenario ist, das die SystaComfort II über den RASPBERRY1 und einem DSL-Router (hier eine Fritz-Box) mit dem Paradigma Server kommuniziert. Somit funktioniert die Paradigma eigene Lösung nach wie vor. Der RASPBERRY1 sitzt in der Mitte und vervielfältigt die interessanten Pakete mit dem Zielport 22460 und sendet sie gespiegelt an den RASPBERRY2 weiter. Diese Spiegelung erlaubt leider nicht die direkte Umleitung an sich selbst, deshalb muss man den Umweg über einen weiteren Netzwerkteilnehmer machen.
Der RASPBERRY2 empfängt die Pakete und per DNAT wird die Zieladresse auf den RASPBERRY1 umgeändert und die Pakete diesem zurückgeschickt.
RASPBERRY1 empfängt nun die an ihn gerichteten Pakete und das Perlscript wertet die Daten aus und speichert sie in einer RRD-Datenbank.
Somit kann ich beides nutzen:
- Abfrage der Solarerträge per kostenloser Paradigma-App am iPhone von Unterwegs.
- Nutzung aller bekannten Temperaturen und Daten aus der SystaComfort in meiner eigenen Umgebung (Homematic mit CCU.IO)
Root-Rechte
Damit wir die Modifikationen durchführen können, müssen wir erweiterte Rechte haben. Hierzu gibt es viele Wege und Möglichkeiten. Temporär kann man mit folgendem Befehl diese Rechte erhalten, nach dem Ab- und Anmelden sind sie aber wieder weg:
1 2 |
# Super User Rechte: sudo -s |
Ich nutze aber auf Dauer lieber den ROOT Account. Da meine Raspberries im Heimnetz unterwegs sind und das hinter einer FritzBox hängt, habe ich keine Bedenken wegen der Sicherheit. Je nach Distribution gibt es unterschiedliche Wege den ROOT zu aktivieren, da dieser meist deaktiv ausgeliefert wird.
Für Raspbian:
https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=45818
Für OSMC:
https://osmc.tv/wiki/general/usernames-and-passwords/
und dann in der Datei /etc/ssh/sshd_config folgende Option aktivieren:
1 |
PermitRootLogin yes |
Setup RASPBERRY1
Zunächst kümmern wir uns um den RASPBERRY1. Bei diesem wollen wir Folgendes erreichen:
- Den Clients am USB-LAN DHCP bereitstellen
- Ebenso als Router den Clients Zugriff auf das Internet geben
- Kopieren der interessanten Pakete an den RASPBERRY2
- Empfang der umgeleiteten Pakete vom RASPBERRY2 durch das Perl-Script und Auswertung der Daten.
Um den RASPBERRY1 als Router aufzusetzen, habe ich die Anleitung hier verfolgt:
http://www.gehaxelt.in/blog/raspberryp-als-router/
Zusammengefasst (auf meine Umgebung angepasst):
- eth0 (Onboard) bekommt eine IP von der zentralen Fritzbox per DHCP.
- eth1 (USB-LAN) bekommt von uns eine statische IP zugewiesen.
Inhalt der /etc/network/interfaces Datei für den USB-LAN Adapter:
1 2 3 4 5 6 7 8 |
#USB LAN eth1 auto eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 |
Setup iptables auf RASPBERRY1 :
Editiere /etc/network/interfaces und füge folgende Zeile am Ende ein, damit die ipTables-Regeln bei jedem Neustart geladen werden:
1 |
pre-up iptables-restore < /etc/network/iptables |
Definiere iptables Regeln, um das Paradigma-Paket zu vervielfältigen und weiterzuleiten. Dann haben wir es lokal verfügbar und ebenso geht es nach wie vor an den Server (wegen der paradigma Solarertragsapp auf dem iPhone). Hierzu schreibt man folgendes in die Datei /etc/network/iptables:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
*mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -p udp --dport 22460 -j TEE --gateway 192.168.178.38 COMMIT *nat :PREROUTING ACCEPT [9665:764142] :INPUT ACCEPT [9256:681851] :OUTPUT ACCEPT [27151:1631724] :POSTROUTING ACCEPT [27151:1631724] -A POSTROUTING -o eth0 -j MASQUERADE COMMIT |
Setup RASPBERRY2
Erst mal müssen wir dem Raspberry erlauben, Nachrichten weiterzuleiten, sonst bleiben die Nachrichten bei ihm stecken. Wir wollen diese Änderung dauerhaft einrichten, so dass wenn dieser Raspberry mal neu starten muss, das es dann automatisch weiter geht. Hierzu modifizieren wir die Datei /etc/sysctl.conf:
1 2 |
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward = 1 |
Setup von iptables auf RASPBERRY2 :
Folgender ipTables-Befehl erstellt die Weiterleitung der kopierten Pakete zurück an den RASPBERRY1 und ändert den Zielport auf 22461:
1 |
iptables -t nat -A PREROUTING -p udp --dport 22460 -j DNAT --to-destination #IP_RASPBERRY1:22461 |
Damit diese Regel ebenso den Neustart überlebt, musste hier ein anderer Weg genommen werden: iptables-persistent.
Dieses Tool speichert die aktuelle ipTables Konfiguration und stellt sie beim Neustart wieder her.
Installation iptables-persistent:
1 2 3 4 5 6 7 8 |
#Erst das Paket holen und installieren: apt-get install iptables-persistent #Aktuelle Konfiguration speichern: iptables-save > /etc/iptables/rules.v4 #Den Service starten /etc/init.d/iptables-persistent start |
Einrichtung Datenauswertung
Um die Daten auszuwerten, nutze ich ein Perl Script, welches von Klaus Schmidinger geschrieben wurde. Man findet es unter folgender Adresse:
Um das Perl Script als Service laufen zu lassen, muss man ein Start-Stop Script in /etc/init.d/ anlegen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#!/bin/sh ### BEGIN INIT INFO # Provides: paradigma logging service # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Put a short description of the service here # Description: Put a long description of the service here ### END INIT INFO # Change the next 3 lines to suit where you install your script and what you want to call it DIR=/usr/local/addons/paradigma DAEMON=$DIR/paradigma-server.pl DAEMON_NAME=paradigma # This next line determines what user the script runs as. # Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python. DAEMON_USER=root # The process ID of the script when it runs is stored here: PIDFILE=/var/run/$DAEMON_NAME.pid . /lib/lsb/init-functions do_start () { log_daemon_msg "Starting system $DAEMON_NAME daemon" start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON log_end_msg $? } do_stop () { log_daemon_msg "Stopping system $DAEMON_NAME daemon" start-stop-daemon --stop --pidfile $PIDFILE --retry 10 log_end_msg $? } case "$1" in start|stop) do_${1} ;; restart|reload|force-reload) do_stop do_start ;; status) status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $? ;; *) echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}" exit 1 ;; esac exit 0 |
Damit das Script funktioniert muss es noch mit chmod 755 ausführbar gemacht werden.
Dann kann man mit /etc/init.d/paradigma.sh start das Script im Hintergrund ausgeführt werden.
Damit das Script auch nach einem Neustart auch automatisch wieder anläuft, muss folgender Befehl noch ausgeführt werden:
1 |
update-rc.d -f paradigma.sh defaults |
Erweiterung und Änderung der RRD Datenbank
Um nachträglich neue Werte der RRD Datenbank hinzuzufügen OHNE die alten Daten zu verlieren, kann man folgende Methode anwenden:
http://www.spaggiari.org/blog5.php/adding-a-column-to-an-existing-rrd-datab
Hier mal ein Diagramm, erstellt direkt aus der RRD-Datenbank und durch das Perl-Script: