mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Added energy sensor to hlw8012 (#1198)
This commit is contained in:
		| @@ -79,6 +79,12 @@ void HLW8012Component::update() { | |||||||
|     this->power_sensor_->publish_state(power); |     this->power_sensor_->publish_state(power); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   if (this->energy_sensor_ != nullptr) { | ||||||
|  |     cf_total_pulses_ += raw_cf; | ||||||
|  |     float energy = cf_total_pulses_ * power_multiplier_micros / 3600 / 1000000.0f; | ||||||
|  |     this->energy_sensor_->publish_state(energy); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   if (this->change_mode_at_++ == this->change_mode_every_) { |   if (this->change_mode_at_++ == this->change_mode_every_) { | ||||||
|     this->current_mode_ = !this->current_mode_; |     this->current_mode_ = !this->current_mode_; | ||||||
|     ESP_LOGV(TAG, "Changing mode to %s mode", this->current_mode_ ? "CURRENT" : "VOLTAGE"); |     ESP_LOGV(TAG, "Changing mode to %s mode", this->current_mode_ ? "CURRENT" : "VOLTAGE"); | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ class HLW8012Component : public PollingComponent { | |||||||
|   void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; } |   void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; } | ||||||
|   void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; } |   void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; } | ||||||
|   void set_power_sensor(sensor::Sensor *power_sensor) { power_sensor_ = power_sensor; } |   void set_power_sensor(sensor::Sensor *power_sensor) { power_sensor_ = power_sensor; } | ||||||
|  |   void set_energy_sensor(sensor::Sensor *energy_sensor) { energy_sensor_ = energy_sensor; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   uint32_t nth_value_{0}; |   uint32_t nth_value_{0}; | ||||||
| @@ -37,6 +38,7 @@ class HLW8012Component : public PollingComponent { | |||||||
|   uint32_t change_mode_every_{8}; |   uint32_t change_mode_every_{8}; | ||||||
|   float current_resistor_{0.001}; |   float current_resistor_{0.001}; | ||||||
|   float voltage_divider_{2351}; |   float voltage_divider_{2351}; | ||||||
|  |   uint64_t cf_total_pulses_{0}; | ||||||
|   GPIOPin *sel_pin_; |   GPIOPin *sel_pin_; | ||||||
|   GPIOPin *cf_pin_; |   GPIOPin *cf_pin_; | ||||||
|   pulse_counter::PulseCounterStorage cf_store_; |   pulse_counter::PulseCounterStorage cf_store_; | ||||||
| @@ -45,6 +47,7 @@ class HLW8012Component : public PollingComponent { | |||||||
|   sensor::Sensor *voltage_sensor_{nullptr}; |   sensor::Sensor *voltage_sensor_{nullptr}; | ||||||
|   sensor::Sensor *current_sensor_{nullptr}; |   sensor::Sensor *current_sensor_{nullptr}; | ||||||
|   sensor::Sensor *power_sensor_{nullptr}; |   sensor::Sensor *power_sensor_{nullptr}; | ||||||
|  |   sensor::Sensor *energy_sensor_{nullptr}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace hlw8012 | }  // namespace hlw8012 | ||||||
|   | |||||||
| @@ -3,8 +3,8 @@ import esphome.config_validation as cv | |||||||
| from esphome import pins | from esphome import pins | ||||||
| from esphome.components import sensor | from esphome.components import sensor | ||||||
| from esphome.const import CONF_CHANGE_MODE_EVERY, CONF_INITIAL_MODE, CONF_CURRENT, \ | from esphome.const import CONF_CHANGE_MODE_EVERY, CONF_INITIAL_MODE, CONF_CURRENT, \ | ||||||
|     CONF_CURRENT_RESISTOR, CONF_ID, CONF_POWER, CONF_SEL_PIN, CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER, \ |     CONF_CURRENT_RESISTOR, CONF_ID, CONF_POWER, CONF_ENERGY, CONF_SEL_PIN, CONF_VOLTAGE, \ | ||||||
|     ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT |     CONF_VOLTAGE_DIVIDER, ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT, UNIT_WATT_HOURS | ||||||
|  |  | ||||||
| AUTO_LOAD = ['pulse_counter'] | AUTO_LOAD = ['pulse_counter'] | ||||||
|  |  | ||||||
| @@ -29,6 +29,7 @@ CONFIG_SCHEMA = cv.Schema({ | |||||||
|     cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(UNIT_VOLT, ICON_FLASH, 1), |     cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(UNIT_VOLT, ICON_FLASH, 1), | ||||||
|     cv.Optional(CONF_CURRENT): sensor.sensor_schema(UNIT_AMPERE, ICON_FLASH, 2), |     cv.Optional(CONF_CURRENT): sensor.sensor_schema(UNIT_AMPERE, ICON_FLASH, 2), | ||||||
|     cv.Optional(CONF_POWER): sensor.sensor_schema(UNIT_WATT, ICON_FLASH, 1), |     cv.Optional(CONF_POWER): sensor.sensor_schema(UNIT_WATT, ICON_FLASH, 1), | ||||||
|  |     cv.Optional(CONF_ENERGY): sensor.sensor_schema(UNIT_WATT_HOURS, ICON_FLASH, 1), | ||||||
|  |  | ||||||
|     cv.Optional(CONF_CURRENT_RESISTOR, default=0.001): cv.resistance, |     cv.Optional(CONF_CURRENT_RESISTOR, default=0.001): cv.resistance, | ||||||
|     cv.Optional(CONF_VOLTAGE_DIVIDER, default=2351): cv.positive_float, |     cv.Optional(CONF_VOLTAGE_DIVIDER, default=2351): cv.positive_float, | ||||||
| @@ -57,6 +58,9 @@ def to_code(config): | |||||||
|     if CONF_POWER in config: |     if CONF_POWER in config: | ||||||
|         sens = yield sensor.new_sensor(config[CONF_POWER]) |         sens = yield sensor.new_sensor(config[CONF_POWER]) | ||||||
|         cg.add(var.set_power_sensor(sens)) |         cg.add(var.set_power_sensor(sens)) | ||||||
|  |     if CONF_ENERGY in config: | ||||||
|  |         sens = yield sensor.new_sensor(config[CONF_ENERGY]) | ||||||
|  |         cg.add(var.set_energy_sensor(sens)) | ||||||
|     cg.add(var.set_current_resistor(config[CONF_CURRENT_RESISTOR])) |     cg.add(var.set_current_resistor(config[CONF_CURRENT_RESISTOR])) | ||||||
|     cg.add(var.set_voltage_divider(config[CONF_VOLTAGE_DIVIDER])) |     cg.add(var.set_voltage_divider(config[CONF_VOLTAGE_DIVIDER])) | ||||||
|     cg.add(var.set_change_mode_every(config[CONF_CHANGE_MODE_EVERY])) |     cg.add(var.set_change_mode_every(config[CONF_CHANGE_MODE_EVERY])) | ||||||
|   | |||||||
| @@ -456,6 +456,9 @@ sensor: | |||||||
|     power: |     power: | ||||||
|       name: 'HLW8012 Power' |       name: 'HLW8012 Power' | ||||||
|       id: hlw8012_power |       id: hlw8012_power | ||||||
|  |     energy: | ||||||
|  |       name: "HLW8012 Energy" | ||||||
|  |       id: hlw8012_energy | ||||||
|     update_interval: 15s |     update_interval: 15s | ||||||
|     current_resistor: 0.001 ohm |     current_resistor: 0.001 ohm | ||||||
|     voltage_divider: 2351 |     voltage_divider: 2351 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user