Fix influxdb parameter init

This commit is contained in:
Theo Arends 2021-08-13 16:35:24 +02:00
parent 20d88f3d68
commit bde66e18c5
2 changed files with 99 additions and 63 deletions

View File

@ -964,7 +964,7 @@ const uint8_t sNumbers[] PROGMEM = { 0,0,0,0,0,0,0,
4,4, 4,4,
255 }; 255 };
int GetStateNumber(char *state_text) int GetStateNumber(const char *state_text)
{ {
char command[CMDSZ]; char command[CMDSZ];
int state_number = GetCommandCode(command, sizeof(command), state_text, kOptions); int state_number = GetCommandCode(command, sizeof(command), state_text, kOptions);

View File

@ -95,18 +95,18 @@ String InfluxDbAuth(void) {
return auth; return auth;
} }
bool InfluxDbInit(void) { bool InfluxDbParameterInit(void) {
IFDB._serverUrl = "http://"; if (strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 ||
IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST);
IFDB._serverUrl += ":";
IFDB._serverUrl += Settings->influxdb_port;
if (IFDB._serverUrl.length() == 0 ||
(2 == Settings->influxdb_version && (strlen(SettingsText(SET_INFLUXDB_ORG)) == 0 || (2 == Settings->influxdb_version && (strlen(SettingsText(SET_INFLUXDB_ORG)) == 0 ||
strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 ||
strlen(SettingsText(SET_INFLUXDB_TOKEN)) == 0))) { strlen(SettingsText(SET_INFLUXDB_TOKEN)) == 0))) {
AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid parameters")); AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid parameters"));
return false; return false;
} }
IFDB._serverUrl = "http://";
IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST);
IFDB._serverUrl += ":";
IFDB._serverUrl += Settings->influxdb_port;
IFDB._writeUrl = IFDB._serverUrl; IFDB._writeUrl = IFDB._serverUrl;
if (2 == Settings->influxdb_version) { if (2 == Settings->influxdb_version) {
IFDB._writeUrl += "/api/v2/write?org="; IFDB._writeUrl += "/api/v2/write?org=";
@ -118,8 +118,12 @@ bool InfluxDbInit(void) {
IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_BUCKET)); IFDB._writeUrl += UrlEncode(SettingsText(SET_INFLUXDB_BUCKET));
IFDB._writeUrl += InfluxDbAuth(); IFDB._writeUrl += InfluxDbAuth();
} }
// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Url %s"), IFDB._writeUrl.c_str()); AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Url %s"), IFDB._writeUrl.c_str());
return true;
}
bool InfluxDbInit(void) {
IFDBwifiClient = new WiFiClient; IFDBwifiClient = new WiFiClient;
if (!IFDBhttpClient) { if (!IFDBhttpClient) {
IFDBhttpClient = new HTTPClient; IFDBhttpClient = new HTTPClient;
@ -156,7 +160,7 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) {
if (IFDB._lastStatusCode != expectedStatusCode) { if (IFDB._lastStatusCode != expectedStatusCode) {
if (IFDB._lastStatusCode > 0) { if (IFDB._lastStatusCode > 0) {
IFDB._lastErrorResponse = IFDBhttpClient->getString(); IFDB._lastErrorResponse = IFDBhttpClient->getString();
AddLog(LOG_LEVEL_INFO, PSTR("IFX: Response %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""} AddLog(LOG_LEVEL_INFO, PSTR("IFX: %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""}
} else { } else {
IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode); IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode);
AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str());
@ -217,16 +221,26 @@ int InfluxDbPostData(const char *data) {
/*********************************************************************************************/ /*********************************************************************************************/
void InfluxDbMetrics(void) { char* InfluxDbMakeNumber(char* dest, const char* source) {
ResponseClear(); // Convert special text as found in kOptions to a number
if (!MqttShowSensor()) { return; }; // Pull sensor data // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2
int number = GetStateNumber(source);
if (number >= 0) {
itoa(number, dest, 10);
return dest;
}
return (char*)source;
}
// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Metrics %s"), TasmotaGlobal.mqtt_data.c_str()); void InfluxDbProcessJson(void) {
// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), TasmotaGlobal.mqtt_data.c_str());
String jsonStr = TasmotaGlobal.mqtt_data; String jsonStr = TasmotaGlobal.mqtt_data;
JsonParser parser((char *)jsonStr.c_str()); JsonParser parser((char *)jsonStr.c_str());
JsonParserObject root = parser.getRootObject(); JsonParserObject root = parser.getRootObject();
if (root) { if (root) {
char number[32];
char linebuf[128]; // 'temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=26.44\n' char linebuf[128]; // 'temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=26.44\n'
char sensor[64]; // 'ds18b20' char sensor[64]; // 'ds18b20'
char type[64]; // 'temperature' char type[64]; // 'temperature'
@ -245,7 +259,9 @@ void InfluxDbMetrics(void) {
JsonParserObject Object3 = value2.getObject(); JsonParserObject Object3 = value2.getObject();
for (auto key3 : Object3) { for (auto key3 : Object3) {
const char *value = key3.getValue().getStr(); const char *value = key3.getValue().getStr();
if (value != nullptr && isdigit(value[0])) { if (value != nullptr) {
value = InfluxDbMakeNumber(number, value);
if (isdigit(value[0])) {
// Level 3 // Level 3
LowerCase(sensor, key2.getStr()); LowerCase(sensor, key2.getStr());
LowerCase(type, key3.getStr()); LowerCase(type, key3.getStr());
@ -255,11 +271,15 @@ void InfluxDbMetrics(void) {
data += linebuf; data += linebuf;
} }
} }
}
} else { } else {
// Level 2 // Level 2
// { ... "ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":24.88},"HTU21":{"Temperature":25.32,"Humidity":49.2,"DewPoint":13.88},"Global":{"Temperature":24.88,"Humidity":49.2,"DewPoint":13.47}, ... }
bool isarray = value2.isArray(); bool isarray = value2.isArray();
const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr(); const char *value = (isarray) ? (value2.getArray())[0].getStr() : value2.getStr();
if (value != nullptr && isdigit(value[0])) { if (value != nullptr) {
value = InfluxDbMakeNumber(number, value);
if (isdigit(value[0])) {
LowerCase(sensor, key1.getStr()); LowerCase(sensor, key1.getStr());
LowerCase(type, key2.getStr()); LowerCase(type, key2.getStr());
@ -281,7 +301,7 @@ void InfluxDbMetrics(void) {
data += linebuf; data += linebuf;
} }
} else { } else {
// temperature,device=Wemos10,sensor=ds18b20,id=01144A0CB2AA value=22.63 // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63
snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"),
type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value);
data += linebuf; data += linebuf;
@ -292,18 +312,28 @@ void InfluxDbMetrics(void) {
} }
} }
} }
/* }
} else { } else {
// Level 1 // Level 1
// {"Time":"2021-08-13T14:15:56","Switch1":"ON","Switch2":"OFF", ... "TempUnit":"C"}
const char *value = value1.getStr(); const char *value = value1.getStr();
LowerCase(sensor, key1.getStr()); if (value != nullptr) {
value = InfluxDbMakeNumber(number, value);
if (isdigit(value[0])) {
LowerCase(type, key1.getStr());
// time,device=Wemos10 value=2021-08-11T09:46:29 if (!((strcasecmp_P(type, PSTR(D_JSON_TIME)) == 0) || // No time,device=demo value=2021-08-11T09:46:29
// tempunit,device=Wemos10 value=C (strcasecmp_P(type, PSTR(D_JSON_TEMPERATURE_UNIT)) == 0) || // No tempunit,device=demo value=C
(strcasecmp_P(type, PSTR(D_JSON_PRESSURE_UNIT)) == 0) ||
(strcasecmp_P(type, PSTR(D_JSON_SPEED_UNIT)) == 0)
)) {
// switch1,device=demo value=1
snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"), snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s value=%s\n"),
sensor, TasmotaGlobal.mqtt_topic, value); type, TasmotaGlobal.mqtt_topic, value);
data += linebuf; data += linebuf;
*/ }
}
}
} }
} }
if (data.length() > 0 ) { if (data.length() > 0 ) {
@ -314,10 +344,22 @@ void InfluxDbMetrics(void) {
} }
void InfluxDbLoop(void) { void InfluxDbLoop(void) {
if (IFDB.interval) {
IFDB.interval--;
if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) {
IFDB.interval = Settings->tele_period;
if (!IFDB.init) { if (!IFDB.init) {
if (InfluxDbParameterInit()) {
IFDB.init = InfluxDbValidateConnection(); IFDB.init = InfluxDbValidateConnection();
} }
InfluxDbMetrics(); }
ResponseClear();
if (MqttShowSensor()) { // Pull sensor data
InfluxDbProcessJson();
};
}
}
} }
/*********************************************************************************************\ /*********************************************************************************************\
@ -435,13 +477,7 @@ bool Xsns90(uint8_t function) {
switch (function) { switch (function) {
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
if (IFDB.interval) {
IFDB.interval--;
if (0 == IFDB.interval || IFDB.interval > Settings->tele_period) {
IFDB.interval = Settings->tele_period;
InfluxDbLoop(); InfluxDbLoop();
}
}
break; break;
case FUNC_COMMAND: case FUNC_COMMAND:
result = DecodeCommand(kInfluxDbCommands, InfluxCommand); result = DecodeCommand(kInfluxDbCommands, InfluxCommand);