LoRaWan – Sensor Humedad y Temperatura. Gateway y Broker

El dispositivo que envía el mensaje con los datos de Humedad y temperatura debe registrarse en ChirpStack. La trama del mensaje se decodifica en al perfil del dispositivo (Device-profile) que permite al servidor de aplicaciones (Application-Server) integrar el mensaje en Home Assistant.

Decodificador de Trama – ChirpStack/Device-Profile

En el menú «Device-profile» se crea el perfil del dispositivo con datos principales semejantes a los usados en el dispositivo básico. La sección que cambia es la de CODEC que se describe en Java Script.

La decodificación se realiza usando LSB, es decir el orden es byte menos significativo primero. En este caso los datos se reconvierten a número real (float) y se trunca a dos decimales (+NumReal.toFixed(2)).

Con los datos decodificados se integran como un diccionario de resultados.

// Decode decodes an array of bytes into an object.
//  - fPort contains the LoRaWAN fPort number
//  - bytes is an array of bytes, e.g. [225, 230, 255, 0]
//  - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)
// The function must return an object, e.g. {"temperature": 22.5}
//function Decode(fPort, bytes, variables) {
//  return {};
//}
function Decode(fPort, bytes, variables) {

  // usando LSB  (least significant byte first)
  var unalectura = bytes[3]<<24 | bytes[2]<<16 | bytes[1]<<8 | bytes[0]; var unsigno = (unalectura>>>31 === 0) ? 1.0 : -1.0;
  var exponente = unalectura>>>23 & 0xff;
  var mantisa = (exponente === 0) ? (unalectura & 0x7fffff)<<1 : (unalectura & 0x7fffff) | 0x800000;
  var NumReal = unsigno * mantisa * Math.pow(2, exponente - 150);
  NumReal = +NumReal.toFixed(2);
  
  // usando LSB  (least significant byte first)
  var unalectura = bytes[7]<<24 | bytes[6]<<16 | bytes[5]<<8 | bytes[4]; var unsigno = (unalectura>>>31 === 0) ? 1.0 : -1.0;
  var exponente = unalectura>>>23 & 0xff;
  var mantisa = (exponente === 0) ? (unalectura & 0x7fffff)<<1 : (unalectura & 0x7fffff) | 0x800000;
  var NumReal2 = unsigno * mantisa * Math.pow(2, exponente - 150);
  NumReal2 = +NumReal2.toFixed(2);
  
  var appData = {'temperaturaC': NumReal, 'humedad': NumReal2};
  return appData;
}

Configuración en Home-Assistant

La configuración se realiza en el archivo configuration.yaml con la instrucción:

sudo nano /home/homeassistant/.homeassistant/configuration.yaml

al archivo se añade en la sección de sensores las instrucciones de cada lectura.

El tópico a observar se construye tomando los datos de chirpstack para cada dispositivo, observando el número de aplicación y el identificador de dispositivo.

Los valores de los sensores se decodificaron en un diccionario, que se transfirió como un valor tipo texto, por  lo que primero se lo convierte en un diccionario antes de seleccionar el valor a usar. La selección del valor se realiza en value_template.

  - platform: mqtt
    name: 'DHT_S01_temperatura'
    unit_of_measurement: '°C'
    state_topic: 'application/1/device/01200893df803774/event/up'
    value_template: "{% set valores = value_json.objectJSON |from_json %} {{valores.temperaturaC}}"    
    #json_attributes_topic: 'application/1/device/01200893df803774/event/up'

  - platform: mqtt
    name: 'DHT_S01_humedad'
    unit_of_measurement: '%'
    state_topic: 'application/1/device/01200893df803774/event/up'
    value_template: "{% set valores = value_json.objectJSON |from_json %} {{valores.humedad}}"

  - platform: mqtt
    name: 'DHT_S01_rssi'
    unit_of_measurement: 'dB'
    state_topic: 'application/1/device/01200893df803774/event/up'
    value_template: "{{ value_json.rxInfo[0].rssi}}"

  - platform: mqtt
    name: 'DHT_S01_snr'
    unit_of_measurement: 'dB'
    state_topic: 'application/1/device/01200893df803774/event/up'
    value_template: "{{ value_json.rxInfo[0].loRaSNR}}"

El resultado se observa como: