{"id":4098,"date":"2023-07-27T06:06:29","date_gmt":"2023-07-27T11:06:29","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=4098"},"modified":"2026-08-04T22:16:26","modified_gmt":"2026-08-05T03:16:26","slug":"lorawan-pluviometro-chirpstack-ha","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-pluviometro-chirpstack-ha\/","title":{"rendered":"LoRaWan - Pluviometro: Chirpstack y HA"},"content":{"rendered":"\n<p>Las instrucciones para interpretar la trama en el gestor de gateways Chirpstack se realizan en JavaScript, siguiendo el mismo orden de bytes transmitido desde el dispositivo.<\/p>\n\n\n\n<p>Para el caso de valores de temperatura se usan n\u00fameros enteros de 2 bytes con signo con dos decimales, seg\u00fan lo permite el sensor usado. El valor antes de transmitir se multiplica por 100. En la recepci\u00f3n se restaura el formato del n\u00famero al dividirlo para 100.<\/p>\n\n\n\n<p>Al final se a\u00f1ade el acumulado del pluvi\u00f3metro de los \u00faltimos 5 minutos como <code>pluviosum<\/code> para fines generales.<\/p>\n\n\n\n<p>Con esta parte se habilita la lectura de los par\u00e1metros para gestionar los datos en HomeAssistant mediante un mensaje Mqtt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ChirpStack<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1245\" height=\"293\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode.png\" alt=\"\" class=\"wp-image-3758\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode.png 1245w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode-300x71.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode-768x181.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDown_ChirpStackDecode-1024x241.png 1024w\" sizes=\"auto, (max-width: 1245px) 100vw, 1245px\" \/><\/a><\/figure>\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}\nfunction Decode(fPort, bytes, variables) {\n  var Down_rssi = -1*parseInt(bytes&#x5B;0]);\n  var Down_snr = bytes&#x5B;1];\n  var Down_datarate = bytes&#x5B;2];\n\n  \/\/ usando entero sin signo\n  var bateria = (bytes&#x5B;4] &lt;&lt; 8) |(bytes&#x5B;3]);\n  bateria = (bateria\/1000);\n  bateria = +bateria.toFixed(2);\n  \n  \/\/ usando entero con signo\n  var unalectura = (bytes&#x5B;6] &lt;&lt; 8) |(bytes&#x5B;5]); var unsigno = (unalectura&gt;&gt;&gt;15 === 0) ? 1.0 : -1.0;\n  var unvalor = unalectura &amp; 0x7fff;\n  if (unsigno&lt;0){unvalor = unvalor - 32768;}\n  var ht_temp = unvalor\/100;\n  ht_temp = +ht_temp.toFixed(2);\n\n  var ht_humi = (bytes&#x5B;8] &lt;&lt; 8) |(bytes&#x5B;7]);\n  ht_humi = ht_humi\/100;\n  ht_humi = +ht_humi.toFixed(2);\n  \n  var unalectura = (bytes&#x5B;10] &lt;&lt; 8) |(bytes&#x5B;9]); var unsigno = (unalectura&gt;&gt;&gt;15 === 0) ? 1.0 : -1.0;\n  var unvalor = unalectura &amp; 0x7fff;\n  if (unsigno&lt;0){unvalor = unvalor - 32768;}\n  var bar_temp = unvalor\/100;\n  bar_temp = +bar_temp.toFixed(2);\n  \n  var unalectura = (bytes&#x5B;14] &lt;&lt; 24) | (bytes&#x5B;13]&lt;&lt; 16) | (bytes&#x5B;12] &lt;&lt; 8) |(bytes&#x5B;11]); 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  var bar_press = NumReal;\n  \n  var pluvi0 = bytes&#x5B;15];\n  var pluvi1 = bytes&#x5B;16];\n  var pluvi2 = bytes&#x5B;17];\n  var pluvi3 = bytes&#x5B;18];\n  var pluvi4 = bytes&#x5B;19];\n  var pluviosum = pluvi0 + pluvi1 + pluvi2 + pluvi3 + pluvi4;\n  var appData = {'Down_rssi':Down_rssi,'Down_snr':Down_snr,\n                 'Down_datarate':Down_datarate,\n                 'bateria_V':bateria,\n                 'ht_temp':ht_temp,'ht_humi':ht_humi,\n                 'bar_temp':bar_temp,'bar_press':bar_press,\n                 'pluvi0':pluvi0,'pluvi1':pluvi1,'pluvi2':pluvi2,'pluvi3':pluvi3,'pluvi4':pluvi4,\n                 'pluviosum':pluviosum,\n                }\n  return appData;\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Home Assistant<\/h2>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>mqtt:\n  sensor:\n    - name: \"pluviometro01\"\n      state_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n      unit_of_measurement: \"mm\/m2\"\n      value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.pluviosum}}\"\n      #availability:\n      #  - topic: \"home\/sensor1\/status\"\n      payload_available: \"online\"\n      payload_not_available: \"offline\"\n      json_attributes_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n\n    - name: \"Temperatura_pluvi01\"\n      state_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n      unit_of_measurement: \"\u00b0C\"\n      value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.ht_temp}}\"\n\n    - name: \"Humedad_pluvi01\"\n      state_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n      unit_of_measurement: \"%\"\n      value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.ht_humi}}\"\n\n    - name: \"Temperatura_pluvi01\"\n      state_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n      unit_of_measurement: \"\u00b0C\"\n      value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.bar_temp}}\"\n\n    - name: \"Presion_pluvi01\"\n      state_topic: \"application\/4\/device\/2e4fa4ddf02f06eb\/event\/up\"\n      unit_of_measurement: \"Pa\"\n      value_template: \"{% set valores = value_json.objectJSON |from_json %} {{valores.bar_press}}\"\n<\/code><\/pre>\n\n\n\n<p>..<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las instrucciones para interpretar la trama en el gestor de gateways Chirpstack se realizan en JavaScript, siguiendo el mismo orden de bytes transmitido desde el dispositivo. Para el caso de valores de temperatura se usan n\u00fameros enteros de 2 bytes con signo con dos decimales, seg\u00fan lo permite el sensor usado. El valor antes de [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1481157],"tags":[],"class_list":["post-4098","post","type-post","status-publish","format-standard","hentry","category-lorawan-pluviometro"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/4098","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=4098"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/4098\/revisions"}],"predecessor-version":[{"id":4886,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/4098\/revisions\/4886"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=4098"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=4098"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=4098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}