Log de actividades de un módulo ESP sobre Wifi

Este artículo trata de configurar un registro de actividad de un módulo ESP sobre un servidor http (más bien microservidor) mediante operaciones http POST.

La programación del ESP está realizada en Lua sobre firmware NodeMCU, y el servidor en Node.js

 

Contexto del proyecto

El módulo sobre el que se ha realizado el prototipo forma parte de una red  de módulos ESP interconectados formando una malla. En concreto el módulo en cuestión es un ESP01, trabajando en modo STATION AP,  que realiza las siguientes funciones:

  • Selecciona la red wifi más potente entre las predeterminadas.
  • Conexión a Internet a través del router wifi.
  • Envío a Thingspeak de los datos de los sensores propios y de los otros nodos conectados a la red ESP.
  • Lectura de dos sensores de temperatura DS18B20 (podrían ser mas)
  • Medida del RSSI del router wifi.
  • Servidor wifi para recepción de datos de los sensores de los demás nodos de la red ESP.
  • Enciende un LED de alarma cuando el RSSI del router wifi desciende de cierto valor.

Se ha seleccionado el ESP01 para este proyecto ya que solo se necesitan 2 GPIO, uno para el bus one wire de los sensores de temperatura, y otro para el LED de alarma. Sin embargo, el modelo de módulo ESP no es relevante para este artículo, ya que puede aplicarse a cualquier otro tipo de ESP.

 

Registro de actividad

Tras la fase de desarrollo, una vez que las pruebas han resultado correctas, normalmente el módulo se desconecta del sistema de desarrollo, y queda funcionando aislado. El registro de actividad proporciona ayuda para determinar qué ha sucedido cuando por algún motivo el módulo deja de funcionar correctamente.

El programa consiste en un bucle gobernado por un contador, que se incrementa cada 10 segundos y va estableciendo la secuencia de tareas.  En cada una de las actividades, se vuelca un mensaje, que permite seguir la evolución del programa y detectar posibles fallos.

El registro de actividad convierte esos mensajes en una instrucción http POST que se envía a un servidor preparado para recibir los mensajes, formatearlos y grabarlos en un archivo. A continuación se muestra en ejemplo de este fichero:

El formato incluye la identidad del nodo, fecha y hora y el mensaje. Al incluir la identidad del nodo, puede utilizarse el mismo fichero para registrar los eventos de varios dispositivos. En este caso, se vuelca un mensaje cada 5 periodos de 10 segundos, además de todos aquellos mensajes asociados a eventos o actividades. Entre los mensajes que se envían  se incluye el estado de la memoria ”heap”, para detectar una posible pérdida de memoria a largo plazo.

 

El servidor

Aunque ya había hecho alguna cosilla en Javascript, esta ha sido mi primera incursión en Node.js.

El servidor está basado en el artículo “El Libro para Principiantes en Node.js”:

https://www.nodebeginner.org/index-es.html

En este artículo se describe paso a paso la realización de un servidor elemental para la recepción de http POST. Yo lo he simplificado un poco más, ya que no necesito que el servidor tenga una página web, y le he añadido las funciones de fecha y hora, de gestión del fichero, y el formateo de los mensajes.

Básicamente, cada vez que se recibe el POST  en la dirección IP del servidor (dirección de la LAN local), puerto 8888 y directorio “/log” (en mi caso ‘http://192.168.1.14:8888/log’), se contesta con un ok,  se obtienen los datos transportados, se formatean y se escriben en el fichero.

El servidor genera un nuevo fichero cada día, con la fecha por nombre ( AAMMDD.log)

Este servidor lo he probado en un PC windows y en un NAS QNAP (Linux). También se podría implementar en una raspberry sin problemas.

 

La parte Lua

Se trata de añadir una nueva función que pueda sustituir la función print por otra que, además realice el http POST. Esto requiere que en en el firmware del NodeMCU se incluya el módulo “http”.

Se ha incluido un control de que el servidor esté caído: si se producen 5 fallos seguidos, se interrumpe el envío, y no se vuelve a intentar hasta que se hayan recibido 20 peticiones.

Claro está que para que esto funcione, debe haberse establecido la  conexión wifi con el router.

 

La parte Node.js

Como ya he comentado, soy novato en Node.js. Además, en el artículo mencionado se describe paso a paso la implementación del servidor, así que en este artículo solo voy a referirme a las modificaciones que he realizado.

index.js

Esta parte se ha modificado de forma que solo admite un handler para “\log”

Router.js

 

requestHandlesr.js

En esta parte solo queda la parte para manejar las peticiones a “\log”

 

server.js

Aquí es donde se hace todo el trabajo, y donde se han realizado más modificaciones:

Se han incluido los siguientes módulos:

El módulo “moment”, que proporciona fecha y hora con formato,  no forma parte de la librería estándar, por lo que habrá que instalarlo:

Se ha incluido la posibilidad de especificar el directorio donde se quieren crear los ficheros. Si no se especifica nada, los ficheros van al directorio donde está “index.js”. Esto se hace de la siguiente forma:

La variable “dataPosteada” contiene la información contenida en el http  POST, pero hay que formatearla para añadirla al log, poniendo al principio la Identidad del dispositivo, y añadiendo fecha y hora:

Finalmente, se añade al fichero

También se incluye una entrada al iniciar el servidor

 

El fichero server.js completo queda así:

 

Conclusión

Este proyecto me ha servido principalmente para experimentar con las funciones http POST a diversos servidores en el contexto del  ESP8266 con Lua, y para iniciarme en Node.js.

También te podría gustar...