LoraWan et MQTT - Remontées et Contrôles depuis Home Assistant

Bonjour,

Je me suis muni d’une passerelle LoraWan RAK7268

et de plusieurs en devices :

  • Dragino LDS02 (Détecteur d’ouverture)
  • MClimate Vicki (tête thermostatique)
  • NEXELEC Origin (Détecteur incendie, température, humidité)

L’objectif :

  • Contrôler la vanne thermostatique et remontée l’information du pourcentage d’ouverture de celle-ci.

  • Remontée l’information de température

    Pour : Réguler en hystérésis ou en proportionnelle à l’aide de Home Assistant ou manuellement.

  • Remontée l’information de l’ouverture de fenêtre

    Pour arrêter le chauffage à l’aide de home assistant

Dans la passerelle Lora les détecteurs sont tous appairés :


(Ne pas prendre en compte la sonde RAK7204)

Voici ce que j’obtiens en MQTT pour le détecteur d’ouverture :
Ouverture :

{
  "applicationID": "3",
  "applicationName": "Rak7268",
  "devEUI": "***",
  "deviceName": "Dragino detecteur",
  "timestamp": 1677767262,
  "fCnt": 155,
  "fPort": 10,
  "data": "8C2A0100005500000000",
  "data_encode": "hexstring",
  "object": {},
  "adr": true,
  "rxInfo": [
    {
      "gatewayID": "***",
      "loRaSNR": 13.3,
      "rssi": -73,
      "location": {
        "latitude": 0,
        "longitude": 0,
        "altitude": 0
      }
    }
  ],
  "txInfo": {
    "frequency": 868300000,
    "dr": 5
  }
}

En fermeture :

{
  "applicationID": "3",
  "applicationName": "Rak7268",
  "devEUI": "***",
  "deviceName": "Dragino detecteur",
  "timestamp": 1677767310,
  "fCnt": 156,
  "fPort": 10,
  "data": "0C2A0100005500000000",
  "data_encode": "hexstring",
  "object": {},
  "adr": true,
  "rxInfo": [
    {
      "gatewayID": "***",
      "loRaSNR": 12.8,
      "rssi": -74,
      "location": {
        "latitude": 0,
        "longitude": 0,
        "altitude": 0
      }
    }
  ],
  "txInfo": {
    "frequency": 867900000,
    "dr": 5
  }
}

Pour cette trame: je ne sais pas quoi prendre comme information
entre object qui est vide (est-ce une erreur?) et data qui est en hexstring ou en base64 selon ce qu’on choisi mais qui n’apporte qui ne plus que quelque d’indéchiffrable.

Pour les autres produits, je ne sais pas commenter piloter la tête thermostatique Vicki.
Ni comment faire fonctionner la sonde Nexelec.

Si je fais appel à votre forum c’est parce que MClimate est un vendeur étranger et Nexelec ne réponds pas.

J’espère surtout trouver quelqu’un au sein du forum qui connait, voir maîtrise, le protocole LoraWan et qui pourrait m’éclairer pour avancer dans mon projet.

Merci d’avance pour vos réponses

Salut,

Pour le Dragino je devrais pouvoir t’aider. Tu as la documentation pour les autres et des exemples de trames?

Hey !

Merci de te proposer pour apporter ton aide !

Voilà ce que j’aimerais faire dans node-red :

Récupérer la trame MQTT, la faire passer dans un bloc function et l’envoyer dans HA.

J’ai trouvé ça pour le LDS02 :
dragino-end-node-decoder/LDS02 at main · dragino/dragino-end-node-decoder · GitHub

Pour le Nexelec Origin j’ai trouvé sur leur site https://support.nexelec.fr/fr/support/solutions/articles/80000952535-codec-ttn le code du capteur.

Voici une trame pour le Nexelec

{
  "applicationID": "3",
  "applicationName": "Rak7268",
  "devEUI": "***",
  "deviceName": "Nexelec capteur",
  "timestamp": 1677784685,
  "fCnt": 6,
  "fPort": 56,
  "data": "A2060C3070B8DC8E371359A4D068B399ACD0",
  "data_encode": "hexstring",
  "adr": true,
  "rxInfo": [
    {
      "gatewayID": "***",
      "loRaSNR": 14,
      "rssi": -55,
      "location": {
        "latitude": 0,
        "longitude": 0,
        "altitude": 0
      }
    }
  ],
  "txInfo": {
    "frequency": 867900000,
    "dr": 5
  }
}

Et voici une trame pour la vicki

{
  "applicationID": "3",
  "applicationName": "Rak7268",
  "devEUI": "***",
  "deviceName": "Vicki tête",
  "timestamp": 1677791064,
  "fCnt": 69,
  "fPort": 2,
  "data": "81159071000000B000",
  "data_encode": "hexstring",
  "adr": true,
  "rxInfo": [
    {
      "gatewayID": "***,
      "loRaSNR": 11.8,
      "rssi": -81,
      "location": {
        "latitude": 0,
        "longitude": 0,
        "altitude": 0
      }
    }
  ],
  "txInfo": {
    "frequency": 868100000,
    "dr": 5
  }
}

J’ai trouvé ce topic MQTT, Node-RED for large or small decoders [HowTo] - Application Development - The Things Network

Je sais pas si ma piste de réflexion est la bonne. (Car évidemment, j’ai essayé d’insérer l’encoder et je n’ai pas résolu mon problème).

Sur quoi tu serais parti pour résoudre ce problème?

Merci d’avance :slight_smile:

Tu dois pouvoir faire ça sans nodered, dans ta définition de capteur du configuration.yaml tu peux utiliser un value_template pour convertir les data du json:

    value_template: '{{value_json.data[4:8] | int(base=16)}}'

L’exemple ci dessus est simple mais tu peux faire plus complexe, je te conseille de tester avec le Template du Developer Tools

Tu renseignes ton json dans set value_json =

Et tu essayes d’interpréter les valeurs sur la base des exemples ou de google.

Si tu veux vraiment passer par NodeRed je vois aussi que Dragino a publié des exemples de Node:

Merci pour ta réponse

Tu ne peux pas le voir mais la valeur de la data change tous le temps sauf le début de la valeur

Quand c’est une ouverture le début le début est toujours identique et il en est de même pour la fermeture

Alors je me dis que c’est assez simple sans décoder la valeur de faire afficher 1 ou 0 (Ouvert/Fermé) en prenant seulement le début de la valeur. (Même si ça je ne sais pas faire non plus)

Mais pour des capteurs de température c’est plus compliqué

Alors la solution de l’encoder semble être la meilleure plutôt que de passer son temps à comprendre la valeur de data pour chaque valeur de Temp.

Node red ou directement home assistant peu m’importe, je prends la plus simple et la plus fiable :wink:

Que voulait dire ton exemple dans les balises de code pour home assistant dans l’outils dev?

C’est juste un test de condition, tu peux voir le resultat a droite directement.
Comme mon json a un rssi j’affiche home

D’accord je comprends à peu près ce que tu me dis

Comment tu les différencie?

est ce que le dernier lien que tu m’as envoyé tu sais ce que je dois à en faire?

Voici un exemple a vérifier et modifier:

{## Imitate available variables: ##}
{% set value_json = {"applicationID": "3","applicationName": "Rak7268","devEUI": "***","deviceName": "Dragino detecteur","timestamp": 1677767262,"fCnt": 155,"fPort": 10,"data": "8C2A0100005500000000","data_encode": "hexstring","object": {},"adr": true,"rxInfo": [{"gatewayID": "***","loRaSNR": 13.3,"rssi": -73,"location": {"latitude": 0,"longitude": 0,"altitude": 0}}],"txInfo": {"frequency": 868300000,"dr": 5}}%}

Pour le device: {{value_json.deviceName}} 
applicationID is {{value_json.applicationID}}, 
the applicationName is {{ value_json.applicationName}}.
Le champ data du capteur est {{ value_json.data}}
Le statut du capteur est {% if  value_json.data[0] | int(base=16) // 8 % 2 -%} ouvert {%- else -%} ferme {%- endif %}

D’accord,

J’ai réussi à extraire le chiffre hexadécimal derrière data

Maintenant j’aimerais ne prendre en compte que le premier chiffre ou les trois premiers

Comment je fais pour « effacer » les suivants ?

C’est ce que fait la formule que tu as dans mon exemple, elle ne prend que le premier element data[0] . Si tu remplaces les elements de data dans le value_json par un exemple de fermeture, tu devrais voir apparaitre « ferme »

dans ton exemple avec value_jason.date[0]
Dans le volet de droite, HA affiche en clair toute la donnée de data.

Je vois pas comment prendre en compte que le premier chiffre.

Car le reste de la valeur, en plus de ne pas m’intéresser, change à partir de la moitié de la suite de chiffres.


edit:

J’ai compris.

à quoi sert :

int(base=16)

et

8 % 2 -%  (le 2?)

Quand je mets un 9 devant ça marque ouvert, comment parer à ca?

Cela correspond au décodage transmis par Dragino, tu as des cas avec le champ data qui commence par un 9 et le capteur qui n’est pas ouvert?

Cela convertit la valeur hexadecimale en entier.

C’est une division par 8 en arrondissant à l’entier inférieur, modulo 2

En synthèse la formule permet d’identifier le premier bit du byte pour savoir si c’est un 1 ou un 0