Setting up InfluxDB and Grafana for storing and viewing Arduino measured sensor values

InfluxDB Line Protocol on HTTP

The Scenario

Let’s assume that you have 4 Arduinos in 4 different corners of your house and you want to monitor and log the temperature, humidity and light intensity in these corners. Then for using InfluxDB for your great home environment monitoring you need only one database in InfluxDB. Let’s call the database ‘embedonix‘.

Each entry in a database is called a “Measurement” in InfluxDB terms and each “Measurement” consists of “Tag(s)” and “Value(s)”. The tags, usually being a string or an integer, are signifying a spatial concept e.g. what is the source of values and where does it come from. The values associated with tags are just the values!

So in our scenario, we need a few tags for better extraction and filtering of data from the database. These tags can be ‘SOURCE=arduino_n‘ where n is the ID you assign to your Arduinos, and another tag might be ‘PLACE=kitchen‘ or ‘PLACE=garage‘…you get the idea. Then comes the values, which for our case would be something like ‘TEMP=20‘, ‘HUMIDITY=85.7‘, ‘LIGHT=780.98‘.

The format for sending the above data would be:

First, is the name of measurement then comes the tag(s) separated by a comma. After the last tag, there is a blank space, anything after this space will be treated as a value (comma separated if there is more than one value). So fixing for out scenario, an insertion query over HTTP will have to look like this:

And of course, the tags will be likely to be hard coded in each of your Arduinos (or any other microcontroller) but the values should be queried from the sensors dynamically. If you are asking what is the significant of measurement name, then my answer is (I can not get a clear answer from InfluxDB’s documentation) perhaps you would like to separate your data by month name, so the measurement for month June would be my_house_data_june, and when next month comes, you will update that code 😉

How to use create a database inInfluxDB

InfluxDB is in some senses similar to your average database system such as MySQL, as it has a kind of database->table->column structure. So in order to insert some data in InfluxDB, you need to have a database created before attempting to insert something into it. This can be done in many ways, but the easiest is to use the administration panel in the browser as below:

Query for creating a database in influxdb

Query for creating a database in influxdb

The used query in this case is

Now you can start inserting data in the newly created database (in this tutorial we assume the name is embedonix).

How to use INSERT queries over HTTP in InfluxDB

The Line Protocol for HTTP uses POST request to the write script on the server which is hosting InfluxDB, followed by the name of the database that data should be inserted in. A correctly formed HTTP header then will look like this:

As you can see above, the POST is requested to the write script with the db argument set to the name of the database we want to put data in (here, ‘/write?db=embedonix’). After the Content-Length there is a blank line that tells the HTTP parser that the actual content starts here. The Content-Length is important to be exactly as the number of characters in the data, otherwise, the HTTP parser will refuse to handle the request!

In the next section, we will see how we can write data in InfluxDB using Arduino.

Saeid Yazdani

An Electronics Engineer with passion in Embedded Systems, Wireless Sensor Networks, Assembly, Desktop and Mobile Development, Web Development and generally anything that has to do with hardware and software of any kind!

17 Comments:

  1. 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.

  2. 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

  3. 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 !

  4. 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”)));

  5. 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

  6. 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

  7. Orange Juice

    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.

  8. Orange Juice

    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

  9. Orange Juice

    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.

  10. Pingback: InfluxDB Week in Review – Feb 13, 2017 | InfluxData

  11. Orange Juice

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *