Arduino R4 → MQTT → Home Assistant

Bouton physique Arduino R4 & statut temps réel dans Home Assistant

Synthèse des étapes pour câbler un bouton, publier son état via MQTT et l’exposer proprement dans Home Assistant.

Arduino UNO R4 WiFi MQTT + Mosquitto Home Assistant MQTT Discovery

1. Préparer Home Assistant

1.1 Installer le broker MQTT (Mosquitto)

  • Ouvrir : Paramètres → Modules complémentaires → Ajouter
  • Choisir : Mosquitto broker
  • Activer : démarrage au boot, affichage dans la barre latérale

1.2 Créer un utilisateur MQTT

  • Aller dans : Paramètres → Personnes & Utilisateurs → Utilisateurs
  • Créer un utilisateur local : par ex. toto
  • Définir un mot de passe : par ex. xyz

1.3 Configurer Mosquitto

Dans la configuration de l’add-on Mosquitto :

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

Redémarrer Mosquitto après modification.

2. Préparer l’Arduino UNO R4 WiFi

2.1 Câblage du bouton

  • Bouton : une patte sur PIN 3, l’autre sur GND
  • Mode : INPUT_PULLUP (interne)
  • Logique : LOW = appuyé, HIGH = relâché
const int buttonPin = 3;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
}

2.2 Configuration WiFi

const char* ssid = "TON_WIFI";
const char* pass = "TON_MDP_WIFI";
Serial.print("Connexion 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 Configuration MQTT

const char* mqtt_server = "192.168.0.210";  // IP de Home Assistant
const int   mqtt_port   = 1883;
const char* mqtt_user   = "toto";
const char* mqtt_pass   = "xyz";

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

3. Connexion MQTT & MQTT Discovery

3.1 Fonction de reconnexion MQTT

void publishDiscoveryConfig() {
  const char* configTopic = "homeassistant/binary_sensor/boite_aux_lettres/config";

  const char* configPayload =
    "{"
      "\"name\": \"Boite aux lettres\","
      "\"unique_id\": \"boite_aux_lettres_arduino\","
      "\"state_topic\": \"maison/boite_aux_lettres\","
      "\"payload_on\": \"ON\","
      "\"payload_off\": \"OFF\","
      "\"device_class\": \"opening\""
    "}";

  mqttClient.publish(configTopic, configPayload, true);
  Serial.println("MQTT Discovery config envoyée !");
}

void reconnectMQTT() {
  while (!mqttClient.connected()) {
    Serial.print("Connexion MQTT...");
    if (mqttClient.connect("ArduinoR4", mqtt_user, mqtt_pass)) {
      Serial.println("OK");
      // Publier la configuration MQTT Discovery
      publishDiscoveryConfig();
    } else {
      Serial.print("Échec, code=");
      Serial.println(mqttClient.state());
      delay(2000);
    }
  }
}

3.2 Initialisation dans le setup

void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);

  // Connexion WiFi (voir section 2.2)
  // ...

  mqttClient.setServer(mqtt_server, mqtt_port);

  Serial.print("Test connexion TCP au broker...");
  if (wifiClient.connect(mqtt_server, mqtt_port)) {
    Serial.println("OK");
  } else {
    Serial.println("Échec TCP");
  }
}

4. Publication de l’état du bouton

4.1 Lecture & publication sur changement

bool lastState = HIGH;

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

  bool currentState = digitalRead(buttonPin);

  if (currentState != lastState) {
    delay(50); // anti-rebond
    currentState = digitalRead(buttonPin);

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

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

      Serial.print("Boite aux lettres = ");
      Serial.println(value);

      bool ok = mqttClient.publish("maison/boite_aux_lettres", value, true);
      Serial.print("MQTT publish envoyé ! Retour = ");
      Serial.println(ok ? "1" : "0");
    }
  }
}

Le topic maison/boite_aux_lettres est celui que Home Assistant utilisera pour l’état du capteur.

5. Côté Home Assistant

5.1 Vérifier la réception MQTT

  • Outils de développement → Événements
  • Écouter l’événement : mqtt_message
  • Appuyer sur le bouton : tu dois voir le topic et le payload

5.2 MQTT Discovery

Grâce au message publié sur homeassistant/binary_sensor/boite_aux_lettres/config, Home Assistant crée automatiquement :

  • Entité : binary_sensor.boite_aux_lettres_arduino
  • Type : binary_sensor (device_class opening)
  • Source : MQTT (intégration MQTT)

5.3 Utilisation dans l’interface

  • Appareils & Services → MQTT : l’appareil Arduino apparaît
  • Tableau de bord : ajouter l’entité comme n’importe quel capteur
  • Automatisations : déclencher notifications, lumières, scènes, etc.

6. Vue d’ensemble & statut

Chaîne complète

Bouton physique (PIN 3) Arduino UNO R4 WiFi WiFi 2.4 GHz MQTT (Mosquitto) MQTT Discovery Home Assistant

Points clés

  • WiFi : même réseau que Home Assistant, IP valide (ex. 192.168.0.77)
  • MQTT : broker Mosquitto sur 192.168.0.210:1883
  • Auth : utilisateur toto + mot de passe configuré dans Mosquitto
  • Topic état : maison/boite_aux_lettres
  • Discovery : topic homeassistant/binary_sensor/boite_aux_lettres/config

Statut logique

WiFi connecté
TCP broker OK
MQTT connecté
Discovery publié
Capteur visible dans HA

Une fois ce schéma en place, ajouter d’autres boutons revient à dupliquer le pattern : nouveau PIN, nouveau topic, nouvelle config MQTT Discovery.

7. Extension possible

  • Multi-boutons : SMS, Telegram, Volet, Porte, Courrier, chacun avec son topic et sa config
  • JSON global : publier un état agrégé (ex. maison/boite/etat avec plusieurs champs)
  • Heartbeat : topic maison/boite/status pour indiquer online/offline
  • Historique : utiliser l’historique HA pour suivre les ouvertures de la boîte