iSmartHome HD: Fernzugriff mit Hilfe eines Raspberry Pi’s

Für den Fernzugriff eures RWE SmartHomes sind seit der Softwareversion 1.70 der Zentrale einige Umwege nötig, da ein Zugriff von “außen” pauschal geblockt wird.
Ich nutze hierfür einen Raspberry Pi 2 mit dem aktuellen Raspbian Jessie Image. Eine Installationsanleitung dafür findet Ihr hier: Raspberry Pi Image installieren

Der Raspberry Pi fungiert dabei sozusagen als interner Vermittler zwischen dem Client (iSmartHome HD) und der Zentrale. Da dieser sich im selben Netzwerk wie die Zentrale befindet, werden die Anfragen auch nicht geblockt.

Wichtig: Diese Anleitung wurde mit Hilfe eines Mac’s durchgeführt. Auf einem Windows Rechner sollte es aber ähnlich laufen (benötigt wird dabei das Programm Putty oder ein vergleichbares, um eine Verbindung zum Raspberry Pi herstellen zu können)

Mein Raspberry Pi hat die IP-Adresse “192.168.1.116”. Diese muss natürlich für die komplette Anleitung an die IP-Adresse eures Raspberry Pi’s angepasst werden!

Voraussetzungen: Raspberry Pi, DynDNS-Adresse

Schritt 1:
Eine SSH-Verbindung zum Raspberry Pi aufbauen (Terminal).

ssh pi@192.168.1.116

Dabei wird das Passwort abgefragt. Das ist bei einer frischen Installation des Pi’s für den Benutzer pi auf raspberry gesetzt.

Schritt 2:
Pakete Installieren. Es werden die Pakete lighttpd, php5-common, php5-cgi, php5 und php5-curl benötigt. Dafür müssen nacheinander folgende Befehle eingegeben werden

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install lighttpd php5-common php5-cgi php5 php5-curl

Es wird dabei wieder nach dem Passwort gefragt. Eventuelle Fragen müssen mit J für Ja bzw. Y für Yes beantwortet werden.

Schritt 3:
Die Datei index.php auf dem Raspberry Pi anlegen. Dafür in das Verzeichnis /var/www/html  des vorher installierten Webservers lighttpd wechseln

cd /var/www/html

Falls der Webserver später noch für andere Zwecke verwendet werden soll, wird vorsichtshalber ein Unterordner angelegt. In diesem Fall ist das der Ordner ismarthome. Dort wird dann die Datei index.php für den Fernzugriff angelegt. Dafür einfach nacheinander folgende Befehle ausführen

sudo mkdir ismarthome
cd ismarthome
sudo nano index.php

Mit dem letzten Befehl hat sich der Editor nano im Terminal geöffnet. Dort wird jetzt der folgende Code kopiert und mit cmd + v (Strg + v für windows) eingefügt

Der Code wurde am 23.03.2016 aktualisiert:

<?php
	// Test des Login-Scripts
	$test = $_GET["test"];
	
	if ($test === null) {
		if (!function_exists('curl_version')) {
			echo "Auf dem Webserver ist curl nicht aktiviert/installiert. Login nicht möglich!";
		} else {
			// Übernehmen der Aktion (nicht verändern)
			$cmd = $_GET["cmd"];
	
			// Übernehmen der SHC IP
			$shcip = $_GET["shcip"];
			
			// ClientId
			$clientId = $_GET["clientid"];
	
			// Übernehmen des Bodys (nicht verändern)
			$body = @file_get_contents('php://input');
	
			// Request zur Zentrale (nicht verändern)
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, 'https://' . $shcip . '/' . $cmd);
			
			if($clientId !== null)
			{
				curl_setopt($ch, CURLOPT_HTTPHEADER, array('ClientId: ' . $clientId));
			}
			
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_HEADER, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
			curl_setopt($ch, CURLOPT_SSLVERSION, 3);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $cmd === 'upd' ? 'upd' : $body);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
			list($header, $response) = explode("\r\n\r\n", curl_exec($ch), 2);
			
			// Verbindung schliessen
			curl_close($ch);
	
			// Response der Zentrale zurückgeben
			echo $response;
		}
	} else {
		if (!function_exists('curl_version')) {
			$test = $test."\n\nInfo: Auf dem Webserver ist curl nicht aktiviert/installiert. Der Login wird deshalb nicht möglich sein!";
		}
		
		echo "\nIhre Nachricht: ".$test;
	}	
?>

Nach dem Einfügen kann die Datei mit ctrl + x (Strg + x für Windows) geschlossen werden. Die Frage mit einem J für Ja bzw Y für Yes sowie den Dateinamen bestätigen.
Nach dem speichern der Datei muss noch fastcgi sowie fastcgi-php aktiviert und der Webserver neu gestartet werden.

sudo lighttpd-enable-mod fastcgi fastcgi-php
sudo service lighttpd restart

Der Raspberry Pi ist jetzt komplett für den Fernzugriff auf euer SmartHome vorbereitet.
Getestet werden kann der eingerichtete Webserver, indem man einen Test-Wert der erstellten index.php ausgeben lässt.

http://192.168.1.116/ismarthome/index.php?test=Hallo

Beim Aufruf der Webseite sollte nun ein “Ihre Nachricht: HalloWelt” zu sehen sein.

Schritt 4:
Portfreigaben/-weiterleitungen einrichten.
Damit iSmartHome HD auch mit der Zentrale von unterwegs aus kommunizieren kann, müssen dementsprechende Portfreigaben im Router konfiguriert werden. Da sich die Einrichtung aber von Modell zu Modell stark unterscheidet, kann ich an dieser Stelle nur eine grobe Anleitung bereitstellen.

Welche Freigaben sind nötig?

  • Für die Zentrale – von Port 54321 auf intern 443
  • Für den Raspberry – von 43210 auf intern 80 oder 443

(die von außen offenen Ports 54321 und 43210 können frei gewählt werden)

Erläuterung zur Funktionsweise: iSmartHomeHD

Schritt 5:
iSmartHome HD richtig konfigurieren.

Beim Einrichten eines neuen SmartHomes in der App ist im Bereich IP-Adresse folgendes zu beachten:

  1. Lokale IP-Adresse der Zentrale
    z.B. 192.168.1.123
  2. DynDNS-Adresse mit Portangabe (Portfreigabe zur Zentrale beachten)
    meinsmarthomedyndns.de:54321
  3. Der Link zur index.php auf dem Raspberry Pi (Portfreigabe zum Raspberry Pi beachten)
    http://meinsmarthomedyndns.de:43210/ismarthome/index.php

Die DynDNS-Adresse meinsmarthomedyndns.de sowie die Portangaben dahinter müssen natürlich angepasst werden. Wenn alles eingerichtet ist, sollte es auch mit dem Fernzugriff klappen.

2 Gedanken zu “iSmartHome HD: Fernzugriff mit Hilfe eines Raspberry Pi’s

  1. Danke, hat wunderbar funktioniert!
    Anfangs hatte ich die Prorts für die Weiterleitung im Router verwechselt, da könnte man vielleicht ein konkreteres Beispiel (nicht xyz) machen und dann von den Settings in der App dazu einen Screenshot.

    Liebe Grüße,

    Stephan

Schreibe einen Kommentar