/*
|
|
|
|
SENSOR MODULE
|
|
|
|
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
|
|
Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
struct sensor_magnitude_t;
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
namespace sensor {
|
|
|
|
namespace type {
|
|
|
|
enum Type : unsigned char {
|
|
Base = 0,
|
|
Emon = 1 << 0,
|
|
Analog = 1 << 1
|
|
};
|
|
|
|
} // namespace type
|
|
|
|
enum class Unit : int {
|
|
Min_,
|
|
None,
|
|
Celcius,
|
|
Farenheit,
|
|
Kelvin,
|
|
Percentage,
|
|
Hectopascal,
|
|
Ampere,
|
|
Volt,
|
|
Voltampere,
|
|
Kilovoltampere,
|
|
VoltampereReactive,
|
|
KilovoltampereReactive,
|
|
Watt,
|
|
Kilowatt,
|
|
WattSecond,
|
|
Joule = WattSecond,
|
|
KilowattHour,
|
|
PartsPerMillion,
|
|
Ohm,
|
|
MicrogrammPerCubicMeter, // The concentration of an air pollutant
|
|
MilligrammPerCubicMeter, //
|
|
Lux,
|
|
UltravioletIndex, // "measurement of the strength of sunburn-producing ultraviolet (UV) radiation at a particular place and time"
|
|
// (XXX: Not a unit. Distinguish from None and specify decimals)
|
|
CountsPerMinute, // Unit of local dose rate (Geiger counting)
|
|
MicrosievertPerHour, // 2nd unit of local dose rate (Geiger counting)
|
|
Meter,
|
|
Max_
|
|
};
|
|
|
|
// Base units are 32 bit since we are the fastest with them.
|
|
|
|
struct Ws {
|
|
Ws();
|
|
Ws(uint32_t);
|
|
uint32_t value;
|
|
};
|
|
|
|
struct Wh {
|
|
Wh();
|
|
Wh(Ws);
|
|
Wh(uint32_t);
|
|
uint32_t value;
|
|
};
|
|
|
|
struct KWh {
|
|
KWh();
|
|
KWh(Ws);
|
|
KWh(Wh);
|
|
KWh(uint32_t);
|
|
uint32_t value;
|
|
};
|
|
|
|
struct Energy {
|
|
|
|
constexpr static uint32_t KwhMultiplier = 3600000ul;
|
|
constexpr static uint32_t KwhLimit = ((1ul << 31ul) / KwhMultiplier);
|
|
|
|
Energy() = default;
|
|
|
|
// TODO: while we accept ws >= the kwh conversion limit,
|
|
// should this be dealt with on the unit level?
|
|
Energy(double);
|
|
Energy(KWh, Ws);
|
|
Energy(KWh);
|
|
Energy(Wh);
|
|
Energy(Ws);
|
|
|
|
// Sets internal counters to zero
|
|
void reset();
|
|
|
|
// Check whether we have *any* energy recorded. Can be zero:
|
|
// - on cold boot
|
|
// - on overflow
|
|
// - when we call `reset()`
|
|
operator bool();
|
|
|
|
// Generic conversion as-is
|
|
double asDouble();
|
|
|
|
// Convert back to input unit, with overflow mechanics when kwh values goes over 32 bit
|
|
Ws asWs();
|
|
|
|
// Generic sensors output energy in joules / watt-second
|
|
Energy& operator +=(Ws);
|
|
Energy operator +(Ws);
|
|
|
|
// But sometimes we want to accept asDouble() value back
|
|
Energy& operator =(double);
|
|
|
|
// We are storing a kind-of integral and fractional parts
|
|
// Using watt-second to avoid loosing precision, we don't expect these to be accessed directly
|
|
KWh kwh;
|
|
Ws ws;
|
|
};
|
|
|
|
}
|
|
|
|
String magnitudeName(unsigned char index);
|
|
String magnitudeUnits(unsigned char index);
|
|
unsigned char magnitudeType(unsigned char index);
|
|
|
|
// XXX: without param name it is kind of vague what exactly unsigned char is
|
|
// consider using index instead of type or adding stronger param type
|
|
String magnitudeTopic(unsigned char type);
|
|
|
|
String magnitudeTopic(const sensor_magnitude_t& magnitude);
|
|
String magnitudeUnits(const sensor_magnitude_t& magnitude);
|
|
|
|
unsigned char sensorCount();
|
|
unsigned char magnitudeCount();
|
|
|
|
double magnitudeValue(unsigned char index);
|
|
|
|
unsigned char magnitudeIndex(unsigned char index);
|
|
String magnitudeTopicIndex(unsigned char index);
|
|
|
|
void sensorSetup();
|
|
void sensorLoop();
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
#include "filters/LastFilter.h"
|
|
#include "filters/MaxFilter.h"
|
|
#include "filters/MedianFilter.h"
|
|
#include "filters/MovingAverageFilter.h"
|
|
#include "filters/SumFilter.h"
|
|
|
|
#include "sensors/BaseSensor.h"
|
|
#include "sensors/BaseEmonSensor.h"
|
|
#include "sensors/BaseAnalogSensor.h"
|
|
|
|
#if AM2320_SUPPORT
|
|
#include "sensors/AM2320Sensor.h"
|
|
#endif
|
|
|
|
#if ANALOG_SUPPORT
|
|
#include "sensors/AnalogSensor.h"
|
|
#endif
|
|
|
|
#if BH1750_SUPPORT
|
|
#include "sensors/BH1750Sensor.h"
|
|
#endif
|
|
|
|
#if BMP180_SUPPORT
|
|
#include "sensors/BMP180Sensor.h"
|
|
#endif
|
|
|
|
#if BMX280_SUPPORT
|
|
#include "sensors/BMX280Sensor.h"
|
|
#endif
|
|
|
|
#if CSE7766_SUPPORT
|
|
#include "sensors/CSE7766Sensor.h"
|
|
#endif
|
|
|
|
#if DALLAS_SUPPORT
|
|
#include "sensors/DallasSensor.h"
|
|
#endif
|
|
|
|
#if DHT_SUPPORT
|
|
#include "sensors/DHTSensor.h"
|
|
#endif
|
|
|
|
#if DIGITAL_SUPPORT
|
|
#include "sensors/DigitalSensor.h"
|
|
#endif
|
|
|
|
#if ECH1560_SUPPORT
|
|
#include "sensors/ECH1560Sensor.h"
|
|
#endif
|
|
|
|
#if EMON_ADC121_SUPPORT
|
|
#include "sensors/EmonADC121Sensor.h"
|
|
#endif
|
|
|
|
#if EMON_ADS1X15_SUPPORT
|
|
#include "sensors/EmonADS1X15Sensor.h"
|
|
#endif
|
|
|
|
#if EMON_ANALOG_SUPPORT
|
|
#include "sensors/EmonAnalogSensor.h"
|
|
#endif
|
|
|
|
#if EVENTS_SUPPORT
|
|
#include "sensors/EventSensor.h"
|
|
#endif
|
|
|
|
#if EZOPH_SUPPORT
|
|
#include "sensors/EZOPHSensor.h"
|
|
#endif
|
|
|
|
#if GEIGER_SUPPORT
|
|
#include "sensors/GeigerSensor.h"
|
|
#endif
|
|
|
|
#if GUVAS12SD_SUPPORT
|
|
#include "sensors/GUVAS12SDSensor.h"
|
|
#endif
|
|
|
|
#if HLW8012_SUPPORT
|
|
#include "sensors/HLW8012Sensor.h"
|
|
#endif
|
|
|
|
#if LDR_SUPPORT
|
|
#include "sensors/LDRSensor.h"
|
|
#endif
|
|
|
|
#if MAX6675_SUPPORT
|
|
#include "sensors/MAX6675Sensor.h"
|
|
#endif
|
|
|
|
#if MICS2710_SUPPORT
|
|
#include "sensors/MICS2710Sensor.h"
|
|
#endif
|
|
|
|
#if MICS5525_SUPPORT
|
|
#include "sensors/MICS5525Sensor.h"
|
|
#endif
|
|
|
|
#if MHZ19_SUPPORT
|
|
#include "sensors/MHZ19Sensor.h"
|
|
#endif
|
|
|
|
#if NTC_SUPPORT
|
|
#include "sensors/NTCSensor.h"
|
|
#endif
|
|
|
|
#if SDS011_SUPPORT
|
|
#include "sensors/SDS011Sensor.h"
|
|
#endif
|
|
|
|
#if SENSEAIR_SUPPORT
|
|
#include "sensors/SenseAirSensor.h"
|
|
#endif
|
|
|
|
#if PMSX003_SUPPORT
|
|
#include "sensors/PMSX003Sensor.h"
|
|
#endif
|
|
|
|
#if PULSEMETER_SUPPORT
|
|
#include "sensors/PulseMeterSensor.h"
|
|
#endif
|
|
|
|
#if PZEM004T_SUPPORT
|
|
#include "sensors/PZEM004TSensor.h"
|
|
#endif
|
|
|
|
#if SHT3X_I2C_SUPPORT
|
|
#include "sensors/SHT3XI2CSensor.h"
|
|
#endif
|
|
|
|
#if SI7021_SUPPORT
|
|
#include "sensors/SI7021Sensor.h"
|
|
#endif
|
|
|
|
#if SONAR_SUPPORT
|
|
#include "sensors/SonarSensor.h"
|
|
#endif
|
|
|
|
#if T6613_SUPPORT
|
|
#include "sensors/T6613Sensor.h"
|
|
#endif
|
|
|
|
#if TMP3X_SUPPORT
|
|
#include "sensors/TMP3XSensor.h"
|
|
#endif
|
|
|
|
#if V9261F_SUPPORT
|
|
#include "sensors/V9261FSensor.h"
|
|
#endif
|
|
|
|
#if VEML6075_SUPPORT
|
|
#include "sensors/VEML6075Sensor.h"
|
|
#endif
|
|
|
|
#if VL53L1X_SUPPORT
|
|
#include "sensors/VL53L1XSensor.h"
|
|
#endif
|
|
|
|
#if ADE7953_SUPPORT
|
|
#include "sensors/ADE7953Sensor.h"
|
|
#endif
|
|
|
|
#if SI1145_SUPPORT
|
|
#include "sensors/SI1145Sensor.h"
|
|
#endif
|
|
|
|
#if HDC1080_SUPPORT
|
|
#include "sensors/HDC1080Sensor.h"
|
|
#endif
|
|
//--------------------------------------------------------------------------------
|
|
|