{"id":11279,"date":"2025-12-01T12:31:47","date_gmt":"2025-12-01T11:31:47","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=11279"},"modified":"2025-12-01T12:32:02","modified_gmt":"2025-12-01T11:32:02","slug":"trazabilidad-de-activos-con-lorawan-una-vuelta-de-tuerca","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=11279","title":{"rendered":"Trazabilidad de activos con LoRaWAN e IA generativa. Una vuelta de tuerca"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 1 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=trazabilidad-de-activos-con-lorawan-e-ia-generativa\" class=\"series-1870\" title=\"Trazabilidad de activos con LoRaWAN e IA generativa\">Trazabilidad de activos con LoRaWAN e IA generativa<\/a><\/div>\n<p>Hace ya algunos a\u00f1os que llevo trasteando con la tecnolog\u00eda LoRaWAN. Hay una serie de art\u00edculos en este mismo sitio web al respecto, de tem\u00e1tica variopinta: una <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4475\" target=\"_blank\" rel=\"noreferrer noopener\">serie sobre Gateways LoRaWAN<\/a>, <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4442\" data-type=\"link\" data-id=\"https:\/\/bitacora.eniac2000.com\/?p=4442\" target=\"_blank\" rel=\"noreferrer noopener\">pruebas de conectividad<\/a>, e incluso <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4769\" data-type=\"link\" data-id=\"https:\/\/bitacora.eniac2000.com\/?p=4769\" target=\"_blank\" rel=\"noreferrer noopener\">uno sobre la trazabilidad de activos<\/a>. Es este \u00faltimo el que me interesa. Dentro de mis investigaciones, tanto para \u00e1mbito personal como para el profesional, desarroll\u00e9 un prototipo r\u00e1pido de c\u00f3mo usar dispositivos Dragino GPS para ubicar activos en un mapa, trazar sus movimientos, e incluso establecer un mapa de calor de las ubicaciones m\u00e1s utilizadas. Funcionaba bien, estaba hecho con Node-RED, pero era ciertamente b\u00e1sico. Un demostrador, m\u00e1s que otra cosa. Pero la idea se qued\u00f3 pululando en mi cabeza.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2021\/04\/trazabilidad-activos-01.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Versi\u00f3n anterior de la aplicaci\u00f3n de trazabilidad de activos. Interesante, pero limitada<\/figcaption><\/figure>\n\n\n\n<p>As\u00ed que otro de los proyectos en los que he estado trabajando estas semanas ha sido en dar una vuelta de tuerca a esta idea, y conseguir algo bastante m\u00e1s acabado. As\u00ed que empec\u00e9 a elaborar una serie de puntos de mejora que aplicar a la versi\u00f3n r\u00e1pida que hab\u00eda elaborado con anterioridad. A bote pronto, salieron unos cuantos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de usuarios:<\/strong> No hab\u00eda ning\u00fan tipo de control de usuarios en la aplicaci\u00f3n anterior, s\u00f3lo dispositivos. Esto implicaba que se pod\u00eda saber qu\u00e9 movimientos hab\u00eda hecho un dispositivo, pero no saber <em>qui\u00e9n<\/em> hab\u00eda realizado esos movimientos.<\/li>\n\n\n\n<li><strong>Gesti\u00f3n de dispositivos: <\/strong>M\u00e1s all\u00e1 de tener los dispositivos ubicados en un mapa, no hab\u00eda capacidad de gesti\u00f3n alguna. No era posible borrarlos, editarlos, cambiarles el nombre, o asignarlos a un usuario del entorno.<\/li>\n\n\n\n<li><strong>Informaci\u00f3n de <em>gateways<\/em>: <\/strong>Los <em>gateways<\/em> no exist\u00edan desde el punto de vista de la aplicaci\u00f3n. Una de las cosas interesantes de LoRaWAN es que, adem\u00e1s de enviar informaci\u00f3n del dispositivo, proporciona tambi\u00e9n informaci\u00f3n sobre los gateways que han recibido la se\u00f1al enviada por el dispositivo. Esto permite realizar triangulaciones, representarlos sobre un mapa, establecer m\u00e9tricas de calidad de servicio&#8230; Toda esta informaci\u00f3n se estaba perdiendo.<\/li>\n\n\n\n<li><strong>Historial de mensajes: <\/strong>No se guardaba registro alguno de los mensajes recibidos. Es interesante tener registrada esta informaci\u00f3n, dado que en el futuro es posible que exista otro registro valioso, que a d\u00eda de hoy no lo es. Los mensajes, una vez procesados, se perd\u00edan.<\/li>\n\n\n\n<li><strong>Historial de actividad:<\/strong> La clave de todo el asunto. La visibilidad sobre un mapa est\u00e1 muy bien, pero el no poder realizar filtrados por actividad en una fecha determinada para un usuario en concreto era un punto faltante claro. Casi que val\u00eda la pena emprender el proyecto nada m\u00e1s que por esto.<\/li>\n\n\n\n<li><strong>Sistema de mensajer\u00eda robusto: <\/strong>La l\u00f3gica de gesti\u00f3n del canal de comunicaciones era b\u00e1sicamente inexistente. Un <em>post<\/em> HTTP contra un flujo de aplicaci\u00f3n en Node-RED. Lo cual, teniendo a mi disposici\u00f3n un servidor MQTT, era casi una verg\u00fcenza. Era necesario usar algo m\u00e1s adecuado.<\/li>\n\n\n\n<li><strong>Base de datos relacional:<\/strong> Y con todo lo anterior relacionado con mantenimiento de informaci\u00f3n, una base de datos se hac\u00eda imprescindible. No puedes confiar en mantener un registro hist\u00f3rico sin una base de datos m\u00ednimamente consistente.<\/li>\n\n\n\n<li><strong>Soporte universal de dispositivos<\/strong>: No ten\u00eda tampoco mucha l\u00f3gica limitarse a un tipo concreto de dispositivos. \u00bfPor qu\u00e9 no implementar una l\u00f3gica que permita usar dispositivos heterog\u00e9neos?<\/li>\n<\/ul>\n\n\n\n<p>Como todo esto daba ya para una aplicaci\u00f3n bastante consistente, val\u00eda la pena invertir tiempo en el desarrollo de la aplicaci\u00f3n. Pero esto implicaba, adem\u00e1s de un proceso de desarrollo software, invertir en <em>backend<\/em>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Un entorno de despliegue:<\/strong> Resuelto con mi estupendo servidor de virtualizaci\u00f3n con ProxMox. Dispon\u00eda de capacidad de c\u00f3mputo y de espacio en disco sobrado. Me decid\u00ed a desplegar la aplicaci\u00f3n a desarrollar en mi servidor virtual de <em>backend<\/em>.<\/li>\n\n\n\n<li><strong>Un servidor LoRaWAN: <\/strong>Aqu\u00ed la elecci\u00f3n estaba clara. Necesitaba desplegar un servidor Chirpstack. Algo que a priori no representaba ning\u00fan problema, y <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4725\" target=\"_blank\" rel=\"noreferrer noopener\">con lo que tengo experiencia sobrada<\/a>. Aunque esta vez le \u00edbamos a dar una vuelta de tuerca. Lo iba a desplegar como contenedor en ProxMox. Y de paso, a probar la nueva versi\u00f3n existente.<\/li>\n\n\n\n<li><strong>Dispositivos hardware<\/strong>: Cuando empec\u00e9 a trastear con el asunto no ten\u00eda a mano los Dragino que ven\u00eda utilizando. S\u00f3lo dispon\u00eda de un Cubecell AB01 y de un m\u00f3dulo GPS para Arduino (el Neo 6M), as\u00ed que tocaba tambi\u00e9n probar la validez de este dispositivo.<\/li>\n\n\n\n<li><strong>Un gateway<\/strong>: Al igual que el caso anterior, no ten\u00eda acceso a los gateway Dragino que ven\u00eda empleando en el \u00e1mbito laboral, y el gateway de un canal, m\u00e1s all\u00e1 de la diversi\u00f3n de la prueba de concepto, no era un sistema s\u00f3lido en el que basarse. Tocaba hacerse con uno.<\/li>\n<\/ul>\n\n\n\n<p>Una vez puestos en pie estos puntos, era el momento de empezar a pensar en la aplicaci\u00f3n. En los pr\u00f3ximos art\u00edculos voy a escribir sobre los distintos aspectos tecnol\u00f3gicos involucrados en el este proyecto, en el que la IA generativa, c\u00f3mo no, tuvo un peso importante, en diversos aspectos. Sirva como adelanto del contenido la siguiente captura de la aplicaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"720\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/lorawan-tracker-captura-1024x720.png\" alt=\"\" class=\"wp-image-11281\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/lorawan-tracker-captura-1024x720.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/lorawan-tracker-captura-300x211.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/lorawan-tracker-captura-768x540.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2025\/12\/lorawan-tracker-captura.png 1265w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Una aplicaci\u00f3n sensiblemente m\u00e1s avanzada que la anterior. Y con algunas sorpresas<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 1 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=trazabilidad-de-activos-con-lorawan-e-ia-generativa\" class=\"series-1870\" title=\"Trazabilidad de activos con LoRaWAN e IA generativa\">Trazabilidad de activos con LoRaWAN e IA generativa<\/a><\/div><p>Hace ya algunos a\u00f1os que llevo trasteando con la tecnolog\u00eda<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[412,745,1869,789,824,998,1134,1310],"series":[1870],"class_list":["post-11279","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-chirpstack","tag-gps","tag-gragino","tag-heltec","tag-ia","tag-lorawan","tag-mqtt","tag-proxmox","series-trazabilidad-de-activos-con-lorawan-e-ia-generativa"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11279"}],"version-history":[{"count":3,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11279\/revisions"}],"predecessor-version":[{"id":11284,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11279\/revisions\/11284"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11279"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=11279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}