Pont RF en Wi-Fi
2019-08-29T20:58:02Z | 8 minutes de lecture | Mise à jour le 2019-08-29T20:58:02Z
Tutoriel d’intégration de capteurs fonctionnant en 433 MHz (LPD) via la mise en place d’un pont de connexion.
Introduction
Contexte
Un des gros challenges de la domotique est l’alimentation de nos solutions et plus particulièrement de nos capteurs. C’est toujours embêtant d’obstruer une prise murale pour un simple capteur.
Les solutions en Wi-Fi sont assez consommateur et limitent donc leur utilisation sous batterie.
Les LPD (“Low Power Device”) fonctionnant dans la bande des 433 MHz sont des éléments connus pour tenir longtemps. À titre d’exemple, on peut parler des télécommandes de garage.
Cette bande de fréquence étant basse, elle pénètre bien les éléments de notre habitat et possède par conséquent une longue portée. L’utilisation de cette bande nécessite un élément permettant de faire le lien entre ce “réseau” RF et l’IP.
Pour cela, il existe plusieurs solutions. J’en ai trouvé une assez simple et pas trop couteuse de chez Sonoff, le “Sonoff RF Bridge”.
Pourquoi cette solution ? Car il est facilement flashable avec un firmware alternatif afin de, comme d’habitude, de s’affranchir du cloud et donc du vol de nos données (j’exagère peut-être un peu).
En tant que capteur, j’ai pris deux capteurs de porte (une pour la porte de chez moi et l’autre pour mon frigo) que voici :
L’avantage de ce capteur est qu’il est bidirectionnel, il envoie un signal à lorsque les deux éléments s’éloignent et un autre quand ils sont proches. De cette manière, on obtient distinctement quand la porte est ouverte et quand elle est fermée. Il fonctionne avec une pile LR03 (“AAA”), un modèle assez courant qui est de plus déjà incluse !
Solution
On va donc voir dans ce tutoriel comment mettre tout cela en place et comment l’intégrer avec Home Assistant.
Pour le firmware du pont, j’ai choisi d’utiliser Tasmota et non ESPHome car j’ai vu qu’il fallait modifier le hardware pour que cela fonctionne bien…
L’intégration d’un module sous Tasmota dans un système domotique se fait via l’utilisation du protocole MQTT. On installera donc dans un premier temps un serveur MQTT du nom de Mosquitto.
Serveur MQTT
Installation
sudo apt-get install mosquitto
Normalement, notre serveur est lancé dès l’installation finie. On vérifie avec la commande systemctl status mosquitto
.
Configuration
Systemd
La commande systemctl list-unit-files | grep mosquitto
m’indique que le service n’est pas activé au démarrage du serveur car elle me retourne “generated” au lieu de “enabled”.
On active donc le lancement du service au démarrage :
sudo systemctl enable mosquitto.service
La connexion avec HA s’effectue au démarrage de ce dernier. On doit alors s’assurer que Mosquitto démarre avant HA.
On va donc éditer le script de démarrage de HA (/etc/systemd/system/home-assistant@homeassistant.service
) pour lui dire de se lancer après Mosquitto.
[Unit]
Description=Home Assistant
After=network-online.target
After=network.target mosquitto.service
[Service]
Type=simple
User=homeassistant
ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
[Install]
WantedBy=multi-user.target
On entre ensuite la commande systemctl daemon-reload
prendre en compte se changement.
Authentification
Comme on ne néglige pas la sécurité (même sous son LAN), on va créer un compte utilisateur. Les données seront stockées dans le fichier /etc/mosquitto/passwd
.
sudo mosquitto_passwd -c /etc/mosquitto/passwd homeassistant
On va donc ensuite éditer la configuration pour utiliser l’authentification. On ajoute donc les lignes suivantes dans le fichier /etc/mosquitto/mosquitto.conf
.
allow_anonymous false
password_file /etc/mosquitto/passwd
Ainsi, on relance le service avec un systemctl restart mosquitto.service
.
Tests
Notre pont va transmettre ses données au serveur MQTT. Pour être au plus proche de cela, on va tester le service depuis une autre machine (VM Ubuntu dans mon cas).
On installe donc le client Mosquitto sur ce PC :
sudo apt-get install mosquitto-clients
On va alors souscrire à un “topic” et y publier un message.
Pour cela, on ouvrira deux terminaux (ou deux connexions SSH) pour effectuer ces deux actions.
Dans le premier, on souscrit au topic test/untest
:
mosquitto_sub -h 192.168.10.1 -u homeassistant -P mapassphrase -t "test/untest"
Et dans l’autre, on publie le message “salut” :
mosquitto_pub -h 192.168.10.1 -u homeassistant -P mapassphrase -t "test/untest" -m "salut"
Le message devrait alors apparaitre dans la première fenêtre.
Maintenant que notre serveur MQTT est en place, on va pouvoir s’attaquer au pont de connexion.
Intégration à Home Assistant
L’intégration se fait simplement dans le menu d’intégration. Comme je ne le savais pas, je l’ai fait à la main via le fichier configuration.yaml
.
mqtt:
broker: 127.0.0.1
username: homeassistant
password: !secret secret_mqtt_password
Mon broker est installé sur le même serveur que HA, d’où l’adresse d’hôte locale.
Je ne sais pas pourquoi, mais le nom d’utilisateur ne passe pas en secret… Je l’ai donc écrit directement et ça fonctionne…
Pont de connexion
Software
On va d’abord télécharger le firmware Tasmota sur la page Github associé ou sur le lien direct.
On télécharge ensuite l’utilitaire de flashage NodeMCU PyFlasher depuis sa page Github.
Hardware
Pour flasher le Sonoff, il faut accéder aux pins de connexion série de la carte. Pour accéder à la carte, il faut ouvrir le boitier (les vis sont sous les patins antidérapants).
Les pins sont identifiés à gauche, on a donc le pin tout en haut qui correspond au 3,3 V et l’avant-dernier à la masse. L’interrupteur et à mettre sur “OFF” pour le flashage.
On y insère donc notre convertisseur USB/TTL en n’oubliant pas d’inverser RX et TX :
Pour assurer le maintien de la connexion, j’ai ajouté une attache :
On peut donc passer au flashage du module.
Flashage
Pour démarrer la carte en mode flashage, il faut brancher l’USB au PC tout en appuyant (environ 5 secondes suffisent) sur le bouton d’appairage (situé à gauche dans la dernière illustration).
On lance ensuite NodeMCU PyFlasher, on sélectionne le port série associé au convertisseur.
On sélectionne le firmware et l’on paramètre l’outil comme sur la capture ci-dessous.
On clique donc sur le bouton de flashage et l’on attend…
Configuration basique
Un réseau Wi-Fi devrait apparaitre ayant pour nom quelque chose du type “sonoff-5802”. On se connecte alors dessus et l’on va sur la page du pont à l’adresse 192.168.4.1.
On inscrit ensuite nos informations de connexion Wi-Fi dans le menu de configuration. Après validation, l’équipement devrait-être accessible via l’adresse qu’a attribué votre serveur DHCP.
On spécifie le type de module dans le menu de configuration du module : “Sonoff Bridge (25)”.
Au redémarrage, l’interface devrait avoir changé.
On va maintenant configurer une IP statique avec les commandes suivantes dans la “Console” :
IPAddress1 192.168.10.200
IPAddress3 255.255.255.0
IPAddress2 192.168.10.254
IPAddress4 192.168.10.7
Ces commandes configurent respectivement : l’adresse IP, le masque, la passerelle et le serveur de résolution de noms.
On en profite pour configurer les paramètres MQTT :
Tests
On va maintenant tester la réception des signaux en 433 MHz. On joue donc avec notre capteur de porte et l’on regarde le résultat dans la console.
21:42:42 RSL: tele/RF_Bridge/RESULT = {“RfReceived”:{“Sync”:14020,“Low”:480,“High”:1380,“Data”:“54350E”,“RfKey”:“None”}} 21:42:47 RSL: tele/RF_Bridge/RESULT = {“RfReceived”:{“Sync”:14010,“Low”:490,“High”:1370,“Data”:“54350A”,“RfKey”:“None”}}
Noter tous les codes de tous vos capteurs, on en aura besoin pour la configuration de second niveau.
Configuration
Sonoff RF Bridge
La première chose à faire et de s’assurer de maintenir le dernier état de notre capteur si un redémarrage se produit. On va aussi spécifier nous-mêmes le message qui va être envoyé à notre broker.
Cela se fait par la création de règles via la console Tasmota.
Voyez ci-dessous mon exemple pour les signaux d’ouverture et fermeture de mes deux capteurs.
rule1 on RfReceived#Data=54350A do publish2 RFBridge/PorteEntree Ouvert endon on RfReceived#Data=54350E do publish2 RFBridge/PorteEntree Ferme endon on RfReceived#Data=5C800A do publish2 RFBridge/Frigo Ouvert endon on RfReceived#Data=5C800E do publish2 RFBridge/Frigo Ferme endon
On active ensuite la règle avec la commande rule1 1
(rule1 0
pour la désactiver).
Voici le résultat en manipulant le capteur destiné à mon frigo :
Après avoir positionné les capteurs et vérifié que le pont les capte bien, on peut passer à l’intégration sous Home Assistant.
Home Assistant
Ces capteurs délivrent des messages de type binaire. On va donc configurer un “binary_sensor” pour chaque capteur.
binary_sensor:
- platform: mqtt
name: "Porte d'entrée"
state_topic: "RFBridge/PorteEntree"
availability_topic: "tele/RF_Bridge/LWT"
qos: 1
payload_on: "Ouvert"
payload_off: "Ferme"
payload_available: "OK"
payload_not_available: "HS"
device_class: door
- platform: mqtt
name: "Réfrigérateur"
state_topic: "RFBridge/Frigo"
availability_topic: "tele/RF_Bridge/LWT"
qos: 1
payload_on: "Ouvert"
payload_off: "Ferme"
payload_available: "OK"
payload_not_available: "HS"
device_class: opening
Après une vérification de la configuration et un redémarrage de HA, on peut créer une carte d’entités pour visualiser l’état de nos deux portes.
À ce moment-là, je remarque que mes deux capteurs affichent le statut “Unavailable”… Mes recherches sur Internet mon permis de résoudre le problème en commentant les lignes availability_topic
…
En redémarrant le pont et en regardant la console, je remarque bien que je ne me suis pas trompé sur le “topic” pour la disponibilité :
Bon, en tout cas le résultat est bien là :
Bonus
On peut aussi ajouter des compteurs de changement d’état grâce au composant History Statistics Sensor de HA.
Voici mon exemple pour compter le nombre de fois où ma porte d’entrée s’ouvre durant la journée :
sensor:
- platform: history_stats
name: Ouverture porte d'entrée
entity_id: binary_sensor.porte_d_entree
state: 'on'
type: count
start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}'
end: '{{ now() }}'
Et aussi le temps d’ouverture journalier de mon réfrigérateur :
sensor:
- platform: history_stats
name: Temps réfrigérateur ouvert
entity_id: binary_sensor.refrigerateur
state: 'on'
type: time
start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}'
end: '{{ now() }}'
Conclusion
On a donc pu intégrer des capteurs basse consommation et peu onéreuse dans notre système domotique. On pourra songer à ajouter d’autres capteurs en 433 MHz comme des détecteurs de fuite d’eau ou de fumée ou encore plus de capteurs (sur les fenêtres par exemple).
Ce tutoriel nous a aussi permis de découvrir le protocole de messagerie MQTT ainsi que l’excellent firmware Tasmota.