ESP8266 WiFi-Postmelder „Der Start“ und die Software

Heute sind die Platinen angekommen, echt schnell, in 6 Tagen aus
China zu mir auf den Tisch 😉

So gleich los gelegt und das „Mainboard“ bestückt, fertig sieht es jetzt so aus…

ESP8266-Briefkasten-Postmelder-Mainboard-300x173 ESP8266 WiFi-Postmelder "Der Start" und die Software

Da der Solar-Laderegler identisch ist mit einem anderen Projekt von mir kann ich den ATTINY13A mit der gleichen Software flashen.

Nach ersten Tests hat sich leider gezeigt das die Idee mit den Lichtschranken nicht so optimal war.

Zum einen ist die Reichweite nicht wie benötigt und es wäre auch zu anfällig gegen „Störlicht“.

Ich haben mich jetzt dazu entschlossen es mit Fenster-Magnetkontakten, wie von Alarmanlagen bekannt, zu realisieren.

Das funktioniert sogar bei Briefkästen aus Metall sehr gut wie sich gezeigt hat.

MagnetFensterkontakt-300x260 ESP8266 WiFi-Postmelder "Der Start" und die SoftwareFenster Magnet-Kontakt

Die Magnet-Konkatke sind bestellt, hatte nur einen von meiner Alarmanlage da, und wenn sie da sind geht es weiter…

In der Zwischenzeit habe ich an der Software gebastelt, aus der Grundlage der Software zum neuen ESP8266-DHT22-SENSOR entstand nun im Februar 2016 eine neue Software für den ESP8266-Postmelder, wie die Sache ab sofort heißt.

Die APP habe ich zu Gunsten der Web basierten Software aufgegeben, ein Browser hat ja jeder im Handy oder auf dem Notebook um von unterwegs zugreifen zu können. Dazu braucht es nur eine Weiterleitung im heimischen WLAN-Router.

Das Demo System kann man hier, ab und zu, testen (manchmal bin daran am basteln oder nutze das Board für andere Projekte):

Noch geändert hat sich das ich jetzt einfach eines meiner Carrier-Boards für die ESP-07 (II) bzw. ESP-12 nehme.

Einsetzen tue ich nur noch die aktuellen ESP-12(E/F) mit 4M Flash. Sie kosten gleich viel und haben mehr Reserven 🙂

Die „Verdrahtung“ ist wie im folgenden Bild zu sehen.

Anschlussschema-300x300 ESP8266 WiFi-Postmelder "Der Start" und die Software
Und hier die Software, die Benachrichtigung erfolgt per Mail über Pushingbox.

/* EEPROM Aufteilung für Konfigurationsdaten
Position     Länge    Wert
0            1        Firststart Flag
1            1        FREI
2            1        Connectiontimeout
3            1        Flag für zu viele Connection Timeouts -> SETUP Modus wird aktiviert bei 3 aufeinanderfolgenden Timeouts
4            1        IP Typ 0=DHCP, 1=Statisch
5            4        IP-Adresse
9            4        Gateway IP-Adresse
13           4        Subnet Mask
17           4        DNS-Server IP-Adresse
21-52        32       WLAN SSID
53-116       64       WLAN PWD
117-148      32       MELDERSSID
149-212      64       MELDERPWD
213-237      25       Standort
240-255      16       Pushingbox Device ID für Post ist da
256-271      16       Pushingbox Device ID für Akku Warnung
300          1        Poststatus 1=Neue Post, 0=Keine Post
301          1        Türstatus 1=offen, 0=geschlossen
302          1        Mail versendet Flag
*/

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <EEPROM.h>

#define SYSTEMRESETPIN 2             
#define STATUSRESETPIN 14
#define KLAPPENPIN 12             
#define TUERPIN 13             
#define LEDPOST 4
#define LEDNOPOST 5

ADC_MODE(ADC_VCC);                                  //Der ADC wird so konfiguriert das er die Systemspannung misst, es darf nichts am ADC (TOUT) Pin angechlossen sein!

const String PRGVERSION="2.100216.f";

//Variablen werden mit EEPROM Konfiguration überschrieben wenn FirstStartFlag im EEPROM = 111 (bedeutet System ist konfiguriert) ist!
byte FIRSTSTARTFLAG=0;                              //Flag zur Erkennung ob System im Setup Modus starten muss weil es keine Konfiguration im EEPROM hat
byte UPDATEINTERVAL=15;                             //Aktualisierungsinterval für den Thingspeak Channel in Minuten (Mindestens 15 lt. Thingspeak gewünscht 😉 )
byte CONNECTIONTIMEOUT=60;                          //Verbindungstimeout für die Verbindung mit unserem WLAN (Sekunden)
byte STATICIP=0;                                    //Art der IP-Adresszuteilung 0=IP per DHCP, 1=Statische IP
String WLANSSID;                                    //Die SSID eures WLAN kommt hier rein
String WLANPWD;                                     //Das WLAN Passwort eures WLAN kommt hier rein
String MELDERSSID="ESP8266-POSTMELDER";             //Die Standard SSID für unser Melder WLAN
String MELDERPWD;                                   //Das Passwort für unser Melder WLAN
String MELDERSTANDORT;                              //Standort des Melders (Max 25 Zeichen)
String PUSHINGBOXIDPOSTMAIL;                        //Pushingbox Device ID die wir zum Versand der Post ist da Mails nutzen
String PUSHINGBOXIDAKKUMAIL;                        //Pushingbox Device ID die wir zum Versand der Akkuwarnungs-Mails nutzen
IPAddress ip(0,0,0,0);                              //Melder Server IP-Adresse bei statischer Konfiguration
IPAddress gw(0,0,0,0);                              //Gateway IP-Adresse bei statischer Konfiguration
IPAddress sub(255,255,255,0);                       //Subnet Mask bei statischer Konfiguration
IPAddress dns(0,0,0,0);                             //DNS Server IP-Adresse bei statischer Konfiguration

//Konstanten definieren, diese Werte können nur im Programm angepasst werden
const String PUSHINGBOXSERVER = "api.pushingbox.com"; //Pushingbox API Hostadresse
const int PUSHINGBOXPORT=80;                        //Port des Pushingbox Hosts
//const IPAddress PBIP(213,186,33,19);
const int SHUTDOWNVCC=3100;                         //Systemabschaltschwelle in Volt ohne Dezimalpunkt 4 Stellen (z.B. 3,1 V = 3100)
const int MAXCONNECTIONTRIES=5;                     //Maximale Anzahl an WLAN Verbindungsversuchen bevor wieder in den Setup Modus gebootet wird
const int DNSPORT=53;                               //Port des DNS Servers
const int SITEREFRESH=30;                           //Zeit in Sekunden in der sich die Statusseite im Browser neu lädt

//Sonstige benötigte Variablen definieren 
String HTMLFORMULARWLAN;                            //Hilfsvariable für das Formular zur Auswahl des WLAN
byte TIMEOUTFLAG=0;                                 //Hilfsvariable zum zählen der Verbindungstimeouts
byte POSTSTATUS;                                    //Flag für neue Post 1=JA, 0=NEIN
byte TUERSTATUS;                                    //Flag für Status der Briefkastentür 1=OFFEN, 0=GESCHLOSSEN
byte MAILISSENT=0;                                  //Fla ob Mail versendet wurde
int step=0;                                         //Variable für den Setup-Wizzard

WiFiServer server(80);
DNSServer dnsServer;

String macToStr(const uint8_t* mac)
{
  String result;

  for (int i = 0; i < 6; ++i) {
    if(String(mac[i],16).length()==1){
      result += "0";
    }
    
    result += String(mac[i], 16);
 
    if (i < 5)
      result += ':';
  }

  result.toUpperCase();
  
  return result;
}

void ReadEEPROMConfig() {
  EEPROM.begin(512);

  delay(10);
  
  EEPROM.get(0,FIRSTSTARTFLAG);

  if (FIRSTSTARTFLAG !=0 && FIRSTSTARTFLAG != 111) {
    FIRSTSTARTFLAG=0;
  }
  
  Serial.print(F("FIRSTSTARTFLAG="));
  Serial.println(FIRSTSTARTFLAG);
  
  EEPROM.get(2,CONNECTIONTIMEOUT);

  Serial.print(F("CONNECTIONTIMEOUT="));
  Serial.println(CONNECTIONTIMEOUT);

  EEPROM.get(3,TIMEOUTFLAG);

  Serial.print(F("TIMEOUTFLAG="));
  Serial.println(TIMEOUTFLAG);

  EEPROM.get(4,STATICIP);

  Serial.print(F("STATICIP="));
  Serial.println(STATICIP);

  ip[0]=EEPROM.read(5);
  ip[1]=EEPROM.read(6);
  ip[2]=EEPROM.read(7);
  ip[3]=EEPROM.read(8);
  
  gw[0]=EEPROM.read(9);
  gw[1]=EEPROM.read(10);
  gw[2]=EEPROM.read(11);
  gw[3]=EEPROM.read(12);
  
  sub[0]=EEPROM.read(13);
  sub[1]=EEPROM.read(14);
  sub[2]=EEPROM.read(15);
  sub[3]=EEPROM.read(16);

  dns[0]=EEPROM.read(17);
  dns[1]=EEPROM.read(18);
  dns[2]=EEPROM.read(19);
  dns[3]=EEPROM.read(20);

  Serial.print(F("IP="));
  Serial.println(ip);
  
  Serial.print(F("GATEWAY="));
  Serial.println(gw);
  
  Serial.print(F("SUBNET="));
  Serial.println(sub);
  
  Serial.print(F("DNS="));
  Serial.println(dns);
  
  WLANSSID="";
  
  for (int i = 21; i < 53; ++i)
  {
    WLANSSID += char(EEPROM.read(i));
  }

  Serial.print(F("WLANSSID="));
  Serial.println(WLANSSID.c_str());

  WLANPWD="";
  
  for (int i = 53; i < 117; ++i)
  {
    WLANPWD += char(EEPROM.read(i));
  }
  
  Serial.print(F("WLANPWD="));
  Serial.println(WLANPWD.c_str());

  MELDERSSID="";

  for (int i = 117; i < 149; ++i)
  {
    MELDERSSID += char(EEPROM.read(i));
  }
  
  Serial.print(F("MELDERSSID="));
  Serial.println(MELDERSSID.c_str());

  MELDERPWD="";

  for (int i = 149; i < 213; ++i)
  {
    MELDERPWD += char(EEPROM.read(i));
  }

  Serial.print(F("MELDERPWD="));
  Serial.println(MELDERPWD.c_str());

  MELDERSTANDORT="";

  for (int i = 213; i < 238; ++i)
  {
    MELDERSTANDORT += char(EEPROM.read(i));
  }

  Serial.print(F("MELDERSTANDORT="));
  Serial.println(MELDERSTANDORT.c_str());

  EEPROM.get(300, POSTSTATUS);

  if (POSTSTATUS >= 2) {
    POSTSTATUS=0;
  }

  Serial.print(F("POSTSTATUS="));
  Serial.println (POSTSTATUS);
  
  EEPROM.get(301, TUERSTATUS);
  
  if (TUERSTATUS >= 2) {
    TUERSTATUS=0;
  }

  Serial.print(F("TUERSTATUS="));
  Serial.println (TUERSTATUS);
  
  EEPROM.get(302, MAILISSENT);

  if (MAILISSENT >= 2) {
    MAILISSENT=0;
  }

  Serial.print(F("MAILISSENT="));
  Serial.println (MAILISSENT);

  PUSHINGBOXIDPOSTMAIL="";

  for (int i = 240; i < 256; ++i)
  {
    PUSHINGBOXIDPOSTMAIL += char(EEPROM.read(i));
  }

  Serial.print(F("PUSHINGBOXIDPOSTMAIL="));
  Serial.println(PUSHINGBOXIDPOSTMAIL.c_str());

  PUSHINGBOXIDAKKUMAIL="";

  for (int i = 256; i < 272; ++i)
  {
    PUSHINGBOXIDAKKUMAIL += char(EEPROM.read(i));
  }

  Serial.print(F("PUSHINGBOXIDAKKUMAIL="));
  Serial.println(PUSHINGBOXIDAKKUMAIL.c_str());

  EEPROM.end();
}

void SendeMail(int MAILTYP) {
  WiFiClient pbclient;

  Serial.print(F("Verbinde mit "));
  Serial.print(PUSHINGBOXSERVER.c_str());
  Serial.println(F(" ..."));

  if (pbclient.connect(PUSHINGBOXSERVER.c_str(), PUSHINGBOXPORT)) { 
    Serial.println(F("Verbindung erfolgreich hergestellt..."));
    
    String getStr = "/pushingbox?devid=";
    
    if (MAILTYP == 0) {
     getStr += PUSHINGBOXIDPOSTMAIL.c_str();
    } else {
     getStr += PUSHINGBOXIDAKKUMAIL.c_str();
    }

    getStr += "&STANDORT=";
    getStr += MELDERSTANDORT.c_str();
    
    pbclient.print("GET " + getStr + " HTTP/1.1\r\n"); 
    pbclient.print("HOST: ");
    pbclient.print(PUSHINGBOXSERVER.c_str());
    pbclient.print("\r\n\r\n"); 
    
    delay(100);
    
    pbclient.stop();
    
    if (MAILTYP == 0) {
      MAILISSENT=1;

      EEPROM.begin(512);

      delay(10);
      
      EEPROM.write(302, 1);

      EEPROM.commit();
      EEPROM.end();
    }
    
    Serial.println(F("Verbindung abgebaut."));
  }  
}

void ShowSysInfo(int typ) {
  if (typ==1) {
    Serial.print(F("SDK-Version: "));
    Serial.println(ESP.getSdkVersion());
    Serial.print(F("ESP8266 Chip-ID: "));
    Serial.println(ESP.getChipId());
    Serial.print(F("ESP8266 Speed: "));  
    Serial.print(ESP.getCpuFreqMHz());
    Serial.println(F(" MHz"));
  }
  
  Serial.print(F("Free Heap Size: "));
  Serial.print(ESP.getFreeHeap());
  Serial.println(F(" Bytes"));
  Serial.print(F("Systemspannung: "));
  Serial.print(String(ESP.getVcc()).substring(0,1));
  Serial.print(F(","));
  Serial.print(String(ESP.getVcc()).substring(1));
  Serial.println(F(" Volt"));  
  Serial.println(F(""));
}

void ResetWiFi() {
  EEPROM.begin(512);

  delay(10);
  
  EEPROM.write(0,0);
  
  EEPROM.commit();
  EEPROM.end();

  WiFi.disconnect();

  delay(100);
  
  ESP.deepSleep(1,WAKE_RF_DEFAULT);
  delay(100);
}

void setup() {
  Serial.begin(115200);

  Serial.println(F(""));  
  Serial.println(F("Starte den ESP8266-POSTMELDER..."));
  Serial.println(F(""));
  Serial.println(F("Teste Systemspannung..."));
  Serial.println(F(""));

  if (ESP.getVcc() <= SHUTDOWNVCC) {
      Serial.println(F("!!! Systemspannung zu niedrig, schalte System ab !!!"));
      Serial.println(F(""));

      SendeMail(1);
      
      delay(100);
      
      ESP.deepSleep(0,WAKE_RF_DISABLED);
      delay(100);
  }
  
  Serial.print(String(ESP.getVcc()).substring(0,1));
  Serial.print(F(","));
  Serial.print(String(ESP.getVcc()).substring(1));
  Serial.println(F(" Volt ist OK"));
  Serial.println(F(""));

  pinMode(KLAPPENPIN, INPUT_PULLUP);
  pinMode(TUERPIN, INPUT_PULLUP);
  pinMode(SYSTEMRESETPIN, INPUT_PULLUP);
  pinMode(STATUSRESETPIN, INPUT_PULLUP);
  pinMode(LEDPOST, OUTPUT);
  pinMode(LEDNOPOST, OUTPUT);
  
  digitalWrite(LEDPOST, 0);
  digitalWrite(LEDNOPOST, 1);
  
  Serial.println(F("Hole Konfiguration aus EEPROM..."));
  Serial.println(F(""));

  ReadEEPROMConfig();

  Serial.println(F(""));

  ShowSysInfo(1);

  Serial.println(F("WLAN-Netzwerk-Scan gestartet..."));
      
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  int n = WiFi.scanNetworks();
    
  Serial.println(F("WLAN-Netzwerk-Scan abgeschlossen..."));
  Serial.println(F(""));

  if (n == 0) {
    Serial.println(F("Kein WLAN-Netzwerk gefunden!"));
  } else {
    Serial.print(n);

    if(n<=1) {
     Serial.println(F(" WLAN-Netzwerk gefunden"));
    } else {
      Serial.println(F(" WLAN-Netzwerke gefunden"));
    }
  
    Serial.println(F(""));

    for (int i = 0; i < n; ++i) { 
      Serial.print(i + 1);
      Serial.print(F(": "));
      Serial.print(WiFi.SSID(i));
      Serial.print(F(" ("));
      Serial.print(WiFi.RSSI(i));
      Serial.print(F(")"));
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
    }
  }

  HTMLFORMULARWLAN = "<b><u>WLAN-Netzwerk ausw&auml;hlen:</u></b><br /><br />";

  for (int i = 0; i < n; ++i) {
    // Erstelle Webseite mit allen SSID und RSSI Werten der gefundenen Netzwerke
    HTMLFORMULARWLAN += "<input type='radio' name='WLANSSID' value='";
    HTMLFORMULARWLAN += WiFi.SSID(i);
    HTMLFORMULARWLAN += "'";

    if (WiFi.SSID(i)==WLANSSID.substring(0, WiFi.SSID(i).length()+1)) {
      HTMLFORMULARWLAN += " checked";
    } 

    HTMLFORMULARWLAN += ">";
    HTMLFORMULARWLAN += WiFi.SSID(i);
    HTMLFORMULARWLAN += " (";
    HTMLFORMULARWLAN += WiFi.RSSI(i);
    HTMLFORMULARWLAN += ")";
    HTMLFORMULARWLAN += (WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*";
    HTMLFORMULARWLAN += "<br />";
  }
  
  Serial.println(F("")); 

  if (FIRSTSTARTFLAG==111) {
    Serial.print(F("Verbinde mit WLAN "));
    Serial.println(WLANSSID);
  
    if (STATICIP==1) {
      WiFi.config(ip, gw, sub, dns);
    }

    WiFi.begin(WLANSSID.c_str(), WLANPWD.c_str());
    
    int WLANTIMEOUT=0;
    
    while (WiFi.status() != WL_CONNECTED) {
      delay(1000);

      Serial.print(F("."));
      
      WLANTIMEOUT+=1;
  
      if (WLANTIMEOUT>=CONNECTIONTIMEOUT) {
        Serial.println(F(""));
        Serial.println(F("Timeout!"));  
        
        TIMEOUTFLAG+=1;

        if(TIMEOUTFLAG>=MAXCONNECTIONTRIES) {
          ResetWiFi();
        } else {
          EEPROM.begin(512);

          delay(10);
          
          EEPROM.write(3, TIMEOUTFLAG);
          
          EEPROM.commit();
          EEPROM.end();
          
          WiFi.disconnect();

          delay(100);
          
          ESP.deepSleep(1000000,WAKE_RF_DEFAULT);
          delay(100);
        }
      }
    }
  
    EEPROM.begin(512);

    delay(10);
    
    EEPROM.write(3, 0);
    
    EEPROM.commit();
    EEPROM.end();

    Serial.println(F(""));
    Serial.println(F("Verbindung mit WLAN hergestellt"));  
    Serial.println(F(""));
    Serial.print(F("IP-Addresse: "));
    Serial.println(WiFi.localIP());
    Serial.println(F(""));
    Serial.println(F("Starte im Normal-Modus"));

    WiFi.softAP(MELDERSSID.c_str(), MELDERPWD.c_str());
  
    Serial.println(F(""));
    Serial.println(F("AP Modus gestartet"));
    Serial.print(F("SSID: "));
    Serial.println(MELDERSSID.c_str());
    Serial.print(F("Passwort: "));
    Serial.println(MELDERPWD.c_str());

    if (POSTSTATUS == 1) {
      digitalWrite(LEDPOST, 1);
    } else {
      digitalWrite(LEDNOPOST, 1);
    }
  } else {
    analogWrite(LEDPOST ,100);
    analogWrite(LEDNOPOST, 100);
    
    FIRSTSTARTFLAG=1;
    
    Serial.println(F("Starte im Setup-Modus!!!"));
    
    WiFi.softAP("ESP8266-POSTMELDER-SETUP");

    Serial.println(F(""));
    Serial.println(F("AP Modus gestartet"));
    Serial.println(F("SSID: ESP8266-POSTMELDER-SETUP"));
  } 
  
  Serial.print(F("AP IP-Adresse: "));
  Serial.println(WiFi.softAPIP());
 
  Serial.println(F(""));
  Serial.println(F("Starte DNS-Server"));
  
  dnsServer.start(DNSPORT, "*", WiFi.softAPIP());

  delay(100);
  
  Serial.println(F("DNS-Server gestartet")); 
  Serial.println(F(""));
  Serial.println(F("Starte HTTP-Server"));

  server.begin();

  delay(100);
  
  Serial.println(F("Server gestartet")); 
  Serial.println(F(""));

  Serial.println(F("...ESP8266-POSTMELDER erfolgreich gestartet."));
  Serial.println(F(""));  
}

void loop() {  
  //Wenn Systemspannung zu gering System abschalten
  if (ESP.getVcc() <= SHUTDOWNVCC) {
    Serial.println(F("Systemspannung zu gering, System wird abgeschaltet..."));
    Serial.println(F(""));  

    digitalWrite(LEDPOST, 0);
    digitalWrite(LEDNOPOST, 0);
    
    SendeMail(1);
    
    delay(100);
    
    ESP.deepSleep(0, WAKE_RF_DISABLED);
    delay(100);
  }

  int KLAPPENPINIST;                                  //Hilfsvariable für aktuellen Klappenstatus
  int TUERPINIST;                                     //Hilfsvariable für aktuellen Türstatus

  KLAPPENPINIST=digitalRead(KLAPPENPIN);
  TUERPINIST=digitalRead(TUERPIN);

  delay(10);
  
  if (FIRSTSTARTFLAG == 111) {
    if (KLAPPENPINIST == 1) {
      
      if (POSTSTATUS == 0) {
        EEPROM.begin(512);

        delay(10);
        
        EEPROM.put(300, 1);
        
        EEPROM.commit();
        EEPROM.end();
    
        POSTSTATUS=1;
      }
        
      digitalWrite(LEDPOST, 1);
      digitalWrite(LEDNOPOST, 0);
  
      if (MAILISSENT == 0) {
        SendeMail(0);
      }
    }
  
    if (TUERSTATUS == 0 && TUERPINIST == 1) {
      TUERSTATUS=1;
  
      EEPROM.begin(512);

      delay(10);
      
      EEPROM.put(301, 1);

      EEPROM.commit();
      EEPROM.end();
    } 
    
    if (TUERSTATUS == 1 && TUERPINIST == 0) {
      TUERSTATUS=0;
  
      EEPROM.begin(512);

      delay(10);
      
      EEPROM.put(301, 0);
      
      EEPROM.commit();
      EEPROM.end();
    }
  
    if(POSTSTATUS == 1 && digitalRead(STATUSRESETPIN) == 0) {
  
      delay(100);
  
      while (digitalRead(STATUSRESETPIN) == 0) {
        delay(10);
      }
      
      POSTSTATUS=0;
      MAILISSENT=0;
      
      digitalWrite(LEDPOST, 0);
      digitalWrite(LEDNOPOST, 1);
      
      EEPROM.begin(512);

      delay(10);
      
      EEPROM.put(300, 0);
      EEPROM.put(302, 0);
      
      EEPROM.commit();
      EEPROM.end();
    }
  }
  
  dnsServer.processNextRequest();

  delay(10);

  WiFiClient http = server.available();

  if (digitalRead(SYSTEMRESETPIN) == 0) {
    digitalWrite(LEDPOST, 1);
    digitalWrite(LEDNOPOST, 1);
    
    delay(500);
    
    while (digitalRead(SYSTEMRESETPIN) == 0) {
      delay(100);
    }

    digitalWrite(LEDPOST, 0);
    digitalWrite(LEDNOPOST, 0);
    
    delay(500);
    
    ResetWiFi();
  }

  if(http) {
    while(http.connected() && !http.available()){
      delay(1);
    }

    String RequestString = http.readStringUntil('\r');

    http.flush();
    
    int addr_start = RequestString.indexOf(' ');
    int addr_end = RequestString.indexOf(' ', addr_start + 1);

    if (addr_start == -1 || addr_end == -1) {
      Serial.print(F("Ungueltige Anfrage: "));
      Serial.println(RequestString);
      Serial.println(F(""));
      
      http.stop();
      return;
    } else {
      RequestString = RequestString.substring(addr_start + 1, addr_end);

      Serial.print(F("Gueltige Anfrage: "));
      Serial.println(RequestString);
      Serial.println(F(""));
      
      String HTMLSite="";
      String HTMLHeader="";
      String ERRORTEXT="";

      IPAddress AKTSOFTAPIP = WiFi.softAPIP();
      
      String HTMLAKTSOFTAPIP = String(AKTSOFTAPIP[0]) + '.' + String(AKTSOFTAPIP[1]) + '.' + String(AKTSOFTAPIP[2]) + '.' + String(AKTSOFTAPIP[3]);
      
      if (RequestString.startsWith("/setwlanconfig?")) {
        FIRSTSTARTFLAG=0;
        step=2;

        //1. Wert extrahieren (WLAN SSID)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        String NeueWLANSSID; 
        NeueWLANSSID = RequestString.substring(StartPosition,EndePosition);

        if(NeueWLANSSID.length() > 32) {
          ERRORTEXT="WLAN SSID zu lang!";
        }
        
        //2. Wert extrahieren (Netzwerk Passwort)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        String NeuesWLANPWD;
        NeuesWLANPWD = RequestString.substring(StartPosition,EndePosition);

        if(NeuesWLANPWD.length() > 64) {
          ERRORTEXT="WLAN Passwort zu lang!";
        }

        //3. Wert extrahieren (CONNECTIONTIMEOUT)
        int NeuesCONNECTIONTIMEOUT=0;
        NeuesCONNECTIONTIMEOUT=RequestString.substring(RequestString.lastIndexOf("=")+1).toInt();

        if(NeuesCONNECTIONTIMEOUT != 10 && NeuesCONNECTIONTIMEOUT != 30 && NeuesCONNECTIONTIMEOUT != 60) {
          ERRORTEXT="Falsches Connection Timeout!";
        }

        if(ERRORTEXT == "") {
          EEPROM.begin(512);

          delay(10);

          //Alte Daten löschen
          EEPROM.write(2, 0); 

          for (int i = 21; i < 117; ++i){ 
            EEPROM.write(i, 0); 
          }
        
          Serial.println(F(""));
          Serial.println(F("Schreibe neue WLANSSID ins EEPROM:"));
    
          for (int i = 0; i < NeueWLANSSID.length(); ++i){
            EEPROM.write(21+i, NeueWLANSSID[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeueWLANSSID[i]); 
          }    
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neues WLANPWD ins EEPROM:"));
  
          for (int i = 0; i < NeuesWLANPWD.length(); ++i){
            EEPROM.write(53+i, NeuesWLANPWD[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeuesWLANPWD[i]); 
          }    
  
          Serial.println(F(""));
          Serial.print(F("Schreibe neues CONNECTIONTIMEOUT ins EEPROM: "));

          Serial.print(F("schreibe: "));
          Serial.println(NeuesCONNECTIONTIMEOUT);
        
          EEPROM.write(2, NeuesCONNECTIONTIMEOUT);

          EEPROM.commit();
          EEPROM.end();
        } else {
          step=1;
        }
      }
      
      if (RequestString.startsWith("/setipconfig")) {
        step=3;

        //1. Wert extrahieren (IP Typ)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        int NeuerIPTYP; 
        NeuerIPTYP = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeuerIPTYP !=0 && NeuerIPTYP !=1) {
          ERRORTEXT="Falsche IP-Art angegeben!";
        }
        
        //2. Wert extrahieren (IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        int NeueIP1;
        NeueIP1 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueIP1 < 0 || NeueIP1 > 255) {
          ERRORTEXT="IP-Adresse Teil 1 ist falsch!";
        }

        //3. Wert extrahieren (IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueIP2;
        NeueIP2 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueIP2 < 0 || NeueIP2 > 255) {
          ERRORTEXT="IP-Adresse Teil 2 ist falsch!";
        }

        //4. Wert extrahieren (IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueIP3;
        NeueIP3 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueIP3 < 0 || NeueIP3 > 255) {
          ERRORTEXT="IP-Adresse Teil 3 ist falsch!";
        }

        //5. Wert extrahieren (IP-Adresse Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueIP4;
        NeueIP4 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueIP4 < 0 || NeueIP4 > 255) {
          ERRORTEXT="IP-Adresse Teil 4 ist falsch!";
        }

        //6. Wert extrahieren (Gateway IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueGWIP1;
        NeueGWIP1 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueGWIP1 < 0 || NeueGWIP1 > 255) {
          ERRORTEXT="Gateway Adresse Teil 1 ist falsch!";
        }

        //7. Wert extrahieren (Gateway IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueGWIP2;
        NeueGWIP2 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueGWIP2 < 0 || NeueGWIP2 > 255) {
          ERRORTEXT="Gateway Adresse Teil 2 ist falsch!";
        }

        //8. Wert extrahieren (Gateway IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueGWIP3;
        NeueGWIP3 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueGWIP3 < 0 || NeueGWIP3 > 255) {
          ERRORTEXT="Gateway Adresse Teil 3 ist falsch!";
        }

        //9. Wert extrahieren (Gateway IP-Adresse Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueGWIP4;
        NeueGWIP4 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueGWIP4 < 0 || NeueGWIP4 > 255) {
          ERRORTEXT="Gateway Adresse Teil 4 ist falsch!";
        }

        //10. Wert extrahieren (Subnet Mask Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueMASK1;
        NeueMASK1 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueMASK1 < 0 || NeueMASK1 > 255) {
          ERRORTEXT="Subnet Mask Teil 1 ist falsch!";
        }

        //11. Wert extrahieren (Subnet Mask Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueMASK2;
        NeueMASK2 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueMASK2 < 0 || NeueMASK2 > 255) {
          ERRORTEXT="Subnet Mask Teil 2 ist falsch!";
        }

        //12. Wert extrahieren (Subnet Mask Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueMASK3;
        NeueMASK3 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueMASK3 < 0 || NeueMASK3 > 255) {
          ERRORTEXT="Subnet Mask Teil 3 ist falsch!";
        }

        //13. Wert extrahieren (Subnet Mask Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueMASK4;
        NeueMASK4 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueMASK4 < 0 || NeueMASK4 > 255) {
          ERRORTEXT="Subnet Mask Teil 4 ist falsch!";
        }

        //14. Wert extrahieren (DNS Server IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueDNSIP1;
        NeueDNSIP1 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueDNSIP1 < 0 || NeueDNSIP1 > 255) {
          ERRORTEXT="DNS IP-Adresse Teil 1 ist falsch!";
        }

        //15. Wert extrahieren (DNS Server IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueDNSIP2;
        NeueDNSIP2 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueDNSIP2 < 0 || NeueDNSIP2 > 255) {
          ERRORTEXT="DNS IP-Adresse Teil 2 ist falsch!";
        }

        //16. Wert extrahieren (DNS Server IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        int NeueDNSIP3;
        NeueDNSIP3 = RequestString.substring(StartPosition,EndePosition).toInt();

        if(NeueDNSIP3 < 0 || NeueDNSIP3 > 255) {
          ERRORTEXT="DNS IP-Adresse Teil 3 ist falsch!";
        }

        //17. Wert extrahieren (DNS Server IP-Adresse Teil 4)
        int NeueDNSIP4;
        NeueDNSIP4 = RequestString.substring(RequestString.lastIndexOf("=")+1).toInt();
        
        if(NeueDNSIP4 < 0 || NeueDNSIP4 > 255) {
          ERRORTEXT="DNS IP-Adresse Teil 4 ist falsch!";
        }

        if(ERRORTEXT == "") {
          EEPROM.begin(512);
  
          delay(10);
          
          //Alte Daten aus EEPROM löschen
          EEPROM.write(4, 0); 
  
          for (int i = 5; i < 21; ++i){ 
            EEPROM.write(i, 0); 
          }
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neuen IPTYP ins EEPROM:"));
    
          EEPROM.write(4, NeuerIPTYP);
  
          Serial.print(F("schreibe: "));
          Serial.println(NeuerIPTYP); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue IP-Adresse Teil 1 ins EEPROM:"));
  
          EEPROM.write(5, NeueIP1);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueIP1); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue IP-Adresse Teil 2 ins EEPROM:"));
  
          EEPROM.write(6, NeueIP2);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueIP2); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue IP-Adresse Teil 3 ins EEPROM:"));
  
          EEPROM.write(7, NeueIP3);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueIP3); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue IP-Adresse Teil 4 ins EEPROM:"));
  
          EEPROM.write(8, NeueIP4);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueIP4); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 1 ins EEPROM:"));
  
          EEPROM.write(9, NeueGWIP1);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueGWIP1); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 2 ins EEPROM:"));
  
          EEPROM.write(10, NeueGWIP2);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueGWIP2); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 3 ins EEPROM:"));
  
          EEPROM.write(11, NeueGWIP3);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueGWIP3); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 4 ins EEPROM:"));
  
          EEPROM.write(12, NeueGWIP4);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueGWIP4); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Subnet Mask Teil 1 ins EEPROM:"));
  
          EEPROM.write(13, NeueMASK1);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueMASK1); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Subnet Mask Teil 2 ins EEPROM:"));
  
          EEPROM.write(14, NeueMASK2);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueMASK2); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Subnet Mask Teil 3 ins EEPROM:"));
  
          EEPROM.write(15, NeueMASK3);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueMASK3); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue Subnet Mask Teil 4 ins EEPROM:"));
  
          EEPROM.write(16, NeueMASK4);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueMASK4); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 1 ins EEPROM:"));
  
          EEPROM.write(17, NeueDNSIP1);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueDNSIP1); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 2 ins EEPROM:"));
  
          EEPROM.write(18, NeueDNSIP2);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueDNSIP2); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 3 ins EEPROM:"));
  
          EEPROM.write(19, NeueDNSIP3);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueDNSIP3); 
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 4 ins EEPROM:"));
  
          EEPROM.write(20, NeueDNSIP4);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueDNSIP4); 
  
          EEPROM.commit();
          EEPROM.end();
        } else {
          step=2;
        }
      }

      if (RequestString.startsWith("/setmailconfig?")) {
        step=4;
        
        //1. Wert extrahieren (PUSHINGBOXIDPOSTMAIL)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        String NeuePUSHINGBOXIDPOSTMAIL; 
        NeuePUSHINGBOXIDPOSTMAIL = RequestString.substring(StartPosition,EndePosition);

        if(NeuePUSHINGBOXIDPOSTMAIL.length() == 0 || NeuePUSHINGBOXIDPOSTMAIL.length() > 16) {
          ERRORTEXT="Pushingbox ID f&uuml;r neue Post ist falsch!";
        }
  
        //2. Wert extrahieren (PUSHINGBOXIDAKKUMAIL)
        String NeuePUSHINGBOXIDAKKUMAIL; 
        NeuePUSHINGBOXIDAKKUMAIL = RequestString.substring(RequestString.lastIndexOf("=")+1);

        if(NeuePUSHINGBOXIDAKKUMAIL.length() == 0 || NeuePUSHINGBOXIDAKKUMAIL.length() > 16) {
          ERRORTEXT="Pushingbox ID f&uuml;r Spannungswarnung ist falsch!";
        }

        if(ERRORTEXT == "") {
          EEPROM.begin(512);
  
          delay(10);
          
          for (int i = 240; i < 302; ++i){ 
            EEPROM.write(i, 0); 
          }
  
          EEPROM.put(300, 0);
          EEPROM.put(301, 0);
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue PUSHINGBOXIDPOSTMAIL ins EEPROM:"));
    
          for (int i = 0; i < NeuePUSHINGBOXIDPOSTMAIL.length(); ++i){
            EEPROM.write(240+i, NeuePUSHINGBOXIDPOSTMAIL[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeuePUSHINGBOXIDPOSTMAIL[i]); 
          }    
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue PUSHINGBOXIDAKKUMAIL ins EEPROM:"));
  
          for (int i = 0; i < NeuePUSHINGBOXIDAKKUMAIL.length(); ++i){
            EEPROM.write(256+i, NeuePUSHINGBOXIDAKKUMAIL[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeuePUSHINGBOXIDAKKUMAIL[i]); 
          }    
  
          EEPROM.commit();
          EEPROM.end();
        } else {
          step=3;
        }
      }

      if (RequestString.startsWith("/setmelderconfig?")) {
        step=5;

        //1. Wert extrahieren (STANDORT)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        String NeuerSTANDORT; 
        NeuerSTANDORT = RequestString.substring(StartPosition,EndePosition);

        if(NeuerSTANDORT.length() > 25) {
          ERRORTEXT="Standort zu lang!";
        }
        
        //2. Wert extrahieren (MELDERSSID)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        String NeueMELDERSSID = "";
        NeueMELDERSSID = RequestString.substring(StartPosition,EndePosition);

        if(NeueMELDERSSID.length() > 32) {
          ERRORTEXT="Melder WLAN SSID zu lang!";
        }
        
        //3. Wert extrahieren (MELDERPWD)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        String NeuesMELDERPWD = "";
        NeuesMELDERPWD = RequestString.substring(RequestString.lastIndexOf("=")+1);

        if(NeuesMELDERPWD.length() > 64) {
          ERRORTEXT="Melder WLAN Passwort zu lang!";
        }
        
        if(ERRORTEXT == "") {
          EEPROM.begin(512);
  
          delay(10);
          
          for (int i = 117; i < 238; ++i){ 
            EEPROM.write(i, 0); 
          }
  
          EEPROM.write(3,0);
          
          Serial.println(F(""));
          Serial.println(F("Schreibe neuen STANDORT ins EEPROM:"));
    
          for (int i = 0; i < NeuerSTANDORT.length(); ++i){
            EEPROM.write(213+i, NeuerSTANDORT[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeuerSTANDORT[i]); 
          }    
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neue MELDERSSID ins EEPROM:"));
  
          for (int i = 0; i < NeueMELDERSSID.length(); ++i){
            EEPROM.write(117+i, NeueMELDERSSID[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeueMELDERSSID[i]); 
          }    
  
          Serial.println(F(""));
          Serial.println(F("Schreibe neues MELDERPWD ins EEPROM:"));
  
          for (int i = 0; i < NeuesMELDERPWD.length(); ++i){
            EEPROM.write(149+i, NeuesMELDERPWD[i]);
            
            Serial.print(F("schreibe: "));
            Serial.println(NeuesMELDERPWD[i]); 
          }    
  
          Serial.println(F("Schreibe neues FIRSTSTARTFLAG ins EEPROM:"));
          FIRSTSTARTFLAG=111;
          
          EEPROM.write(0, FIRSTSTARTFLAG);
  
          Serial.print(F("schreibe: "));
          Serial.println(FIRSTSTARTFLAG); 
  
          EEPROM.commit();
          EEPROM.end();
        } else {
          step=4;
        }
      }

      if (step==5) {
        Serial.println(F("Abschlussseite des Setup wird ausgegeben"));
        Serial.println(F(""));
        
        HTMLSite ="<!DOCTYPE html><html><head>";
        HTMLSite += "<title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><br />";
        HTMLSite += "<b>Das Setup des Melders<br />";
        HTMLSite += "ist abgeschlossen.<br /><br />";
        HTMLSite += "Der Melderr startet jetzt neu!<br />";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";

        HTMLHeader  = "HTTP/1.1 200 OK\r\n";
        HTMLHeader += "Content-Length: ";
        HTMLHeader += HTMLSite.length();
        HTMLHeader += "\r\n";
        HTMLHeader += "Content-Type: text/html\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
        
        http.print(HTMLHeader);
        delay(1);
        http.print(HTMLSite);
        delay(1);
        
        http.stop();

        WiFi.disconnect();

        ESP.deepSleep(1000,WAKE_RF_DEFAULT); //System neu starten über Deep-Sleep Timer
        delay(100);
      }
      
      if (step == 1) {
        Serial.println(F("WLAN Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();

        if(ERRORTEXT != "") {
          HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Es ist ein Fehler aufgetreten!</legend><br />";
          HTMLSite += "<font color='red'><b>";
          HTMLSite += ERRORTEXT;
          HTMLSite += "</b></font><br /><br /></fieldset>";
        }
        
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Melder Setup Schritt 1</legend>";
        HTMLSite += "<form method='GET' action='http://";
        HTMLSite += HTMLAKTSOFTAPIP;
        HTMLSite += "/setwlanconfig'>";
        HTMLSite += "<br /><b>WLAN Einstellungen</b><br /><hr /><br />";
        HTMLSite += HTMLFORMULARWLAN;
        HTMLSite += "<br />WLAN-Passwort: <input name='WLANPWD' type='text' size='30' maxlength='64' value='";
        HTMLSite += WLANPWD.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />Verbindungs-Timeout: ";
        HTMLSite += "<select name='CONNECTIONTIMEOUT' size='1'>";

        if (CONNECTIONTIMEOUT==10) {
          HTMLSite += "<option value='10' selected>10</option><option value='30'>30</option><option value='60'>60</option>";
        } else if (CONNECTIONTIMEOUT==30) {
          HTMLSite += "<option value='10'>10</option><option value='30' selected>30</option><option value='60'>60</option>";
        } else {
          HTMLSite += "<option value='10'>10</option><option value='30'>30</option><option value='60' selected>60</option>";
        }
 
        HTMLSite += "</select> Sekunden<br />";
        HTMLSite += "<br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und weiter zu Schritt 2...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      }
      
      if (step == 2) {
        Serial.println(F("IP Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();

        if(ERRORTEXT != "") {
          HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Es ist ein Fehler aufgetreten!</legend><br />";
          HTMLSite += "<font color='red'><b>";
          HTMLSite += ERRORTEXT;
          HTMLSite += "</b></font><br /><br /></fieldset>";
        }
        
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Melder Setup Schritt 2</legend>";
        HTMLSite += "<form method='GET' action='http://";
        HTMLSite += HTMLAKTSOFTAPIP;
        HTMLSite += "/setipconfig'>";
        HTMLSite += "<br /><b>IP Einstellungen</b><br /><hr />";
        HTMLSite += "<br />IP-Adresstyp: ";
        HTMLSite += "<select name='STATICIP' size='1'>";
        
        if (STATICIP==0) {
          HTMLSite += "<option value='0' selected>DHCP</option><option value='1'>Statisch</option></select>";
        } else {
          HTMLSite += "<option value='0'>DHCP</option><option value='1' selected>Statisch</option></select>";
        }
        HTMLSite += "<br /><br />IP-Adresse: <input name='IP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />Gateway IP-Adresse: <input name='GWIP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />Subnet Mask: <input name='MASK1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />DNS-Server IP-Adresse: <input name='DNSIP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[3]);
        HTMLSite += "'></input><br />";
        HTMLSite += "<br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und weiter zu Schritt 3...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      } 
      
      if (step == 3) {
        Serial.println(F("Pushingbox Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();

        if(ERRORTEXT != "") {
          HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Es ist ein Fehler aufgetreten!</legend><br />";
          HTMLSite += "<font color='red'><b>";
          HTMLSite += ERRORTEXT;
          HTMLSite += "</b></font><br /><br /></fieldset>";
        }
        
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Melder Setup Schritt 3</legend>";
        HTMLSite += "<form method='GET' action='http://";
        HTMLSite += HTMLAKTSOFTAPIP;
        HTMLSite += "/setmailconfig'>";
        HTMLSite += "<br /><b>Pushingbox Einstellungen</b><br /><hr />";
        HTMLSite += "<br />Pushingbox ID f&uuml;r 'Neue Post' Mail: ";
        HTMLSite += "<input type='text' name='PUSHINGBOXIDPOSTMAIL' size='20' maxlegth='16' value='";
        HTMLSite += PUSHINGBOXIDPOSTMAIL;
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />Pushingbox ID f&uuml;r Akku Warnmail: ";
        HTMLSite += "<input type='text' name='MAILUSER' size='20' maxlength='16' value='";
        HTMLSite += PUSHINGBOXIDAKKUMAIL;
        HTMLSite += "'></input><br />";
        HTMLSite += "<br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und weiter zu Schritt 4...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      } 
      
      if (step == 4) {
        Serial.println(F("Melder Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();

        if(ERRORTEXT != "") {
          HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Es ist ein Fehler aufgetreten!</legend><br />";
          HTMLSite += "<font color='red'><b>";
          HTMLSite += ERRORTEXT;
          HTMLSite += "</b></font><br /><br /></fieldset>";
        }
        
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Melder Setup Schritt 4</legend>";
        HTMLSite += "<form method='GET' action='http://";
        HTMLSite += HTMLAKTSOFTAPIP;
        HTMLSite += "/setmelderconfig'>";
        HTMLSite += "<br /><b>Melder Einstellungen</b><br /><hr />";
        HTMLSite += "<br />Standort: <input name='MELDERSTANDORT' type='text' size='25' maxlength='25' value='";
        HTMLSite += MELDERSTANDORT.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />SSID: <input name='MELDERSSID' type='text' size='32' maxlength='32' value='";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />Passwort: <input name='MELDERPWD' type='text' size='30' maxlength='64' value='";
        HTMLSite += MELDERPWD.c_str();
        HTMLSite += "'></input><br /><br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und das Setup beenden'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      } 

      uint8_t mac[6];
      WiFi.macAddress(mac);
      
      IPAddress LOCALIPIST = WiFi.localIP();
      IPAddress GATEWAYIST = WiFi.gatewayIP();
      IPAddress SUBMASKIST = WiFi.subnetMask();
      IPAddress DNSIPIST = WiFi.dnsIP();
      
      String HTMLipStr = String(LOCALIPIST[0]) + '.' + String(LOCALIPIST[1]) + '.' + String(LOCALIPIST[2]) + '.' + String(LOCALIPIST[3]);
      String HTMLgwStr = String(GATEWAYIST[0]) + '.' + String(GATEWAYIST[1]) + '.' + String(GATEWAYIST[2]) + '.' + String(GATEWAYIST[3]);
      String HTMLsmStr = String(SUBMASKIST[0]) + '.' + String(SUBMASKIST[1]) + '.' + String(SUBMASKIST[2]) + '.' + String(SUBMASKIST[3]);
      String HTMLdnsStr = String(DNSIPIST[0]) + '.' + String(DNSIPIST[1]) + '.' + String(DNSIPIST[2]) + '.' + String(DNSIPIST[3]);

      if (RequestString.startsWith("/sensorinfo") && step == 0 && FIRSTSTARTFLAG == 111) {  
        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Melder Informationen</legend>";
        HTMLSite += "<br />ESP8266 Chip-ID: ";
        HTMLSite += ESP.getChipId();
        HTMLSite += "<br /><br />ESP8266 Speed: ";
        HTMLSite += ESP.getCpuFreqMHz();
        HTMLSite += " MHz<br /><br />Flash Chip-ID: ";
        HTMLSite += ESP.getFlashChipId();
        HTMLSite += "<br /><br />Flash Speed: ";
        HTMLSite += ESP.getFlashChipSpeed()/1000000;
        HTMLSite += " MHz<br /><br />Flash Size: ";
        HTMLSite += ESP.getFlashChipSize();
        HTMLSite += " Bytes<br /><br /><hr /><br />SDK-Version: ";
        HTMLSite += ESP.getSdkVersion();
        HTMLSite += "<br /><br />Boot Mode: ";
        HTMLSite += ESP.getBootMode();
        HTMLSite += "<br /><br />Free Heap Size: ";
        HTMLSite += ESP.getFreeHeap();
        HTMLSite += " Bytes<br /><br /><hr /><br />";
        HTMLSite += "Systemspannung: ";
        HTMLSite += String(ESP.getVcc()).substring(0,1);
        HTMLSite += ",";
        HTMLSite += String(ESP.getVcc()).substring(1);
        HTMLSite += " Volt<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Status'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/netinfo") && step == 0 && FIRSTSTARTFLAG == 111) {  
        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>WLAN Netzwerk Informationen</legend>";
        HTMLSite += "<br />WLAN SSID: ";
        HTMLSite += WiFi.SSID();
        HTMLSite += "<br /><br />WLAN Kanal: ";
        HTMLSite += WiFi.channel();
        HTMLSite += "<br /><br />WLAN Signalkst&auml;rke: ";
        HTMLSite += WiFi.RSSI();
        HTMLSite += " dBm<br /><br />Router MAC Adresse: ";
        HTMLSite += WiFi.BSSIDstr();
        HTMLSite += "<br /><br />Eigene IP-Adresse: ";
        HTMLSite += HTMLipStr;
        HTMLSite += "<br /><br />Eigene MAC Adresse: ";
        HTMLSite += macToStr(mac);
        HTMLSite += "<br /><br />Gateway IP-Adresse: ";
        HTMLSite += HTMLgwStr;
        HTMLSite += "<br /><br />Subnet Mask: ";
        HTMLSite += HTMLsmStr;
        HTMLSite += "<br /><br />DNS Server IP-Adresse: ";
        HTMLSite += HTMLdnsStr;
        HTMLSite += "<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Status'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/prginfo") && step == 0 && FIRSTSTARTFLAG == 111) {  
        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Programm Informationen</legend>";
        HTMLSite += "<br />Programm Version<br/><br />";
        HTMLSite += PRGVERSION.c_str();
        HTMLSite += "<br /><br /><hr /><br />Author<br/><br /><a href='http://blog.thomasheldt.de' target=_blank'>Thomas Heldt</a> (Karlsbad, Germany)";
        HTMLSite += "<br /><br /><hr /><br />Arduino ESP8266 Addon<br /><br /><a href='https://github.com/esp8266/Arduino' target='_blank'>ESP8266 Arduino Core auf Github</a>";
        HTMLSite += "<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Status'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/") && step == 0 && FIRSTSTARTFLAG == 111) {  
        HTMLSite ="<!DOCTYPE html><html><head><meta http-equiv='refresh' content='";
        HTMLSite += SITEREFRESH;
        HTMLSite += "'><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Standort: ";
        HTMLSite += MELDERSTANDORT.c_str();
        HTMLSite += "</legend><br />";
        HTMLSite += "<u>Aktueller Status</u><br />";

        if (POSTSTATUS == 1) {
          HTMLSite += "<br /><font color='red'><b>Es befindet sich neue POST im Briefkasten</b></font>";
        } else {
          HTMLSite += "<br /><b>Es befindet sich keine neue POST im Briefkasten</b>";
        }

        HTMLSite += "<br /><br /><hr /><br />";

        if (TUERSTATUS == 1) {
          HTMLSite += "<font color='red'><b>Die Briefkastent&uuml;r ist OFFEN !!!</b></font>";
        } else {
          HTMLSite += "<font color='grteen'><b>Die Briefkastent&uuml;r ist GESCHLOSSEN</b></font>";
        }
        
        HTMLSite += "<br /><br /><hr /><br />";
        HTMLSite += "Systemspannung: ";
        HTMLSite += String(ESP.getVcc()).substring(0,1);
        HTMLSite += ",";
        HTMLSite += String(ESP.getVcc()).substring(1);
        HTMLSite += " Volt<br /><br />";
        HTMLSite += "</fieldset><br /><fieldset style='width:350px'><br /><form action='sensorinfo.htm'><input type='submit' value='System Informationen'></form>";
        HTMLSite += "<br /><form action='netinfo.htm'><input type='submit' value='WLAN Netzwerk Informationen'></form>";
        HTMLSite += "<br /><form action='prginfo.htm'><input type='submit' value='Programm Informationen'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (HTMLSite=="") {
        step=1;
        
        Serial.println(F("Setup Startseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += MELDERSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><br />";
        HTMLSite += "<b>Herzlich Willkommen zum Setup<br />";
        HTMLSite += "des ESP8266 Postmelders.<br /><br />";
        HTMLSite += "Sie werden jetzt Schritt f&uuml;r Schritt<br />";
        HTMLSite += "durch das Setup gef&uuml;hrt.<br /><br /></fieldset><br />";
        HTMLSite += "<form method='GET' action='wlanconfig.htm'>";
        HTMLSite += "<input type='submit' value='Weiter zu Schritt 1...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      }
          
      if (RequestString.startsWith("/favicon")) {  
        HTMLHeader  = "HTTP/1.1 403 FORBIDDEN\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
      } else {
        HTMLHeader  = "HTTP/1.1 200 OK\r\n";
        HTMLHeader += "Content-Length: ";
        HTMLHeader += HTMLSite.length();
        HTMLHeader += "\r\n";
        HTMLHeader += "Content-Type: text/html\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
      }
      
      http.print(HTMLHeader);
      delay(1);
      http.print(HTMLSite);
      delay(1);

      http.stop();
    }
  } 
}

Obwohl die ganze Sache mit meinem Carrier-Board sehr gut funktioniert bin ich heute mal eben auf die Idee gekommen mir eine kleine „universelle“ Melder-Platine zu entwerfen.

Diese Platine werde ich zukünftig für diesen Postmelder einsetzen.

Mehr dazu im Beitrag Kleines, universelles, Melderboard mit ESP8266 ESP-07 o. ESP-12.

Verlinke diesen Beitrag:

<a href="http://blog.thomasheldt.de/esp8266-wifi-briefkastenmelder-mit-solarmodul-der-start/">ESP8266 WiFi-Postmelder „Der Start“ und die Software</a>

The following two tabs change content below.
c7282393508c6050f22643a7feb8fec6?s=80&r=g ESP8266 WiFi-Postmelder "Der Start" und die Software

Thomas H.

Als Betreiber dieses Blog versuche ich hier interessante Projekte und Tipps rund um die Elektronik zu bieten.
c7282393508c6050f22643a7feb8fec6?s=80&r=g ESP8266 WiFi-Postmelder "Der Start" und die Software

Neueste Artikel von Thomas H. (alle ansehen)

Aktualisiert am: 14. Juli 2015

Neue Software, Veröffentlichung begonnen. *15/07/15* Live-Demo eingebaut und Projekt Titel geändert.

Aktualisiert am: 5. Februar 2016

Aktuelle Software veröffentlicht und Verdrahtungsplan eingestellt.

3 Gedanken zu „ESP8266 WiFi-Postmelder „Der Start“ und die Software

  1. Marvin S.

    Habe sowas ähnliches auch schon in Planung gehabt.
    Meine Version besitzt allerdings neben der Briefkastenabfrage auch noch eine Türklingelabfrage, falls der Pizzamann oder der DHL Bote anklingelt und ich mal wieder im obersten Stockwerk rumlatsche 🙂
    Briefkasten wird über einen standard Taster abgefragt.

    Wo genau hast du deine PCB in machen lassen?

    Mit freundlichen Grüßen
    Marvin

    Antworten
  2. Thomas H. Beitragsautor

    Hallo Marvin,

    ich habe jetzt noch eine Erkennung integriert um zu sehen ob die Briefkastentür
    auch zu ist, hatte ich schon einmal vergessen 😉

    Meine Platinen lasse ich bei verschiedenen Herstellern fertigen, Smart-Prototyping,
    Dirty-PCB etc.

    Aber auch bei Beta-Layout und anderen in Deutschland, je nachdem welche Qualität und wie schnell ich sie brauche.

    Wünsche dir viel Erfolg mit deinem Postmelder.

    Gruß
    Thomas

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.