|
@ -9,89 +9,89 @@ Copyright (C) 2016 by Xose Pérez <xose dot perez at gmail dot com> |
|
|
|
|
|
|
|
|
#if ENABLE_EMON
|
|
|
#if ENABLE_EMON
|
|
|
|
|
|
|
|
|
#include <EmonLiteESP.h>
|
|
|
|
|
|
|
|
|
|
|
|
EmonLiteESP emon; |
|
|
|
|
|
double current; |
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
// 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; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void setCurrentRatio(float value) { |
|
|
|
|
|
emon.setCurrentRatio(value); |
|
|
|
|
|
} |
|
|
|
|
|
double getCurrent() { |
|
|
|
|
|
return current; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
unsigned int currentCallback() { |
|
|
|
|
|
return analogRead(EMON_CURRENT_PIN); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
next_measurement += EMON_INTERVAL; |
|
|
|
|
|
|
|
|
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
|
|
|
#endif
|