The ESP8266 is a $5 IOT device with huge capabilities. In this post we will log data to a remote Influx database running on a RaspberryPi.
I am programming the ESP8266 in the Arduino IDE, the ESP8266 library is required, you can find it here. I have a test code file (of copy from below) that you can upload after entering your InfluxDB I.P. Address, SSID & Password and it will start logging data immediately.
Code for InfluxDB Version 1.x (Version 1.6 specifically for me.)
#include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <InfluxDb.h> #define INFLUXDB_HOST "192.168.1.1" //Enter IP of device running Influx Database #define WIFI_SSID "SSID" //Enter SSID of your WIFI Access Point #define WIFI_PASS "PASSWORD" //Enter Password of your WIFI Access Point ESP8266WiFiMulti WiFiMulti; Influxdb influx(INFLUXDB_HOST); void setup() { Serial.begin(9600); WiFiMulti.addAP(WIFI_SSID, WIFI_PASS); Serial.print("Connecting to WIFI"); while (WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); influx.setDb("esp8266_test"); Serial.println("Setup Complete."); } int loopCount = 0; void loop() { loopCount++; InfluxData row("data"); row.addTag("Device", "ESP8266"); row.addTag("Sensor", "Temp"); row.addTag("Unit", "Celsius"); row.addValue("LoopCount", loopCount); row.addValue("RandomValue", random(10, 40)); influx.write(row); delay(5000); }
Code for InfluxDB Version 2.x (Version 2.1 specifically for me). Download Arduino library from here.
#include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <InfluxDb.h> #define INFLUXDB_URL "http://192.168.1.XXX:8086" // e.g. http://192.168.1.48:8086 (In InfluxDB 2 UI -> Load Data -> Client Libraries), #define INFLUXDB_TOKEN "YOUR_TOKEN" // InfluxDB 2 server or cloud API authentication token (Use: InfluxDB UI -> Load Data -> Tokens -> <select token>) #define INFLUXDB_ORG "influx" // InfluxDB 2 organization id (Use: InfluxDB UI -> Settings -> Profile -> <name under tile> ) #define INFLUXDB_BUCKET "YOUR_BUCKET" // InfluxDB 2 bucket name (Use: InfluxDB UI -> Load Data -> Buckets) #define WIFI_SSID "YOUR_SSID" #define WIFI_PASS "YOUR_PASS" #define MEASUREMENT "esp" #define DEVICE "esp_04" #define ID "Development ESP" ESP8266WiFiMulti WiFiMulti; InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN); Point row(MEASUREMENT); // Setup InfluxDB data point void setup() { Serial.begin(9600); WiFiMulti.addAP(WIFI_SSID, WIFI_PASS); Serial.print("Connecting to WIFI"); while (WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); if (client.validateConnection()) { // Checks if can communicate with InfluxDB server Serial.print("Connected to InfluxDB: "); Serial.println(client.getServerUrl()); } else { Serial.print("InfluxDB connection failed: "); Serial.println(client.getLastErrorMessage()); } Serial.println("Setup Complete."); } int loopCount = 0; void loop() { loopCount++; row.clearFields(); // Clear Influx Fields row.clearTags(); // Clear Influx Tags row.addTag("Device", DEVICE); row.addTag("ID", ID); row.addField("LoopCount", loopCount); row.addField("RandomValue", random(0, 100)); //Helpful for debugging if needed. row.addField("25_Value", 20); row.addField("50_Value", 50); row.addField("100_Value", 100); Serial.print("Writing: "); // Print what are we exactly writing Serial.println(client.pointToLineProtocol(row)); if (!client.writePoint(row)) { Serial.print("InfluxDB write failed: "); Serial.println(client.getLastErrorMessage()); } else { Serial.println("Wrote data successfully"); Serial.println(""); } delay(5000); }
The Arduino Serial Terminal will display something like the below so you can if it is working. (My previous tutorial shows setting up InfluxDB, ensure you have the database “esp8266_test” created as we are going to write to that.)
--> writing to esp8266_test: data,Device=ESP8266,Sensor=Temp,Unit=Celsius LoopCount=256.00,RandomValue=37.00 <-- Response: 204 "" --> writing to esp8266_test: data,Device=ESP8266,Sensor=Temp,Unit=Celsius LoopCount=257.00,RandomValue=20.00 <-- Response: 204
On the Influx Database we can look at the data by:
influx USE esp8266_test select * from data limit 50
Below you can see the export from my database (I have shortened the time field for neatness). You can see I reset the ESP8266 a couple of times due to the LoopCount value.
time Device LoopCount RandomValue Sensor Unit ---- ------ --------- ----------- ------ ---- 52808175073 ESP8266 1 38 Temp Celsius 63108846141 ESP8266 2 35 Temp Celsius 69802517277 ESP8266 1 13 Temp Celsius 79892112240 ESP8266 2 12 Temp Celsius 89961602267 ESP8266 3 14 Temp Celsius 99998928411 ESP8266 4 22 Temp Celsius 10053683452 ESP8266 5 10 Temp Celsius 20120378415 ESP8266 6 28 Temp Celsius 30175745403 ESP8266 7 14 Temp Celsius 40732248123 ESP8266 8 38 Temp Celsius 51232948067 ESP8266 9 15 Temp Celsius 61322347831 ESP8266 10 13 Temp Celsius 71424432515 ESP8266 11 19 Temp Celsius 84740185749 ESP8266 1 18 Temp Celsius 94790343615 ESP8266 2 21 Temp Celsius 04839215465 ESP8266 3 13 Temp Celsius 31864448941 ESP8266 1 32 Temp Celsius 41956355523 ESP8266 2 36 Temp Celsius 52018136222 ESP8266 3 30 Temp Celsius 62083037888 ESP8266 4 22 Temp Celsius
That’s it!
Resources I used:
- https://github.com/davidgs/ESP8266_Influx_DB_V2
- https://www.influxdata.com/blog/writing-data-from-arduino-to-influxdb-v2/
G’day mate, I’m currently doing a little project with an INA260 to sense voltage and current. I’m not super good with the code. Hardware is fine. Any chance I can run some things past you? I’m using a wemos d1 mini, the INA260 and have already configured influx and grafana. Thats all tested and working! Basically I’m a bit stumped on using another library to fetch the metrics and getting them in the correct format to move to influx. Love the blog by the way. (And the content!)
Glad you got it sorted, I don’t check here too often!
How does one get in contact with you? Want to shoot you a quick email.
Sent you an email there.
I finally got the INA260 logging power from my solar cabinet to influx directly from the Wemos D1 mini. A few other guys said I should have used node-red, but thanks to your code I was able to skip that and post directly to influx from Arduino. Thank you.
Good to hear!
Does anyone know how to add a sleep timer to this and a sensor reading timer, maybe once ever couple minutes and sleep/go into low power mode in between readings ?
Use something like: (you need to connect D0 to RST also.)
ESP.deepSleep(20e6); // 20e6 is 20 microseconds
delay( 1 );