Added pzemdc reset energy action (#4481)

* remove unused sensors on pzemdc

* add reset energy action for pzemdc

* fix lint errors

* remove trailing space on pzemdc.h

* make method reset_energy of pzemdc public

* Apply suggestions from code review

---------

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Kai Gerken 2023-03-08 20:00:44 +01:00 committed by GitHub
parent 600f4be2c4
commit 1087cb55b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 4 deletions

View file

@ -7,6 +7,7 @@ namespace pzemdc {
static const char *const TAG = "pzemdc";
static const uint8_t PZEM_CMD_READ_IN_REGISTERS = 0x04;
static const uint8_t PZEM_CMD_RESET_ENERGY = 0x42;
static const uint8_t PZEM_REGISTER_COUNT = 10; // 10x 16-bit registers
void PZEMDC::on_modbus_data(const std::vector<uint8_t> &data) {
@ -61,5 +62,12 @@ void PZEMDC::dump_config() {
LOG_SENSOR("", "Energy", this->energy_sensor_);
}
void PZEMDC::reset_energy() {
std::vector<uint8_t> cmd;
cmd.push_back(this->address_);
cmd.push_back(PZEM_CMD_RESET_ENERGY);
this->send_raw(cmd);
}
} // namespace pzemdc
} // namespace esphome

View file

@ -15,8 +15,6 @@ class PZEMDC : public PollingComponent, public modbus::ModbusDevice {
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_energy_sensor(sensor::Sensor *energy_sensor) { energy_sensor_ = energy_sensor; }
void set_frequency_sensor(sensor::Sensor *frequency_sensor) { frequency_sensor_ = frequency_sensor; }
void set_powerfactor_sensor(sensor::Sensor *powerfactor_sensor) { power_factor_sensor_ = powerfactor_sensor; }
void update() override;
@ -24,14 +22,24 @@ class PZEMDC : public PollingComponent, public modbus::ModbusDevice {
void dump_config() override;
void reset_energy();
protected:
sensor::Sensor *voltage_sensor_{nullptr};
sensor::Sensor *current_sensor_{nullptr};
sensor::Sensor *power_sensor_{nullptr};
sensor::Sensor *frequency_sensor_{nullptr};
sensor::Sensor *power_factor_sensor_{nullptr};
sensor::Sensor *energy_sensor_{nullptr};
};
template<typename... Ts> class ResetEnergyAction : public Action<Ts...> {
public:
ResetEnergyAction(PZEMDC *pzemdc) : pzemdc_(pzemdc) {}
void play(Ts... x) override { this->pzemdc_->reset_energy(); }
protected:
PZEMDC *pzemdc_;
};
} // namespace pzemdc
} // namespace esphome

View file

@ -1,5 +1,7 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome import automation
from esphome.automation import maybe_simple_id
from esphome.components import sensor, modbus
from esphome.const import (
CONF_CURRENT,
@ -24,6 +26,9 @@ AUTO_LOAD = ["modbus"]
pzemdc_ns = cg.esphome_ns.namespace("pzemdc")
PZEMDC = pzemdc_ns.class_("PZEMDC", cg.PollingComponent, modbus.ModbusDevice)
# Actions
ResetEnergyAction = pzemdc_ns.class_("ResetEnergyAction", automation.Action)
CONFIG_SCHEMA = (
cv.Schema(
{
@ -59,6 +64,20 @@ CONFIG_SCHEMA = (
)
@automation.register_action(
"pzemdc.reset_energy",
ResetEnergyAction,
maybe_simple_id(
{
cv.GenerateID(CONF_ID): cv.use_id(PZEMDC),
}
),
)
async def reset_energy_to_code(config, action_id, template_arg, args):
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)

View file

@ -579,6 +579,7 @@ sensor:
power_factor:
name: PZEMAC Power Factor
- platform: pzemdc
id: pzemdc1
voltage:
name: PZEMDC Voltage
current:
@ -925,6 +926,11 @@ binary_sensor:
on_press:
then:
- pzemac.reset_energy: pzemac1
- platform: template
id: pzemdc_reset_energy
on_press:
then:
- pzemdc.reset_energy: pzemdc1
- platform: vbus
model: deltasol_bs_plus