Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
4.9 KiB

// -----------------------------------------------------------------------------
// Abstract emon sensor class (other sensor classes extend this class)
// Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
// -----------------------------------------------------------------------------
#pragma once
#include "../sensor.h"
#include "BaseSensor.h"
class BaseEmonSensor : public BaseSensor {
public:
BaseEmonSensor(size_t devices) :
_energy(devices),
_devices(devices)
{}
BaseEmonSensor() :
BaseEmonSensor(1)
{}
unsigned char type() {
return sensor::type::Emon;
}
// --- energy monitoring --
virtual void resizeDevices(size_t devices) {
_energy.resize(devices);
_devices = devices;
}
virtual size_t countDevices() {
return _devices;
}
virtual void resetEnergy(unsigned char index, sensor::Energy energy) {
_energy[index] = energy;
}
virtual void resetEnergy(unsigned char index) {
_energy[index].reset();
};
virtual void resetEnergy() {
for (auto& energy : _energy) {
energy.reset();
}
}
virtual sensor::Energy totalEnergy(unsigned char index) {
return _energy[index];
}
virtual sensor::Energy totalEnergy() {
return totalEnergy(0);
}
virtual double getEnergy(unsigned char index) {
return _energy[index].asDouble();
}
virtual double getEnergy() {
return getEnergy(0);
}
// --- configuration ---
virtual double defaultVoltage() {
return 0.0;
}
// when sensor needs explicit mains voltage value
virtual void setVoltage(double) {}
virtual void setVoltage(unsigned char index, double value) {
setVoltage(value);
}
virtual double getVoltage() {
return defaultVoltage();
}
virtual double getVoltage(unsigned char index) {
return getVoltage();
}
// when sensor implements ratios / multipliers
virtual void setCurrentRatio(double) {}
virtual void setVoltageRatio(double) {}
virtual void setPowerRatio(double) {}
virtual void setEnergyRatio(double) {}
// when sensor implements ratios / multipliers
virtual void setCurrentRatio(unsigned char index, double value) {
setCurrentRatio(value);
}
virtual void setVoltageRatio(unsigned char index, double value) {
setVoltageRatio(value);
}
virtual void setPowerRatio(unsigned char index, double value) {
setPowerRatio(value);
}
virtual void setEnergyRatio(unsigned char index, double value) {
setEnergyRatio(value);
}
// Generic ratio configuration, default is a
// no-op and must be implemented by the sensor class
virtual double defaultCurrentRatio() const {
return 0.0;
}
virtual double defaultVoltageRatio() const {
return 0.0;
}
virtual double defaultPowerRatio() const {
return 0.0;
}
virtual double defaultEnergyRatio() const {
return 0.0;
}
// when sensor implements a single device
virtual double getCurrentRatio() {
return defaultCurrentRatio();
}
virtual double getVoltageRatio() {
return defaultVoltageRatio();
}
virtual double getPowerRatio() {
return defaultPowerRatio();
}
virtual double getEnergyRatio() {
return defaultEnergyRatio();
}
// when sensor implements more than one device
virtual double getCurrentRatio(unsigned char index) {
return getCurrentRatio();
}
virtual double getVoltageRatio(unsigned char index) {
return getVoltageRatio();
}
virtual double getPowerRatio(unsigned char index) {
return getPowerRatio();
}
virtual double getEnergyRatio(unsigned char index) {
return getEnergyRatio();
}
virtual void expectedCurrent(double value) {}
virtual void expectedVoltage(unsigned int value) {}
virtual void expectedPower(unsigned int value) {}
virtual void expectedCurrent(unsigned char index, double value) {
expectedCurrent(value);
}
virtual void expectedVoltage(unsigned char index, unsigned int value) {
expectedVoltage(value);
}
virtual void expectedPower(unsigned char index, unsigned int value) {
expectedPower(value);
}
virtual void resetRatios() {}
protected:
std::vector<sensor::Energy> _energy;
size_t _devices;
};