/*
|
|
|
|
ESPurna
|
|
EMON MODULE
|
|
|
|
Copyright (C) 2016 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
*/
|
|
|
|
#if ENABLE_EMON
|
|
|
|
#include <EmonLiteESP.h>
|
|
|
|
EmonLiteESP emon;
|
|
double current;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// EMON
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void setCurrentRatio(float value) {
|
|
emon.setCurrentRatio(value);
|
|
}
|
|
double getCurrent() {
|
|
return current;
|
|
}
|
|
|
|
unsigned int currentCallback() {
|
|
return analogRead(EMON_CURRENT_PIN);
|
|
}
|
|
|
|
void powerMonitorSetup() {
|
|
emon.initCurrent(
|
|
currentCallback,
|
|
EMON_ADC_BITS,
|
|
EMON_REFERENCE_VOLTAGE,
|
|
getSetting("pwCurrentRatio", String(EMON_CURRENT_RATIO)).toFloat()
|
|
);
|
|
emon.setPrecision(EMON_CURRENT_PRECISION);
|
|
}
|
|
|
|
void powerMonitorLoop() {
|
|
|
|
static unsigned long next_measurement = millis();
|
|
static byte measurements = 0;
|
|
static double max = 0;
|
|
static double min = 0;
|
|
static double sum = 0;
|
|
|
|
if (!mqttConnected()) return;
|
|
|
|
if (millis() > next_measurement) {
|
|
|
|
// Safety check: do not read current if relay is OFF
|
|
if (!digitalRead(RELAY_PIN)) {
|
|
current = 0;
|
|
} else {
|
|
current = emon.getCurrent(EMON_SAMPLES);
|
|
current -= EMON_CURRENT_OFFSET;
|
|
if (current < 0) current = 0;
|
|
}
|
|
|
|
if (measurements == 0) {
|
|
max = min = current;
|
|
} else {
|
|
if (current > max) max = current;
|
|
if (current < min) min = current;
|
|
}
|
|
sum += current;
|
|
++measurements;
|
|
|
|
float mainsVoltage = getSetting("pwMainsVoltage", String(EMON_MAINS_VOLTAGE)).toFloat();
|
|
|
|
//DEBUG_MSG("[ENERGY] Power now: %dW\n", int(current * mainsVoltage));
|
|
|
|
// Update websocket clients
|
|
char text[20];
|
|
sprintf_P(text, PSTR("{\"power\": %d}"), int(current * mainsVoltage));
|
|
webSocketSend(text);
|
|
|
|
// Send MQTT messages averaged every EMON_MEASUREMENTS
|
|
if (measurements == EMON_MEASUREMENTS) {
|
|
char buffer[8];
|
|
double power = (sum - max - min) * mainsVoltage / (measurements - 2);
|
|
sprintf(buffer, "%d", int(power));
|
|
mqttSend((char *) getSetting("emonPowerTopic", EMON_POWER_TOPIC).c_str(), buffer);
|
|
sum = 0;
|
|
measurements = 0;
|
|
}
|
|
|
|
next_measurement += EMON_INTERVAL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|