// Import des librairies
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>

// PARAMÈTRES À MODIFIER SELON VOTRE CONFIG
#define   ssid            "XXXXXXX"               // ssid 
#define   password        "YYYYYYYYYYYYYYYYYY"    // mdp ssid
#define   Domotocz        "192.168.X.X"           // adresse de domoticz
#define   portDomotocz    8084                    // port de domoticz
#define   IDX             "2"                     // idx de votre capteur sur domoticz
#define   BOUTON_PIN      0                       // GPIO0 pin D3
#define   LED             2                       // GPIO2 pin D4

int etat_led = LOW; 
int etat_bouton = 0;  

HTTPClient http;                                  // on crée l'objet HTTPClient -> http
ESP8266WebServer server (80);

// fonction qui envoie les datas sur domoticz
void sendDomoticz(String url){
  Serial.print("connection à Domoticz : ");
  Serial.print(Domotocz);
  Serial.print(":");
  Serial.println(portDomotocz);
  WiFiClient client;                              // on crée l'objet WiFiClient -> client      
  http.begin(client,Domotocz,portDomotocz,url);   // on envoie les datas
  int httpCode = http.GET();                      
    if (httpCode) {
      if (httpCode == 200) {                      // si on a bien reçu les datas    
        String payload = http.getString();        
        Serial.println(payload);
        Serial.print("datas envoyées : ");        // on affiche l'url envoyée
        Serial.println(url);
      } else {                                    // sinon
        Serial.println("echec de la connexion à Domoticz");
        return;      
      }
    }
  Serial.println("fermeture de la connection");
  http.end();
  Serial.println();
}

void BoutonPoussoir() {  
  int lecture = digitalRead(BOUTON_PIN);  
  if (lecture != etat_bouton) {
    etat_bouton = lecture;      
    if (etat_bouton == LOW) {
      etat_led = !etat_led; 
      Serial.println(etat_led ? "La LED est allumée par le bouton" : "La LED est éteinte par le bouton");
      Serial.println("Commande envoyée :");
      String url = "/json.htm?type=command&param=udevice&idx=";
      url += String(IDX);
      url +="&nvalue=";
      url += etat_led;
      url += "&svalue=0";    
      sendDomoticz(url);                      // On envoie l'url à domoticz
      digitalWrite(LED, etat_led);              
    }             
  }  
}  

void allume() {
  if (etat_led == LOW)
  etat_led = !etat_led;
  digitalWrite(LED, etat_led);  
  Serial.println("La LED est allumée par Domoticz");
  server.send(200, "text/plain", "LED on");
}

void eteint() {
  if (etat_led == HIGH) {
    etat_led = !etat_led;
    digitalWrite(LED, etat_led);     
    Serial.println("La LED est éteinte par Domoticz");     
    server.send(200, "text/plain", "LED off");
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println();
  Serial.println("Initialisation !!!");
  pinMode(BOUTON_PIN, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, etat_led);  
  Serial.println("Connecting Wifi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }   
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); 
  Serial.println();
  server.on("/on", allume);
  server.on("/off", eteint);
  server.begin();
  Serial.println("Mise à jour de l'état de la LED vers Domoticz");
  String url = "/json.htm?type=command&param=udevice&idx=";
  url += String(IDX);
  url +="&nvalue=";
  url += etat_led;
  url += "&svalue=0";    
  sendDomoticz(url);
  Serial.println("Initialisation OK");
  Serial.println();
}

void loop() {
  server.handleClient();
  BoutonPoussoir();  
}