mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 16:38:16 +01:00
Adding sdm_meter ability to report total power (#2959)
This commit is contained in:
parent
a4431abea8
commit
9e8b701dea
4 changed files with 21 additions and 2 deletions
|
@ -57,15 +57,19 @@ void SDMMeter::on_modbus_data(const std::vector<uint8_t> &data) {
|
||||||
phase.phase_angle_sensor_->publish_state(phase_angle);
|
phase.phase_angle_sensor_->publish_state(phase_angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float total_power = sdm_meter_get_float(SDM_TOTAL_SYSTEM_POWER * 2);
|
||||||
float frequency = sdm_meter_get_float(SDM_FREQUENCY * 2);
|
float frequency = sdm_meter_get_float(SDM_FREQUENCY * 2);
|
||||||
float import_active_energy = sdm_meter_get_float(SDM_IMPORT_ACTIVE_ENERGY * 2);
|
float import_active_energy = sdm_meter_get_float(SDM_IMPORT_ACTIVE_ENERGY * 2);
|
||||||
float export_active_energy = sdm_meter_get_float(SDM_EXPORT_ACTIVE_ENERGY * 2);
|
float export_active_energy = sdm_meter_get_float(SDM_EXPORT_ACTIVE_ENERGY * 2);
|
||||||
float import_reactive_energy = sdm_meter_get_float(SDM_IMPORT_REACTIVE_ENERGY * 2);
|
float import_reactive_energy = sdm_meter_get_float(SDM_IMPORT_REACTIVE_ENERGY * 2);
|
||||||
float export_reactive_energy = sdm_meter_get_float(SDM_EXPORT_REACTIVE_ENERGY * 2);
|
float export_reactive_energy = sdm_meter_get_float(SDM_EXPORT_REACTIVE_ENERGY * 2);
|
||||||
|
|
||||||
ESP_LOGD(TAG, "SDMMeter: F=%.3f Hz, Im.A.E=%.3f Wh, Ex.A.E=%.3f Wh, Im.R.E=%.3f VARh, Ex.R.E=%.3f VARh", frequency,
|
ESP_LOGD(TAG, "SDMMeter: F=%.3f Hz, Im.A.E=%.3f Wh, Ex.A.E=%.3f Wh, Im.R.E=%.3f VARh, Ex.R.E=%.3f VARh, T.P=%.3f W",
|
||||||
import_active_energy, export_active_energy, import_reactive_energy, export_reactive_energy);
|
frequency, import_active_energy, export_active_energy, import_reactive_energy, export_reactive_energy,
|
||||||
|
total_power);
|
||||||
|
|
||||||
|
if (this->total_power_sensor_ != nullptr)
|
||||||
|
this->total_power_sensor_->publish_state(total_power);
|
||||||
if (this->frequency_sensor_ != nullptr)
|
if (this->frequency_sensor_ != nullptr)
|
||||||
this->frequency_sensor_->publish_state(frequency);
|
this->frequency_sensor_->publish_state(frequency);
|
||||||
if (this->import_active_energy_sensor_ != nullptr)
|
if (this->import_active_energy_sensor_ != nullptr)
|
||||||
|
@ -95,6 +99,7 @@ void SDMMeter::dump_config() {
|
||||||
LOG_SENSOR(" ", "Power Factor", phase.power_factor_sensor_);
|
LOG_SENSOR(" ", "Power Factor", phase.power_factor_sensor_);
|
||||||
LOG_SENSOR(" ", "Phase Angle", phase.phase_angle_sensor_);
|
LOG_SENSOR(" ", "Phase Angle", phase.phase_angle_sensor_);
|
||||||
}
|
}
|
||||||
|
LOG_SENSOR(" ", "Total Power", this->total_power_sensor_);
|
||||||
LOG_SENSOR(" ", "Frequency", this->frequency_sensor_);
|
LOG_SENSOR(" ", "Frequency", this->frequency_sensor_);
|
||||||
LOG_SENSOR(" ", "Import Active Energy", this->import_active_energy_sensor_);
|
LOG_SENSOR(" ", "Import Active Energy", this->import_active_energy_sensor_);
|
||||||
LOG_SENSOR(" ", "Export Active Energy", this->export_active_energy_sensor_);
|
LOG_SENSOR(" ", "Export Active Energy", this->export_active_energy_sensor_);
|
||||||
|
|
|
@ -37,6 +37,7 @@ class SDMMeter : public PollingComponent, public modbus::ModbusDevice {
|
||||||
this->phases_[phase].setup = true;
|
this->phases_[phase].setup = true;
|
||||||
this->phases_[phase].phase_angle_sensor_ = phase_angle_sensor;
|
this->phases_[phase].phase_angle_sensor_ = phase_angle_sensor;
|
||||||
}
|
}
|
||||||
|
void set_total_power_sensor(sensor::Sensor *total_power_sensor) { this->total_power_sensor_ = total_power_sensor; }
|
||||||
void set_frequency_sensor(sensor::Sensor *frequency_sensor) { this->frequency_sensor_ = frequency_sensor; }
|
void set_frequency_sensor(sensor::Sensor *frequency_sensor) { this->frequency_sensor_ = frequency_sensor; }
|
||||||
void set_import_active_energy_sensor(sensor::Sensor *import_active_energy_sensor) {
|
void set_import_active_energy_sensor(sensor::Sensor *import_active_energy_sensor) {
|
||||||
this->import_active_energy_sensor_ = import_active_energy_sensor;
|
this->import_active_energy_sensor_ = import_active_energy_sensor;
|
||||||
|
@ -69,6 +70,7 @@ class SDMMeter : public PollingComponent, public modbus::ModbusDevice {
|
||||||
sensor::Sensor *phase_angle_sensor_{nullptr};
|
sensor::Sensor *phase_angle_sensor_{nullptr};
|
||||||
} phases_[3];
|
} phases_[3];
|
||||||
sensor::Sensor *frequency_sensor_{nullptr};
|
sensor::Sensor *frequency_sensor_{nullptr};
|
||||||
|
sensor::Sensor *total_power_sensor_{nullptr};
|
||||||
sensor::Sensor *import_active_energy_sensor_{nullptr};
|
sensor::Sensor *import_active_energy_sensor_{nullptr};
|
||||||
sensor::Sensor *export_active_energy_sensor_{nullptr};
|
sensor::Sensor *export_active_energy_sensor_{nullptr};
|
||||||
sensor::Sensor *import_reactive_energy_sensor_{nullptr};
|
sensor::Sensor *import_reactive_energy_sensor_{nullptr};
|
||||||
|
|
|
@ -8,6 +8,7 @@ from esphome.const import (
|
||||||
CONF_CURRENT,
|
CONF_CURRENT,
|
||||||
CONF_EXPORT_ACTIVE_ENERGY,
|
CONF_EXPORT_ACTIVE_ENERGY,
|
||||||
CONF_EXPORT_REACTIVE_ENERGY,
|
CONF_EXPORT_REACTIVE_ENERGY,
|
||||||
|
CONF_TOTAL_POWER,
|
||||||
CONF_FREQUENCY,
|
CONF_FREQUENCY,
|
||||||
CONF_ID,
|
CONF_ID,
|
||||||
CONF_IMPORT_ACTIVE_ENERGY,
|
CONF_IMPORT_ACTIVE_ENERGY,
|
||||||
|
@ -98,6 +99,12 @@ CONFIG_SCHEMA = (
|
||||||
accuracy_decimals=3,
|
accuracy_decimals=3,
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
),
|
),
|
||||||
|
cv.Optional(CONF_TOTAL_POWER): sensor.sensor_schema(
|
||||||
|
unit_of_measurement=UNIT_WATT,
|
||||||
|
accuracy_decimals=2,
|
||||||
|
device_class=DEVICE_CLASS_POWER,
|
||||||
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
|
),
|
||||||
cv.Optional(CONF_IMPORT_ACTIVE_ENERGY): sensor.sensor_schema(
|
cv.Optional(CONF_IMPORT_ACTIVE_ENERGY): sensor.sensor_schema(
|
||||||
unit_of_measurement=UNIT_KILOWATT_HOURS,
|
unit_of_measurement=UNIT_KILOWATT_HOURS,
|
||||||
accuracy_decimals=2,
|
accuracy_decimals=2,
|
||||||
|
@ -132,6 +139,10 @@ async def to_code(config):
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
await modbus.register_modbus_device(var, config)
|
await modbus.register_modbus_device(var, config)
|
||||||
|
|
||||||
|
if CONF_TOTAL_POWER in config:
|
||||||
|
sens = await sensor.new_sensor(config[CONF_TOTAL_POWER])
|
||||||
|
cg.add(var.set_total_power_sensor(sens))
|
||||||
|
|
||||||
if CONF_FREQUENCY in config:
|
if CONF_FREQUENCY in config:
|
||||||
sens = await sensor.new_sensor(config[CONF_FREQUENCY])
|
sens = await sensor.new_sensor(config[CONF_FREQUENCY])
|
||||||
cg.add(var.set_frequency_sensor(sens))
|
cg.add(var.set_frequency_sensor(sens))
|
||||||
|
|
|
@ -685,6 +685,7 @@ CONF_TOLERANCE = "tolerance"
|
||||||
CONF_TOPIC = "topic"
|
CONF_TOPIC = "topic"
|
||||||
CONF_TOPIC_PREFIX = "topic_prefix"
|
CONF_TOPIC_PREFIX = "topic_prefix"
|
||||||
CONF_TOTAL = "total"
|
CONF_TOTAL = "total"
|
||||||
|
CONF_TOTAL_POWER = "total_power"
|
||||||
CONF_TRACES = "traces"
|
CONF_TRACES = "traces"
|
||||||
CONF_TRANSITION_LENGTH = "transition_length"
|
CONF_TRANSITION_LENGTH = "transition_length"
|
||||||
CONF_TRIGGER_ID = "trigger_id"
|
CONF_TRIGGER_ID = "trigger_id"
|
||||||
|
|
Loading…
Reference in a new issue