A minimal library for binary data logging in ESP8266 systems.
- Easy to use
 - Stores data in binary along with a UTC timestamp
 - Results in about 50% space spavings when compared to logging the same data in CSV
 - Splits data into daily files, allowing for efficient search
 - Automatically rotates files, deleting the ones that exceed the specified age
 - Uses built-in ESP/newlib time functions
 
- Download the latest release
 - Extract it into your libraries folder
 - Rename the folder from 
SPIFFSLogger-x.x.xtoSPIFFSLogger 
See the summary below and try the example. You may also want to take a peek at our documentation.
#include <SPIFFSLogger.h>This struct represents the data as stored in SPIFFS (including the timestamp). It is returned in any logger read operations.
Definition:
template <class T>
struct SPIFFSLogData
{
    time_t timestampUTC; /** creation time in UTC */
    T data;              /** data of type T */
};This is the core of the library. You can create your logger like so:
// store ints, saving files in /log/ and keeping today + 7 days of history
SPIFFSLogger<int> logger("/log", 7);We can also store a struct (which is probably more useful!):
struct EnvData {
    float temperature;
    float humidity;
    uint16_t pressure;
};
SPIFFSLogger<EnvData> logger("/log", 7);This library uses the ESP8266 SPIFFS and built-in time functions so you must initialize those components and then call logger.init().
Your setup() should look something like this:
void setup() {
    // configure time however you like, we use NTP here
    wifiSetup(); // ommitted for brevity
    configTime(0, 0, "pool.ntp.org");
    
    // initialize SPIFFS
    SPIFFS.begin();
    
    // initialize our logger
    logger.init();
}You must call logger.process() in your loop to run the required operations (file updates and rotation). E.g.:
void loop() {
    // your code is here
    logger.process();
}Simply call logger.write() and the data will be logged with the current timestamp:
struct EnvData data = { 23.54, 50.67, 1020 };
logger.write(data);Reading the first row of today's logfile:
SPIFFSLogData<EnvData> data;
logger.readRows(&data, time(nullptr), 0, 1);
Serial.printf("TS: %d, T: %.2f, H: %.2f, %u\n",
              data.timestampUTC,
              data.data.temperature,
              data.data.humidity,
              data.data.pressure);Or the last row:
const time_t now = time(nullptr);
const size_t rowCount = logger.rowCount(now);
logger.readRows(&data, now, rowCount - 1, 1);Or 25 rows starting at the 50th:
SPIFFSLogData<EnvData> data[25];
logger.readRows(data, time(nullptr), 49, 25);Retrieving data from the last 20 minutes:
SPIFFSLogData<EnvData> data[25];
size_t count = logger.readRowsBetween(
                       &data,                // output
                       now - (60 * 20),      // time start (inclusive)
                       now,                  // time end (inclusive)
                       0,                    // start index within results
                       25                    // max number of rows to fetch
);
for (int i=0; i<count; i++) {
    Serial.printf("TS: %d, T: %.2f, H: %.2f, %u\n",
                  data[i].timestampUTC,
                  data[i].data.temperature,
                  data[i].data.humidity,
                  data[i].data.pressure);
}Licensed under the GNU LGPLv3, see the LICENSE file.