Browse Source

Rename settings names from POW to HLW8012

fastled
Xose Pérez 7 years ago
parent
commit
59ced72001
7 changed files with 102 additions and 102 deletions
  1. +1
    -1
      code/espurna/config/arduino.h
  2. +2
    -2
      code/espurna/config/hardware.h
  3. +25
    -25
      code/espurna/config/sensors.h
  4. +4
    -4
      code/espurna/espurna.ino
  5. +58
    -58
      code/espurna/hlw8012.ino
  6. +7
    -7
      code/espurna/web.ino
  7. +5
    -5
      code/espurna/wifi.ino

+ 1
- 1
code/espurna/config/arduino.h View File

@ -38,7 +38,7 @@
//#define ENABLE_DHT 1
//#define ENABLE_DS18B20 1
//#define ENABLE_EMON 1
//#define ENABLE_POW 1
//#define ENABLE_HLW8012 1
//#define ENABLE_RF 1
//#define ENABLE_FAUXMO 0
//#define ENABLE_NOFUSS 1


+ 2
- 2
code/espurna/config/hardware.h View File

@ -59,7 +59,7 @@
#define BUTTON1_PIN 4
#define BUTTON1_RELAY 1
#define BUTTON1_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define ENABLE_POW 1
#define ENABLE_HLW8012 1
// -----------------------------------------------------------------------------
// Itead Studio boards
@ -148,7 +148,7 @@
#define RELAY1_PIN_INVERSE 0
#define LED1_PIN 15
#define LED1_PIN_INVERSE 0
#define ENABLE_POW 1
#define ENABLE_HLW8012 1
#elif defined(SONOFF_DUAL)


+ 25
- 25
code/espurna/config/sensors.h View File

@ -91,37 +91,37 @@
#define EMON_CURRENT_TOPIC "current"
//--------------------------------------------------------------------------------
// HLW8012 power sensor (Sonoff POW)
// Enable support by passing ENABLE_POW=1 build flag
// HLW8012 power sensor (Sonoff POW, Espurna H)
// Enable support by passing ENABLE_HLW8012=1 build flag
// Enabled by default when selecting SONOFF_POW hardware
//--------------------------------------------------------------------------------
#ifdef ESPURNA_H
#define POW_SEL_PIN 2
#define HLW8012_SEL_PIN 2
#else
#define POW_SEL_PIN 5
#define HLW8012_SEL_PIN 5
#endif
#define POW_CF1_PIN 13
#define POW_CF_PIN 14
#define POW_USE_INTERRUPTS 1
#define POW_SEL_CURRENT HIGH
#define POW_CURRENT_R 0.001
#define POW_VOLTAGE_R_UP ( 5 * 470000 ) // Real: 2280k
#define POW_VOLTAGE_R_DOWN ( 1000 ) // Real 1.009k
#define POW_POWER_TOPIC "power"
#define POW_CURRENT_TOPIC "current"
#define POW_VOLTAGE_TOPIC "voltage"
#define POW_APOWER_TOPIC "apower"
#define POW_RPOWER_TOPIC "rpower"
#define POW_PFACTOR_TOPIC "pfactor"
#define POW_ENERGY_TOPIC "energy"
#define POW_UPDATE_INTERVAL 5000
#define POW_REPORT_EVERY 12
#define POW_MIN_POWER 5
#define POW_MAX_POWER 2500
#define POW_MIN_CURRENT 0.05
#define POW_MAX_CURRENT 10
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 14
#define HLW8012_USE_INTERRUPTS 1
#define HLW8012_SEL_CURRENT HIGH
#define HLW8012_CURRENT_R 0.001
#define HLW8012_VOLTAGE_R_UP ( 5 * 470000 ) // Real: 2280k
#define HLW8012_VOLTAGE_R_DOWN ( 1000 ) // Real 1.009k
#define HLW8012_POWER_TOPIC "power"
#define HLW8012_CURRENT_TOPIC "current"
#define HLW8012_VOLTAGE_TOPIC "voltage"
#define HLW8012_APOWER_TOPIC "apower"
#define HLW8012_RPOWER_TOPIC "rpower"
#define HLW8012_PFACTOR_TOPIC "pfactor"
#define HLW8012_ENERGY_TOPIC "energy"
#define HLW8012_UPDATE_INTERVAL 5000
#define HLW8012_REPORT_EVERY 12
#define HLW8012_MIN_POWER 5
#define HLW8012_MAX_POWER 2500
#define HLW8012_MIN_CURRENT 0.05
#define HLW8012_MAX_CURRENT 10
//--------------------------------------------------------------------------------
// Internal power montior


+ 4
- 4
code/espurna/espurna.ino View File

@ -226,8 +226,8 @@ void setup() {
#if ENABLE_INFLUXDB
influxDBSetup();
#endif
#if ENABLE_POW
powSetup();
#if ENABLE_HLW8012
hlw8012Setup();
#endif
#if ENABLE_DS18B20
dsSetup();
@ -270,8 +270,8 @@ void loop() {
#if ENABLE_NOFUSS
nofussLoop();
#endif
#if ENABLE_POW
powLoop();
#if ENABLE_HLW8012
hlw8012Loop();
#endif
#if ENABLE_DS18B20
dsLoop();


+ 58
- 58
code/espurna/hlw8012.ino View File

@ -7,7 +7,7 @@ Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
*/
#if ENABLE_POW
#if ENABLE_HLW8012
#include <HLW8012.h>
#include <Hash.h>
@ -15,7 +15,7 @@ Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
#include <EEPROM.h>
HLW8012 hlw8012;
bool _powEnabled = false;
bool _hlw8012Enabled = false;
// -----------------------------------------------------------------------------
// POW
@ -31,18 +31,18 @@ void ICACHE_RAM_ATTR hlw8012_cf_interrupt() {
hlw8012.cf_interrupt();
}
void powEnable(bool status) {
_powEnabled = status;
if (_powEnabled) {
#if POW_USE_INTERRUPTS == 1
attachInterrupt(POW_CF1_PIN, hlw8012_cf1_interrupt, CHANGE);
attachInterrupt(POW_CF_PIN, hlw8012_cf_interrupt, CHANGE);
void hlw8012Enable(bool status) {
_hlw8012Enabled = status;
if (_hlw8012Enabled) {
#if HLW8012_USE_INTERRUPTS == 1
attachInterrupt(HLW8012_CF1_PIN, hlw8012_cf1_interrupt, CHANGE);
attachInterrupt(HLW8012_CF_PIN, hlw8012_cf_interrupt, CHANGE);
#endif
DEBUG_MSG_P(PSTR("[POW] Enabled\n"));
} else {
#if POW_USE_INTERRUPTS == 1
detachInterrupt(POW_CF1_PIN);
detachInterrupt(POW_CF_PIN);
#if HLW8012_USE_INTERRUPTS == 1
detachInterrupt(HLW8012_CF1_PIN);
detachInterrupt(HLW8012_CF_PIN);
#endif
DEBUG_MSG_P(PSTR("[POW] Disabled\n"));
}
@ -50,13 +50,13 @@ void powEnable(bool status) {
// -----------------------------------------------------------------------------
void powSaveCalibration() {
void hlw8012SaveCalibration() {
setSetting("powPowerMult", hlw8012.getPowerMultiplier());
setSetting("powCurrentMult", hlw8012.getCurrentMultiplier());
setSetting("powVoltageMult", hlw8012.getVoltageMultiplier());
}
void powRetrieveCalibration() {
void hlw8012RetrieveCalibration() {
double value;
value = getSetting("powPowerMult", 0).toFloat();
if (value > 0) hlw8012.setPowerMultiplier((int) value);
@ -66,55 +66,55 @@ void powRetrieveCalibration() {
if (value > 0) hlw8012.setVoltageMultiplier((int) value);
}
void powSetExpectedActivePower(unsigned int power) {
void hlw8012SetExpectedActivePower(unsigned int power) {
if (power > 0) {
hlw8012.expectedActivePower(power);
powSaveCalibration();
hlw8012SaveCalibration();
}
}
void powSetExpectedCurrent(double current) {
void hlw8012SetExpectedCurrent(double current) {
if (current > 0) {
hlw8012.expectedCurrent(current);
powSaveCalibration();
hlw8012SaveCalibration();
}
}
void powSetExpectedVoltage(unsigned int voltage) {
void hlw8012SetExpectedVoltage(unsigned int voltage) {
if (voltage > 0) {
hlw8012.expectedVoltage(voltage);
powSaveCalibration();
hlw8012SaveCalibration();
}
}
void powReset() {
void hlw8012Reset() {
hlw8012.resetMultipliers();
powSaveCalibration();
hlw8012SaveCalibration();
}
// -----------------------------------------------------------------------------
unsigned int getActivePower() {
unsigned int power = hlw8012.getActivePower();
if (POW_MIN_POWER > power || power > POW_MAX_POWER) power = 0;
if (HLW8012_MIN_POWER > power || power > HLW8012_MAX_POWER) power = 0;
return power;
}
unsigned int getApparentPower() {
unsigned int power = hlw8012.getApparentPower();
if (POW_MIN_POWER > power || power > POW_MAX_POWER) power = 0;
if (HLW8012_MIN_POWER > power || power > HLW8012_MAX_POWER) power = 0;
return power;
}
unsigned int getReactivePower() {
unsigned int power = hlw8012.getReactivePower();
if (POW_MIN_POWER > power || power > POW_MAX_POWER) power = 0;
if (HLW8012_MIN_POWER > power || power > HLW8012_MAX_POWER) power = 0;
return power;
}
double getCurrent() {
double current = hlw8012.getCurrent();
if (POW_MIN_CURRENT > current || current > POW_MAX_CURRENT) current = 0;
if (HLW8012_MIN_CURRENT > current || current > HLW8012_MAX_CURRENT) current = 0;
return current;
}
@ -128,7 +128,7 @@ double getPowerFactor() {
// -----------------------------------------------------------------------------
void powSetup() {
void hlw8012Setup() {
// Initialize HLW8012
// void begin(unsigned char cf_pin, unsigned char cf1_pin, unsigned char sel_pin, unsigned char currentWhen = HIGH, bool use_interrupts = false, unsigned long pulse_timeout = PULSE_TIMEOUT);
@ -136,10 +136,10 @@ void powSetup() {
// * currentWhen is the value in sel_pin to select current sampling
// * set use_interrupts to true to use interrupts to monitor pulse widths
// * leave pulse_timeout to the default value, recommended when using interrupts
#if POW_USE_INTERRUPTS
hlw8012.begin(POW_CF_PIN, POW_CF1_PIN, POW_SEL_PIN, POW_SEL_CURRENT, true);
#if HLW8012_USE_INTERRUPTS
hlw8012.begin(HLW8012_CF_PIN, HLW8012_CF1_PIN, HLW8012_SEL_PIN, HLW8012_SEL_CURRENT, true);
#else
hlw8012.begin(POW_CF_PIN, POW_CF1_PIN, POW_SEL_PIN, POW_SEL_CURRENT, false, 1000000);
hlw8012.begin(HLW8012_CF_PIN, HLW8012_CF1_PIN, HLW8012_SEL_PIN, HLW8012_SEL_CURRENT, false, 1000000);
#endif
// These values are used to calculate current, voltage and power factors as per datasheet formula
@ -147,28 +147,28 @@ void powSetup() {
// * The CURRENT_RESISTOR is the 1milliOhm copper-manganese resistor in series with the main line
// * The VOLTAGE_RESISTOR_UPSTREAM are the 5 470kOhm resistors in the voltage divider that feeds the V2P pin in the HLW8012
// * The VOLTAGE_RESISTOR_DOWNSTREAM is the 1kOhm resistor in the voltage divider that feeds the V2P pin in the HLW8012
hlw8012.setResistors(POW_CURRENT_R, POW_VOLTAGE_R_UP, POW_VOLTAGE_R_DOWN);
hlw8012.setResistors(HLW8012_CURRENT_R, HLW8012_VOLTAGE_R_UP, HLW8012_VOLTAGE_R_DOWN);
// Retrieve calibration values
powRetrieveCalibration();
hlw8012RetrieveCalibration();
// API definitions
apiRegister(POW_POWER_TOPIC, POW_POWER_TOPIC, [](char * buffer, size_t len) {
apiRegister(HLW8012_POWER_TOPIC, HLW8012_POWER_TOPIC, [](char * buffer, size_t len) {
snprintf(buffer, len, "%d", getActivePower());
});
apiRegister(POW_CURRENT_TOPIC, POW_CURRENT_TOPIC, [](char * buffer, size_t len) {
apiRegister(HLW8012_CURRENT_TOPIC, HLW8012_CURRENT_TOPIC, [](char * buffer, size_t len) {
dtostrf(getCurrent(), len-1, 3, buffer);
});
apiRegister(POW_VOLTAGE_TOPIC, POW_VOLTAGE_TOPIC, [](char * buffer, size_t len) {
apiRegister(HLW8012_VOLTAGE_TOPIC, HLW8012_VOLTAGE_TOPIC, [](char * buffer, size_t len) {
snprintf(buffer, len, "%d", getVoltage());
});
}
void powLoop() {
void hlw8012Loop() {
static unsigned long last_update = 0;
static unsigned char report_count = POW_REPORT_EVERY;
static unsigned char report_count = HLW8012_REPORT_EVERY;
static bool power_spike = false;
static unsigned long power_sum = 0;
@ -186,7 +186,7 @@ void powLoop() {
// POW is disabled while there is no internet connection
// When the HLW8012 measurements are enabled back we reset the timer
if (!_powEnabled) {
if (!_hlw8012Enabled) {
powWasEnabled = false;
return;
}
@ -195,7 +195,7 @@ void powLoop() {
powWasEnabled = true;
}
if (millis() - last_update > POW_UPDATE_INTERVAL) {
if (millis() - last_update > HLW8012_UPDATE_INTERVAL) {
last_update = millis();
@ -247,29 +247,29 @@ void powLoop() {
if (--report_count == 0) {
power = power_sum / POW_REPORT_EVERY;
current = current_sum / POW_REPORT_EVERY;
voltage = voltage_sum / POW_REPORT_EVERY;
power = power_sum / HLW8012_REPORT_EVERY;
current = current_sum / HLW8012_REPORT_EVERY;
voltage = voltage_sum / HLW8012_REPORT_EVERY;
apparent = current * voltage;
reactive = (apparent > power) ? sqrt(apparent * apparent - power * power) : 0;
factor = (apparent > 0) ? (double) power / apparent : 1;
if (factor > 1) factor = 1;
// Calculate energy increment (ppower times time) and create C-string
double energy_inc = (double) power * POW_REPORT_EVERY * POW_UPDATE_INTERVAL / 1000.0 / 3600.0;
double energy_inc = (double) power * HLW8012_REPORT_EVERY * HLW8012_UPDATE_INTERVAL / 1000.0 / 3600.0;
char energy_buf[11];
dtostrf(energy_inc, 11, 3, energy_buf);
char *e = energy_buf;
while ((unsigned char) *e == ' ') ++e;
// Report values to MQTT broker
mqttSend(getSetting("powPowerTopic", POW_POWER_TOPIC).c_str(), String(power).c_str());
mqttSend(getSetting("powEnergyTopic", POW_ENERGY_TOPIC).c_str(), e);
mqttSend(getSetting("powCurrentTopic", POW_CURRENT_TOPIC).c_str(), String(current, 3).c_str());
mqttSend(getSetting("powVoltageTopic", POW_VOLTAGE_TOPIC).c_str(), String(voltage).c_str());
mqttSend(getSetting("powAPowerTopic", POW_APOWER_TOPIC).c_str(), String(apparent).c_str());
mqttSend(getSetting("powRPowerTopic", POW_RPOWER_TOPIC).c_str(), String(reactive).c_str());
mqttSend(getSetting("powPFactorTopic", POW_PFACTOR_TOPIC).c_str(), String(factor, 2).c_str());
mqttSend(getSetting("powPowerTopic", HLW8012_POWER_TOPIC).c_str(), String(power).c_str());
mqttSend(getSetting("powEnergyTopic", HLW8012_ENERGY_TOPIC).c_str(), e);
mqttSend(getSetting("powCurrentTopic", HLW8012_CURRENT_TOPIC).c_str(), String(current, 3).c_str());
mqttSend(getSetting("powVoltageTopic", HLW8012_VOLTAGE_TOPIC).c_str(), String(voltage).c_str());
mqttSend(getSetting("powAPowerTopic", HLW8012_APOWER_TOPIC).c_str(), String(apparent).c_str());
mqttSend(getSetting("powRPowerTopic", HLW8012_RPOWER_TOPIC).c_str(), String(reactive).c_str());
mqttSend(getSetting("powPFactorTopic", HLW8012_PFACTOR_TOPIC).c_str(), String(factor, 2).c_str());
// Report values to Domoticz
#if ENABLE_DOMOTICZ
@ -287,18 +287,18 @@ void powLoop() {
#endif
#if ENABLE_INFLUXDB
influxDBSend(getSetting("powPowerTopic", POW_POWER_TOPIC).c_str(), String(power).c_str());
//influxDBSend(getSetting("powEnergyTopic", POW_ENERGY_TOPIC).c_str(), e);
//influxDBSend(getSetting("powCurrentTopic", POW_CURRENT_TOPIC).c_str(), String(current, 3).c_str());
//influxDBSend(getSetting("powVoltageTopic", POW_VOLTAGE_TOPIC).c_str(), String(voltage).c_str());
//influxDBSend(getSetting("powAPowerTopic", POW_APOWER_TOPIC).c_str(), String(apparent).c_str());
//influxDBSend(getSetting("powRPowerTopic", POW_RPOWER_TOPIC).c_str(), String(reactive).c_str());
//influxDBSend(getSetting("powPFactorTopic", POW_PFACTOR_TOPIC).c_str(), String(factor, 2).c_str());
influxDBSend(getSetting("powPowerTopic", HLW8012_POWER_TOPIC).c_str(), String(power).c_str());
//influxDBSend(getSetting("powEnergyTopic", HLW8012_ENERGY_TOPIC).c_str(), e);
//influxDBSend(getSetting("powCurrentTopic", HLW8012_CURRENT_TOPIC).c_str(), String(current, 3).c_str());
//influxDBSend(getSetting("powVoltageTopic", HLW8012_VOLTAGE_TOPIC).c_str(), String(voltage).c_str());
//influxDBSend(getSetting("powAPowerTopic", HLW8012_APOWER_TOPIC).c_str(), String(apparent).c_str());
//influxDBSend(getSetting("powRPowerTopic", HLW8012_RPOWER_TOPIC).c_str(), String(reactive).c_str());
//influxDBSend(getSetting("powPFactorTopic", HLW8012_PFACTOR_TOPIC).c_str(), String(factor, 2).c_str());
#endif
// Reset counters
power_sum = current_sum = voltage_sum = 0;
report_count = POW_REPORT_EVERY;
report_count = HLW8012_REPORT_EVERY;
}
@ -308,7 +308,7 @@ void powLoop() {
voltage_sum += voltage_previous;
// Toggle between current and voltage monitoring
#if POW_USE_INTERRUPTS == 0
#if HLW8012_USE_INTERRUPTS == 0
hlw8012.toggleMode();
#endif


+ 7
- 7
code/espurna/web.ino View File

@ -178,25 +178,25 @@ void _wsParse(uint32_t client_id, uint8_t * payload, size_t length) {
// Skip firmware filename
if (key.equals("filename")) continue;
#if ENABLE_POW
#if ENABLE_HLW8012
if (key == "powExpectedPower") {
powSetExpectedActivePower(value.toInt());
hlw8012SetExpectedActivePower(value.toInt());
changed = true;
}
if (key == "powExpectedVoltage") {
powSetExpectedVoltage(value.toInt());
hlw8012SetExpectedVoltage(value.toInt());
changed = true;
}
if (key == "powExpectedCurrent") {
powSetExpectedCurrent(value.toFloat());
hlw8012SetExpectedCurrent(value.toFloat());
changed = true;
}
if (key == "powExpectedReset") {
powReset();
hlw8012Reset();
changed = true;
}
@ -488,7 +488,7 @@ void _wsStart(uint32_t client_id) {
root["dczAnaIdx"] = getSetting("dczAnaIdx").toInt();
#endif
#if ENABLE_POW
#if ENABLE_HLW8012
root["dczPowIdx"] = getSetting("dczPowIdx").toInt();
root["dczEnergyIdx"] = getSetting("dczEnergyIdx").toInt();
root["dczVoltIdx"] = getSetting("dczVoltIdx").toInt();
@ -540,7 +540,7 @@ void _wsStart(uint32_t client_id) {
root["analogValue"] = getAnalog();
#endif
#if ENABLE_POW
#if ENABLE_HLW8012
root["powVisible"] = 1;
root["powActivePower"] = getActivePower();
root["powApparentPower"] = getApparentPower();


+ 5
- 5
code/espurna/wifi.ino View File

@ -27,8 +27,8 @@ String getNetwork() {
}
void wifiDisconnect() {
#if ENABLE_POW
powEnable(false);
#if ENABLE_HLW8012
hlw8012Enable(false);
#endif
jw.disconnect();
}
@ -196,12 +196,12 @@ void wifiSetup() {
}
// Manage POW
#if ENABLE_POW
#if ENABLE_HLW8012
if (code == MESSAGE_CONNECTED) {
powEnable(true);
hlw8012Enable(true);
}
if (code == MESSAGE_DISCONNECTED) {
powEnable(false);
hlw8012Enable(false);
}
#endif


Loading…
Cancel
Save