Skip to content

Commit

Permalink
sns: deprecate global delta settings
Browse files Browse the repository at this point in the history
  • Loading branch information
mcspr committed Nov 22, 2021
1 parent a734a9e commit 1ef22e1
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 48 deletions.
6 changes: 6 additions & 0 deletions code/espurna/config/deprecated.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,9 @@
#define IR_RX_PRESET IR_BUTTON_SET
#warning "IR_BUTTON_SET was renamed to IR_RX_PRESET"
#endif

#if defined(TEMPERATURE_MIN_CHANGE) \
|| defined(HUMIDITY_MIN_CHANGE) \
|| defined(ENERGY_MAX_CHANGE)
#warning "Global MIN / MAX CHANGE is replaced with per-magnitude settings, please use ${prefix}MinDelta / ${prefix}MaxDelta"
#endif
12 changes: 0 additions & 12 deletions code/espurna/config/sensors.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,6 @@
#define SENSOR_REAL_TIME_VALUES 0 // Show filtered/median values by default (0 => median, 1 => real time)
#endif

#ifndef TEMPERATURE_MIN_CHANGE
#define TEMPERATURE_MIN_CHANGE 0.0 // Minimum temperature change to report
#endif

#ifndef HUMIDITY_MIN_CHANGE
#define HUMIDITY_MIN_CHANGE 0.0 // Minimum humidity change to report
#endif

#ifndef ENERGY_MAX_CHANGE
#define ENERGY_MAX_CHANGE 0.0 // Maximum energy change to report (if >0 it will allways report when delta(E) is greater than this)
#endif

#ifndef SENSOR_SAVE_EVERY
#define SENSOR_SAVE_EVERY 0 // Save accumulating values to EEPROM (atm only energy)
// A 0 means do not save and it's the default value
Expand Down
2 changes: 1 addition & 1 deletion code/espurna/config/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
#endif

#ifndef CFG_VERSION
#define CFG_VERSION 10
#define CFG_VERSION 11
#endif
57 changes: 22 additions & 35 deletions code/espurna/sensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,8 @@ class sensor_magnitude_t {

double last { _unset }; // Last raw value from sensor (unfiltered)
double reported { _unset }; // Last reported value
double min_change { 0.0 }; // Minimum value change to report
double max_change { 0.0 }; // Maximum value change to report
double min_delta { 0.0 }; // Minimum value change to report
double max_delta { 0.0 }; // Maximum value change to report
double correction { 0.0 }; // Value correction (applied when processing)

double zero_threshold { _unset }; // Reset value to zero when below threshold (applied when reading)
Expand Down Expand Up @@ -400,8 +400,12 @@ void Energy::reset() {
ws.value = 0;
}

namespace {
namespace build {

constexpr double DefaultMinDelta { 0.0 };
constexpr double DefaultMaxDelta { 0.0 };

constexpr espurna::duration::Seconds initInterval() {
return espurna::duration::Seconds(SENSOR_INIT_INTERVAL);
}
Expand Down Expand Up @@ -456,6 +460,7 @@ bool realTimeValues() {
}

} // namespace settings
} // namespace
} // namespace sensor

namespace settings {
Expand Down Expand Up @@ -1876,10 +1881,10 @@ void _sensorWebSocketSettings(JsonObject& root) {
}
}},
{F("MinDelta"), [](JsonArray& out, size_t index) {
out.add(_magnitudes[index].min_change);
out.add(_magnitudes[index].min_delta);
}},
{F("MaxDelta"), [](JsonArray& out, size_t index) {
out.add(_magnitudes[index].max_change);
out.add(_magnitudes[index].max_delta);
}}
});

Expand Down Expand Up @@ -3070,11 +3075,6 @@ void _sensorConfigure() {

_sensor_real_time = sensor::settings::realTimeValues();

// pre-load some settings that are controlled via old build flags
const auto tmp_min_delta = getSetting("tmpMinDelta", TEMPERATURE_MIN_CHANGE);
const auto hum_min_delta = getSetting("humMinDelta", HUMIDITY_MIN_CHANGE);
const auto ene_max_delta = getSetting("eneMaxDelta", ENERGY_MAX_CHANGE);

// Update magnitude config, filter sizes and reset energy if needed
{
for (auto& magnitude : _magnitudes) {
Expand Down Expand Up @@ -3128,32 +3128,13 @@ void _sensorConfigure() {
// - ${prefix}DeltaMax${index} will trigger report as soon as read value is greater than the specified delta
// (default is 0.0 as well, but this needs to be >0 to actually do something)
{
// TODO: we inherited these as settings and build flags, settings migration
// needs to happen some time after init to detect all of available magnitudes
auto min_default = 0.0;
auto max_default = 0.0;

switch (magnitude.type) {
case MAGNITUDE_TEMPERATURE:
min_default = tmp_min_delta;
break;
case MAGNITUDE_HUMIDITY:
min_default = hum_min_delta;
break;
case MAGNITUDE_ENERGY:
max_default = ene_max_delta;
break;
default:
break;
}

magnitude.min_change = getSetting(
magnitude.min_delta = getSetting(
{_magnitudeSettingsKey(magnitude, F("MinDelta")), magnitude.index_global},
min_default
sensor::build::DefaultMinDelta
);
magnitude.max_change = getSetting(
magnitude.max_delta = getSetting(
{_magnitudeSettingsKey(magnitude, F("MaxDelta")), magnitude.index_global},
max_default
sensor::build::DefaultMaxDelta
);
}

Expand Down Expand Up @@ -3312,6 +3293,12 @@ void _sensorSettingsMigrate(int version) {
moveSetting(F("snsHlw8012Cf1GPIO"), F("hlw8012CF1"));
}
#endif

if (version < 11) {
moveSetting(F("tmpMinDelta"), _magnitudeSettingsKey(MAGNITUDE_TEMPERATURE, F("MinDelta0")));
moveSetting(F("humMinDelta"), _magnitudeSettingsKey(MAGNITUDE_HUMIDITY, F("MinDelta0")));
moveSetting(F("eneMaxDelta"), _magnitudeSettingsKey(MAGNITUDE_ENERGY, F("MaxDelta0")));
}
}

} // namespace
Expand Down Expand Up @@ -3474,8 +3461,8 @@ void sensorLoop() {

// In case magnitude was configured with ${name}MaxDelta, override report check
// when the value change is greater than the delta
if (!std::isnan(magnitude.reported) && (magnitude.max_change > 0)) {
report = (std::abs(value.processed - magnitude.reported) >= magnitude.max_change);
if (!std::isnan(magnitude.reported) && (magnitude.max_delta > sensor::build::DefaultMaxDelta)) {
report = std::abs(value.processed - magnitude.reported) >= magnitude.max_delta;
}

// Special case for energy, save readings to RAM and EEPROM
Expand All @@ -3493,7 +3480,7 @@ void sensorLoop() {
}

// Check ${name}MinDelta if there is a minimum change threshold to report
if (std::isnan(magnitude.reported) || (std::abs(value.filtered - magnitude.reported) >= magnitude.min_change)) {
if (std::isnan(magnitude.reported) || (std::abs(value.filtered - magnitude.reported) >= magnitude.min_delta)) {
magnitude.reported = value.filtered;
_sensorReport(magnitude_index, magnitude);
}
Expand Down

0 comments on commit 1ef22e1

Please sign in to comment.