weatherstation/firmware/libraries/ESP8266_Influxdb/src/InfluxDb 2.cpp
2022-09-15 10:23:02 +02:00

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);
}