msgbartop
Made of More
msgbarbottom

25 oct 23 Control de luces inteligentes con NFC, MQTT y Node Red

En fechas recientes he implementado un elemento adicional de interacción con la domótica. No es algo especialmente nuevo (de hecho, ya en Irlanda empecé a trastear con ellos), pero sí es algo que he recuperado recientemente: el uso de tags NFC para interactuar con la domótica, usando teléfonos inteligentes. La idea es bastante sencilla: desplegar una serie de tags desplegados por la casa, allí donde quiera que se dispare una acción concreta, para escanearlo con el teléfono, y ejecutar la acción. Y el elemento más obvio para ello es el control de luces inteligentes.

En mi caso, tengo desplegadas dos tecnologías diferentes para el control de luces inteligentes: interruptores WiFi (básicamente, 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én con la plataforma HomeAssistant. La gracia del asunto es que toda la interacción con ellas se realiza desde el propio HomeAssistant, independientemente de la tecnología subyacente. Y siempre usando MQTT como elemento de mensajería.

Para poner en marcha el sistema de interacción basado con NFC he optado por lo siguiente: codificar en los NFC el envío de un datagrama UDP. La razón de hacerlo así 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ífico en el teléfono, ya que mediante el envío del datagrama se evita que el usuario tenga que interactuar con ninguna aplicación, haciéndose el envío siempre en segundo plano. Esto implica que es preciso tener abierto en algún lugar un puerto UDP al que enviar los mensajes. Y la opción obvia en mi caso es hacer uso de Node-Red.

Así pues, he hecho un flujo bastante simple, que lo que hace es exponer un puerto UDP, a donde el teléfono envía la mensaje del datagrama. Este mensaje, en líneas generales, es un alfanumérico que me permite identificar qué luz quiero encender (por ejemplo, santiponceSalon1, para identificar la luz principal del salón 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 payload el mensaje de encendido/apagado. Aquí hay dos opciones:

  • Luces Sonoff: Para las luces WiFi basadas en Sonoff con el firmware Tasmota, basta con enviar un “TOGGLE”, y con eso variaremos el estado de la luz entre encendido y apagado. Ese mensaje se envía mediante MQTT al topic que permite dar órdenes al interruptor (por lo general, algo como xxxxx/xxxx/cmnd/xxxx/POWER).
  • Luces Zigbee: En mi caso, como decía, uso Zigbee2MQTT para controlar las luces Zigbee de manera agnóstica al fabricante, interactuando a través de un servidor MQTT. En este caso, la composición del mensaje es algo distinta. Hay que enviar un ‘{“state”: “TOGGLE”}’. Se enviará al topic que, como en el caso anterior, permite enviar comandos. Será algo como zigbee2mqtt/0xxxxxxxxxxxx/set
Flujo Node Red para control de luces inteligentes con NFC y MQTT

Flujo Node Red para control de luces inteligentes con NFC y MQTT

Una vez publicado el flujo, el servidor donde tengamos desplegado Node-Red abrirá 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ía que realizar una publicación de puertos del contenedor, de lo que hablaba en el artículo anterior. Y con esto, estaremos listos para controlar las luces con un móvil NFC.

Un par de comentarios adicionales:

  • Desde el punto de vista de la seguridad, no es una buena práctica publicar estos puertos hacia Internet. En mi caso, lo tengo publicado sólo 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úe con los tags NFC. Se puede exponer hacia Internet, pero lo desaconsejo de manera vehemente.
  • Para grabar los tags NFC para que envíen datagramas por UDP hago uso de la versión Profesional de la aplicación de Android NFC Tools. Vale apenas unos 3€, 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éfono con NFC, aunque no tenga la aplicación, será capaz de enviar el datagrama.
Datagrama UDP con NFC Tools Professional

Datagrama UDP con NFC Tools Professional

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , , , , , , , , ,

22 oct 23 Cómo editar los puertos a un contenedor docker en ejecución

Una de las gracias de ejecutar servicios en un contenedor docker es que, si cambian las necesidades del contenedor (como por ejemplo publicar en un nuevo puerto), es bastante sencillo aprovisionar uno nuevo sin mayores consecuencias. Pero a veces pasa que no puedes destruir y aprovisionar un nuevo contenedor, bien porque tienes determinada información persistente en el mismo (cosa que no debe hacerse, ya que en teoría los contenedores han de poder ser sin estado, pero esa es otra historia) o por cualquier otro motivo, y precisas de mantener el mismo contenedor, pero modificando (bien añadiendo, quitando o reemplazando puertos) el contenedor existente. Aunque no es una buena práctica, es posible realizarlo, siguiendo los siguientes pasos (por supuesto, recomiendo hacer primero una copia de seguridad de los ficheros modificados):

  • Detener el contenedor en cuestion: Haremos un docker ps para obtener el listado de contenedores, y poder identificar nuestro contenedor en cuestión. Tras ello, lo detendremos con un docker stop .
  • Abrir el directorio que contiene el docker: Lo más normal es que haya que realizarlo con permisos de root. Se encontrará bajo la ruta /var/lib/docker/containers/, y allí tendremos que entrar en una carpeta que comience por el id del contenedor.
  • Editar el fichero hostconfig.json para modificar las asociaciones de puertos entre host y contenedor: Una vez en la carpeta, tendremos que editar el fichero hostconfig.json. Esto nos permitirá reconfigurar las asociaciones de puertos entre el host y el contenedor docker. Para añadir un nuevo puerto, tendremos que añadir una entrada en la sección PortBindings. Por ejemplo, si quisiéramos añadir el puerto 18334/tcp a un docker que publique por el puerto 18332, tendríamos que dejar esa sección de la siguiente manera:

    “PortBindings”:{“18332/tcp”:[{"HostIp":"","HostPort":"18332"}],”18334/tcp”:[{"HostIp":"","HostPort":"18334"}]}

  • Editar el fichero config.v2.json para modificar las exposiciones de puertos del contenedor: Asociar el puerto por sí solo no es suficiente, es preciso decirle al contenedor que tiene que exponer un nuevo puerto, que habrá de coincidir con el añadido en el punto anterior. Para ello, hay que modificar el fichero config.v2.json, bajo la sección ExposedPorts. Como en el caso anterior, si quisiéramos publicar ese puerto 18334/tcp, tendría que quedar como sigue:

    “ExposedPorts”:{“18332/tcp”:{},”18334/tcp”:{}},

  • Reiniciar el servicio docker: Bastará con un sudo systemctl restart docker.
  • Iniciar el contenedor: En caso de que el contenedor no se haya iniciado de manera automática al reiniciar el servicio docker, tendremos que iniciarlo a mano con un docker start . Posteriormente, con un docker ps podremos verificar que hemos modificado adecuadamente los puertos expuestos.

Referencias:

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , ,

16 oct 23 Monasterio de Armenteira a vista de dron

El pasado 12 de octubre, aprovechando el festivo, visité con Ana el cercano monasterio de Armenteira, en Poio, su pueblo natal. No es tan famoso como el Monasterio de Poio, pero es una pequeña joyita que vale la pena visitar. Y a la que no pude menos que hacer un reportaje con el dron:

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , ,

15 oct 23 Estatua del Ángel Caído, Parque del Retiro, Madrid

De vuelta de nuestro viaje a Grecia hicimos una breve escala en Madrid, ya que el vuelo de Grecia llegaba a la capital de España, y desde allí teníamos que volver a Sevilla. Lo irónico del asunto es que descubrimos, en nuestra escala en el aeropuerto de Atenas, que teníamos un vuelo a Sevilla directo, con nuestra misma compañía, y un par de horas antes del vuelo a Madrid, lo que nos había ahorrado -en la práctica- un día de viaje. Pero es lo que tiene ir en paquetes organizados, que no puedes hacer según qué optimizaciones. En fin.

El caso es que, puestos a llegar a Madrid, aprovechamos para emplear el tiempo entre esperas para dar una vuelta por el Retiro y sus alrededores. Del Parque me quedo con esta imagen:

Estatua del Ángel Caído, Parque del Retiro

Estatua del Ángel Caído, Parque del Retiro

…y de la visita a los alrededores, el haber comprado la última novel de Arturo Pérez-Reverte, El Problema Final, en uno de los tenderetes de la Cuesta Moyano.

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , ,

14 oct 23 Marcos, el burro de Fira, Santorini

Nuestro último día en Grecia se inició en Santorini. Teníamos la mañana libre antes de tomar un vuelo a media tarde hacia Atenas, y otro por la noche a Madrid, así que invertimos esa mañana en volver de nuevo a Fira. Allí estuvimos deambulando por el pueblo, tomando las últimas fotos, y disfrutando de nuestras últimas horas en Grecia. Y no pudimos menos que quedarnos con el simpático homenaje de Fira a sus burros, que fueron una parte importante de la economía de la isla, al ayudar a trasladar pesadas cargas desde el puerto hasta los pueblos y viceversa, y que a día de hoy son un atractivo turístico más, ya que proporcionan un servicio para subir y bajar del puerto, alternativo al moderno teleférico. Y ese homenaje tiene el nombre de Marcos:

Marcos, el burro de Fira

Marcos, el burro de Fira

Una simpática estatua emplazada en el centro de la ciudad, en la que se advierte que la misma no es para montar en ella, sino sólo para hacerse “fototos”. Me imagino que más de un inglés borracho se habrá subido al pobre Marcos…

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , ,