add the wong lib
This commit is contained in:
parent
1f6bec5ffe
commit
8a4f73d425
5 changed files with 336 additions and 0 deletions
176
influxdb-lib/ESP8266Influxdb.cpp
Normal file
176
influxdb-lib/ESP8266Influxdb.cpp
Normal file
|
@ -0,0 +1,176 @@
|
|||
#include "Arduino.h"
|
||||
#include "ESP8266Influxdb.h"
|
||||
#include <ESP8266WiFi.h>
|
||||
|
||||
#define DEBUG_PRINT // comment this line to disable debug print
|
||||
|
||||
#ifndef DEBUG_PRINT
|
||||
#define DEBUG_PRINT(a)
|
||||
#else
|
||||
#define DEBUG_PRINT(a) (Serial.println(String(F("[Debug]: "))+(a)))
|
||||
#define _DEBUG
|
||||
#endif
|
||||
|
||||
Influxdb::Influxdb(const char *host, uint16_t port) : WiFiClient() {
|
||||
_port = port;
|
||||
_host = host;
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::opendb(String db, String user, String password) {
|
||||
_db = "db=" + db + "&u=" + user + "&p=" + password;
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::opendb(String db) {
|
||||
_db = "db=" + db;
|
||||
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::write(FIELD data) {
|
||||
return write(data.postString());
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::write(String data) {
|
||||
if (!connect(_host, _port)) {
|
||||
DEBUG_PRINT("connection failed");
|
||||
_response = DB_CONNECT_FAILED;
|
||||
return _response;
|
||||
}
|
||||
String postHead = "POST /write?" + _db + " HTTP/1.1\r\n";
|
||||
postHead += "Host: " + String(_host) + ":" + String(_port) + "\r\n";
|
||||
// postHead += "Content-Type: application/x-www-form-urlencoded\r\n";
|
||||
postHead += "Content-Length: " + String(data.length()) + "\r\n\r\n";
|
||||
|
||||
DEBUG_PRINT("Writing data to " + String(_host) + ":" + String(_port));
|
||||
print(postHead + data);
|
||||
DEBUG_PRINT(postHead + data);
|
||||
|
||||
uint8_t t = 0;
|
||||
// Check the reply whether writing is success or not
|
||||
while (!available() && t < 200) {
|
||||
delay(10);
|
||||
t++;
|
||||
}
|
||||
if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out.
|
||||
|
||||
#if !defined _DEBUG
|
||||
if (available()) {
|
||||
_response = (findUntil("204", "\r")) ? DB_SUCCESS : DB_ERROR;
|
||||
return _response;
|
||||
}
|
||||
#else
|
||||
_response=DB_ERROR;
|
||||
while (available()) {
|
||||
String line = readStringUntil('\n');
|
||||
if (line.substring(9,12)=="204")
|
||||
_response = DB_SUCCESS;
|
||||
DEBUG_PRINT("(Responsed): " + line);
|
||||
}
|
||||
return _response;
|
||||
#endif
|
||||
return DB_ERROR;
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::query(String sql) {
|
||||
|
||||
if (!connect(_host, _port)) {
|
||||
DEBUG_PRINT("connection failed");
|
||||
_response = DB_CONNECT_FAILED;
|
||||
return _response;
|
||||
}
|
||||
|
||||
String url = "/query?";
|
||||
#if defined _DEBUG
|
||||
url += "pretty=true&";
|
||||
#endif
|
||||
url += _db;
|
||||
url += "&q=" + URLEncode(sql);
|
||||
DEBUG_PRINT("Requesting URL: ");
|
||||
DEBUG_PRINT(url);
|
||||
|
||||
// This will send the request to the server
|
||||
print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + _host +
|
||||
":" + _port + "\r\n" + "Connection: close\r\n\r\n");
|
||||
|
||||
// Read all the lines of the reply from server and print them to Serial
|
||||
uint8_t t = 0;
|
||||
while (!available() && t < 200) {
|
||||
delay(10);
|
||||
t++;
|
||||
}
|
||||
if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out.
|
||||
|
||||
DEBUG_PRINT("Receiving....");
|
||||
uint8_t i=0;
|
||||
String line = readStringUntil('\n');
|
||||
DEBUG_PRINT("[HEAD] " + line);
|
||||
|
||||
if (line.substring(9,12) == "200") {
|
||||
while (available()) {
|
||||
line = readStringUntil('\n');
|
||||
DEBUG_PRINT("(HEAD) " + line);
|
||||
if (i < 6 ) i++; else return _response;
|
||||
}
|
||||
_response = DB_SUCCESS;
|
||||
}
|
||||
else{
|
||||
_response = DB_ERROR;
|
||||
#if defined _DEBUG
|
||||
while (available()) {
|
||||
line = readStringUntil('\n');
|
||||
DEBUG_PRINT("[HEAD] " + line);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return _response;
|
||||
}
|
||||
|
||||
DB_RESPONSE Influxdb::response() {
|
||||
return _response;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------*/
|
||||
// Field object
|
||||
/* -----------------------------------------------*/
|
||||
FIELD::FIELD(String m) {
|
||||
measurement = m;
|
||||
}
|
||||
|
||||
void FIELD::empty() {
|
||||
_data = "";
|
||||
_tag = "";
|
||||
}
|
||||
|
||||
void FIELD::addTag(String key, String value) {
|
||||
_tag += "," + key + "=" + value;
|
||||
}
|
||||
|
||||
void FIELD::addField(String key, float value) {
|
||||
_data = (_data == "") ? (" ") : (_data += ",");
|
||||
_data += key + "=" + String(value);
|
||||
}
|
||||
|
||||
String FIELD::postString() {
|
||||
// uint32_t utc = 1448114561 + millis() /1000;
|
||||
return measurement + _tag + _data;
|
||||
}
|
||||
|
||||
// URL Encode with Arduino String object
|
||||
String URLEncode(String msg) {
|
||||
const char *hex = "0123456789abcdef";
|
||||
String encodedMsg = "";
|
||||
|
||||
uint16_t i;
|
||||
for (i = 0; i < msg.length(); i++) {
|
||||
if (('a' <= msg.charAt(i) && msg.charAt(i) <= 'z') ||
|
||||
('A' <= msg.charAt(i) && msg.charAt(i) <= 'Z') ||
|
||||
('0' <= msg.charAt(i) && msg.charAt(i) <= '9')) {
|
||||
encodedMsg += msg.charAt(i);
|
||||
} else {
|
||||
encodedMsg += '%';
|
||||
encodedMsg += hex[msg.charAt(i) >> 4];
|
||||
encodedMsg += hex[msg.charAt(i) & 15];
|
||||
}
|
||||
}
|
||||
return encodedMsg;
|
||||
}
|
72
influxdb-lib/ESP8266Influxdb.h
Normal file
72
influxdb-lib/ESP8266Influxdb.h
Normal file
|
@ -0,0 +1,72 @@
|
|||
/* Influxdb library
|
||||
|
||||
MIT license
|
||||
Written by HW Wong
|
||||
*/
|
||||
|
||||
#ifndef INFLUXDB_H
|
||||
#define INFLUXDB_H
|
||||
#include "Arduino.h"
|
||||
#include <ESP8266WiFi.h>
|
||||
|
||||
enum DB_RESPONSE {DB_SUCCESS, DB_ERROR, DB_CONNECT_FAILED};
|
||||
|
||||
// Url encode function
|
||||
String URLEncode(String msg);
|
||||
|
||||
class FIELD
|
||||
{
|
||||
public:
|
||||
FIELD(String m);
|
||||
|
||||
String measurement;
|
||||
|
||||
void addField(String key, float value);
|
||||
void addTag(String key, String value);
|
||||
void empty();
|
||||
String postString();
|
||||
|
||||
private:
|
||||
String _data;
|
||||
String _tag;
|
||||
|
||||
};
|
||||
|
||||
class Influxdb : private WiFiClient
|
||||
{
|
||||
public:
|
||||
Influxdb(const char* host, uint16_t port);
|
||||
|
||||
DB_RESPONSE opendb(String db);
|
||||
DB_RESPONSE opendb(String db, String user, String password);
|
||||
DB_RESPONSE write(FIELD data);
|
||||
DB_RESPONSE write(String data);
|
||||
DB_RESPONSE query(String sql);
|
||||
//uint8_t createDatabase(char *dbname);
|
||||
DB_RESPONSE response();
|
||||
|
||||
using WiFiClient::available;
|
||||
using WiFiClient::read;
|
||||
using WiFiClient::flush;
|
||||
using WiFiClient::find;
|
||||
using WiFiClient::findUntil;
|
||||
using WiFiClient::peek;
|
||||
using WiFiClient::readBytes;
|
||||
using WiFiClient::readBytesUntil;
|
||||
using WiFiClient::readString;
|
||||
using WiFiClient::readStringUntil;
|
||||
using WiFiClient::parseInt;
|
||||
using WiFiClient::setTimeout;
|
||||
|
||||
private:
|
||||
uint16_t _port;
|
||||
const char* _host;
|
||||
String _db;
|
||||
DB_RESPONSE _response;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
1
influxdb-lib/README.md
Normal file
1
influxdb-lib/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# ESP8266Influxdb
|
63
influxdb-lib/examples/influxdb_write/influxdb_write.ino
Normal file
63
influxdb-lib/examples/influxdb_write/influxdb_write.ino
Normal file
|
@ -0,0 +1,63 @@
|
|||
|
||||
#include <Arduino.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266WiFiMulti.h>
|
||||
#include <ESP8266Influxdb.h>
|
||||
|
||||
const char *INFLUXDB_HOST = "host_or_ip";
|
||||
const uint16_t INFLUXDB_PORT = 8086;
|
||||
|
||||
const char *DATABASE = "dbname";
|
||||
const char *DB_USER = "dbuser";
|
||||
const char *DB_PASSWORD = "dbpassword";
|
||||
|
||||
ESP8266WiFiMulti WiFiMulti;
|
||||
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
WiFiMulti.addAP("SSID", "PASSWORD");
|
||||
while (WiFiMulti.run() != WL_CONNECTED) {
|
||||
delay(100);
|
||||
}
|
||||
Serial.println("Ready");
|
||||
influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Writing data with influxdb HTTP API
|
||||
// https://influxdb.com/docs/v0.9/guides/writing_data.html
|
||||
Serial.println("Writing data to host " + String(INFLUXDB_HOST) + ":" +
|
||||
INFLUXDB_PORT + "'s database=" + DATABASE);
|
||||
String data = "analog_read,method=HTTP_API,pin=A0 value=" + String(analogRead(A0));
|
||||
influxdb.write(data);
|
||||
Serial.println(influxdb.response() == DB_SUCCESS ? "HTTP write success"
|
||||
: "Writing failed");
|
||||
|
||||
// Writing data using FIELD object
|
||||
// Create field object with measurment name=analog_read
|
||||
FIELD dataObj("analog_read");
|
||||
dataObj.addTag("method", "Field_object"); // Add method tag
|
||||
dataObj.addTag("pin", "A0"); // Add pin tag
|
||||
dataObj.addField("value", analogRead(A0)); // Add value field
|
||||
Serial.println(influxdb.write(dataObj) == DB_SUCCESS ? "Object write success"
|
||||
: "Writing failed");
|
||||
|
||||
// Empty field object.
|
||||
dataObj.empty();
|
||||
|
||||
// Querying Data
|
||||
// https://influxdb.com/docs/v0.9/query_language/query_syntax.html
|
||||
Serial.println("Querying data ........");
|
||||
|
||||
String sql = "select * from analog_read order by time desc limit 2";
|
||||
if (influxdb.query(sql) == DB_SUCCESS) {
|
||||
while (influxdb.available()) {
|
||||
String line = influxdb.readStringUntil('\n');
|
||||
Serial.println(line);
|
||||
}
|
||||
}
|
||||
else
|
||||
Serial.println("Query Failed");
|
||||
delay(30000);
|
||||
}
|
24
influxdb-lib/keywords.txt
Normal file
24
influxdb-lib/keywords.txt
Normal file
|
@ -0,0 +1,24 @@
|
|||
##################################################
|
||||
# Syntax Coloring Map For ESP8266 Influxdb library
|
||||
##################################################
|
||||
|
||||
##################################################
|
||||
# Datatypes (KEYWORD1)
|
||||
##################################################
|
||||
|
||||
Influxdb KEYWORD1
|
||||
FIELD KEYWORD1
|
||||
DB_RESPOND KEYWORD1
|
||||
|
||||
##################################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
##################################################
|
||||
|
||||
addField KEYWORD2
|
||||
addTag KEYWORD2
|
||||
empty KEYWORD2
|
||||
opendb KEYWORD2
|
||||
write KEYWORD2
|
||||
query KEYWORD2
|
||||
postString KEYWORD2
|
||||
response KEYWORD2
|
Loading…
Reference in a new issue