#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>
#include "WEBset.h"  // Hier ist die HTML-Webseite als Array abgelegt

#define LEDpin 1     // LED zum Blinken. Bei ESP-07 Pin 2. Bei ESP-01 Pin 1
IPAddress apIP(192, 168, 2 , 15);  // IP-Adresse für Setup

ADC_MODE (ADC_VCC);           // ADC an das Stromversorgung
int z = 0; //Aktuelle EEPROM-Adresse zum lesen
String nachricht = "Garagentor";
String url = "";
int timout = 0;

char ssid[32] = "fhgdhfghd\0";
char passwort[64] = "gghdfgh\0";
ESP8266WebServer server;
EspClass ESPm;
HTTPClient http;
#include "Setup.h"
bool stat = "High"; // Torstatus über GPIO2

extern "C" {
#include "user_interface.h"
}

void setup() {
  char inser;
  EEPROM.begin(250);  // EEPROM initialisieren mit 200 Byts
  pinMode(2, INPUT); // GPIO2 als Input

  Serial.begin(115200);
  while (Serial.available())inser = Serial.read();
  Serial.println("Start");
  delay(10);
  inser = Serial.read();
  if (inser != 'S') goto weiter;
  inser = Serial.read();

Einstellen();                      // TxD ist mit RxD verbunden Setupmodus (Setup.h)
weiter:

  z = 0;                             // Einstellungen einlesen
  LeseEeprom(ssid, sizeof(ssid));
  LeseEeprom(passwort, sizeof(passwort));
  LeseEepromStr(&url, 100);
  LeseEepromStr(&nachricht, 100);

  unsigned int Ziklus[2];              // Zykluszehler
  const rst_info * resetInfo = system_get_rst_info();  // Resetgrund einlesen
  ESPm.rtcUserMemoryRead(0, Ziklus, sizeof(Ziklus));  // Zyklus Nummer einlesen
  if ((resetInfo->reason) == 6)Ziklus[0] = 0;         // Wenn Spannung OFF 
  Ziklus[0]++;                                      
  ESPm.rtcUserMemoryWrite(0, Ziklus, sizeof(Ziklus)); // Zyklus Nummer speichern

  uint ADCValue = 0;                // Batteriespannung messen
  ADCValue = ESPm.getVcc() ;         //  hier Korrektur Wert eintragen
  float ADCfloat = float(ADCValue);
  String Ubatt = "";
  Ubatt = String(ADCfloat / 1000, 2) + "V";

  WiFi.mode(WIFI_STA);
# if defined  seriell
  Serial.println();
  Serial.print("Ziklus: ");
  Serial.println(Ziklus[0] - 1);
  Serial.print("U Batt:  ");
  Serial.println(Ubatt);
  Serial.print("Connecting to ");
  Serial.println (ssid);
  // Serial.print(" Pass: ");
  // Serial.println (passwort);
  Serial.println (url);
  Serial.println (nachricht);
#endif

  WiFi.begin(ssid, passwort);

#if not defined seriell       // Vorbereiten das LED
  pinMode(LEDpin, OUTPUT);
#endif

  while (WiFi.status() != WL_CONNECTED)
  {
    timout++;
    if  (timout > 60) // Wenn Anmeldung nicht möglich
    {
      WiFi.forceSleepBegin();       // Sender OFF um Strom zu sparen
#if defined seriell
      Serial.print("Netzwerk nicht gefunden");
#else
      pinMode(LEDpin, OUTPUT);
      digitalWrite(LEDpin, 0);    // LED ON für 5 Sekunden
      delay(5000);
      digitalWrite(LEDpin, 1);

#endif
      WiFi.forceSleepWake();      // Sender ON, sonst beim nächsten aufwachen geht WiFi nicht
      ESPm.deepSleep(0, WAKE_RFCAL);
      delay(100);
    }                           // End timeout
#if defined seriell
    delay(1000);
    Serial.print("O");
#else
    digitalWrite(LEDpin, 0);
    delay(100);
    digitalWrite(LEDpin, 1);

    delay(100);
#endif
  }                         // Verbunden

 stat = digitalRead(2); // GPIO2 Status einlesen
 #if (stat == LOW) 
  String nachricht = "hei Tor auf";
   
 #else              
  String nachricht = "hei Tor zu";

 #endif
 
  //String nachricht = "hhmmm";
  int32_t rssi = wifi_station_get_rssi(); // Signalstärke einlesen

  url = url + "UBatt=" + Ubatt;      //Parameter Bat Spannung
  url = url + "&WachNr=" + String(Ziklus[0] - 1); //Aufwachzyklus
  url = url + "&Empfang=" + String(rssi); //Parameter Signalstärke
  url = url + "&Nachricht=" + urlencode(nachricht);

#if defined  seriell
  Serial.begin(115200);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("Signal strength: ");
  Serial.print(rssi);
  Serial.println("dBm");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("connecting to ");
  Serial.println(url);
#endif

  http.begin(url); //HTTP
  int httpCode = http.GET();

  if (httpCode > 0) {
    // HTTP header has been send and Server response header has been handled
# if defined  seriell
    Serial.printf("[HTTP] GET... code: %d\n", httpCode);
#endif
    // file found at server
    if (httpCode == HTTP_CODE_OK) {
      String payload = http.getString();
# if defined  seriell
      Serial.println(payload);
#endif
    }
  } else {
# if defined  seriell
    Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
#else
    http.end();

    WiFi.forceSleepBegin();  // Wlan aus
    pinMode(LEDpin, OUTPUT);
    digitalWrite(LEDpin, 0);
    delay(5000);
    digitalWrite(LEDpin, 1);
    WiFi.forceSleepWake(); // Wlan ON für neue Zyklus
    ESPm.deepSleep(0, WAKE_RFCAL); //gehe schlafen
#endif
  }
  http.end();

# if defined  seriell
  Serial.println();
  Serial.println("closing connection");
  delay(100);
#endif

  ESPm.deepSleep(0, WAKE_RFCAL);
  delay(100);
}

void loop()
{
  yield();
}