Verbindung InfluxDB - ESP32 - Preferences

Hallo,

ich bin neu hier Im Forum. Ich beschäftige mich allerdings schon seit einiger Zeit mit dem Arduino und aufgrund der vorhanden InfluxDB nun auch vermehrt mit dem ESP8266 bzw. ESP32.

Nun habe ich den folgenden Sketch beispielhaft geschrieben:

#include <WiFiManager.h>
#include <InfluxDbClient.h>
#include <Preferences.h>

//SSID and Password of your WiFi router
const char* ssid = "Test";
const char* wpakey = "1234567890";

String tname, tnr;

#define dname "http://arduino-influx-test.de:9999"
#define idbtoken "sadsaffie4r40fg9vpjvrf0f89fj0fj0j40rrfj0g4t4jg8jije490tg54rj"
#define idborg "Test-Org"
#define idbbucket "Test-Bucket" 

//Influx client instance mit #define Variablen
InfluxDBClient client(dname, idbtoken, idborg, idbbucket);
  
//Influx setze Point
Point sensor("Test-Name");

//Flashspeicher initialisieren
Preferences preferences;

//==============================================================
//                  SETUP
//==============================================================
void setup() {
  Serial.begin(115200);
  preferences.begin("Test-Settings", false);
  WiFi.begin(ssid, wpakey);
  
  //Warte bis WLAN-Verbindung aufgebaut
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  //Holen der Daten aus dem Speicher
  tname = preferences.getString("tname", "");
  tnr = tname;
  tnr.replace("Test_", "");
  
  //Verbindungseinstellungen fuer Influx laden *WUNSCH!*
  dname = preferences.getString("dname", "");
  idbtoken = preferences.getString("idbtoken", "");
  idborg = preferences.getString("idborg", "");
  idbbucket = preferences.getString("idbbucket", "");
  
  //Influx Tag hinzufuegen
  sensor.addTag("Serialnumber", tnr);
  delay(50);
}
//==============================================================
//                     LOOP
//==============================================================
void loop() {
  float temp = 4.2;
  sensor.clearFields();
  if (client.validateConnection()) {
	//Messdaten hinzufuegen
	sensor.addField("C°", temp);
	//Messdaten in Influx schreiben
	client.writePoint(sensor);
  }
  else {
	delay(10000);
  }
  delay(600000);
}

Hier habe ich gleich mehrere Probleme, aber eins nach dem anderen :slight_smile:

  1. Ich möchte gern aus dem Speicher des ESP32 mit Hilfe von <Preferences.h> die darin zuvor (anderer Sketch) gespeicherten "Zugangsdaten" für den InfluxDB client auslesen und hiermit die Verbind aufbauen. Wie ist es also möglich in dem allgemeinem Sketch die Variablen zumindest beim Start zu überschreiben? InfluxDB erwartet hier #define ...., wenn ich das richtig verstanden habe ist dies gleich zu setzen mit const .... und diese können ja im weiteren Verlauf nicht geändert werden!?

  2. Welchen Rückgabe-Typ erhalte ich mit preferences.getString()? wenn ich z.B.

    String test = preferences.getString("test", "")

aufrufe, dann bekomme ich beim compilieren den Fehler:

    error: incompatible types in assignment of 'String' to 'const char [12]

Warum char? ich hole dies doch mit getString()? (srry, preferences ist ein neues Thema für mich)

Wäre super es könnte mir jemand bei diesen beiden Dingen Hilfestellung leisten.

Grundidee (für diejenigen die es interessiert):
Ich möchte ein Sketch schreiben welcher einen Webserver beinhaltet. Hier kann ich Grundeinstellungen setzen (in den Speicher des ESP schreiben).
Anschließend kommt eine Update-Seite über die ich z.B. den oben vorgestellten Sketch (als .bin) hochlade. Dieser soll dann die Grundeinstellungen auslesen und seinen Dienst tun.
Es soll zukünftig viele ESP's geben die alle auf die gleiche Art mit Influx kommunizieren und ich habe keine Lust immer im (ich sage mal) Hauptprogramm alle Variablen anpassen zu müssen.

Vielen Dank vorab für eure Hilfe!

Links zu den Libs erleichern/ermöglichen die Hilfestellung.
Falls es diese Preferences.h ist, dann schau Dir mal den Header von getString an:

size_t getString(const char* key, char* value, size_t maxLen);

#define ist eine reine Textersetzung, keine Variable, kann so also nicht genutzt werden.

Gruß Tommy

Hallo Tommy56,

alles klar danke dir! "wer lesen kann..." :slight_smile: Also erhalte ich ein char* obwohl ich es als getString() aufrufe, etwas verwirrend.

Bezüglich #define das hatte ich hier in der Doku schon gelesen damit kann ich nix anfangen.

Nun habe ich eben noch mal ein wenig bei InfluxDB-Client-for-Arduino auf github geschaut und habe dort folgendes gefunden:

// InfluxDB client instance
InfluxDBClient client;

void setup() {
    // configure client
    client.setConnectionParams(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, ServerCert);
}

Dies sollte nun mein Problem beheben.

Danke für die Hilfe!!!

String bezeichnet im Englischen einfach eine (Zeichen)kette, nicht speziell die Klasse String.

Gruß Tommy

Danke, das hatte ich so nicht auf dem Schirm.

nun hänge ich aber doch irgendwie!

client.setConnectionParams(dname, idbtoken, idborg, idbbucket);

erwartet jetzt, dass die Variablen wie folgt deklariert werden z.B.

char dname[20];

wie müsste denn der Aufruf preferences aussehen?

dname = preferences.getChar("dname");

geht ja nicht bekomme ja nur die Länge des char zurück als uint_8, oder verstehe ich da was falsch?

Ich habe gerade gesehen, es gibt noch eine andere Version

String getString(const char* key, String defaultValue = String());

Schau Dir mal dieses Tutorial an.

Gruß Tommy

1 Like

Top nochmals Dankeschön!

habe es jetzt (für alle Suchenden) wie folgt gelöst:

  String dname;
  String idbtoken; 
  String idborg; 
  String idbbucket;
  
  dname = preferences.getString("dname");
  idbtoken = preferences.getString("idbtoken");
  idborg = preferences.getString("idborg");
  idbbucket = preferences.getString("idbbucket");
  
  client.setConnectionParams(dname.c_str(), idbtoken.c_str(), idborg.c_str(), idbbucket.c_str());