Sonoff Basic

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.

Sonoff Basic
Abbildung 1: Der Sonoff Basic
Sonoff Basic Platine
Abbildung 2: Der Sonoff Basic geöffnet

Den ESP8266 flashen

Sonoff Basic Pinout
Abbildung 3: Das Sonoff Basic-Pinout
Sonoff Basic löten
Abbildung 4: Den Sonoff Basic löten
Sonoff Basic gelötet
Abbildung 5: Der Sonoff Basic gelötet
Sonoff Basic verkabelt
Abbildung 6: Das Sonoff Basic verkabelt
Sonoff Basic USB
Abbildung 7: Der Sonoff Basic am USB

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).

Home Control
Abbildung 8: Home Control

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!


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

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 :-)