Arduino R4 → MQTT → Home Assistant

Arduino R4 Button & Real-Time Status in Home Assistant

This guide explains how to wire a physical button to an Arduino R4 WiFi, publish its state via MQTT, and automatically integrate it into Home Assistant.

1. Prepare Home Assistant

1.1 Install Mosquitto

1.2 Create an MQTT user

1.3 Configure Mosquitto

logins:
  - username: toto
    password: xyz
require_certificate: false

2. Prepare the Arduino UNO R4 WiFi

2.1 Button wiring

2.2 WiFi connection

const char* ssid = "YOUR_WIFI";
const char* pass = "YOUR_WIFI_PASSWORD";
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
  WiFi.begin(ssid, pass);
  delay(5000);
  Serial.print(".");
}
Serial.println();
Serial.print("Arduino IP = ");
Serial.println(WiFi.localIP());

2.3 MQTT configuration

const char* mqtt_server = "192.168.0.210";
const int   mqtt_port   = 1883;
const char* mqtt_user   = "toto";
const char* mqtt_pass   = "xyz";

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

3. MQTT Connection & MQTT Discovery

3.1 Publish the Discovery configuration

void publishDiscoveryConfig() {
  mqttClient.publish(
    "homeassistant/binary_sensor/mailbox/config",
    "{ \"name\":\"Mailbox\","
    "\"unique_id\":\"mailbox_arduino\","
    "\"state_topic\":\"home/mailbox\","
    "\"payload_on\":\"ON\","
    "\"payload_off\":\"OFF\","
    "\"device_class\":\"opening\" }",
    true
  );
}

3.2 MQTT reconnection

void reconnectMQTT() {
  while (!mqttClient.connected()) {
    Serial.print("Connecting to MQTT...");
    if (mqttClient.connect("ArduinoR4", mqtt_user, mqtt_pass)) {
      Serial.println("OK");
      publishDiscoveryConfig();
    } else {
      Serial.print("Failed, code=");
      Serial.println(mqttClient.state());
      delay(2000);
    }
  }
}

3.3 TCP test

Serial.print("Testing TCP connection...");
if (wifiClient.connect(mqtt_server, mqtt_port)) {
  Serial.println("OK");
} else {
  Serial.println("TCP Failed");
}

4. Publish the button state

bool lastState = HIGH;

void loop() {
  if (!mqttClient.connected()) {
    reconnectMQTT();
  }
  mqttClient.loop();

  bool currentState = digitalRead(buttonPin);

  if (currentState != lastState) {
    delay(50);
    currentState = digitalRead(buttonPin);

    if (currentState != lastState) {
      lastState = currentState;

      const char* value = (currentState == LOW) ? "ON" : "OFF";

      Serial.print("Mailbox = ");
      Serial.println(value);

      mqttClient.publish("home/mailbox", value, true);
    }
  }
}

The topic home/mailbox is used by Home Assistant to track the sensor state.

5. Home Assistant Side

5.1 Check MQTT reception

5.2 Automatic Discovery

Home Assistant automatically creates:

5.3 Use in the interface

6. Overview

7. Possible Extensions

8. Example source