diff --git a/esphome/components/hlw8012/hlw8012.cpp b/esphome/components/hlw8012/hlw8012.cpp index c5138b7562..2b3b4ec2d9 100644 --- a/esphome/components/hlw8012/hlw8012.cpp +++ b/esphome/components/hlw8012/hlw8012.cpp @@ -13,8 +13,8 @@ void HLW8012Component::setup() { ESP_LOGCONFIG(TAG, "Setting up HLW8012..."); this->sel_pin_->setup(); this->sel_pin_->digital_write(this->current_mode_); - this->cf_store_.setup(this->cf_pin_); - this->cf1_store_.setup(this->cf1_pin_); + this->cf_store_.pulse_counter_setup(this->cf_pin_); + this->cf1_store_.pulse_counter_setup(this->cf1_pin_); } void HLW8012Component::dump_config() { ESP_LOGCONFIG(TAG, "HLW8012:"); @@ -32,18 +32,18 @@ void HLW8012Component::dump_config() { float HLW8012Component::get_setup_priority() const { return setup_priority::DATA; } void HLW8012Component::update() { // HLW8012 has 50% duty cycle - const uint32_t last_rise_cf = this->cf_store_.get_last_rise(); - const uint32_t last_rise_cf1 = this->cf1_store_.get_last_rise(); - const uint32_t now = micros(); - float full_cycle_cf = this->cf_store_.get_pulse_width_s() * 2; - float full_cycle_cf1 = this->cf1_store_.get_pulse_width_s() * 2; - float cf_hz = 0.0f, cf1_hz = 0.0f; - auto update_interval_micros = static_cast(this->update_interval_ * 1e3f); - - if (full_cycle_cf != 0.0f && now - last_rise_cf < update_interval_micros * 3) - cf_hz = 1.0f / full_cycle_cf; - if (full_cycle_cf1 != 0.0f && now - last_rise_cf1 < update_interval_micros * 3) - cf1_hz = 1.0f / full_cycle_cf1; + pulse_counter::pulse_counter_t raw_cf = this->cf_store_.read_raw_value(); + pulse_counter::pulse_counter_t raw_cf1 = this->cf1_store_.read_raw_value(); + float cf_hz = raw_cf / (this->get_update_interval() / 1000.0f); + if (raw_cf <= 1) { + // don't count single pulse as power + cf_hz = 0.0f; + } + float cf1_hz = raw_cf1 / (this->get_update_interval() / 1000.0f); + if (raw_cf1 <= 1) { + // don't count single pulse as anything + cf1_hz = 0.0f; + } if (this->nth_value_++ < 2) { return; diff --git a/esphome/components/hlw8012/hlw8012.h b/esphome/components/hlw8012/hlw8012.h index 3eb1ea97c9..b9321b51c6 100644 --- a/esphome/components/hlw8012/hlw8012.h +++ b/esphome/components/hlw8012/hlw8012.h @@ -3,7 +3,7 @@ #include "esphome/core/component.h" #include "esphome/core/esphal.h" #include "esphome/components/sensor/sensor.h" -#include "esphome/components/pulse_width/pulse_width.h" +#include "esphome/components/pulse_counter/pulse_counter_sensor.h" namespace esphome { namespace hlw8012 { @@ -34,9 +34,9 @@ class HLW8012Component : public PollingComponent { float voltage_divider_{2351}; GPIOPin *sel_pin_; GPIOPin *cf_pin_; - pulse_width::PulseWidthSensorStore cf_store_; + pulse_counter::PulseCounterStorage cf_store_; GPIOPin *cf1_pin_; - pulse_width::PulseWidthSensorStore cf1_store_; + pulse_counter::PulseCounterStorage cf1_store_; sensor::Sensor *voltage_sensor_{nullptr}; sensor::Sensor *current_sensor_{nullptr}; sensor::Sensor *power_sensor_{nullptr}; diff --git a/esphome/components/hlw8012/sensor.py b/esphome/components/hlw8012/sensor.py index 3dd1f0ae33..697c34f9d2 100644 --- a/esphome/components/hlw8012/sensor.py +++ b/esphome/components/hlw8012/sensor.py @@ -6,7 +6,7 @@ from esphome.const import CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \ CONF_CURRENT_RESISTOR, CONF_ID, CONF_POWER, CONF_SEL_PIN, CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER, \ ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT -AUTO_LOAD = ['pulse_width'] +AUTO_LOAD = ['pulse_counter'] hlw8012_ns = cg.esphome_ns.namespace('hlw8012') HLW8012Component = hlw8012_ns.class_('HLW8012Component', cg.PollingComponent) diff --git a/esphome/components/pulse_counter/pulse_counter_sensor.cpp b/esphome/components/pulse_counter/pulse_counter_sensor.cpp index 9947cebac8..6503711e35 100644 --- a/esphome/components/pulse_counter/pulse_counter_sensor.cpp +++ b/esphome/components/pulse_counter/pulse_counter_sensor.cpp @@ -28,7 +28,9 @@ void ICACHE_RAM_ATTR PulseCounterStorage::gpio_intr(PulseCounterStorage *arg) { break; } } -bool PulseCounterStorage::pulse_counter_setup() { +bool PulseCounterStorage::pulse_counter_setup(GPIOPin *pin) { + this->pin = pin; + this->pin->setup(); this->isr_pin = this->pin->to_isr(); this->pin->attach_interrupt(PulseCounterStorage::gpio_intr, this, CHANGE); return true; @@ -42,7 +44,9 @@ pulse_counter_t PulseCounterStorage::read_raw_value() { #endif #ifdef ARDUINO_ARCH_ESP32 -bool PulseCounterStorage::pulse_counter_setup() { +bool PulseCounterStorage::pulse_counter_setup(GPIOPin *pin) { + this->pin = pin; + this->pin->setup(); this->pcnt_unit = next_pcnt_unit; next_pcnt_unit = pcnt_unit_t(int(next_pcnt_unit) + 1); // NOLINT @@ -133,9 +137,7 @@ pulse_counter_t PulseCounterStorage::read_raw_value() { void PulseCounterSensor::setup() { ESP_LOGCONFIG(TAG, "Setting up pulse counter '%s'...", this->name_.c_str()); - this->pin_->setup(); - this->storage_.pin = this->pin_; - if (!this->storage_.pulse_counter_setup()) { + if (!this->storage_.pulse_counter_setup(this->pin_)) { this->mark_failed(); return; } diff --git a/esphome/components/pulse_counter/pulse_counter_sensor.h b/esphome/components/pulse_counter/pulse_counter_sensor.h index cf73156147..483036ac34 100644 --- a/esphome/components/pulse_counter/pulse_counter_sensor.h +++ b/esphome/components/pulse_counter/pulse_counter_sensor.h @@ -25,7 +25,7 @@ using pulse_counter_t = int32_t; #endif struct PulseCounterStorage { - bool pulse_counter_setup(); + bool pulse_counter_setup(GPIOPin *pin); pulse_counter_t read_raw_value(); static void gpio_intr(PulseCounterStorage *arg); @@ -42,9 +42,9 @@ struct PulseCounterStorage { #ifdef ARDUINO_ARCH_ESP8266 ISRInternalGPIOPin *isr_pin; #endif - PulseCounterCountMode rising_edge_mode{}; - PulseCounterCountMode falling_edge_mode{}; - uint32_t filter_us{}; + PulseCounterCountMode rising_edge_mode{PULSE_COUNTER_INCREMENT}; + PulseCounterCountMode falling_edge_mode{PULSE_COUNTER_DISABLE}; + uint32_t filter_us{0}; pulse_counter_t last_value{0}; };