This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[SpainLabsIoT2018] InfluxDB + Telegraf
#1
[Imagen: eavgQPRl.jpg]

Continuamos con una nueva entrega! En la pasada vimos la teoría sobre el protocolo MQTT y los primeros pasos en la instalación de las diferentes aplicaciones y/o configuraciones que vamos a usar. Ademas vimos esquemáticamente como vamos a implementar la solución. La dividimos en varios bloques, esta vez tocaremos la parte de base de datos y una pasarela entre nuestro broker MQTT (Mosquitto) y la base de datos InfluxDB. De esta pasarela se encarga Telegraf (https://www.influxdata.com/time-series-p.../telegraf/). Telegraf es una aplicación que pertenece al grupo InfluxData, al igual que InfluxDB y Grafana. Telegraf es un agente que recopila datos y métricas de diferentes sitios, recopila los datos para meterlos en nuestra base de datos, entre otras opciones. Hablaremos mas detenidamente de Telegraf después de tratar InfluxDB. Vamos a entrar en materia un poco.

InfluxDB - Base de datos para series de datos temporales.

InfluxDB pertenece a un ecosistema del grupo InfluxData. A continuación os muestro una imagen del lugar que ocuparía InfluxDB. En ella podemos ver el lugar que ocupa también Telegraf y en el lugar donde esta Chronograf iría nuestro Grafana. Cabe decir, que Grafana es muy similar a Chronograf y que ambos son del mismo grupo, InfluxData.


[Imagen: Tick-Stack-InfluxDB.png]

Que es InfluxDB?

Influxdb es un servidor OpenSource de base de datos de series de tiempo (timeseries), ideal para logs o datos para gráficas que se generen en vivo (dashboards, …). Programado en go permite la interacción via API HTTP(S) (JSON) e interficie web y los datos de gestionan con un lenguaje similar a SQL. En las tablas no hay que tener una previsión de las columnas que tendrá, se pueden añadir al vuelo. Su lanzamiento data en Septiembre de 2013, es una plataforma bastante joven.

InfluxDB se ha convertido en la mejor opción para las series de datos, destacando su capacidad frente a su mas inmediato perseguidor MongoDB.

Veamos una serie de características de este tipo de base de datos:
  • Se asume que si se envía el mismo dato varias veces, es el mismo dato por lo que se aplica la política de resolución de conflictos (de forma resumida, si son exactamente los mismos datos de tags set, field set, timestamp, se sobrescriben los valores en field set con los datos del último Point) por lo que en ciertos casos, se pueden perder datos.
  • El borrado de datos es una situación extraña. Normalmente se borran datos antiguos. Se limita la funcionalidad de borrado para incrementar las de escritura y lectura
  • La actualización de datos también es una situación poco común, por lo que su funcionalidad está restringida.
  • La mayoría de los datos tienen timestamps recientes y se guardan en orden ascendente para mejorar el rendimiento.
  • La base de datos puede gestionar un gran volumen de lecturas y escrituras, priorizandolas sobre la vista de los datos.
  • No está soportado el uso de joins entre tablas
Una serie de conceptos característicos de esta base de datos serían los siguientes:

  • Database: es el contenedor lógico que contiene series temporales, usuarios, políticas de retención…
  • Measurement: es la estructura en la que se almacenan los datos. En el ejemplo anterior sería la tabla “host_performance”
  • Timestamp: todo dato almacenado en InfluxDB tiene asociado la fecha y hora. InfluxDB almacena la fecha en formato UTC siguiendo el RFC3339. En el ejemplo anterior, el timestamp se indica en la columna “time”
  • Field: es el par clave-valor que almacena los valores de datos en InfluxDB y siempre están asociados a un timestamp. Son campos no indexados, y que pueden tener datos de tipo strings, floats, integers o booleans. Es obligatorio contar con Fields en nuestra infraestructura de datos. En el ejemplo anterior, “cpu_usage” y “mem_usage” son fields. Tenemos Field-keys (cpu_usage y mem_usage) y Field-values (10, 30, 50, 40 …)
  • Tags: es el par-clave-valor que almacena valores de metadatos.. Son campos indexados y almacenados como strings. Son opcionales en la infraestructura de datos. En el ejemplo anterior,  “host” y “cluster” son Tags. Tenemos Tags-keys (host y cluster) y Tags-values (esxi01.localdomain.local, esxi02.localdomain.local, cluster01…)
  • Point: es el conjunto de valores de fields y tags asociados a un timestamp. Podríamos asociarlo a un registro de la tabla.
  • Retention policy: describe durante cuanto tiempo mantiene InfluxDB los datos en su infraestructura, cuantas copias de los datos se guardan (en el caso de tener un cluster de InfluxDB) y el tiempo asociado a los shard groups. De forma automática, cuando se crea una base de datos, se crea la política “autogen” cuyos datos se guardan por tiempo infinito y con un factor de réplica de 1 y con 7 días como duración de los shard group.
  • Shard: contiene los datos comprimidos y codificados que se guardan en un archivo del disco del servidor. Cada shard pertenece a un solo group shard. Cada shard contiene un grupo específico de series y todos los datos de una serie se almacenan en el mismo shard (archivo) según la duración establecida en la “retention policy”.
Podemos profundizar un poco en el uso de la linea de comandos de InfluxDB en el siguiente enlace: https://robertoorayen.eu/2016/11/21/conc...-influxdb/

Podemos consultar mas información sobre InfluxDB en https://www.influxdata.com/time-series-p.../influxdb/

Repositorio en GitHub: https://github.com/influxdata/influxdb

Os pongo un video donde se presentan ambos bloques, aunque en ingles, de InfluxData sobre InfluxDB y Telegraf.


Visto unos aspectos básicos de InfluxDB, vamos a ver los pasos necesarios para instalarlo en nuestra Raspberry.

Instalación en la Raspberry Pi 3

En unos sencillos pasos vamos a realizar la instalación del software en nuestra Raspberry, nuestro "centro de datos".

Primero añadiremos el repositorio de InfluxDB a nuestro gestor de paquetes:

Código:
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

Posteriormente actualizamos e instalamos de esta sencilla forma:

Código:
sudo apt update

sudo apt -y install influxdb

Un ultimo paso, es gestionar los accesos desde las diferentes aplicaciones (Telegraf y Grafana) a nuestra base de datos. Para ello, usaremos estos comandos:

Código:
sudo service influxdb start
influx -execute "CREATE USER "telegraf" WITH PASSWORD 'inserthardtoreadpasswordhere' WITH ALL PRIVILEGES;"
influx -execute "CREATE USER "grafana" WITH PASSWORD 'forgrafanaaccess' WITH ALL PRIVILEGES;"

Instalaciones manuales, desde este enlace podéis acceder a los archivos: https://portal.influxdata.com/downloads#influxdb

Con esto ya tendríamos lista la parte de InfluxDB. Vamos a pasar a ver Telegraf.

Que es Telegraf?

Telegraf es una pasarela o servicio que unicamente tiene la función de recopilar y enviar métricas a otro sitio. Existen multitud de scripts, en varios lenguajes, que podrían hacer esta tarea, pero Telegraf lo reúne todo y de una forma mas o menos sencilla de configurar, se ocupa de ello. Telegraf nos permite captar datos del sistema donde se esta ejecutando para luego enviarlos a APIs de terceras partes (u otros programas pertenecientes al grupo IbluxData). Por tanto, tenemos multitud de opciones para la captura de datos (INPUTS) y otras tantas para el envío de estos (OUTPUTS). Por ejemplo, bases de datos, servicios, etc. (InfluxDB, Graphite, OpenTSDB, Datadog, Librato, Kafka, MQTT, NSQ, etc).

Características:
  • Escrito enteramente en Go. Se compila en un único binario sin dependencias externas.
  • Consumo mínimo de memoria.
  • Sistema de plugin que permite una fácil inserción de nuevos inputs y outputs
  • Gran numero de plgugins para la mayoría de los servicios mas populares y APIs.

Podemos encontrar mas información en la documentación de Telegraf: https://docs.influxdata.com/telegraf/v1.5/

Instalación de Telegraf en Raspberry Pi 3

Vamos a proceder a la instalación del software y configuración para nuestra aplicación real. La instalación vale para cualquier caso que se os ocurra, mientras que la configuración, ya sera mas propia del enfoque que necesitamos, aunque también es reutilizable en otros supuestos. Remarco que algún detalle de la configuración no sera definitivo, pues aun me queda algún aspecto del despliegue real de la aplicación que puede hacer que varié o se tenga que añadir algún parámetro mas. No obstante, en rasgos generales, lo que se comentará a continuación es válido.

Instalamos desde el gestor de paquetes el software Telegraf, podemos usar el siguiente comando:

Código:
sudo apt -y install telegraf

Tras la instalación, procedemos a configurar nuestra pasarela. Desde el mismo archivo que vamos a proceder a editar, realizaremos los cambios necesarios para el input (que en nuestro caso sera configurar MQTT), como el output (que en nuestro caso sera InfluxDB). Ejecutaremos el siguiente comando para proceder a la edición (el archivo que se abre es bastante extenso):

Código:
sudo nano /etc/telegraf/telegraf.conf

Tendremos que ir bajando hasta encontrarnos con la sección [[inputs.mqtt_consumer]], la cual descomentaremos. Ese bloque de texto nos quedara algo así:

Nota: Cuidado de no equivocarse de sección. Hay un bloque de inputs y de outputs. Ambos tienen los mismos o muy parecidos subapartados, pero con matices distintos. Puede despistar y ponernos a editar donde no toca.

Código:
[..]
# Read metrics from MQTT topic(s)
[[inputs.mqtt_consumer]]
  servers = ["localhost:1883"]
  ## MQTT QoS, must be 0, 1, or 2
  qos = 0

  ## Topics to subscribe to
  topics = [
    "telegraf/host01/cpu",
    "telegraf/+/mem",
    "sensors/#",
  ]

# if true, messages that can't be delivered while the subscriber is offline
# will be delivered when it comes back (such as on service restart).
# NOTE: if true, client_id MUST be set
persistent_session = true
# If empty, a random client ID will be generated.
client_id = "telegraf"

## username and password to connect MQTT server.
#username = "telegraf"
#password = "contraseña"

## Optional SSL Config
# ssl_ca = "/etc/telegraf/ca.pem"
# ssl_cert = "/etc/telegraf/cert.pem"
# ssl_key = "/etc/telegraf/key.pem"
## Use SSL but skip chain & host verification
# insecure_skip_verify = false

## Data format to consume.
## Each data format has its own unique set of configuration options, read
## more about them here:
## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
data_format = "influx"
[..]


Tras editar la parte de INPUTS, vamos a pasar a los OUTPUTS. Buscamos este fragmento de texto y lo editamos así:

Código:
# Configuration for influxdb server to send metrics to                          
[[outputs.influxdb]]                                                            
 ## The HTTP or UDP URL for your InfluxDB instance.  Each item should be      
## of the form:                                                              
 ##   scheme "://" host [ ":" port]                                            
 ##                                                                            
 ## Multiple urls can be specified as part of the same cluster,                
 ## this means that only ONE of the urls will be written to each interval.    
 # urls = ["udp://localhost:8089"] # UDP endpoint example                      
 urls = ["http://localhost:8086"] # required                                  
 ## The target database for metrics (telegraf will create it if not exists).  
 database = "arduinosensors" # required                                          
                                                                             
 ## Name of existing retention policy to write to.  Empty string writes to    
 ## the default retention policy.                                          
retention_policy = ""                                                        
 ## Write consistency (clusters only), can be: "any", "one", "quorum", "all"  
 write_consistency = "any"                                                  
                                                                       
 ## Write timeout (for the InfluxDB client), formatted as a string.            
 ## If not provided, will default to 5s. 0s means no timeout (not recommended).
 timeout = "5s"                                                            
 username = "telegraf"                                                    
 password = "inserthardtoreadpasswordhere"                                  
 ## Set the user agent for HTTP POSTs (can be useful for log differentiation)
 # user_agent = "telegraf"                                                
 ## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)  
# udp_payload = 512                                                          
                                                                             
## Optional SSL Config                                                      
 # ssl_ca = "/etc/telegraf/ca.pem"                                          
 # ssl_cert = "/etc/telegraf/cert.pem"                                      
 # ssl_key = "/etc/telegraf/key.pem"                                        
 ## Use SSL but skip chain & host verification                              
 # insecure_skip_verify = false                                              
                                                                             
 ## HTTP Proxy Config                                                        
 # http_proxy = "http://corporate.proxy:3128"                                
                                                                             
 ## Compress each HTTP request payload using GZIP.                          
 # content_encoding = "gzip"

Con esto ya tendríamos configurado Telegraf. Podéis editarlo tantas veces como queráis. Destaco que en la parte de INPUTS, lo correspondiente a la configuración de MQTT, la parte donde dice "Topics to subscribe to", es donde indicamos los hilos a los que nos subscribimos del broker MQTT, para que luego esos datos sean indexados en la base de datos. Puede que conforme avance el curso, volvamos a este punto y hagamos algún cambio.

Con esto queda completo esta entrega. En ella hemos comentado en rasgos generales la base de datos InfluxDB y la pasarela Telegraf, con multitud de opciones para poder adaptarla a las diferentes necesidades que puedan aparecer al implementar una solución. Ademas, hemos realizado las instalaciones y configuraciones oportunas en nuestra Raspberry, de forma que seguimos construyendo la estructura que estamos implementado.

Os propongo profundizar un poco con InfluxDB. Con los comandos que vimos en la pasada entrega, los que nos permiten enviar datos vía MQTT, os propongo que probéis a ir mandando algún dato a nuestra base de datos. Posteriormente, os adentréis un poco en la base de datos, familiarizándoos ligeramente con sus comandos y buscando los datos que habéis enviado. Os encontrareis con tablas que contienen datos de la Raspberry como por ejemplo consumo de procesador, Ram, Hd, etc. Son datos en tiempo real de los parámetros de la Raspberry. Los usaremos mas adelante para monitorizar nuestro hardware, en el capitulo de Grafana donde los representaremos.

Nuevamente, si veis que algún aspecto de lo tratado no esta explicado con claridad o veis que es necesario profundizar mas, os animo a que lo comentéis para poder abordarlo y dejaros todo el contenido necesario. Repito lo mismo sobre si tenéis alguna idea o queráis que se trate algún tema en especial, comentadlo. Gracias.

Las siguientes entregas serán la introducción al hardware que hará de nodo con el ESP8266 y el apartado de representación de datos usando Grafana ( es muy probable que este se divida en 2 partes). En la correspondiente al hardware, trataremos desde la creación de la PCB, hasta la programación de esta. Como es un punto que puede dar mucho de si, se dividirá en varias entregas. En el caso de Grafana, serán mínimo dos partes; una tratara sobre la instalación y primeros pasos. Mientras que la siguiente estará ya totalmente enfocada a nuestra aplicación.

Podeis ir al Indice general del curso con el siguiente enlace: https://www.spainlabs.com/foros/tema-Spa...para-tod-s

Y hasta aquí esta entrega. Gracias por la lectura Sonrisa

Saludos
  Responder
#2
Hola grafisoft. Tras instalar en la raspberry influxdb y telegraf, para ver la base de datos he instalado Chronograf. En teoría deberían de verse los datos de la raspberry (cpu, % disco, memoria,...), pero no se ven.
En el apartado Host list, el estado del host raspberry aparece en rojo, lo cual creo que quiere decir que no se está recibiendo datos en la base de datos. Si entro en el host raspberry, todos las tablas están vacías.
No se si esto es normal o es que he hecho algo mal.
[Imagen: 1.jpg]

[Imagen: 2.jpg]
  Responder
#3
No debe estar cogiendo datos telegraf, es raro que tengas las tablas pero no datod
  Responder
#4
No he probado aun chronograf.
  Responder
#5
He estado intentando meter en influxdb datos que envío por mqtt y no conseguía verlos desde grafana. He tenido que cambiar el data format en el telegraf.conf, y en vez de "influx" poner:

Código:
data_format = "value"
data_type = "string"

Así, desde Grafana, en la edición de un panel me aparece un nuevo measurement "mqtt_consumer", y en el where puedo poner el topic que quiero mostrar en el gráfico. Me pregunto si esta es una manera correcta de consultar los valores de los topics, o cómo tenías pensado hacerlo con el data_type "influx"

[Imagen: grafana.png]
  Responder
#6
Pues la verdad es que hay varias formas. A mi tal y como lo puse en la guía me funciono, y me aparecían ya los datos. Igual hay alguna versión nueva del Telegraf con cambios que afectan a lo que comentas.

Puedes seleccionar los datos o bien especificando el topic, y luego olvidarte del campo select, o sin especificar nada después del where y eligiendo el parámetro en el campo field( value ).

Yo lo tengo así:

[Imagen: grafana_dash.png]

Que es redundante, ya que en ese topic solo esta el valor de un parámetro.
  Responder
#7
Creo que ya lo entendí. La diferencia está en cómo se está publicando a través de mqtt. Yo estoy haciendo pruebas desde el terminal con mosquitto_pub y pensaba que cada dispositivo publicaría la información de esta manera:
Código:
mosquitto_pub -t 'casa/sala/temperatura' -m 23

Es decir, el topic se corresponde con el sensor en si, y el mensaje con el valor de ese sensor. Pero si nos subscribimos al topic 'casa/#' desde telegraf.conf, con data_format = "influx", el telegraf no entiende el mensaje (que es '23') y lo descarta. Así que si tenemos dispositivos que publican la información de ese modo para que funcione hay que poner el data_format="value", y el data_type="string"

Si usamos el data_format="influx" tendremos que enviar los mensajes mqtt de esta manera:
Código:
mosquitto_pub -t "casa" -m "casa,tag=spainlbs-21 value=23"

Aquí el mensaje está en el formato "influx", y el telegraf creara (si no existe) un measurement "casa", le pone el tag "sala/temperatura" y le inserta un value de 23
  Responder
#8
Y a mi me funciona porque estoy usando la opcion 2, en el mensaje hay texto y el valor.

Ya tenemos mas info Sonrisa

Gracias por postearlo.
  Responder
#9
(12-02-2018, 11:00 AM)s118 escribió: Hola grafisoft. Tras instalar en la raspberry influxdb y telegraf, para ver la base de datos he instalado Chronograf. En teoría deberían de verse los datos de la raspberry (cpu, % disco, memoria,...), pero no se ven.
En el apartado Host list, el estado del host raspberry aparece en rojo, lo cual creo que quiere decir que no se está recibiendo datos en la base de datos. Si entro en el host raspberry, todos las tablas están vacías.
No se si esto es normal o es que he hecho algo mal.
[Imagen: 1.jpg]

[Imagen: 2.jpg]

Hola, soy nuevo aquí y aún no leo cómo realizar estos comentarios.Disculpen si hago algo mal.
Con respecto a tu error, eso se produce porque no has descomentado las líneas de inputs system en el archivo de configuración de telegraf (telegraf.conf)

[[inputs.system]]

Una vez que las descomentes y reinicies el servicio de telegraf, todo funcionará y el led cambiará a verde. Espero que no sea muy tarde. Saludos.
  Responder
#10
Buenos días a todos, estoy siguiendo estos excelentes tutoriales a @grafisoft, pero me he quedado atascado desde hace un par de días en la configuración de Grafana.

He seguido todos los pasos, y ahora mismo he conectado un sensor DHT que leo en los tópicos:

- casa/despacho/temperatura La temperatura es: 22.00 ºC
- casa/despacho/humedad La humedad es: 33.00

Luego me puse con la configuración de telegraf. Añadí los tópicos que cree

 # Read metrics from MQTT topic(s)
 [[inputs.mqtt_consumer]]
#   ## MQTT broker URLs to be used. The format should be scheme://host:port,
#   ## schema can be tcp, ssl, or ws.
#   servers = ["tcp://127.0.0.1:1883"]
  servers = ["localhost:1883"]
#
#   ## Topics that will be subscribed to.
   topics = [
     "telegraf/host01/cpu",
     "telegraf/+/mem",
     "sensors/#",
     "casa/#"
   ]

Y cree la base de datos como explica en el tutorial:


[[outputs.influxdb]]

urls = ["http://localhost:8086"]

database = "arduinosensors"

Pero cuando intento configurar la base de datos en grafana me dice que no existe


[Imagen: grafana.png]

¿Alguien me podría ayuda o guiar sobre lo que estoy haciendo mal?

Muchas gracias

EDIT: Mirando un poco la ayuda de Influx he puesto este comando:
influx -execute 'SHOW DATABASES'
name: databases
name
----
_internal
telegraf

Y por lo visto no aparece la arduinosensors, así que no sé que estoy haciendo de forma incorrecta.
  Responder
#11
Por algun motivo no te ha creado la nueva base de datos, tendras que hacerlo de forma manual con los comandos de influxdb.

Echale un ojo al output de telegraf cuando lo ejecutas a ver que te devuelve, suele dar log de los fallos. Igual no te esta encontrando nada en el mosquitto o no esta parseando los datos.

El mensaje de mqtt tiene que contener el nombre del nodo. Por ejemplo:

Nodo: Salon
mensaje mqtt: Salon temperatura=23.0
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#12
Bueno, tras un reinicio de la RPi (no conseguí relanzar telegraf) me ha creado la base de datos.

pi@raspberrypi:~ $ influx -execute 'SHOW DATABASES'
name: databases
name
----
_internal
telegraf
arduinosensors

Pero cuando veo el telegraf me salen un montón de errores constantes (básicamente los dos mensajes que envío)

2019-09-24T14:23:40Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-24T14:23:40Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:40Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:41Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:41Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:42Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:42Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:43Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:44Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:44Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:44Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 33.00"
2019-09-24T14:23:45Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:45Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:46Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:15: "La temperatura es: 22.00 ºC"
2019-09-24T14:23:46Z E! [inputs.mqtt_consumer] Error in plugin: metric parse error: expected field at 1:11: "La humedad es: 34.00"
2019-09-24T14:23:47Z E! [inputs.mqtt_consumer] Error in plugin: connection lost: EOF

Ahora mismo acabo de cambiar los mensajes para que se lean como me has indicado:

pi@raspberrypi:~ $ mosquitto_sub -t 'despacho/temperatura'
despacho temperatura=23.00
despacho temperatura=23.00
despacho temperatura=23.00
despacho temperatura=23.00
^C
pi@raspberrypi:~ $ mosquitto_sub -t 'despacho/humedad'
despacho humedad=33.00
despacho humedad=33.00
despacho humedad=33.00

También en el fichero he modificado para que lea "despacho/#" y "#". Sin embargo, telegraf me da los siguientes errores:

pi@raspberrypi:~ $ telegraf --debug
2019-09-24T14:49:08Z I! Starting Telegraf 1.12.1
2019-09-24T14:49:08Z I! Using config file: /etc/telegraf/telegraf.conf
2019-09-24T14:49:08Z I! Loaded inputs: cpu disk diskio mqtt_consumer kernel mem processes swap system
2019-09-24T14:49:08Z I! Loaded aggregators:
2019-09-24T14:49:08Z I! Loaded processors:
2019-09-24T14:49:08Z I! Loaded outputs: influxdb
2019-09-24T14:49:08Z I! Tags enabled: host=raspberrypi
2019-09-24T14:49:08Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"raspberrypi", Flush Interval:10s
2019-09-24T14:49:08Z D! [agent] Initializing plugins
2019-09-24T14:49:08Z W! [inputs.mqtt_consumer] Server "localhost:1883" should be updated to use `scheme://host:port` format
2019-09-24T14:49:08Z D! [agent] Connecting outputs
2019-09-24T14:49:08Z D! [agent] Attempting connection to [outputs.influxdb]
2019-09-24T14:49:08Z D! [agent] Successfully connected to outputs.influxdb
2019-09-24T14:49:08Z D! [agent] Starting service inputs
2019-09-24T14:49:08Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-24T14:49:08Z D! [inputs.mqtt_consumer] Session found [localhost:1883]
2019-09-24T14:49:14Z E! [inputs.mqtt_consumer] Error in plugin: connection lost: EOF
2019-09-24T14:49:14Z D! [inputs.mqtt_consumer] Disconnected [localhost:1883]
2019-09-24T14:49:20Z D! [inputs.mqtt_consumer] Connecting [localhost:1883]
2019-09-24T14:49:20Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-24T14:49:20Z D! [inputs.mqtt_consumer] Session found [localhost:1883]
2019-09-24T14:49:20Z D! [outputs.influxdb] Wrote batch of 13 metrics in 80.680724ms
2019-09-24T14:49:20Z D! [outputs.influxdb] Buffer fullness: 17 / 10000 metrics
2019-09-24T14:49:24Z E! [inputs.mqtt_consumer] Error in plugin: connection lost: EOF
2019-09-24T14:49:24Z D! [inputs.mqtt_consumer] Disconnected [localhost:1883]
2019-09-24T14:49:30Z D! [inputs.mqtt_consumer] Connecting [localhost:1883]
2019-09-24T14:49:30Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-24T14:49:30Z D! [inputs.mqtt_consumer] Session found [localhost:1883]
2019-09-24T14:49:30Z D! [outputs.influxdb] Wrote batch of 18 metrics in 43.559698ms
2019-09-24T14:49:30Z D! [outputs.influxdb] Buffer fullness: 17 / 10000 metrics
^C2019-09-24T14:49:34Z D! [agent] Stopping service inputs
2019-09-24T14:49:34Z D! [inputs.mqtt_consumer] Disconnecting [localhost:1883]
2019-09-24T14:49:34Z D! [inputs.mqtt_consumer] Disconnected [localhost:1883]
2019-09-24T14:49:34Z D! [agent] Input channel closed
2019-09-24T14:49:34Z I! [agent] Hang on, flushing any cached metrics before shutdown
2019-09-24T14:49:34Z D! [outputs.influxdb] Wrote batch of 18 metrics in 415.754963ms
2019-09-24T14:49:34Z D! [outputs.influxdb] Buffer fullness: 0 / 10000 metrics
2019-09-24T14:49:34Z D! [agent] Closing outputs
2019-09-24T14:49:34Z D! [agent] Stopped Successfully

¿El fallo podría ser por el nombre con el que defino al cliente en el programa del ESP? Ahora mismo al cliente lo llamo Espclient, no sé si tendría que ser telegraf.

Un saludo
  Responder
#13
Pues nada... no hay manera, llevo toda la tarde revisando el código y no hay manera.

Los datos los envío como un ejemplo de grafisoft:

char valTemperatura[5];
char valHumedad[5];

dtostrf(temperature, 3, 1, valTemperatura);
String payload; //Variable para contener la info de la trama que se envia.
//Creamos la trama. Sera del estilo: "sensors/NodeName/temp"

TopicMQTT = "sensors/" + NodeName + "/temp";
//Creamos el mensaje. Sera del estilo: "NodeName temperature=";
payload = ""; //Limpiamos la variable.
payload += NodeName;
payload += " temperatura=";
payload += valTemperatura;
//Enviamos la trama via MQTT.
client.publish((char*) TopicMQTT.c_str(), (char*) payload.c_str());

Los topicos se publican correctamente:

pi@raspberrypi:~ $ mosquitto_sub -t '#' -v
sensors/Testing/temp Testing temperatura=23.0
sensors/Testing/humedad Testing Humedad=32.0
sensors/Testing/temp Testing temperatura=23.0
sensors/Testing/humedad Testing Humedad=32.0
sensors/Testing/temp Testing temperatura=23.0
sensors/Testing/humedad Testing Humedad=32.0

Influx me dice que si están esos mensajes:

> SHOW SERIES ON arduinosensors
key
---
Testing,host=raspberrypi,topic=sensors/Testing/humedad
Testing,host=raspberrypi,topic=sensors/Testing/temp
cpu,cpu=cpu-total,host=raspberrypi
cpu,cpu=cpu0,host=raspberrypi
cpu,cpu=cpu1,host=raspberrypi
cpu,cpu=cpu2,host=raspberrypi
cpu,cpu=cpu3,host=raspberrypi
disk,device=mmcblk0p1,fstype=vfat,host=raspberrypi,mode=rw,path=/boot
disk,device=mmcblk0p2,fstype=ext4,host=raspberrypi,mode=rw,path=/
diskio,host=raspberrypi,name=mmcblk0
diskio,host=raspberrypi,name=mmcblk0p1
diskio,host=raspberrypi,name=mmcblk0p2
kernel,host=raspberrypi
mem,host=raspberrypi
processes,host=raspberrypi
swap,host=raspberrypi
system,host=raspberrypi

Pero telegraf sigue con el mismo error:

2019-09-24T20:18:00Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-24T20:18:02Z E! [inputs.mqtt_consumer] Error in plugin: connection lost: EOF

Si hago la modificación de argalleiro, me salen 2 series más en influx

mqtt_consumer,host=raspberrypi,topic=sensors/Testing/humedad
mqtt_consumer,host=raspberrypi,topic=sensors/Testing/temp

Pero telegraf sigue en sus trece...
  Responder
#14
Copia toda la config del input de mqtt que tienes en telegraf aqui. Copia pega, no edites nada.

En el ultimo log ya no te da errores de parseo y parece ser que tienes datos en la bd, los pudiste ver en grafana?

En mqtt tendras un usuario puesto solo no?
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#15
Buenos días, no sé como pero ahora si me aparecen los tópicos en grafana, aunque no me plotea ningún dato.

[Imagen: grafana-queries.png]

Aquí dejo la configuración de telegraf


# Read metrics from MQTT topic(s)
[[inputs.mqtt_consumer]]
# ## MQTT broker URLs to be used. The format should be scheme://host:port,
# ## schema can be tcp, ssl, or ws.
# servers = ["tcp://127.0.0.1:1883"]
servers = ["localhost:1883"]
#
# ## Topics that will be subscribed to.
topics = [
"telegraf/host01/cpu",
"telegraf/+/mem",
"sensors/#",
]
#
# ## The message topic will be stored in a tag specified by this value. If s$
# ## to the empty string no topic tag will be created.
# # topic_tag = "topic"
#
# ## QoS policy for messages
# ## 0 = at most once
# ## 1 = at least once
# ## 2 = exactly once
# ##
# ## When using a QoS of 1 or 2, you should enable persistent_session to allow
# ## resuming unacknowledged messages.
qos = 0
#
# ## Connection timeout for initial connection in seconds
# # connection_timeout = "30s"
#
# ## Maximum messages to read from the broker that have not been written by an
# ## output. For best throughput set based on the number of metrics within
# ## each message and the size of the output's metric_batch_size.
# ##
# ## For example, if each message from the queue contains 10 metrics and the
# ## output metric_batch_size is 1000, setting this to 100 will ensure that a
# ## full batch is collected and the write is triggered immediately without
# ## waiting until the next flush_interval.
# # max_undelivered_messages = 1000
#
# ## Persistent session disables clearing of the client session on connection.
# ## In order for this option to work you must also set client_id to identity
# ## the client. To receive messages that arrived while the client is offlin$
# ## also set the qos option to 1 or 2 and don't forget to also set the QoS w$
# ## publishing.
persistent_session = true
#
# ## If unset, a random client ID will be generated.
client_id = "telegraf"
#
# ## Username and password to connect MQTT server.
# # username = "telegraf"
# # password = "metricsmetricsmetricsmetrics"
#
# ## Optional TLS Config
# # tls_ca = "/etc/telegraf/ca.pem"
# # tls_cert = "/etc/telegraf/cert.pem"
# # tls_key = "/etc/telegraf/key.pem"
# ## Use TLS but skip chain & host verification
# # insecure_skip_verify = false
#
# ## Data format to consume.
# ## Each data format has its own unique set of configuration options, read
# ## more about them here:
# ## https://github.com/influxdata/telegraf/b...ORMATS_INP$
#data_format = "influx"
data_format = "value"
data_type = "string"

A ver si conseguimos dar con el problema.
Gracias de nuevo
  Responder
#16
Igual estas ploteando una franja temporal donde no tienes datos.

Ademas de ese detalle, ponte en la configuración de la grafica, que cada dato sea 1 punto, asi veras mejor si tienes algun dato y no se te escapan cuando son poquitos.

Esta noche bajo la config del ultimo telegraf que configure hace 2 meses y lo comparo con lo que has puesto, ahora que recuerdo, tuve algun problemilla para que me detectara los topics.

Saludos
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#17
[Imagen: imagen.png]

Aqui te dejo como configurar lo de los puntos.
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#18
Gracias por la respuesta Grafisoft,

He modificado un poco la configuración para que tenga menos tópicos, pero aún así no hay manera.

Código:
   topics = [
    # "telegraf/host01/cpu",
    # "telegraf/+/mem",
     "sensors/#",
   ]

También he puesto la gráfica con puntos, pero siguen sin salir datos. Tengo un ESP enviando datos cada 2 segundos, así que sí que deberían de haber datos que visualizar.

Un saludo

EDIT:
Si prefieres puedes subir fichero al github.
  Responder
#19
Chequea de forma manual que tienes los nuevos datos en la BD. No hace falta que envies cada 2 segudos, espacialos mas, a 30s. A simple vista, el telegraf lo tienes bien, y me queda la duda de los topics. Puedes quitarte los topics de los datos del pc. Ponte tambien un topic con "#" y/o "/#".

Para als pruebas iniciales, uso un soft que e conecta al servidor mqtt y me va sacando todo lo que llega. Lo pongo luego porque no recuerdo el nombre exacto. Asi estas seguro de que el servidor mqtt recibe datos y esa parte la puedes dar por buena. O incluso desde el mismo programa puedes enviar mensajes y no hace falta tener un nodo. Es mas comodo de cara a probar toda la plataforma software.
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#20
He probado ha dejar solo el tópico de las pruebas y los que me has comentado #, /#. Pero parece sigue mostrando los mismo tópicos. No sé si es porque saca la información de la RPi por defecto o porque he hecho algo mal.

Código:
Testing,host=raspberrypi,topic=sensors/Testing/humedad
Testing,host=raspberrypi,topic=sensors/Testing/temp
cpu,cpu=cpu-total,host=raspberrypi
cpu,cpu=cpu0,host=raspberrypi
cpu,cpu=cpu1,host=raspberrypi
cpu,cpu=cpu2,host=raspberrypi
cpu,cpu=cpu3,host=raspberrypi
disk,device=mmcblk0p1,fstype=vfat,host=raspberrypi,mode=rw,path=/boot
disk,device=mmcblk0p2,fstype=ext4,host=raspberrypi,mode=rw,path=/
diskio,host=raspberrypi,name=mmcblk0
diskio,host=raspberrypi,name=mmcblk0p1
diskio,host=raspberrypi,name=mmcblk0p2
kernel,host=raspberrypi
mem,host=raspberrypi
mqtt_consumer,host=raspberrypi,topic=sensors/Testing/humedad
mqtt_consumer,host=raspberrypi,topic=sensors/Testing/temp
processes,host=raspberrypi
swap,host=raspberrypi
system,host=raspberrypi

¿El programa que dices es el siguiente?
Github: https://github.com/1technophile/OpenMQTT...ign=buffer
Web del proyecto: https://1technophile.github.io/OpenMQTTGateway/
Wiki: https://github.com/1technophile/OpenMQTTGateway/wiki

Un pequeño avance de repente, he cambiado el input lo más simple posible en una única línea:

Código:
topics = ["sensors/#",]

Ahora parece que telegraf si acepta los datos

Código:
pi@raspberrypi:~ $ telegraf --debug
2019-09-25T15:35:10Z I! Starting Telegraf 1.12.1
2019-09-25T15:35:10Z I! Using config file: /etc/telegraf/telegraf.conf
2019-09-25T15:35:10Z I! Loaded inputs: disk kernel mem processes swap system cpu diskio mqtt_consumer
2019-09-25T15:35:10Z I! Loaded aggregators:
2019-09-25T15:35:10Z I! Loaded processors:
2019-09-25T15:35:10Z I! Loaded outputs: influxdb
2019-09-25T15:35:10Z I! Tags enabled: host=raspberrypi
2019-09-25T15:35:10Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"raspberrypi", Flush Interval:10s
2019-09-25T15:35:10Z D! [agent] Initializing plugins
2019-09-25T15:35:10Z W! [inputs.mqtt_consumer] Server "localhost:1883" should be updated to use `scheme://host:port` format
2019-09-25T15:35:10Z D! [agent] Connecting outputs
2019-09-25T15:35:10Z D! [agent] Attempting connection to [outputs.influxdb]
2019-09-25T15:35:10Z D! [agent] Successfully connected to outputs.influxdb
2019-09-25T15:35:10Z D! [agent] Starting service inputs
2019-09-25T15:35:10Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-25T15:35:10Z D! [inputs.mqtt_consumer] Session found [localhost:1883]
2019-09-25T15:35:31Z D! [outputs.influxdb] Wrote batch of 15 metrics in 1.29951687s
2019-09-25T15:35:31Z D! [outputs.influxdb] Buffer fullness: 18 / 10000 metrics
2019-09-25T15:35:40Z D! [outputs.influxdb] Wrote batch of 30 metrics in 67.447363ms
2019-09-25T15:35:40Z D! [outputs.influxdb] Buffer fullness: 5 / 10000 metrics
2019-09-25T15:35:50Z D! [outputs.influxdb] Wrote batch of 8 metrics in 640.575952ms
2019-09-25T15:35:50Z D! [outputs.influxdb] Buffer fullness: 18 / 10000 metrics
2019-09-25T15:36:00Z D! [outputs.influxdb] Wrote batch of 18 metrics in 67.679068ms

Ahora a seguir peleándome con grafana para intentar mostrar los datos

Un pequeño avance de repente, he cambiado el input lo más simple posible en una única línea:

Código:
topics = ["sensors/#",]

Ahora parece que telegraf si acepta los datos

Código:
pi@raspberrypi:~ $ telegraf --debug
2019-09-25T15:35:10Z I! Starting Telegraf 1.12.1
2019-09-25T15:35:10Z I! Using config file: /etc/telegraf/telegraf.conf
2019-09-25T15:35:10Z I! Loaded inputs: disk kernel mem processes swap system cpu diskio mqtt_consumer
2019-09-25T15:35:10Z I! Loaded aggregators:
2019-09-25T15:35:10Z I! Loaded processors:
2019-09-25T15:35:10Z I! Loaded outputs: influxdb
2019-09-25T15:35:10Z I! Tags enabled: host=raspberrypi
2019-09-25T15:35:10Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"raspberrypi", Flush Interval:10s
2019-09-25T15:35:10Z D! [agent] Initializing plugins
2019-09-25T15:35:10Z W! [inputs.mqtt_consumer] Server "localhost:1883" should be updated to use `scheme://host:port` format
2019-09-25T15:35:10Z D! [agent] Connecting outputs
2019-09-25T15:35:10Z D! [agent] Attempting connection to [outputs.influxdb]
2019-09-25T15:35:10Z D! [agent] Successfully connected to outputs.influxdb
2019-09-25T15:35:10Z D! [agent] Starting service inputs
2019-09-25T15:35:10Z I! [inputs.mqtt_consumer] Connected [localhost:1883]
2019-09-25T15:35:10Z D! [inputs.mqtt_consumer] Session found [localhost:1883]
2019-09-25T15:35:31Z D! [outputs.influxdb] Wrote batch of 15 metrics in 1.29951687s
2019-09-25T15:35:31Z D! [outputs.influxdb] Buffer fullness: 18 / 10000 metrics
2019-09-25T15:35:40Z D! [outputs.influxdb] Wrote batch of 30 metrics in 67.447363ms
2019-09-25T15:35:40Z D! [outputs.influxdb] Buffer fullness: 5 / 10000 metrics
2019-09-25T15:35:50Z D! [outputs.influxdb] Wrote batch of 8 metrics in 640.575952ms
2019-09-25T15:35:50Z D! [outputs.influxdb] Buffer fullness: 18 / 10000 metrics
2019-09-25T15:36:00Z D! [outputs.influxdb] Wrote batch of 18 metrics in 67.679068ms

Ahora a seguir peleándome con grafana para intentar mostrar los datos
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  [SpainLabsIoT2018] Caso real: Nodos ESP8266 grafisoft 78 26,394 09-04-2020, 03:33 PM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Empezamos - Servidor MQTT grafisoft 14 9,825 25-09-2019, 08:11 PM
Último mensaje: grafisoft
  APORTE [SpainLabsIoT2018] ESP8266 NodeMCU - Ajustando su consumo (hack) grafisoft 10 8,963 24-04-2019, 04:49 PM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Nodo ESP8266 - Smart Sensors Shield grafisoft 16 7,968 02-07-2018, 08:55 PM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Grafana - Actualizar a la ultima version grafisoft 0 1,732 02-04-2018, 07:46 PM
Último mensaje: grafisoft