Messdaten vor dem Schreiben in die InfluxDB im Flashspeicher des nodes puffern

Hallo Zusammen,

ich würde gerne Messdaten im Flash Speicher speichern und im Anschluss in meine InfluxDB schreiben (wenn der Flash voll ist). Allerdings komme ich nicht wirklich weiter und habe einige Fragen:

Ich brauche für meine Daten einen Zeitstempel, dass habe ich versucht mit der point.setTime() Methode. Allerdings hat dies nicht funktioniert und die Daten wurden nicht in Grafana angezeigt. Hat jemand eine Idee, wie man den Messdaten einen Zeitstempel geben kann und welches Format dieser hat?

Mich interessiert auch, ob die Daten aus der Vergangenheit, welche ich im Optimalfall in meiner InfluxDB habe, auch in Grafana angezeigt werden?

(Wenn ich als Zeitstempel die aktuelle Zeit aus dem Internet verwende funktioniert mein Programm. Allerdings habe ich in der Anwendung kein Internet und kann den Zeitstempel deshalb erst im Nachgang hinzufügen)

bin dankbar für jeden Hinweis:)

Viele Grüße

Hallo Leon,

willkommen bei uns im Forum.

Dein Wunsch ist naheliegend. Wir haben uns mit diesem Thema bisher erst konzeptionell auseinandergesetzt [1], anbei findest Du ein paar Diskussionen darüber.

Erst einmal vorweg: Deine Frage ist recht allgemein und lässt kaum Rückschlüsse auf das Setup zu, das Du vor Dir hast. Benutzt Du denn irgendeine Komponente (Firmware, Telemetrie oder Backend) aus unserer Sammlung, so dass man daran gedanklich anknüpfen könnte?

Das wiederum ist ja nun wieder ein ziemlich spezielles Ding. Hilf uns bitte weiter, was Du genau meinst und welches Hardware- und Software-Setup Du betreibst oder betreiben willst.

Viele Grüße,
Andreas.


Referenzen


  1. Oder kann der BOB-Logger das schon, @diren, @didilamken, oder @clemens? ↩︎

Hallo Leon / @kanstile! Wilkommen bei hiveeyes erst einmal! Wenn du magst, schreib gerne etwas zu dir oder deinem Anwendungssetting unter Introduce yourself - Hiveeyes. Hast du Daten von Bienenvölkern oder von etwas ganz anderem?

Der “BOB-Logger” ist ein ESP32-basierter FiPy, für den FiPy gibt es ein expansion board mit SD-Karte, dafür hat @diren den urprünglichen BOB-Code für ein Projekt in Afrika etwas umgeschrieben, damit Daten en bloc übertragen werden, wenn ein Handy alle 14 Tage in der nähe ist.

Beim (ATmega) Arduino wäre ein “Zwischenspeichern” von Daten, falls es nur darum geht nicht so häufig z.B. eine GSM-Verbindung aufzubauen, relativ einfach möglich, wenn man sie in einem Array als Variablen vorhält und dann en bloc wegschickt. Der ATmega behält auch über deep sleep-Zyklen die Variableninhalte, großer Vorteil im Gegensatz zu den ESPs! Beim ESP werden alle Variableninhalte zurückgesetzt, man kann als keine Daten über den deep sleep retten. Ganz geringe Daten, etwa Konfig-Variablen könnte man im RTC memory speichern, aber eben keine Messdaten. Möglich wären externe EEPROMs, SD-Karten oder ähnliches.

Nun ist mir über die Beschäftigung mit diversen “Wifi-Managern” noch eine andere Möglichkeit aufgefallen: Einen Teil des Programmspeichers nutzen, um z.B. mittels LittleFS oder SPIFFS dort Dateien / Daten abzulegen:

Wenn die Daten auf dem node gespeichert werden könntest du bei setup / boot eine Internetverbindung aufmachen und dir aktuelle Zeit holen, alternativ eine RTC verbauen und von dort die Zeit nehmen. Theoretisch könnte man auch vom letzten Dataset bei bekanntem Messintervall rückwärts zählen und so nachträglich timestamps generieren. Könnte aber fehleranfällig werden, wenn z.B. aus irgendeinem Grund ein reboot passiert oder Datensätze fehlen. Zumindest beim ESP überlebt die Uhrzeit einen deep sleep.

Du siehst, es kommt sehr auf dein setup an, schreibe doch mal was genau du hast und was du machen möchtest.

Das funktioniert auf jeden Fall.

Wir hatten mal Daten, ich meine als CSV gespeichert, so versendet: FiPy/influx.py at kamerun-sleep · Hiverize/FiPy · GitHub

War aber ziemlich langsam, also noch nicht die Lösung, die wir haben wollten. Ist schon ein bisschen her und ich bin da nicht mehr so drin.

1 Like

Ich habe zufällig eine Referenz auf point.setTime() entdecken können. Du sprichst von dieser Methode im GitHub - tobiasschuerg/InfluxDB-Client-for-Arduino: Simple library for sending measurements to an InfluxDB with a single network request. Supports ESP8266 and ESP32., richtig?

Anwendungsbeispiel:

1 Like

Hallo Leon,

Ich glaube ich verstehe nun was Du meinst.

Du willst die Daten puffern und willst sie daher mit einem Zeitstempel versehen, damit man später weiß wann sie erhoben wurden. Soweit klar.

Damit steht und fällt die ganze Angelegenheit natürlich, wenn Du meinst, dass Du die Zeit nicht aus dem Internet abrufen kannst, weil das System niemals nicht damit verbunden ist und sein wird.

Es gibt aber Hilfe: Die Zeit muss nicht zwingend aus dem Internet kommen, sie kann auch “einmalig” richtig eingestellt werden. Wichtig ist nur, dass das Gerät sie nicht “verliert”.

Grundsätzlich hilft es nichts, die Appliance muss zwingend die Zeit kennen, sonst kann sie die Daten nicht ordentlich zeitstempeln. Andere Verfahren, wie z.B. eine “relative Zeitnahme”, scheinen denkbar, scheitern aber vermutlich an der Praxis.

Die Lösung heißt hier z.B. “RTC”: Ein batteriegepufferter Chip, der für die Zeitnahme zuständig ist. Bei uns ist der DS3231 recht populär, siehe Search results for 'DS3231' - Hiveeyes. Bei Versuchsaufbau "Autonome Zelle" #1 & #2: Solar-Feinstaub-Wetter-Vergleichsding und Diskussion zu »Autonome Zellen #1-2« wird das Thema auch ausführlicher und anwendungsnah beleuchtet.

Mächtigere MCUs haben eine solche RTC Einheit auch an Bord, siehe z.B. System Time - ESP32 - — ESP-IDF Programming Guide latest documentation beim ESP32.

Ist dies das Thema, das Dich beschäftigt?

Viele Grüße,
Andreas.

1 Like

Erstmal vielen Dank für die ausführlichen Antworten. @clemens ich hatte vor die Daten im Flash Speicher des ESP32 zu Speichern. Es ist möglich, dass er zwischenzeitlich komplett runterfährt (Die Spannung bricht manchmal ein). Die Daten im Flash sollten Allerdings trotzdem bleiben, oder nicht?

@Andreas das ist so ziemlich das Thema das mich beschäftigt. Jedoch ist es so, dass ich erstmal nur die Daten Speicher will, dies kann auch ohne Zeitstempel geschehen. Zu einem späterem Zeitpunkt baue ich eine Internetverbindung auf und kann dann die Zeitstempel durch rückwärts rechnen hinzufügen (so zumindest meine Theorie). Allerdings sehe ich darin einige Probleme die es schwierig machen könnten: Ich brauche zusammenhängende Daten, sprich der ESP darf zwischenzeitlich nicht herunter fahren, da das sonst nicht möglich ist mit dem zurück rechnen…Nun wäre eine Idee den Flash zu leeren nach jedem runterfahren und somit immer nur zusammenhängende Daten zu haben. Damit verliere ich zwar Daten, es wäre allerdings eine erste Verbesserung zum jetzigen Zustand meines Projekts.

Und genau, das ist die Methode die ich verwenden wollte für den Zeitstempel.

Kannst du nochmal schreiben welches ESP32 Board du verwendest, oder ist das noch nicht festgelegt? Mit ist noch nicht klar, ob du ESP internen Speicher verwenden möchtest oder einen externen flash-Baustein verwendest, zu letzterem

Hier wird über die EEPROM lib auf den flash-Speicher zugegriffen: Using ESP32's Flash Memory for data storage - Electronics-Lab.com

Wie gesagt würde ich mir den timestamp vorher holen, und zwar immer wenn die RTC nicht gesetzt ist. Magst du noch was zu deiner Stromversorgung schreiben?! Solar, LiPo, immer am Strom? Wenn du davon ausgehen kannst, dass zumindest deep sleep zwischen den Messungen möglich ist und der da auch normalerweise Strom hat würde auch die Uhrzeit erhalten bleiben.

es handelt sich um den ESP32 Wrover E und ich würde gerne den internen Flash Speicher benutzen. Zum Thema Stromversorgung: Solar Energie => manchmal ist die Stromversorgung auch komplett weg. Den Timestamp kann ich nicht vorher holen, da es mir darum geht, Daten zu speichern, wenn nicht genug Strom für eine Wlan Verbindung vorhanden ist und diese dann zu senden, wenn genug Sonne da ist (Dann bekomme ich auch erst meine Zeit).

Hast du schon deep sleep zwischen den Messzyklen eingerichtet? Ggf. hilft es dafür auch ein anderes / besseres Board zu nehmen, das im deep sleep stromsparender ist, z.B. den FireBeetle von DFRobot oder nutzt du den ESP32 Wrover SoC auf einer eigenen Platine? Gibt es neben der Solarzelle noch einen Pufferakku und wie häufig möchtest du messen?

Wenn das Ding unkontrolliert off geht und da zufällig oder von Wetter abhängig lange oder kurze zweiten dazwischen sein können musst du eigentlich zwingend die Daten mit timestamp abspeichern oder du verwirft Daten, die nicht direkt mit einem upload “abgeschlossen” werden können. Meine Empfehlung wäre wie oben schon angedeutet:

  • Das ganze System so optimieren, dass es zwischen den Messzyklen minimal Strom verbraucht (deep sleep, low power board).
  • Sich am Anfang / system start die Zeit holen (einmalig!), die RTC des ESP behält die, auch über deep sleep und du könntest somit die Daten time stampen.
  • Falls der tatsächlich oft ausgeht eine externe RTC verwenden, dann brauchst du nicht initial oder nach power loss die Zeit holen, sondern könntest sie mit dem Daten upload nur immer nachstellen.

Hi Leon,

Das liest sich kompliziert und Du erkennst die Probleme ja bereits selbst.

Eigentlich ist davon nur abzuraten und stattdessen einfach “ganz normal” mit einer RTC zu arbeiten, die genau für diesen Einssatzzweck das richtige Bauteil ist. Darüber hinaus würde ich auch die Liste der Vorschläge von Clemens abarbeiten, um generell mehr Strom zu sparen.

Viele Grüße,
Andreas.

Hallo Leon und Clemens,

@tonke nimmt sich das Thema auch gerade wieder vor. Anknüpfend an ESPHome mit NAU7802, aber diesmal pur-Arduino. Folgende Dinge finden dabei Verwendung.

Viele Grüße,
Andreas.