433Mhz vers MQTT (2)

Voyons maintenant comment intégrer SDR2MQTT à Domoticz. Les données seront récupérées par Node-RED via MQTT et renvoyer au bon format dans Domoticz toujours via MQTT.

Domoticz

Par défaut, un plugin RTL433 est disponible dans Domoticz. Cela implique d'avoir le périphérique RTL-SDR branché sur la machine qui fait tourner Domoticz.

Il existe aussi un plugin qui fait la même chose, mais via MQTT. Je l'ai utilisé pendant plusieurs mois mais j'ai préféré gérer tout ça directement dans Node-RED.

Sur Domoticz, je créé un nouveau matériel de type Dummy.

Je créé ensuite plusieurs capteurs virtuels de type Température+Humidité (parce que mes capteurs renvoient ces deux informations). Je récupère l'ID de ces capteurs, ils seront utilisés dans Node-RED.

MQTT

Si vous avez utilisé mon image Docker (cf précédent article), les messages reçus en 433Mhz sont publiés dans les topic suivant : sdr2mqtt/[id] ou [id] est l'ID du capteur. Cet ID est modifié à chaque fois que vous changez (ou retirez puis remettez) les piles du capteur.

Un petit tour dans MQTT Explorer pour voir ce que l'on reçoit :

Dans notre cas, on va uniquement avoir besoin des topics suivants : sdr2mqtt/[id]/temperature_C et sdr2mqtt/[id]/humidity.

Node-RED

Maintenant que mes capteurs de températures envoient leur informations en MQTT et que j'ai identifié ce que je devais récupérer, on passe à Node-RED :

  • Via un node mqtt in je m'abonne aux topics correspondant à la température et à l'humidité
  • Via un node change, je modifie le topic des payload en respectivement temperature et humidity
  • Les deux payload sont fusionnés via un node join sous la forme d'un objet clé/valeur, la clé étant le nom du topic
  • Un nouveau payload est créé via un node function sous la forme : temperature;humidity;0. C'est ce format qui sera accepté par Domoticz.
  • Le payload est ensuite modifié via un node change pour répondre aux contraintes Domoticz. C'est là que j'indiquerais l'ID de mon capteur virtuel créé plus haut.
  • J'ai ajouté un node delay parce que certains capteurs envoient parfois leurs données 2 fois de suite
  • Le payload est ensuite envoyé dans le topic domoticz/in

J'ai répété ce même flow pour tous mes capteurs de température. Si jamais je change les piles d'un de mes capteurs, je n'ai qu'a récupérer son nouvel ID et le modifier. Je n'ai pas de modifications à faire sur Domoticz.

Le flow utilisé :

[
    {
        "id": "b7ceb2b1.96e2f",
        "type": "mqtt in",
        "z": "ae5681da.b0ceb8",
        "name": "SDR2MQTT",
        "topic": "sdr2mqtt/113/temperature_C",
        "qos": "1",
        "datatype": "auto",
        "broker": "1949a812.2568e8",
        "x": 110,
        "y": 80,
        "wires": [
            [
                "d06ffafb.63c558"
            ]
        ]
    },
    {
        "id": "52800ed8.b2fba8",
        "type": "change",
        "z": "ae5681da.b0ceb8",
        "name": "Set Temp",
        "rules": [
            {
                "t": "move",
                "p": "payload",
                "pt": "msg",
                "to": "payload.svalue",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "payload.command",
                "pt": "msg",
                "to": "udevice",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.idx",
                "pt": "msg",
                "to": "760",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.nvalue",
                "pt": "msg",
                "to": "0",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 800,
        "y": 100,
        "wires": [
            [
                "c18f60f9.2766e"
            ]
        ]
    },
    {
        "id": "f8274d02.097828",
        "type": "mqtt out",
        "z": "ae5681da.b0ceb8",
        "name": "Domoticz",
        "topic": "domoticz/in",
        "qos": "",
        "retain": "",
        "broker": "1949a812.2568e8",
        "x": 1100,
        "y": 100,
        "wires": []
    },
    {
        "id": "e0bf1cb3.1cbe48",
        "type": "mqtt in",
        "z": "ae5681da.b0ceb8",
        "name": "SDR2MQTT",
        "topic": "sdr2mqtt/113/humidity",
        "qos": "1",
        "datatype": "auto",
        "broker": "1949a812.2568e8",
        "x": 110,
        "y": 120,
        "wires": [
            [
                "3bfa7fe.ccd3a8"
            ]
        ]
    },
    {
        "id": "d06ffafb.63c558",
        "type": "change",
        "z": "ae5681da.b0ceb8",
        "name": "Change Topic",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "temperature",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 300,
        "y": 80,
        "wires": [
            [
                "4f5629a7.80f618"
            ]
        ]
    },
    {
        "id": "3bfa7fe.ccd3a8",
        "type": "change",
        "z": "ae5681da.b0ceb8",
        "name": "Change Topic",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "humidity",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 300,
        "y": 120,
        "wires": [
            [
                "4f5629a7.80f618"
            ]
        ]
    },
    {
        "id": "4f5629a7.80f618",
        "type": "join",
        "z": "ae5681da.b0ceb8",
        "name": "",
        "mode": "custom",
        "build": "object",
        "property": "payload",
        "propertyType": "msg",
        "key": "topic",
        "joiner": ";",
        "joinerType": "str",
        "accumulate": false,
        "timeout": "",
        "count": "2",
        "reduceRight": false,
        "reduceExp": "",
        "reduceInit": "",
        "reduceInitType": "num",
        "reduceFixup": "",
        "x": 490,
        "y": 100,
        "wires": [
            [
                "d6d623.ffc0a1e"
            ]
        ]
    },
    {
        "id": "d6d623.ffc0a1e",
        "type": "function",
        "z": "ae5681da.b0ceb8",
        "name": "Convert",
        "func": "var temperature = msg.payload.temperature;\nvar humidity = msg.payload.humidity;\nmsg.payload = temperature+';'+humidity+\";0\"\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 640,
        "y": 100,
        "wires": [
            [
                "52800ed8.b2fba8"
            ]
        ]
    },
    {
        "id": "c18f60f9.2766e",
        "type": "delay",
        "z": "ae5681da.b0ceb8",
        "name": "Limit",
        "pauseType": "rate",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "2",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "x": 950,
        "y": 100,
        "wires": [
            [
                "f8274d02.097828"
            ]
        ]
    },
    {
        "id": "1949a812.2568e8",
        "type": "mqtt-broker",
        "name": "Mosquitto",
        "broker": "192.168.0.47",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closeRetain": "false",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": ""
    }
]