Intro
Contents
Arduino and its related products are undoubtedly very popular among hobbyists and even professionals. One of the areas of interest with hobbyists and professionals is interfacing with many different sensors such as temperature, humidity, light, etc. The simplest method would be storing measured values on an SD card or transmitting the data over the serial interface, but there are times where a prolonged measurement session is a requirement. In this case, storing data in a database over Serial, Ethernet or WiFi is the best solution. In this article I will talk about setting up InfluxDB on a Linux platform and how to store data in it, and how to view measurement data using Grafana.
What is InfluxDB?
InfluxDB is an open-source time series database developed by InfluxData. It is written in Go and optimized for fast, high-availability storage and retrieval of time series data in fields such as operations monitoring, application metrics, Internet of Things sensor data, and real-time analytics.
InfluxDB has no external dependencies[and provides an SQL-like language with built-in time-centric functions for querying a data structure composed of measurements, series, and points. Each point consists of several key-value pairs called the fieldset and a timestamp. When grouped together by a set of key-value pairs called the tagset, these define a series. Finally, series are grouped together by a string identifier to form a measurement. Some of the InfluxDB’s features are:
- Values can be 64-bit integers, 64-bit floating points, strings, and booleans.
- Points are indexed by their time and tagset.
- Retention policies are defined on a measurement and control how data is downsampled and deleted.
- Continuous Queries run periodically, storing results in a target measurement.
- Line Protocol: Store data through HTTP, TCP or UDP protocols.
A very good point about InfluxDB for use with microcontrollers is that it does not necessarily require any timestamp as it automatically adds the time of arrival of the data (server time).
Installing InfluxDB on Linux
You should head on to InfluxDB’s download page in order to get the latest release version of InfluxDB. At the time of writing this article, the version is 1.1.1. In the download page, you will be given the chance to download the appropriate version for your Linux distribution. But to make the stuff going faster here is the commands you need to execute to install InfluxDB (version 1.1.1):
If you are on Ubuntu or other Debian-based flavors:
1 2 3 4 |
$wget https://dl.influxdata.com/influxdb/releases/influxdb_1.1.1_amd64.deb $sudo dpkg -i influxdb_1.1.1_amd64.deb |
If you are on RedHat or CentOS:
1 2 3 4 |
$wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.1.x86_64.rpm $sudo yum localinstall influxdb-1.1.1.x86_64.rpm |
You can also install InfluxDB on Windows, but since this guide is focused on Linux, you will be on your own for that matter (it is really simple, don’t worry!)
Setting up InfluxDB on Linux
After installation, to generate the configuration file, run the following command (note that the command is influxd that is without the b at the end!):
1 2 3 |
$sudo influxd config |
After running this command, there will be a config file in the ‘/etc/influxdb‘ named ‘influxdb.conf’. To change the default configuration you need to edit this file. I should remind you that this folder is write protected so you will need root access to be able to edit this file.
The most important options to check or change are listed below (you can read the exact purpose from the comments written in the config file by the developers) Make sure you uncomment the section directive as well if you are going to change it, e.g., uncomment the [admin] by removing the hash character!:
- In the [admin] section make sure the admin page is enabled by removing the comment character ‘#‘ and setting it to ‘enabled = true‘
- Since we are going to use the HTTP protocol to write values into InfluxDB, make sure it is also enabled under the [http] section of the config file.
- If necessary, you can change the default port numbers for Administrator Panel (8083) and HTTP (8086).
Now in the terminal, running the command below starts the InfluxDB as a service (change start to stop to end the service!):
1 2 3 |
$sudo service influxdb start |
Alternatively, if you want to see the output messages of InfluxDB live, you can start it in standalone mode (not as a service) by the following command:
1 2 3 |
$sudo influxd -config /etc/influxdb/influxdb.conf |
That command starts the InfluxDB and tells it to use the configuration file that we just edited.
Now, if you open your browser and go to ‘http://localhost:8083‘ (or the another port if you have changed it in the config file), you will be greeted by the administration panel of InfluxDB.
InfluxDB folders
By default, the following folders will be created (again, read the config file’s comments for exact details) :
- /home/[username]/.influxdb => contains user specific data and meta folders to store databases.
- /var/log/influxdb => this folder will contain logs such as warnings and errors
- /var/lib/influxdb => this folder contains the variable state information, database engine, etc.
- /etc/influxdb => this folder contains configuration file(s)
The whole process in a GIF animation
At the moment, there is not an awful lot of data to see there 😉 so in the next steps we will discuss the line protocol which is the way of sending data to InfluxDB, and then we send some data from Arduino over Ethernet to InfluxDB!
Thanks for sharing !!!
Code “as-is” is giving me very weird errors en compiling for arduino 2560
Still investigating on this
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS'
}
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:
(insn 294 291 297 19 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
(subreg:QI (reg/f:HI 271) 1)) \\WIN7PRO\__Projets\Grid Tie solar et vent\arduino\to influxdb\v033 test influx\v033\v033.ino:144 1 {pushqi1}
(expr_list:REG_ARGS_SIZE (const_int 5 [0x5])
(nil)))
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out
lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.
but werirdly compile fine for arduino due !
( from all I know, back end compiler is not the same at all )
Using arduino 1.8.1 on windows 10
I have only tested this with Due. I’m not sure what the problem could be as I don’t have any other arduinos to test again. I just guess it has something tido with your Ethernet library.
Thank, I tought you were using a 2560 .
BTW You dont need the board to test compilation
I got the stock etherne lib
Playing around commenting uncomenting lines, still got weird compil errors
I’ll use a Due if its the only issue , just a bit more expensive
Found a work around
Seems a documented bug in the latest GCC Compiler
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60040
Aplied a similar work around I got from here
https://github.com/arduino/Arduino/issues/3972
I’ve Added
void eth_send_data(char* data, int dataSize) __attribute__((__optimize__(“O2”)));
On line 2 of your code
Now compile Fine for 2560 , dont ask me more details !!!!!
Thanks !
Thanks for sharing!
Eratum
You need 2 “spaces” before “__attribute__”
Dont ask me why , but it is not the same
void eth_send_data(char* data, int dataSize) __attribute__((__optimize__(“O2”)));
Sorry … itsjust because I ve taken back My own comment and it wasent compiling again
The issue is not the double space at all
it is because this web page convert the ” character to another type of ”
Just have to type it back to the “real” ” one …. hard to explain
Just gave up, moved it all to arduino due, still having compilation error for 2560, but all working fine on due. Rest of instructions are all good.
Except minor error, on page 5:
$sudo dpkg -i https://grafanarel.s3.amazonaws.com/builds/grafana_4.0.2-1481203731_amd64.deb
that should read
$sudo dpkg -i grafana_4.0.2-1481203731_amd64.deb
Thanks, I edited the problem on the last page. I do not know why the code is not woking on Mega since the code is pretty much standard C.
Hi. Code is working fine, I also needed to Optimize due to using a Mega. I am actually using a ENC28J60 with the UIPEthernet which is drop in for Ethernet.h however I dont get any respone from the server shown in Serial Monitor just the “Reply from InfluxDB”, The information is reaching influx it just doesnt display the 204 error it should in serial monitor.
Dont suppose you have any pointers, not that its essential as the code is working.
I think you should play around with the delay value between sending and waiting for the response. Give it a try.
And perhaps you can show the changes you made to make it work on Mega? maybe that’s the problem. Jean-Francois Payeur comments show that it doesn’t work on Mega, although I have never tried it with Mega so can’t say for sure.
Thanks for responding, great tutorial by the way.
I followed Jean’s instructions as I got the same compile error an it was the GCC .
Only difference in code compared with yours is i added this at the top of the skect.
#include
void eth_send_data(char* data, int dataSize) __attribute__((__optimize__(“O2”)));
I will check delay and have a look into if it is a issue with UIPEthernet and syntax
I managed to get it working by replacing availible with connected.
Serial.println(“Reply from InfluxDB”);
while(client.connected()) { //receive char
Serial.print((char)client.read());
}
Thanks for a great tutorial.
Thanks for sharing your discoveries 😉 I think I have to reflect that in the article.
Pingback: InfluxDB Week in Review – Feb 13, 2017 | InfluxData
It could be because I’m using the UIPEthernet library.
I regret to inform the test I had running which was taking humidity readings from 3x DHT11 stopped sending information to influx after 60hours.
Unsure on why it failed as it wasnt plugged into the computer so didnt have Serial Monitor open 🙁 I have reset the Arduino and hope for a better result, maybe it was my cat.
Pingback: Comunicação Arduino+InfluxDB+Grafana Parte 1 | Daniel Ortega
Excellent tutorial! But im having a problem that a copple minutes after starts sending data, arduino cant send any more messages, it just cant connect. If i restart arduino, it works again. Any ideas?
This might be due to bugs in original ethernet library of Arduino. Try to use a third party library and see if it helps.
how can i post each field with multiple field value.
batch data sent to influxdb.
It is possible according to influxdb documentation, I do not know myself but I have seen it in their documents. Search for something like “sending multiple data in single query” or something similar on their documentation page.
Hi!
I found your code very useful, but the thing I do not see is how the data is written into your created database. I mean how do you tell the Arduino to send the data to the database named “embedonix”? In my case the data is being sent (at least the serial monitor says so) but if i check for the data, the databse appears blank.
Thank you very much
Please check to log file of influxdb (or run
influxd
in standalone mode to see std output) and see if you receive any http request or not.I planned to do this for my house but instead of Ethernet shield i’m gonna use esp8266 wifi module.So can i do some changes to your code and use it for my project?
Yes the communication method does not matter as long as it works 🙂
I cant seem to establish a connection with my InfluxDB server. Influx is running on a virtual machine (Ubuntu) and I am trying to send data from Arduino installed on Windows using a NodeMCU