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

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.
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.
Mais les classiques
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é

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
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
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.