Sensor3/lib/patrix/sensors/DallasSensor.h

92 lines
1.9 KiB
C++

#ifndef SENSOR2_DALLAS_SENSOR_H
#define SENSOR2_DALLAS_SENSOR_H
#include "base.h"
#include "Dallas.h"
#include "wifi.h"
#include "mqtt.h"
#include "data.h"
class DallasSensor {
private:
Dallas &sensors;
uint64_t address;
const double valueThreshold;
const time_t timeoutSec;
const time_t minIntervalMillis;
double lastSentValue = NAN;
unsigned long lastSentMillis = 0;
double lastValue = NAN;
time_t lastTimestamp = 0;
double lastValidValue = NAN;
time_t lastValidTimestamp = 0;
public:
DallasSensor(Dallas &sensors, const uint64_t address, const double valueThreshold, const time_t timeoutSec, const time_t minIntervalMillis) :
sensors(sensors),
address(address),
valueThreshold(valueThreshold),
timeoutSec(timeoutSec),
minIntervalMillis(minIntervalMillis) {
// -
}
bool loop() {
const time_t now = getTime();
if (now - lastTimestamp > timeoutSec) {
lastTimestamp = 0;
lastValue = NAN;
}
if (sensors.isConverted()) {
const double value = sensors.read(address);
const time_t timestamp = sensors.getTimestamp();
const unsigned long millisNow = millis();
const bool doPublish = !isnan(value) && (abs(lastSentValue - value) >= valueThreshold || millisNow - lastSentMillis >= minIntervalMillis);
if (doPublish) {
lastSentValue = value;
lastSentMillis = millisNow;
}
lastValue = value;
lastTimestamp = timestamp;
if (!isnan(value)) {
lastValidValue = value;
lastValidTimestamp = timestamp;
}
return doPublish;
}
return false;
}
[[nodiscard]] double getLastValue() const {
return lastValue;
}
[[nodiscard]] time_t getLastTimestamp() const {
return lastTimestamp;
}
[[nodiscard]] double getLastValidValue() const {
return lastValidValue;
}
[[nodiscard]] time_t getLastValidTimestamp() const {
return lastValidTimestamp;
}
};
#endif