158 lines
4.3 KiB
C++
158 lines
4.3 KiB
C++
|
/**
|
||
|
*
|
||
|
* InfluxDb.cpp: InfluxDB Client for Arduino
|
||
|
*
|
||
|
* MIT License
|
||
|
*
|
||
|
* Copyright (c) 2018-2020 Tobias Schürg
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
* of this software and associated documentation files (the "Software"), to deal
|
||
|
* in the Software without restriction, including without limitation the rights
|
||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
* copies of the Software, and to permit persons to whom the Software is
|
||
|
* furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in all
|
||
|
* copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
|
* SOFTWARE.
|
||
|
*/
|
||
|
#include "InfluxDb.h"
|
||
|
#include "Arduino.h"
|
||
|
|
||
|
/**
|
||
|
* Construct an InfluxDb instance.
|
||
|
* @param host the InfluxDb host
|
||
|
* @param port the InfluxDb port
|
||
|
*/
|
||
|
Influxdb::Influxdb(String host, uint16_t port) {
|
||
|
if(port == 443) {
|
||
|
// this happens usualy when influxdb is behind fw/proxy. Mostly, when influxdb is switched to https, the port remains the same (8086)
|
||
|
// port number shouldn't be qualificator for secure connection, either scheme or a flag
|
||
|
_connInfo.serverUrl = "https://";
|
||
|
} else {
|
||
|
_connInfo.serverUrl = "http://";
|
||
|
}
|
||
|
_connInfo.serverUrl += host + ":" + String(port);
|
||
|
_connInfo.dbVersion = 1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the database to be used.
|
||
|
* @param db the Influx Database to be written to.
|
||
|
*/
|
||
|
void Influxdb::setDb(String db) {
|
||
|
_connInfo.bucket = db;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the database to be used with authentication.
|
||
|
*/
|
||
|
void Influxdb::setDbAuth(String db, String user, String pass) {
|
||
|
_connInfo.bucket = db;
|
||
|
_connInfo.user = user;
|
||
|
_connInfo.password = pass;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Bucket to be used v2.0 ONLY.
|
||
|
* @param bucket the InfluxDB Bucket which must already exist
|
||
|
*/
|
||
|
void Influxdb::setBucket(String bucket) {
|
||
|
_connInfo.bucket = bucket;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the influxDB port.
|
||
|
* @param port both v1.x and v3 use 8086
|
||
|
*/
|
||
|
void Influxdb::setPort(uint16_t port){
|
||
|
int b = _connInfo.serverUrl.indexOf(":",5);
|
||
|
if(b > 0) {
|
||
|
_connInfo.serverUrl = _connInfo.serverUrl.substring(0, b+1) + String(port);
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Set the Organization to be used v2.0 ONLY
|
||
|
* @param org the Name of the organization unit to use which must already exist
|
||
|
*/
|
||
|
void Influxdb::setOrg(String org){
|
||
|
_connInfo.org = org;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the authorization token v2.0 ONLY
|
||
|
* @param token the Auth Token from InfluxDBv2 *required*
|
||
|
*/
|
||
|
void Influxdb::setToken(String token){
|
||
|
_connInfo.authToken = token;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the version of InfluxDB to write to
|
||
|
* @param version accepts 1 for version 1.x or 2 for version 2.x
|
||
|
*/
|
||
|
void Influxdb::setVersion(uint16_t version){
|
||
|
_connInfo.dbVersion = version;
|
||
|
}
|
||
|
|
||
|
#if defined(ESP8266)
|
||
|
/**
|
||
|
* Set server certificate finger print
|
||
|
* @param fingerPrint server certificate finger print
|
||
|
*/
|
||
|
void Influxdb::setFingerPrint(const char *fingerPrint){
|
||
|
_connInfo.certInfo = fingerPrint;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void Influxdb::begin() {
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Prepare a measurement to be sent.
|
||
|
*/
|
||
|
void Influxdb::prepare(InfluxData data) {
|
||
|
++_preparedPoints;
|
||
|
if(_writeOptions._batchSize <= _preparedPoints) {
|
||
|
// for preparation, batchsize must be greater than number of prepared points, or it will send data right away
|
||
|
_writeOptions._batchSize = _preparedPoints+1;
|
||
|
reserveBuffer(2*_writeOptions._batchSize);
|
||
|
}
|
||
|
write(data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Write all prepared measurements into the db.
|
||
|
*/
|
||
|
boolean Influxdb::write() {
|
||
|
_preparedPoints = 0;
|
||
|
return flushBuffer();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Write a single measurement into the db.
|
||
|
*/
|
||
|
boolean Influxdb::write(InfluxData data) {
|
||
|
return write(pointToLineProtocol(data));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Send raw data to InfluxDb.
|
||
|
*
|
||
|
* @see
|
||
|
* https://github.com/esp8266/Arduino/blob/cc0bfa04d401810ed3f5d7d01be6e88b9011997f/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h#L44-L55
|
||
|
* for a list of error codes.
|
||
|
*/
|
||
|
boolean Influxdb::write(String data) {
|
||
|
return writeRecord(data);
|
||
|
}
|