71#if defined(ESP32) || defined(ESP8266)
74#include "RollingCounter.h"
75#if defined(RAINGAUGE_USE_PREFS) && !defined(INSIDE_UNITTEST)
76 #include <Preferences.h>
84#define RAINGAUGE_MAX_VALUE 1000
92#define RAINGAUGE_UPD_RATE 6
99#define RAIN_HIST_SIZE 10
106#define RAIN_HIST_SIZE_24H 24
112 #define RESET_RAIN_H 1
113 #define RESET_RAIN_D 2
114 #define RESET_RAIN_W 4
115 #define RESET_RAIN_M 8
116 #define RESET_RAIN_24H 16
129 int16_t hist[RAIN_HIST_SIZE];
132 int16_t hist24h[RAIN_HIST_SIZE_24H];
136 float rainPreStartup;
148 uint8_t tsMonthBegin;
149 float rainMonthBegin;
169 #if defined(RAINGAUGE_USE_PREFS) || defined(INSIDE_UNITTEST)
174 .startupPrev =
false,
181 .tsMonthBegin = 0xFF,
185 .updateRate = RAINGAUGE_UPD_RATE
188 #if defined(RAINGAUGE_USE_PREFS) && !defined(INSIDE_UNITTEST)
189 Preferences preferences;
199 RainGauge(
const float raingauge_max = RAINGAUGE_MAX_VALUE,
const float quality_threshold = DEFAULT_QUALITY_THRESHOLD) :
201 raingaugeMax(raingauge_max)
211 raingaugeMax = raingauge_max;
245 log_w(
"setUpdateRate: rate cannot be 0");
248 if (60 % rate != 0) {
249 log_w(
"setUpdateRate: rate=%u must evenly divide 60 minutes", rate);
252 if (60 / rate > RAIN_HIST_SIZE) {
253 log_w(
"setUpdateRate: rate=%u would require %u bins, but only %u available",
254 rate, 60 / rate, RAIN_HIST_SIZE);
258 #if !defined(INSIDE_UNITTEST)
259 preferences.begin(
"BWS-RAIN",
false);
260 uint8_t updateRatePrev = preferences.getUChar(
"updateRate", RAINGAUGE_UPD_RATE);
261 preferences.putUChar(
"updateRate", rate);
264 static uint8_t updateRatePrev = RAINGAUGE_UPD_RATE;
265 updateRatePrev = nvData.updateRate;
267 nvData.updateRate = rate;
268 if (nvData.updateRate != updateRatePrev) {
279 void reset(uint8_t flags=0x1F);
286 void hist_init(int16_t rain = -1)
override;
295 #if defined(RAINGAUGE_USE_PREFS) && !defined(INSIDE_UNITTEST)
296 void prefs_load(
void);
297 void prefs_save(
void);
311 void update(time_t ts,
float rain,
bool startup =
false);
322 float pastHour(
bool *valid =
nullptr,
int *nbins =
nullptr,
float *quality =
nullptr);
333 float past24Hours(
bool *valid =
nullptr,
int *nbins =
nullptr,
float *quality =
nullptr);
Calculation of hourly (past 60 minutes), daily, weekly and monthly rainfall.
Definition RainGauge.h:164
float pastHour(bool *valid=nullptr, int *nbins=nullptr, float *quality=nullptr)
Definition RainGauge.cpp:455
float currentWeek(void)
Definition RainGauge.cpp:486
float currentMonth(void)
Definition RainGauge.cpp:495
bool setUpdateRate(uint8_t rate=RAINGAUGE_UPD_RATE)
Set expected update rate for pastHour() calculation.
Definition RainGauge.h:242
void set_max(float raingauge_max)
Definition RainGauge.h:209
float currentDay(void)
Definition RainGauge.cpp:477
RainGauge(const float raingauge_max=RAINGAUGE_MAX_VALUE, const float quality_threshold=DEFAULT_QUALITY_THRESHOLD)
Definition RainGauge.h:199
void hist24h_init(int16_t rain=-1)
Definition RainGauge.cpp:188
void reset(uint8_t flags=0x1F)
Definition RainGauge.cpp:98
float past24Hours(bool *valid=nullptr, int *nbins=nullptr, float *quality=nullptr)
Definition RainGauge.cpp:466
void hist_init(int16_t rain=-1) override
Definition RainGauge.cpp:180
void update(time_t ts, float rain, bool startup=false)
Update rain gauge statistics.
Definition RainGauge.cpp:275
Base class for rolling counter implementations.
Definition RollingCounter.h:78
Definition RainGauge.h:124