433Mhz vers MQTT (1)

Un moment que je n'avais rien écrit ici, il était temps de reprendre un peu.

Zigbee2MQTT m'a permis de découvrir le protocole MQTT et plus globalement ce que je pouvais en faire via Node-RED.

J'ai donc décider de migrer tout ce que j'avais chez moi pour faire en sorte que ça communique en MQTT. Les objectifs sont les suivants :

  • Me débarasser de mon RFXCom qui ne sert plus que pour la reception
  • Me débarasser de l'intégration OpenZWave de Domoticz et le remplacer par ZWave2MQTT (je ferais peut être un sujet un jour...)
  • Me débarasser de toutes les automatisations Domoticz et les gérer via Node-RED
  • Me débarraser d'un maximum de plugin tiers à Domoticz
  • Segmenter les différents composants de mon système domotique via Docker : Domoticz est un conteneur, Zigbee2MQTT est un conteneur, Mosquitto est un conteneur, Node-RED est un conteneur, etc. Cela me permet de placer mes conteneurs ou je veux : sur un ou plusieurs Raspberry PI, sur mon NAS, ... ils devront juste se trouver sur le même réseau local.

En dé-corrélant le frontend (Domoticz) et le backend (les automatisations, les différents protocoles), je me permets d'envisager de me passer de Domoticz pour le remplacer par autre chose (Node-RED UI, Home Assistant, solution maison, etc.). Domoticz devient une interface de consultation et plus une grosse machine à tout faire.

Remplacer mon RFXCom

Je n'ai jamais eu de soucis avec mon RFXCom et plus généralement avec tout ce qui communique en 433Mhz. Et quand je pense à tous les soucis que j'ai pu avoir avec le Zigbee et le Z-Wave, je pense qu'il est important de le souligner.

Le problème c'est que le RFXCom est cher (près de 100€) et que mon utilisation ne se limitait plus qu'a la réception de messages en 433Mz (mes sondes de température). J'ai donc cherché un remplaçant à mon RFXCom, et je l'ai trouvé via une clé TNT qui, lorsque l'on détourne l'utilisation, agit comme un récepteur sur une large bande de fréquence, incluant la bande de fréquence 433 Mhz.

Cela devient possible avec les clés utilisant le chipset Realtek RTL2832 et le projet RTL-SDR. Un exemple de clé qui fonctionne : https://www.passion-radio.fr/cles-rtl-sdr/recepteur-sdr-88.html (que vous pouvez également retrouver sur AliExpress à un tarif encore plus abordable).

Pour réceptionner uniquement le 433Mhz et transmettre ce qui est reçu en MQTT, j'ai utilisé le projet rtl_433.

J'ai également investi dans une rallonge USB et une meilleure antenne ayant constaté quelques soucis de réception.

rtl-sdr + rtl_433 dans une image Docker

J'ai intégré rtl-sdr et rtl_433 dans une image Docker (librement inspiré de ce que j'ai pu trouvé notamment ici et ) que j'ai appelé sdr2mqtt (parce que 4332MQTT... bof).

Le Dockerfile :

FROM alpine:3.9

RUN apk add --no-cache libusb-dev
    
WORKDIR /tmp
RUN apk add --no-cache --virtual .build-deps git bash cmake build-base && \
    #install rtl-sdr
    echo 'blacklist dvb_usb_rtl28xxu' > /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf && \
    git clone git://git.osmocom.org/rtl-sdr.git && \
    mkdir rtl-sdr/build && \
    cd rtl-sdr/build && \
    cmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON && \
    make  && \
    make install && \
    cd / && \
    rm -rf /tmp/rtl-sdr && \
    #install rtl_433
    git clone https://github.com/merbanan/rtl_433.git && \
    cd rtl_433 && \
    mkdir build && \
    cd build && \
    cmake ../ && \
    make && \
    make install && \
    cd / && \
    rm -rf /tmp/rtl_433 && \
    #cleanup
    apk del .build-deps

WORKDIR /
COPY ./entrypoint.sh /opt

ENTRYPOINT ["sh", "/opt/entrypoint.sh"]

L'entrypoint :

#!/bin/ash

rtl_433 -R3 -R12 -f 433.84M -Y classic -M level -F "mqtt://192.168.0.47:1883,user=mon_user,pass=mon_password,retain=0,devices=sdr2mqtt[/id]"

Dedans, j'ai spécifié la fréquence d'écoute (433.84 Mhz), les protocols (3 = mes capteurs de température chinois ; 12 = mes capteurs de température Oregon) et les différents paramètres MQTT. Chaque device publiera ses infos dans un topic unique, basé sur son ID.
Ca posera des problèmes si on change les piles du capteur (l'ID change), mais on va pouvoir gérer tout ça via Node-RED.

Enfin, mon docker-compose après avoir construit l'image sous le nom sdr2mqtt :

  sdr2mqtt:
    container_name: sdr2mqtt
    image: sdr2mqtt
    devices:
      - /dev/bus/usb
    network_mode: host
    environment:
      - TZ=Europe/Paris

Problèmes de réception

Comme dit plus haut, au début des mes expérimentations, j'ai assez vite constaté des problèmes de réception, je ne recevais plus rien d'une ou plusieurs de mes sondes de températures pendant plusieurs heures.

Après pas mal de temps à debugger et tester de nouveaux paramètres (et après l'achat d'une nouvelle antenne), je me suis rendu compte que cela venait d'un manque de puissance de mon Raspberry Pi (version 3B+), qui alimentait déjà une clé Zigbee et une clé Z-Wave.

J'ai simplement déplacé ma clé SDR sur un Rasperry Pi 4 et je n'ai quasiment plus de problèmes depuis.

J'ai ainsi pu revendre mon RFXCom !