/* ################################################################
################################################################
########## 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;
}
Do-it-yourself,DIY,How-To,Electronics,Arduino,Esp,Raspberry-Pi,Programming,Hacking Stuff,Gardening,Photography,Hobby,Fun
Home Assistant / Hassbian MQTT Switches Using ESP8266 / Arduino IDE v1.0
Labels:
diy,
do-it-yourself,
esp8266,
hassbian,
home assistant,
mqtt,
switch
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment