{"id":3407,"date":"2021-04-06T14:35:51","date_gmt":"2021-04-06T19:35:51","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3407"},"modified":"2026-08-04T22:32:36","modified_gmt":"2026-08-05T03:32:36","slug":"lorawan-temperatura-humedad-gateway","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-temperatura-humedad-gateway\/","title":{"rendered":"LoRaWan - Temperatura y Humedad: Gateway-HA"},"content":{"rendered":"\n<p>El dispositivo que env\u00eda 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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Decodificador de Trama - ChirpStack\/Device-Profile<\/h2>\n\n\n\n<p>En el men\u00fa \"Device-profile\" se crea el perfil del dispositivo con datos principales semejantes a los usados en el dispositivo b\u00e1sico. La secci\u00f3n que cambia es la de CODEC que se describe en Java Script.<\/p>\n\n\n\n<p>La decodificaci\u00f3n se realiza usando LSB, es decir el orden es byte menos significativo primero. En este caso los datos se reconvierten a n\u00famero real (float) y se trunca a dos decimales (+NumReal.toFixed(2)).<\/p>\n\n\n\n<p>Con los datos decodificados se integran como un diccionario de resultados.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/\/ Decode decodes an array of bytes into an object.\n\/\/  - fPort contains the LoRaWAN fPort number\n\/\/  - bytes is an array of bytes, e.g. &#x5B;225, 230, 255, 0]\n\/\/  - variables contains the device variables e.g. {&quot;calibration&quot;: &quot;3.5&quot;} (both the key \/ value are of type string)\n\/\/ The function must return an object, e.g. {&quot;temperature&quot;: 22.5}\n\/\/function Decode(fPort, bytes, variables) {\n\/\/  return {};\n\/\/}\nfunction Decode(fPort, bytes, variables) {\n\n  \/\/ usando LSB  (least significant byte first)\n  var unalectura = bytes&#x5B;3]&lt;&lt;24 | bytes&#x5B;2]&lt;&lt;16 | bytes&#x5B;1]&lt;&lt;8 | bytes&#x5B;0]; var unsigno = (unalectura&gt;&gt;&gt;31 === 0) ? 1.0 : -1.0;\n  var exponente = unalectura&gt;&gt;&gt;23 &amp; 0xff;\n  var mantisa = (exponente === 0) ? (unalectura &amp; 0x7fffff)&lt;&lt;1 : (unalectura &amp; 0x7fffff) | 0x800000;\n  var NumReal = unsigno * mantisa * Math.pow(2, exponente - 150);\n  NumReal = +NumReal.toFixed(2);\n  \n  \/\/ usando LSB  (least significant byte first)\n  var unalectura = bytes&#x5B;7]&lt;&lt;24 | bytes&#x5B;6]&lt;&lt;16 | bytes&#x5B;5]&lt;&lt;8 | bytes&#x5B;4]; var unsigno = (unalectura&gt;&gt;&gt;31 === 0) ? 1.0 : -1.0;\n  var exponente = unalectura&gt;&gt;&gt;23 &amp; 0xff;\n  var mantisa = (exponente === 0) ? (unalectura &amp; 0x7fffff)&lt;&lt;1 : (unalectura &amp; 0x7fffff) | 0x800000;\n  var NumReal2 = unsigno * mantisa * Math.pow(2, exponente - 150);\n  NumReal2 = +NumReal2.toFixed(2);\n  \n  var appData = {'temperaturaC': NumReal, 'humedad': NumReal2};\n  return appData;\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Configuraci\u00f3n en Home-Assistant<\/h2>\n\n\n\n<p>La configuraci\u00f3n se realiza en el archivo <code>configuration.yaml<\/code> con la instrucci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>sudo nano \/home\/homeassistant\/.homeassistant\/configuration.yaml<\/code><\/pre>\n\n\n\n<p>al archivo se a\u00f1ade en la secci\u00f3n de sensores las instrucciones de cada lectura.<\/p>\n\n\n\n<p>El t\u00f3pico a observar se construye tomando los datos de Chirpstack para cada dispositivo, observando el n\u00famero de aplicaci\u00f3n y el identificador de dispositivo.<\/p>\n\n\n\n<p>Los valores de los sensores se decodificaron en un diccionario, que se transfiri\u00f3 como un valor tipo texto, por&nbsp; lo que primero se lo convierte en un diccionario antes de seleccionar el valor a usar. La selecci\u00f3n del valor se realiza en <code>value_template<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>  - platform: mqtt\n    name: 'DHT_S01_temperatura'\n    unit_of_measurement: '\u00b0C'\n    state_topic: 'application\/1\/device\/01200893df803774\/event\/up'\n    value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.temperaturaC}}\"    \n    #json_attributes_topic: 'application\/1\/device\/01200893df803774\/event\/up'\n\n  - platform: mqtt\n    name: 'DHT_S01_humedad'\n    unit_of_measurement: '%'\n    state_topic: 'application\/1\/device\/01200893df803774\/event\/up'\n    value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.humedad}}\"\n\n  - platform: mqtt\n    name: 'DHT_S01_rssi'\n    unit_of_measurement: 'dB'\n    state_topic: 'application\/1\/device\/01200893df803774\/event\/up'\n    value_template: \"{{ value_json.rxInfo&#091;0].rssi}}\"\n\n  - platform: mqtt\n    name: 'DHT_S01_snr'\n    unit_of_measurement: 'dB'\n    state_topic: 'application\/1\/device\/01200893df803774\/event\/up'\n    value_template: \"{{ value_json.rxInfo&#091;0].loRaSNR}}\"\n<\/code><\/pre>\n\n\n\n<p>El resultado se observa como:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/04\/LoraWanBaseDHT_01_HA.png\"><img loading=\"lazy\" decoding=\"async\" width=\"315\" height=\"223\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/04\/LoraWanBaseDHT_01_HA.png\" alt=\"\" class=\"wp-image-3417\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/04\/LoraWanBaseDHT_01_HA.png 315w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/04\/LoraWanBaseDHT_01_HA-300x212.png 300w\" sizes=\"auto, (max-width: 315px) 100vw, 315px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>El dispositivo que env\u00eda 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\u00fa \"Device-profile\" se crea el perfil [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1465790],"tags":[],"class_list":["post-3407","post","type-post","status-publish","format-standard","hentry","category-lorawan-temperatura-humedad"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=3407"}],"version-history":[{"count":10,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3407\/revisions"}],"predecessor-version":[{"id":4901,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3407\/revisions\/4901"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}