{"id":5430,"date":"2023-10-25T20:38:27","date_gmt":"2023-10-25T19:38:27","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=5430"},"modified":"2023-10-25T20:38:27","modified_gmt":"2023-10-25T19:38:27","slug":"control-de-luces-inteligentes-con-nfc-mqtt-y-node-red","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=5430","title":{"rendered":"Control de luces inteligentes con NFC, MQTT y Node Red"},"content":{"rendered":"<p>En fechas recientes he implementado un elemento adicional de interacci\u00f3n con la dom\u00f3tica. No es algo especialmente nuevo (de hecho, ya en Irlanda empec\u00e9 a trastear con ellos), pero s\u00ed es algo que he recuperado recientemente: el uso de <em>tags<\/em> NFC para interactuar con la dom\u00f3tica, usando tel\u00e9fonos inteligentes. La idea es bastante sencilla: desplegar una serie de <em>tags<\/em> desplegados por la casa, all\u00ed donde quiera que se dispare una acci\u00f3n concreta, para escanearlo con el tel\u00e9fono, y ejecutar la acci\u00f3n. Y el elemento m\u00e1s obvio para ello es el control de luces inteligentes.<\/p>\n<p>En mi caso, tengo desplegadas dos tecnolog\u00edas diferentes para el control de luces inteligentes: interruptores WiFi (b\u00e1sicamente, diversas variedades de Sonoff) y luces Zigbee, que controlo mediante sendas plataformas zigbee2MQTT que tengo tanto en Santiponce como en Forcarey. Todo ello integrado en mi servidor MQTT, que se utiliza tambi\u00e9n con la plataforma HomeAssistant. La gracia del asunto es que toda la interacci\u00f3n con ellas se realiza desde el propio HomeAssistant, independientemente de la tecnolog\u00eda subyacente. Y siempre usando MQTT como elemento de mensajer\u00eda.<\/p>\n<p>Para poner en marcha el sistema de interacci\u00f3n basado con NFC he optado por lo siguiente: codificar en los NFC el env\u00edo de un datagrama UDP. La raz\u00f3n de hacerlo as\u00ed es que es que de esta manera se evita, como es el caso de conexiones HTTP o similar, el tener que hacer uso de un programa espec\u00edfico en el tel\u00e9fono, ya que mediante el env\u00edo del datagrama se evita que el usuario tenga que interactuar con ninguna aplicaci\u00f3n, haci\u00e9ndose el env\u00edo siempre en segundo plano. Esto implica que es preciso tener abierto en alg\u00fan lugar un puerto UDP al que enviar los mensajes. Y la opci\u00f3n obvia en mi caso es hacer uso de Node-Red.<\/p>\n<p>As\u00ed pues, he hecho un flujo bastante simple, que lo que hace es exponer un puerto UDP, a donde el tel\u00e9fono env\u00eda la mensaje del datagrama. Este mensaje, en l\u00edneas generales, es un alfanum\u00e9rico que me permite identificar qu\u00e9 luz quiero encender (por ejemplo, <em>santiponceSalon1<\/em>, para identificar la luz principal del sal\u00f3n de Santiponce). Una vez recibido el mensaje, se procesa en un switch, con tantas entradas como luces a controlar (en mi caso, de momento, 4), y se incluye en el <em>payload<\/em> el mensaje de encendido\/apagado. Aqu\u00ed hay dos opciones:<\/p>\n<ul>\n<li><strong>Luces Sonoff:<\/strong> Para las luces WiFi basadas en Sonoff con el firmware Tasmota, basta con enviar un <em>\u00abTOGGLE\u00bb<\/em>, y con eso variaremos el estado de la luz entre encendido y apagado. Ese mensaje se env\u00eda mediante MQTT al <em>topic<\/em> que permite dar \u00f3rdenes al interruptor (por lo general, algo como <em>xxxxx\/xxxx\/cmnd\/xxxx\/POWER<\/em>).<\/li>\n<li><strong>Luces Zigbee:<\/strong> En mi caso, como dec\u00eda, uso Zigbee2MQTT para controlar las luces Zigbee de manera agn\u00f3stica al fabricante, interactuando a trav\u00e9s de un servidor MQTT. En este caso, la composici\u00f3n del mensaje es algo distinta. Hay que enviar un <em>&#8216;{\u00abstate\u00bb: \u00abTOGGLE\u00bb}&#8217;<\/em>. Se enviar\u00e1 al <em>topic<\/em> que, como en el caso anterior, permite enviar comandos. Ser\u00e1 algo como <em>zigbee2mqtt\/0xxxxxxxxxxxx\/set<\/em><\/li>\n<\/ul>\n<figure id=\"attachment_5431\" aria-describedby=\"caption-attachment-5431\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2023\/10\/node-red-nfc-lights.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2023\/10\/node-red-nfc-lights-400x104.png\" alt=\"Flujo Node Red para control de luces inteligentes con NFC y MQTT\" title=\"Flujo Node Red para control de luces inteligentes con NFC y MQTT\" width=\"400\" height=\"104\" class=\"size-medium wp-image-5431\" \/><\/a><figcaption id=\"caption-attachment-5431\" class=\"wp-caption-text\">Flujo Node Red para control de luces inteligentes con NFC y MQTT<\/figcaption><\/figure>\n<p>Una vez publicado el flujo, el servidor donde tengamos desplegado Node-Red abrir\u00e1 un puerto UDP para escuchar conexiones (aconsejo hacer uso de un puerto alto, para evitar tener que asignar permisos de root). En mi caso, dado que publico Node-Red mediante un contenedor docker, es por lo que ten\u00eda que realizar una <a href=\"https:\/\/bitacora.eniac2000.com\/?p=5425\" title=\"C\u00f3mo editar los puertos a un contenedor docker en ejecuci\u00f3n\" target=\"_blank\">publicaci\u00f3n de puertos del contenedor, de lo que hablaba en el art\u00edculo anterior<\/a>. Y con esto, estaremos listos para controlar las luces con un m\u00f3vil NFC.<\/p>\n<p>Un par de comentarios adicionales:<\/p>\n<ul>\n<li>Desde el punto de vista de la seguridad, no es una buena pr\u00e1ctica publicar estos puertos hacia Internet. En mi caso, lo tengo publicado s\u00f3lo en el contexto de la red local de mi casa, lo que no supone un problema, ya que siempre voy a estar conectado a la WiFi cuando interact\u00fae con los <em>tags<\/em> NFC. Se puede exponer hacia Internet, pero lo desaconsejo de manera vehemente.<\/li>\n<li>Para grabar los tags NFC para que env\u00eden datagramas por UDP hago uso de la versi\u00f3n Profesional de la aplicaci\u00f3n de Android NFC Tools. Vale apenas unos 3\u20ac, y compensa tenerla. La manera de hacerlo es muy sencilla, basta con agregar una Tarea, de tipo Redes, UDP, y grabar el tag. Y lo bueno es que cualquier otro tel\u00e9fono con NFC, aunque no tenga la aplicaci\u00f3n, ser\u00e1 capaz de enviar el datagrama.<\/li>\n<\/ul>\n<figure id=\"attachment_5433\" aria-describedby=\"caption-attachment-5433\" style=\"width: 460px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2023\/10\/nfc-tools-professional.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2023\/10\/nfc-tools-professional-460x1024.jpg\" alt=\"Datagrama UDP con NFC Tools Professional\" title=\"Datagrama UDP con NFC Tools Professional\" width=\"460\" height=\"1024\" class=\"size-large wp-image-5433\" \/><\/a><figcaption id=\"caption-attachment-5433\" class=\"wp-caption-text\">Datagrama UDP con NFC Tools Professional<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>En fechas recientes he implementado un elemento adicional de interacci\u00f3n<\/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":[106,543,799,1134,1168,1177,1567,1595,1679,1785,1817,1818],"series":[],"class_list":["post-5430","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-android","tag-domotica","tag-homeassistant","tag-mqtt","tag-nfc","tag-node-red","tag-sonoff","tag-tasmota","tag-udp","tag-wifi","tag-zigbee","tag-zigbee2mqtt"],"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\/5430","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=5430"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/5430\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5430"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=5430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}