Skip to content

polygontwist/ESP_sonoff_Schaltuhr

Repository files navigation

Projekt: Wifi Schaltuhr Version 2.5

Alternative Firmware für WLAN-Steckdosen (Sonoff, Horsky, Lingan SWA1) mit folgenden Funktionen:

  • Schalten per WLAN-Verbindung
  • definieren von Timern (Schaltuhrfunktion)
  • Uhr wird per NTP (Network Time Protocol) aktuell gehalten, Server ist 0.europe.pool.ntp.org (siehe myNTP.h)
  • automatische Umschaltung Sommer-/Winterzeit
  • update per OTA möglich (Arduino)
  • Oberfläche per Javascript und CSS gestaltbar

Getestet mit: Sonoff S20, HORSKY, Sononoff POW.

Schaue Dir auch das Projekt https://github.com/arendst/Sonoff-Tasmota/ evtl. passt es besser zu Deinem Setup (mit MQTT für Alexa & Co.).

Hardwaresetup

Zur Verbindung mit dem Recher benutze ich ein USB-to-Seriel-Adapter. Dort ist TX, RX, GND und 3,3V gefordert, keinesfalls darf der ESP eine höhere Spannung als 3,3V bekommen!

Je nach Schaltdose sind die Pins zu seriellen Verbindung zu finden:

Sonoff S20

Das Relais hängt an Port 12, die Status LED an Port 13 und der Button an Port 0.

HORSKY Wifi

Das Relais hängt an Port 5, die Status LED an Port 4 und der Button an Port 13. Um den Button zu benutzen muß der Mode auf INPUT_PULLUP gesetzt werden (Eingang mit internen Pullupwiederstand). Eine Besonderheit bei der HORSKY das es kein direkten Draht zum 3.3V gibt, Vcc geht über einen Spannungsregler (AMS1117) und dann zum ESP. Ich habe die 3.3V dort angeschlossen - es hatte funktioniert. Alternativ kann man sich auch ein Kabel an den ESP löten (Pin 3v3 oben links). Der ESP scheint ein ESP8266-9 zu sein.

Sonoff S20 POW

Diese hat einen zusätzlichen Chip (CSE7759) zur Strom- und Spannungsmessung. Die Ansteuerung ist analog zum hlw8012.

WIFI Smart Socket PS-16-M (10A)

Pinbelegung & Handling wie Sonoff

Luminea Home Control Steckdose (16(2)A) von Pearl

  • pin_relais 15 //relais
  • pin_led 2 //green
  • pin_Button 13 //Button
  • pin_ledinvert true
  • pin_relaisinvert false
  • pin_buttoninvert true

Ich habe meine Dose im Sonderangebot von PEARL bezogen (~5,-€). Im inneren werkelt ein ESP8266-S3, der Standesgemäß auf der Seriellen mit 74880 Baud Infos ausgibt. Z.B. die MAC-Adressen. Für den Anschluss eines USB-Seriell-Wandlers sind auf der Platine Lötpunkte an den relevanten Stellen vorhanden. Bei dieser Dose liegen auf Pin 15 das Relais, Pin 2 die grüne LED und Pin 13 der Taster (Nummerierung nach Arduino).

Quellen und Inspirationen

folgende Bibliothecken wurden verwendet:

folgende Projekte waren für die Entwicklung hilfreich:

Installation mit Arduino IDE 1.8.5

  • zuerst müssen die Zeilen #define WIFI_SSID und #define WIFI_PASSWORD aus kommentiert und befüllt werden
  • die Zeile #include "wifisetup.h" ist auszukommentieren (ich habe dort meine Wifi-Einstellungen abgelegt)
  • Einstellung: Generic ESP8266 Modul, 80 MHZ, 40MHz, DOUT, 115200, 1M (64k SPIFFS)
  • Um die Stecksode im Netzwerk zu finden, sollte ARDUINO_HOSTNAME definiert werden
  • Es gibt verschiedene Vordefinitionen für verschiedene Steckdosen, die passende ist einzukommentieren
  • kann sich die Dose nicht ins Netzwerk einloggen, schaltet diese in den AP-Modus (AP-Name ist der in ARDUINO_HOSTNAME definiert wurde) und ist unter 192.168.4.1 erreichbar

Bei upload auf die Sonoff muß der Button gedrück werden und dann Strom geschaltet werden - damit geht der ESP8266 in den Programiermodus. Beim Horsky ist der Port IO0 mit GND zu verbinden.

Nach dem Übertragen startet der ESP8266 neu und meldet sich im angegeben Netzwerk an. Mit der Seriellen Konsole kann der Bootvorgang beobachtet werden.

Ist der Steckdose erfolgreich im heimischen Netz können weitere updates per OTA gemacht werden.

Oberfläche nach den upload von CSS & JS

Wenn die Dose erfolgreich programmiert wurde, sind die Daten im Ordner www-data mit der upload-Funktion hochzuladen. Wer möchte kann das natürlich je nach Bedarf anpassen. Ist dies erfolgt, sieht das ganze etwa so aus:

Hier habe ich schon Zeitpunkte definiert, diese werden in der Datei timer.txt abgelegt.

Web-API

folgende Befehle stehen zur Verfügung:

  • [ip]/action?sonoff=ON Relais einschalten
  • [ip]/action?sonoff=OFF Relais ausschalten
  • [ip]/action?sonoff=LEDON LED einschalten
  • [ip]/action?sonoff=LEDOFF LED ausschalten
  • [ip]/data.json Rückgabe ein JSON-Formatierte Systeminfo (Relaystatus, LEDstatus, Dateien,...)
  • [ip]/timer.txt (wenn vorhanden) die definierten Timer
  • [ip]/favicon.ico?delete=/favicon.ico hiermit kann eine Datei gelöscht werden
  • [ip]/upload Schnittstelle zum hochladen von Dateien (per upload-Formular)

timer.txt

jede Zeite repräsentiert einen Timereintrage z.B. on|07:05|31|ON|t1

  • der 1. Wert sagt ob der Timer aktiv ist (on=aktiv)
  • der 2. Wert gibt den Zeitpunkt der Ausführung an, in Stunden:Minute (hh:mm)
  • der 3. Wert gibt an an welchem Tag der Timer aktiv sein soll, als byte (1=Mo, 2=Di, 4=Mi, 8=Do, 16=Fr, 32=Sa, 64=So) z.B. 31=Montag bis Freitag
  • der 4. Wert beschreibt den Befehl (ON,OFF,LEDON,LEDOFF)
  • der 5. Wert ist die ID des Timers

History

  • Ab Version 2.0: wenn der erste Versuch nicht geklappt hat, versucht die Dose es noch 15 mal (alle 15 Sekunden). Gelingt keine Verbindung bleibt sie im AP-Modus. Fällt zwischendurch das WLAN aus, versucht die Dose einen reconnect (10mal, alle 15 Sek.), gelinkt keine Verbindung bleibt sie im AP-Modus.
  • Version 2.1: HTML Umlaute codiert
  • Version 2.2: mit "#define keinAPModus true" versucht die Dose endlos eine Neuverbindung, wenn WLan-Verbundung unterbrochen wurde.
  • Version 2.3: größere (check_wlanasclient) und variablere WLAN-check, um bei Wiederverbindung AP nicht zu überlasten
  • Version 2.4: neue Dosentyp hinzugefügt (Luminea Home Control Wlansteckdose), Access-Control-Allow-Origin eingefügt

TODO / was ist noch zu tun

  • WLAN-Einstellungen dynamisch anpassbar machen (siehe esp32-32x32rgbmatrix)

Beispiel Lampe

Wer die Daten aus dem Ordner "beispiel_lampe" hochläd, erhält folgende Features:

  • Einstellungen in Tabs gruppiert
  • LED schalten ausgeblendet

So kann mam bequem mit zwei Tasten die Lampe ein und ausschalten ohne das andere Geraffel immer zu sehen.