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.
Settings → Add-ons → AddMosquitto brokerSettings → People & Users → Userstotoxyzlogins:
- username: toto
password: xyz
require_certificate: false
INPUT_PULLUPLOW = pressed, HIGH = releasedconst 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());
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);
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
);
}
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);
}
}
}
Serial.print("Testing TCP connection...");
if (wifiClient.connect(mqtt_server, mqtt_port)) {
Serial.println("OK");
} else {
Serial.println("TCP Failed");
}
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.
mqtt_messageHome Assistant automatically creates:
binary_sensor.mailbox_arduino