Using Home Assistant to Expand Your Home Automations
Example 1: MQTT + ESP32
Now that we have the MQTT server running, it's time to add some devices. For this first example we'll connect two ESP32 Thing Plus boards to our network over MQTT. If you're unsure of what MQTT is and how it works, there's a guide for that! Check out the MQTT tutorial below:
Introduction to MQTT
The first device we'll add will be a switch that waits for the button connected to IO pin 0 to be pressed. Once pressed the button will publish to the topic room/light
with message of "on" or "off". The second ESP32 will subscribe to the same topic room/light
and listen for messages from the switch. When the message "on" is received, it will turn on the LED connected to IO pin 13, and when "off" is received, turn the LED off. To do this we'll need to flash the ESP32 Thing Plus boards with some code using Arduino.
MQTT Switch
Copy and paste the code below into your Arduino IDE, make sure to select ESP32 Dev Module as your board, and the correct COM port is selected. Fill in the information for your WiFi credentials (your WiFi network must be on the same network as the Raspberry Pi), your user name and password you created for Home Assistant, and the IP address of the Pi.
/****************************************************************************** MQTT_Switch_Example.ino Example for controlling a light using an MQTT switch by: Alex Wende, SparkFun Electronics This sketch connects the ESP32 to a MQTT broker and subcribes to the topic room/light. When the button is pressed, the client will toggle between publishing "on" and "off". ******************************************************************************/ // WiFi Network Credentials const char *ssid = "-----"; // name of your WiFi network const char *password = "-----"; // password of the WiFi network // Home Assistant Credentials const char *HA_USER = "-----"; const char *HA_PASS = "-----"; // MQTT Network IPAddress broker(192,168,1,-); // IP address of your MQTT broker eg. 192.168.1.50 const byte SWITCH_PIN = 0; // Pin to control the light with const char *ID = "Example_Switch"; // Name of our device, must be unique const char *TOPIC = "room/light"; // Topic to subcribe to WiFiClient wclient; PubSubClient client(wclient); // Setup MQTT client bool state=0; // Connect to WiFi network void setup_wifi() { Serial.print("\nConnecting to "); Serial.println(ssid); WiFi.begin(ssid, password); // Connect to network while (WiFi.status() != WL_CONNECTED) { // Wait for connection delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } // Reconnect to client void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(ID,HA_USER,HA_PASS)) { Serial.println("connected"); Serial.print("Publishing to: "); Serial.println(TOPIC); Serial.println('\n'); } else { Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(115200); // Start serial communication at 115200 baud pinMode(SWITCH_PIN,INPUT); // Configure SWITCH_Pin as an input digitalWrite(SWITCH_PIN,HIGH); // enable pull-up resistor (active low) delay(100); setup_wifi(); // Connect to network client.setServer(broker, 1883); } void loop() { if (!client.connected()) // Reconnect if connection is lost { reconnect(); } client.loop(); // if the switch is being pressed if(digitalRead(SWITCH_PIN) == 0) { state = !state; //toggle state if(state == 1) // ON { client.publish(TOPIC, "on"); Serial.println((String)TOPIC + " => on"); } else // OFF { client.publish(TOPIC, "off"); Serial.println((String)TOPIC + " => off"); } while(digitalRead(SWITCH_PIN) == 0) // Wait for switch to be released { delay(20); } } }
Once the code has uploaded, open the terminal window to make sure that the switch successfully connected to WiFi, and has connected to the MQTT network. If you're able to connect to the network and not the Pi, make sure the IP address is correct, as well as the credentials for Home Assistant. If both of those are right, the MQTT broker might not have been set up correctly.
MQTT Light
Copy and paste the code below into your Arduino IDE, make sure to select ESP32 Dev Module as your board, and the correct COM port is selected. Fill in the information for your WiFi credentials (your WiFi network must be on the same network as the Raspberry Pi), your user name and password for Home Assistant, and the IP address of the Pi.
/****************************************************************************** MQTT_Light_Example.ino Example for controlling a light using MQTT by: Alex Wende, SparkFun Electronics This sketch connects the ESP32 Thing Plus to a MQTT broker and subcribes to the topic room/light. When "on" is recieved, the pin LIGHT_PIN is set HIGH. When "off" is recieved, the pin LIGHT_PIN is set LOW. ******************************************************************************/ // WiFi Network Credentials const char *ssid = "-----"; // name of your WiFi network const char *password = "-----"; // password of the WiFi network // Home Assistant Credentials const char *HA_USER = "-----"; const char *HA_PASS = "-----"; // MQTT Network IPAddress broker(192,168,1,-); // IP address of your MQTT broker eg. 192.168.1.50 const byte LIGHT_PIN = 13; // Pin to control the light with const char *ID = "Example_Light"; // Name of our device, must be unique const char *TOPIC = "room/light"; // Topic to subcribe to const char *STATE_TOPIC = "room/light/state"; // Topic to publish the light state to WiFiClient wclient; PubSubClient client(wclient); // Setup MQTT client // Handle incomming messages from the broker void callback(char* topic, byte* payload, unsigned int length) { String response; for (int i = 0; i < length; i++) { response += (char)payload[i]; } Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); Serial.println(response); if(response == "on") // Turn the light on { digitalWrite(LIGHT_PIN, HIGH); client.publish(STATE_TOPIC,"on"); } else if(response == "off") // Turn the light off { digitalWrite(LIGHT_PIN, LOW); client.publish(STATE_TOPIC,"off"); } } // Connect to WiFi network void setup_wifi() { Serial.print("\nConnecting to "); Serial.println(ssid); WiFi.begin(ssid, password); // Connect to network while (WiFi.status() != WL_CONNECTED) { // Wait for connection delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } // Reconnect to client void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if(client.connect(ID,HA_USER,HA_PASS)) { client.subscribe(TOPIC); Serial.println("connected"); Serial.print("Subcribed to: "); Serial.println(TOPIC); Serial.println('\n'); } else { Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(115200); // Start serial communication at 115200 baud pinMode(LIGHT_PIN, OUTPUT); // Configure LIGHT_PIN as an output delay(100); setup_wifi(); // Connect to network client.setServer(broker, 1883); client.setCallback(callback);// Initialize the callback routine } void loop() { if (!client.connected()) // Reconnect if connection is lost { reconnect(); } client.loop(); }
Once the code has uploaded, open the terminal window to make sure that the light successfully connected to WiFi, and has connected to the MQTT network. Once both devices have connected, you can press the button connected to IO pin 0 of the ESP32 Thing Plus acting as a switch and the LED on IO pin 13 of the light should turn on. Pressing the button a second time should turn off the LED.