Home Assistant / Hassbian MQTT Switches Using ESP8266 / Arduino IDE v1.0



   
 /* ################################################################  
    ################################################################  
    ########## ESP 8266 MQTT Switch for Home Assistant #############  
    ################################################################  
    ###################*** MOSQUITTO ***############################  
 */  
   
   
   
 //########################################################################################  
   
  // You Can find this sketch on Home Assistant forum i have just modified it according to my 
  // Requirements as it is just a waste of time trying to re-invent the wheel 
  // so thank you for it random citizen :D  
  
  //** INCLUDE LIBRARIES ** make sure you have all the Libraries installed   
  // Get them from within the Arduino IDE Sketch > Include Libraries > Manage Libraries   
   
 //########################################################################################   
   
   
   
 #include <PubSubClient.h>  
 #include <ESP8266WiFi.h>  
 #include <ArduinoOTA.h>  
 #include <ESP8266mDNS.h>  
 #include <WiFiUdp.h>  
   
   
   
 //##################################################################  
   
   
 void callback(char* topic, byte* payload, unsigned int length);  
   
   
   
 #define MQTT_SERVER "192.168.1.3"      // IP of your MQTT Server   
   
   
 const char* ssid = "cool-spot";        // SSID for you Wifi Hotspot  
 const char* password = "12345678";     // Password for Wifi Hotspot   
   
   
 //########### ESP 8266 GPIO Pins ###########################################  
   
   
 const int switchPin1 = 4;  
 const int switchPin2 = 5;  
 const int switchPin3 = 13;  
 const int switchPin4 = 12;  
   
   
 //#########################################################################  
         
         
 // ***** MQTT Topics Defined In Home Assistant's Configuration.yaml file ***  
         
   
 //#########################################################################  
   
 char const* switchTopic1 = "/house/switch1/";      //four switches for relays  
   
 char const* switchTopic2 = "/house/switch2/";  
   
 char const* switchTopic3 = "/house/switch3/";  
   
 char const* switchTopic4 = "/house/switch4/";  
   
   
   
 char const* switchSleep  = "/house/switchSleep/";  // fifth for putting the Esp in sleep mode   
   
 char const* switchReset  = "/house/switchReset/";  // sixth for Reseting the Esp  
   
 //##########################################################################  
   
   
   
 WiFiClient wifiClient;  
   
   
 PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);  
   
   
   
   
   
   
 //#################################################################################  
 //#################################################################################  
   
 //############## SETUP BEGINS #####################################################  
   
 //#################################################################################  
 //#################################################################################  
   
   
   
 void setup() {  
   
        
                                  // These lines will keep the Relays off during start-up    
    
  pinMode(switchPin1, OUTPUT);    // Relay Switch 1    
    
  digitalWrite(switchPin1, LOW);  // Because i'm Using NPN transistors for   
   
                                  // switching the relays which are actually   
                     
                                  // LOW-level-trigger type   
   
                                  // adding the transistor will invert that logic  
   
                                  // and LOW will be OFF because Transistor is off    
                         
    
    
  pinMode(switchPin2, OUTPUT);   // Relay Switch 2  
    
  digitalWrite(switchPin2, LOW);  
   
   
   
  pinMode(switchPin3, OUTPUT);   // Relay Switch 3  
   
  digitalWrite(switchPin3, LOW);  
   
   
   
  pinMode(switchPin4, OUTPUT);   // Relay Switch 4  
   
  digitalWrite(switchPin4, LOW);  
   
   
  //####################################################################################  
   
    
    
    
  Serial.begin(115200);  
  delay(100);  
    
    
   
    
    
    
  WiFi.mode(WIFI_STA);        // Set Esp8266 in Station mode  
   
  WiFi.begin(ssid, password);       
   
    
    
    
    
   while (WiFi.waitForConnectResult() != WL_CONNECTED) {  
    
   Serial.println("Connection Failed! Rebooting...");  
     
   delay(2000);  
          

  }  
   
 //############################################################################################  
 //############################################################################################  
   
 //############# CHANGE OTA UPDATE PASSWORD ###################################################    
 //############################################################################################  
 //############################################################################################  
   
  ArduinoOTA.setPassword((const char *)"123"); // Password for OTA Update "123"  
  ArduinoOTA.begin();                          // on every reset it waits for 60 secs   
                                               // During that time it will accept OTA updates  
  Serial.println("Ready");                     // Turn Firewall off on the PC when trying to   
                                               // Over The Air update sketch  
    
  Serial.print("IP address: ");  
  Serial.println(WiFi.localIP());  
   
   
   
 }  
   
 //##########################################################################################  
   
 //############ SETUP END ###################################################################  
   
 //##########################################################################################   
   
   
  bool ota_update = true ;  // Don't change this manually   
   
   
   
   
   
 //#########################################################################################  
   
 //######### LOOP BEGINS ##################################################################  
   
 //#########################################################################################  
   
   
 void loop()  {  
   
    
    
    
    
   
 //################# WAIT FOR OTA UPDATE ON EVERY START UP #################  
    
   
    
  if(ota_update)                 // on Every Reset ota update boolean will be set to TRUE   
     
  {  
     
     
     
   while(millis()/1000 < 15 ) // then it will count to 60 seconds *******WHEN Reset Switch is Turned ON **********  
                          // it will constantly Reboot and wait for 60 Secs and then after Subscribing Reboots   
   {                      // again  
   
      
     
    ArduinoOTA.handle() ;  // During that time update ota can be done  
      
      
    Serial.println(millis()/1000);  
   
      
    delay(10);  
      
      
   }  
     
     
   Serial.println("Time up");  
   
   ota_update = false ;  // then after time up it will be set to false  
                         // and the rest of the code runs for that instance   
                         // it will happen if the reset switch is then turned off 
     
     
   }  
    
    
    
    
    
 //#########################################################  
    
    
    
    
    
    
    
  if (!client.connected() && WiFi.status() == 3)   
     
   {  
     
    reconnect(); // Reconnect if connection is lost  
      
   }   
   
    
    
    
    
    
  client.loop();  // Maintain MQTT connection  
   
   
  delay(10);      // MUST delay to allow ESP8266 WIFI functions to run  
   
   
 }  
   
   
   
   
   
 void callback(char* topic, byte* payload, unsigned int length) {  
   
    
 String topicStr = topic;   
    
   
    
  Serial.println("Callback update.");  
  Serial.print("Topic: ");  
  Serial.println(topicStr);  
   
    
  //################## Switch 1 ################### COPY THESE BLOCKS FOR MORE SWITCHES ####################   
     
   if (topicStr == "/house/switch1/")   
   {  
   
     
      
    if(payload[0] == '1'){  
      
     digitalWrite(switchPin1, HIGH);  
           
     client.publish("/house/switchConfirm1/", "1");  
     delay(700);  
     }  
   
     
      
    else if (payload[0] == '0'){  
      
     digitalWrite(switchPin1, LOW);  
       
     client.publish("/house/switchConfirm1/", "0");  
       
     }  
      
    }  
      
   
     
      
  //################## Switch 2 #####################################################   
      
      
      
      
      
      
    else if (topicStr == "/house/switch2/")   
    {  
      
     
      
    if(payload[0] == '1'){  
      
     digitalWrite(switchPin2, HIGH);  
       
     client.publish("/house/switchConfirm2/", "1");  
     delay(700);  
      
     }  
       
   
     
     else if (payload[0] == '0'){  
      
     digitalWrite(switchPin2, LOW);  
       
     client.publish("/house/switchConfirm2/", "0");  
       
     }  
       
    }  
      
      
      
  //################## Switch 3 #####################################################   
   
      
      
      
      
      
    else if (topicStr == "/house/switch3/")   
    {  
      
      
      
    if(payload[0] == '1'){  
      
     digitalWrite(switchPin3, HIGH);  
       
     client.publish("/house/switchConfirm3/", "1");  
     delay(700);  
       
     }  
   
      
      
    else if (payload[0] == '0'){  
       
     digitalWrite(switchPin3, LOW);  
       
     client.publish("/house/switchConfirm3/", "0");  
       
     }  
    }  
      
      
      
      
      
 //################## Switch 4 #####################################################   
   
      
      
      
    else if (topicStr == "/house/switch4/")   
    {  
      
      
    if(payload[0] == '1'){  
      
     digitalWrite(switchPin4, HIGH);  
       
     client.publish("/house/switchConfirm4/", "1");  
     delay(700);  
       
     }  
   
      
      
    else if (payload[0] == '0'){  
      
    digitalWrite(switchPin4, LOW);  
      
     client.publish("/house/switchConfirm4/", "0");  
     }  
    }  
   
   
   
   
    
    
    
 //################## Switch 5 Sleep Mode #######################################   
     
   
    
    
    
    
    
  else if (topicStr == "/house/switchSleep/")   
    {  
      
    
    if(payload[0] == '1'){  
   
     client.publish("/house/switchSleepConfirm/", "1");  
   
     Serial.println("going to sleep for 10 secs");  
   
       
     delay(2000);  
          ESP.deepSleep(60*1000000);  
     }  
   
    
      
    else if (payload[0] == '0'){  
      
       
     client.publish("/house/switchSleepConfirm/", "0");  
     }  
    }  
   
   
   
   
 //################## Switch 6 Reset #######################################   
   
   
  else if (topicStr == "/house/switchReset/")   
    {  
      
    
    if(payload[0] == '1'){  
   
     client.publish("/house/switchResetConfirm/", "1");  
   
     Serial.println("going to Reset ");  
   
       
     delay(2000);  
     ESP.deepSleep(5*1000000);  
  
     }  
   
    
      
    else if (payload[0] == '0'){  
      
       
     client.publish("/house/switchResetConfirm/", "0");  
     }  
    }  
   
   
   
   
   
   
   
   
   
   
      
 }  
   
   
 //#########################################################################################  
   
 //######### LOOP ENDS ##################################################################  
   
 //#########################################################################################  
   
   
   
   
   
   
 void reconnect() {  
   
    
    
  if(WiFi.status() != WL_CONNECTED){  
     
   Serial.print("Connecting to ");  
    
   Serial.println(ssid);  
   
     
     
   while (WiFi.status() != WL_CONNECTED) {  
     
    delay(500);  
      
    Serial.print(".");  
     
   }  
   
     
     
   Serial.println("");  
     
   Serial.println("WiFi connected");   
     
   Serial.println("IP address: ");  
     
   Serial.println(WiFi.localIP());  
  }  
   
    
    
    
    
  if(WiFi.status() == WL_CONNECTED){  
    
   while (!client.connected()) {  
    
    Serial.print("Attempting MQTT connection...");  
   
      
      
    // Generate client name based on MAC address and last 8 bits of microsecond counter  
    String clientName;  
    clientName += "esp8266-";  
    uint8_t mac[6];  
    WiFi.macAddress(mac);  
    clientName += macToStr(mac);  
   
       
 //#########################################################################################  
   
 //######### CHANGE MQTT USER NAME AND PASSWORD BELOW ####################################  
   
 //#########################################################################################  
    
      
      
      
    if (client.connect((char*) clientName.c_str(),"newuser", "12345")) {    
      
     Serial.print("\tMQTT Connected");  
       
       
       
       
     client.subscribe(switchReset);        // the order in which topics are arranged here  
   
       
     client.subscribe(switchSleep);        // is how ESP will Subscribe and if you put   
   
                            // relays first and also turn them on and reset or sleep too  
       
                            // the switches will turn on momentarily untill it gets the message to sleep or reset   
       
     client.subscribe(switchTopic1);       // so keep them on the top and then even if the Relay switches are turned on from the page   
       
     client.subscribe(switchTopic2);       // the switch will reset or sleep even before subscribing to the later topics in the list   
       
     client.subscribe(switchTopic3);  
       
     client.subscribe(switchTopic4);  
   
     // ##**************************########  Add MORE TOPICS FOR  SWITCHES HERE   #####################  
       
       
    }  
   
      
    else{Serial.println("\tFailed.");  
      
    delay(2000);  
   //  ESP.deepSleep(5*1000000); 
break;}  
     
   }  
    
  }  
   
 }  
   
   
   
   
   
 String macToStr(const uint8_t* mac){  
   
  String result;  
   
  for (int i = 0; i < 6; ++i) {  
   result += String(mac[i], 16);  
   
   if (i < 5){  
    result += ':';  
   }  
  }  
   
  return result;  
 }  

No comments:

Post a Comment