
Smart Home ohne Cloud
Stand: 18.05.2018, Erstveröffentlichung: 08.04.2018, Autor: Christoph Heise
Kaufen, einschalten, fertig?
Smart Home-Komponenten findest du wie Sand am Meer. Nach dem Einschalten erhalten sie das WLAN-Passwort und los gehts. Oft erstellen sie zusätzlich einen Account für die firmeneigene Cloud, damit du auch von unterwegs Zugriff auf deine Geräte hast. Ganz nebenbei erfahren die Firmen so deine E-Mail-Adresse, die sie verkaufen oder unsicher aufbewahren könnten. Außerdem entsteht durch die Verknüpfung mit der Cloud ein Zugang in dein Netzwerk. Investiert die Firma nicht ausreichend in die Sicherheit ihres Systems (Stichwort: Updates), könnten schnell Sicherheitslücken (sogenannte Exploits) bekannt werden, welche für Fremde den Zugang in dein Netzwerk ermöglichen.
In diesem Artikel erfährst du, wie du dir mit etwas technischem Knowhow aus einem cloudbasierten WLAN-Schalter deinen eigenen baust. Dieser kommuniziert nur innerhalb deines Netzwerks mit einer Webanwendung, z.B. einem Apache-Server auf deinem Raspberry Pi.
Der Sonoff Basic
Der Sonoff Basic der chinesischen Firma ITEAD ist ein sehr günstiger WLAN-Schalter. Leider kommuniziert er von Hause aus mit einer chinesischen Cloud, was für viele Anwender ein No-Go darstellt. Herzstück ist ein ESP8266-Mikrocontroller, der unter Elektronikbastlern wegen seiner vielseitigen Verwendbarkeit sehr beliebt ist.
Den ESP8266 flashen
Sicherheitshinweis: Öffne das Gehäuse des Geräts nur im spannungsfreien Zustand! Nimm Änderungen am Gerät nur vor, wenn du fachlich entsprechend ausgebildet bist und nochmals sichergehst, das Gerät von jeglicher Spannungsquelle getrennt zu haben! Du handelst auf eigene Verantwortung.
Um den Zugang zum ESP8266 zu erhalten, lötest du Pins auf die Kontakte GND, TXD, RXD und VCC. Diese verbindest du entsprechend mit einem passenden USB-Flasher (für ESP8266 VCC: 3,3V). Um in den Flashmode zu kommen, halte den Taster auf GPIO0 gedrückt, während du den USB-Flasher in deinen Computer einsteckst. Mit der Arduino-IDE (Software) und dem folgenden Code kannst du nun deinen Sonoff Basic mit neuer Software bespielen. Der Sonoff Basic lässt sich dann über HTTP im Netzwerk schalten.
Hinweis: Informationen zum Flashen eines ESP8266 mit Hilfe der Arduino-IDE findest du ausreichend im Internet. Auf Softwareeinstellungen wird deshalb an dieser Stelle nicht eingegangen.
#include <ESP8266WiFi.h> // Einstellungen const char* ssid = "DEINE_WLAN_SSID"; const char* password = "DEIN_WLAN_SCHLÜSSEL"; const char* server_ip = "192.168.0.5"; //IP Apache-Server WiFiServer server(80); int tout = 0; void setup() { // Ausgang bestimmen und auf 0 setzen pinMode(12, OUTPUT); digitalWrite(12, 0); // Eingang für Taster bestimmen pinMode(0, INPUT); // mit WLAN-Netz verbinden WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // statische IP-Adresse benutzen WiFi.config(IPAddress(192,168,0,30), IPAddress(192,168,0,1), IPAddress(255,255,255,0), IPAddress(192,168,0,1)); // Warten, bis WLAN-Verbindung steht; nach 10 Sekunden abbrechen und weiter ohne WLAN while (WiFi.status() != WL_CONNECTED) { delay(500); tout++; if (tout == 20) { break; } } // Server starten, wenn WLAN vorhanden if (tout != 20) { server.begin(); } } void loop() { // Prüfen, ob Taster betätigt wird if (digitalRead(0)==LOW) { if (digitalRead(12) == 0) //wenn Ausgang aktuell auf 0... { digitalWrite(12, 1); //...Ausgang wird auf 1 geschaltet delay(500); return; } if (digitalRead(12) == 1) //wenn Ausgang aktuell auf 1... { digitalWrite(12, 0); //...Ausgang wird auf 0 geschaltet delay(500); } } // Prüfen, ob Serveranfrage da (nur bei WLAN-Verbindung) if (tout != 20) { WiFiClient client = server.available(); if (client) { //...Warten, bis Benutzer Anfrage sendet while(!client.available()) { delay(1); } // ...Lesen der Anfrage String req = client.readStringUntil('\r'); client.flush(); // ...Prüfen, ob Anfrage zu einer hinterlegten Aktion passt if (req.indexOf("/ask.html") != -1) //Benutzer will den aktuellen Status des Ausgangs abfragen { client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); client.print(digitalRead(12)); //gibt 0 oder 1 für aktuell aus oder an zurück return; } else if (req.indexOf("/set0.html") != -1) //Benutzer will Ausgang auf 0 schalten { digitalWrite(12, 0); //Ausgang wird auf 0 geschaltet client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); client.print("<meta http-equiv='refresh' content='0; URL=http://"); //gibt Weiterleitung auf die Home Control-Startseite aus client.print(server_ip); //gibt Weiterleitung auf die Home Control-Startseite aus client.print("/index.php?from=light'>"); //gibt Weiterleitung auf die Home Control-Startseite aus return; } else if (req.indexOf("/set1.html") != -1) //Benutzer will Ausgang auf 1 schalten { digitalWrite(12, 1); //Ausgang wird auf 1 geschaltet client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); client.print("<meta http-equiv='refresh' content='0; URL=http://"); //gibt Weiterleitung auf die Home Control-Startseite aus client.print(server_ip); //gibt Weiterleitung auf die Home Control-Startseite aus client.print("/index.php?from=light'>"); //gibt Weiterleitung auf die Home Control-Startseite aus return; } else { client.stop(); //Anfrage passt zu keiner hinterlegten Aktion return; } } } }
Der modifizierte Sonoff reagiert nun auf Tasterbetätigungen (Ein- und Ausschalten), auch wenn das WLAN nicht funktioniert. Des Weiteren ist er über http://192.168.0.30/set1.html (Einschalten), http://192.168.0.30/set0.html (Ausschalten) und http://192.168.0.30/ask.html (aktuellen Status anzeigen) erreichbar.
Nach dem Schalten via HTTP gibt er eine Weiterleitung auf eine Adresse der Apache-Server-IP zurück. Der Apache-Server mit PHP läuft bei mir auf einem Raspberry Pi 3. Folgenden Code verwende ich hier:
Der PHP-Code für den Apache-Server
<?php $thing_1_ip = "192.168.0.30"; $server_ip = "192.168.0.5"; $url = "http://" . $thing_1_ip . "/ask.html"; $file = fopen($url , "r"); $file_1_data = fread($file, 1); ?> <!doctype html> <html lang="de"> <head> <title>HOME CONTROL</title> <link rel="stylesheet" type="text/css" href="css/style.css"> <link rel="icon" sizes="16x16" href="icons/favicon.ico"> <link rel="apple-touch-icon" href="icons/touch-icon-iphone.png"> <link rel="apple-touch-icon" sizes="76x76" href="icons/touch-icon-ipad.png"> <link rel="apple-touch-icon" sizes="120x120" href="icons/touch-icon-iphone-retina.png"> <link rel="apple-touch-icon" sizes="152x152" href="icons/touch-icon-ipad-retina.png"> <meta name="author" content="Christoph Heise"> <meta name="publisher" content="Christoph Heise"> <meta name="keywords" content="HOME CONTROL"> <meta name="description" content="HOME CONTROL"> <meta charset="UTF-8"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <header style=""><h1 style="background-color: black; text-align: center; font-family: Arial, Verdana, sans-serif; color: white; font-size: 200%; margin: 10px 0px 0px 0px;">HOME CONTROL</h1></header> <nav style="display: none;"></nav> <main style="border: 1px solid grey;"> <a href="http://<?php echo $thing_1_ip; ?>/set<?php if ($file_1_data == "1") echo "0"; if ($file_1_data == "0") echo "1"; ?>.html"> <div style="border: 1px solid black; padding: 10px 10px 10px 10px; margin: 50px auto 50px auto; display: table;"> <img src="light/light_<?php if ($file_1_data == "1") echo "on"; if ($file_1_data == "0") echo "off"; ?>.jpg" style="width: 20%; max-width: 500px; margin: 0px 50px 0px 0px; float: left;"> <p style="font-family: Arial, Verdana, sans-serif; color: black; font-size: 7.0vw; float: left; margin-top: 2%;">Garderobe</p> </div> </a> </main> <footer style="display: none;"></footer> </body> </html>
Zu beachten ist, dass jeder Netzwerkteilnehmer Zugriff auf das Home Control erhält. Ist dies nicht gewünscht, füge z.B. einen Passwortschutz hinzu oder lasse nur bestimmte MAC-Adressen zugreifen!
Alle nötigen Dateien für den Apache-Server stehen hier zum Download bereit (ZIP).
Deine Meinung, deine Projekte
Wie gefällt dir dieser Artikel? Hast du vielleicht Hinweise für mich? Lass es mich wissen und kommentiere mit.
Welche Projekte hast du mit einem Sonoff Basic bzw. einem ESP8266 umgesetzt? Erzähl es uns!
Danke Stephan Roseburg
An dieser Stelle möchte ich meinem Freund Stephan Roseburg für die Unterstützung bei der Umsetzung dieses Projekts danken. Wenn ich mit meinen PHP-Kenntnissen mal nicht mehr weiter wusste, half er mir schnell, damit es weiter gehen konnte. Weil Stephan freier PHP-Programmierer ist und sich über Arbeit freut, kann ich hier etwas zurückgeben und empfehle ihn ausdrücklich als Partner für dein Projekt. Kontakt zu Stephan Roseburg
ARTIKEL TEILEN
Erzähle deinen Freunden von diesem Artikel und unterstütze damit Simmsi-Internetsicherheit. Kopiere den Artikel-Link einfach in deine sozialen Netzwerke:
https://www.simmsi.de/Smart_Home_ohne_Cloud.php
NEWSLETTER ABONNIEREN
Verpasse keinen neuen Artikel und lass dich per E-Mail informieren. Keine Werbung, kein Spam. Abmeldung jederzeit möglich (Infos in jedem Newsletter):
ARTIKEL KOMMENTIEREN
Webmaster schrieb am 28.03.2021 um 20:07 Uhr:
Kommentare sind hier aktuell geblockt.
KarstenK schrieb am 08.04.2018 um 18:10 Uhr:
!!!SEHR, SEHR GEILER ARTIKEL CHRIS!!!! Gerade im IoT-Zeitalter liegt die Chance gehackt zu werden bei über 50%!!! Da ist dieser kostenlose Artikel Gold Wert :-)