RF 433 MQTT passerelle pour pas cher

Bonsoir,
Je partage avec vous pour ceux que cela intéresse une petit projet que j’ai eu à faire.
Ça n’a pas vocation à être un très grand projet mais cela permet de faire une passerelle RF 433Mhz → MQTT pas cher.

Le but du projet, était de réoccuper des codes de télécommandes RF 433Mhz

image

Et de pouvoir les exploiter sous HA

Le matériel utilisé

Le microcontrôleur, Moins de 5€
La j’utilise un esp-12 mais n’importe quel esp8266 fait l’affaire.
image

Module RF 433 pour la capture des trames des télécommandes
Moi j’utilise ce module rx470c le plus stable des modules que j’ai pu utiliser.
image
Mais les classiques
image
Fonctionnent aussi

Le prototype a mettre en boite après (attention, la photo montre une plaque de prototype que j’utilise)


Mais vous pouvez utiliser ce type tout pret monté
image
ou tout autre module.

Le principe de fonctionnement

Le module RF 433 écoute les ondes
Si une transmission est reçu le microcontrôleur l’envois dans le Broker MQTT la trame découpé
Une fois dans le Brocker tout système domotique peut exploiter l’information.

Le code de l’ESP8266
En deux partie
Le fichier ou se trouvent les paramètres pouvant être variable, comme le Wifi, le Broker, le GPIO
config.h

#ifndef CONFIG_H
#define CONFIG_H

// Configuration Wi-Fi
const char* ssid = "MonWifi";
const char* password = "MonPasswordfiwi";

// Configuration MQTT
const char* mqtt_server = "MonBrokerMQTT";
const char* mqtt_user = "NomUtilisateurMQTT";
const char* mqtt_password = "MotDePasseMQTT";
const char* mqtt_topic = "rf434/raw";

// Pin du récepteur RF 434 MHz
const int rf434_rx_pin = 5;

// Pin de la LED
const int led_pin = LED_BUILTIN;

// Vitesse du port de débogage (baud rate)
const int debug_baud_rate = 115200;

#endif

Le fichier pricipale, pour moi
RF433_esp8266_MQTT_topics.ino (mais il peut porter un autre nom)

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <RCSwitch.h>
#include <ArduinoJson.h> // Inclure la bibliothèque ArduinoJSON
#include "config.h"

RCSwitch rf434Switch = RCSwitch();
WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
  delay(10);
  Serial.begin(debug_baud_rate); // Utilisation de la vitesse du port de débogage depuis le fichier de configuration
  Serial.println();
  Serial.print("Connexion à ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connecté");
  Serial.println("Adresse IP: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  // Gérer les messages MQTT reçus (si nécessaire)
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Tentative de connexion MQTT...");
    
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("Connecté !");
    } else {
      Serial.print("Échec, rc=");
      Serial.print(client.state());
      Serial.println(" Réessai dans 5 secondes");
      delay(5000);
    }
  }
}

void process_rf_value(RCSwitch rfswitch, int rf) {
  char str[120];
  unsigned long value;
  value = rfswitch.getReceivedValue();
  if (value) {
    // Créer un objet JSON
    DynamicJsonDocument jsonDoc(200); // Utiliser DynamicJsonDocument pour la taille variable
    jsonDoc["rf"] = rf;
    jsonDoc["value"] = value;
    jsonDoc["bit_length"] = rfswitch.getReceivedBitlength();
    jsonDoc["protocol"] = rfswitch.getReceivedProtocol();
    jsonDoc["binary_value"] = String(value, BIN); // Ajouter la valeur en binaire
    jsonDoc["decimal_value"] = String(value); // Ajouter la valeur en décimal

    // Convertir l'objet JSON en chaîne
    String jsonString;
    serializeJson(jsonDoc, jsonString);

    // Publier le JSON sur MQTT
    client.publish(mqtt_topic, jsonString.c_str());
  } else {
    sprintf(str, "[-] %d Received: Unknown encoding (0)", rf);
    Serial.println(str);
  }

  // Réinitialiser le récepteur RF pour recevoir plus de données
  rfswitch.resetAvailable();
}

void setup() {
  setup_wifi();
  rf434Switch.enableReceive(rf434_rx_pin);  // Activer la réception RF 434 MHz
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(led_pin, OUTPUT);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  
  client.loop();

  if (rf434Switch.available()) {
    process_rf_value(rf434Switch, 434);
  }
}

Dans ce code, je mets les valeur de la trame dans des topics différents volontairement, mais il est possible de passer une chaîne JSON (j’ai fais le code pour ceux que cela intéresse).

Le résultat a la réception d’une trame
image

Déclaration dans la configuration MQTT de HA mqtt.yaml

#========================================================
#
#   SENSORS
#
#========================================================

sensor:
    - name: "Module RF"
      state_topic: "rf434/rf"

    - name: "Module RF Code Decimale"
      state_topic: "rf434/decimal_value"

    - name: "Module RF Longueur de bits"
      state_topic: "rf434/bit_length"

    - name: "Module RF Protocol N°"
      state_topic: "rf434/protocol"

    - name: "Module RF Code Binaire"
      state_topic: "rf434/binary_value"

Entités disponible a la manipulation dans HA

Avec une Card rapide
image

Je n’ai pas de capteur RF 433Mhz comme des sondes ou autres pour faire le test, mais dans l’absolut, ce sniffer ne fait pas la distinction, mais attention, certain protocoles ne sont pas pris en charge, donc ne soyez pas étonné de ne pas voir tous vos capteurs, comme certaine station météo ou autres.
Je vous rappel que ce code a été fait pour un besoin spécifique, donc le code du Microcontrôleur peut être modifier pour prendre en charge d’autre devices et d’autres protocoles.

Et c’était aussi pour démonter qu’il était possible de faire une passerelle RF 433/MQTT pour pas cher.

2 « J'aime »

Ça me rappelle un autre projet :grinning:

Hello,
Oui complètement, des projets de RF Gateway il y en a pléthore.
Il n’y a rien de plus ressemblant a un moustique qu’un autre moustique :grinning:

Je n’avais pas par ce partage l’ambition de concurrencer des mastodontes du développement.
Juste partager.
Mais si chacun met ses propres références et expériences a ce post, ça aura pour bénéfice de rassembler les différents projets autour de la RF Gateway « pas cher ». :metal:

3 « J'aime »

Merci pour ce partage qui est intéressant.

C’est du beau boulot, bien développé et exposé très clairement !
Merci pour le partage !

Merci pour le partage, si tu veux avoir une idée des différentes solutions existantes tu peux regarder le tableau ci dessous:

Maintenant si OpenMQTTGateway devait être un animal j’hésite entre un éléphant ou un moustique :grin:

Bonjour 1technophile
Il semble devoir avoir un accès a ce fichier.
Je viens de faire la demande, je ne sais pas si tu es propriétaire de ce lien.
J’ai fais la demande

Bonjour,

Merci, j’ai mis à jour le lien ça devrait être mieux

1 « J'aime »

Merci 1technophile
J’avais visité déjà certains de ces projets, mais des petits nouveaux, mais il y a aussi a la fin de tes infos, un lien sur une discussion qui me parait intéressante.
Encore des nuits a ne pas dormir :joy:

1 « J'aime »