InfluxDB for IoT devices
The number of connected devices is growing every year, but most of them don’t expose a public API (pretty sad).
Some work is needed to extract access all their secrets, which is a whole other story.
Currently, I just display the data on a screen, but having stored data for some machine learning and analysis would be great.
But where to store and evaluate the data? InfluxDB to the rescue!
Searching for a tool that just saves all the data devices produce every day was pretty hard. There are a lot of IoT platforms available today, but some of them cost money and have way too many features for my use case, while others do not provide visualization and analysis out-of-the-box or can’t be self-hosted.
InfluxDB is just a database optimized for time series data, but there is a whole stack of tools for collecting, analyzing, displaying, and processing data called TICK.
The most important components for me are the InfluxDB for storage, Chronograf for visualization and Telegraf for data
Kapacitor, the last element of the stack is used for triggering alerts and processing data, which may come in handy later on.
I like to organize all my services in containers using Docker. Here is a simple docker-compose file that fires up all parts of the TICK stack.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 version: "3" services: influxdb: image: influxdb container_name: influxdb restart: always ports: - "8086:8086" volumes: - $PWD/influxdb:/var/lib/influxdb networks: - influx telegraf: image: telegraf container_name: telegraf restart: always networks: - influx volumes: - $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro chronograf: image: chronograf container_name: chronograf restart: always ports: - "8888:8888" networks: - influx volumes: - $PWD/chronograf:/var/lib/chronograf kapacitor: image: kapacitor container_name: kapacitor restart: always networks: - influx volumes: - $PWD/kapacitor.conf:/etc/kapacitor/kapacitor.conf:ro environment: - TZ=Europe/Berlin - KAPACITOR_INFLUXDB_0_URLS_0=http://influxdb:8086 networks: influx:
Customize the volume and port bindings to your liking.
Then just execute
docker-compose -d up to start all services in the background.
Now we can retrieve some data from our IoT devices using the first part of the TICK stack, Telegraf. There is a multitude of input plugins available from the official repository .
I will mostly use the HTTP plugin, because my data is already being preprocessed by other containers for use in other
services. Maybe I will change that and make Influx the hub for all my data needs later on.
But for now, this setup makes consuming data very simple.
To consume a HTTP endpoints providing JSON data, I set up my
telegraf.conf like so:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [global_tags] dc = "iot_nd" [agent] interval = "10s" # OUTPUTS [[outputs.influxdb]] url = "http://influxdb:8086" # required. database = "iot" # required. precision = "s" # INPUTS [[inputs.http]] urls = ["http://192.168.188.20:9094/info"] data_format = "json" name_override = "wallbox" [[inputs.http]] urls = ["http://192.168.188.20:9091/data"] data_format = "json" name_override = "pv" [[inputs.http]] urls = ["http://192.168.188.20:9095/cmi_data"] interval = "90s" name_override = "heating_system" data_format = "json" json_query = "data"
Documentation for the HTTP Plugin is available here.
influxdb is the URL for the InfluxDB, because Docker automatically resolves hostnames as specified by the container
name to the correct IP in the network.
Telegraf will write new data in a database called
iot and will query data in an interval of 10s,
except for the last input, where data will only be queried every 90 seconds.
Chronograf should now display the juicy data we saved.