diff --git a/esphome/components/emporia_vue_utility/emporia_vue_utility.cpp b/esphome/components/emporia_vue_utility/emporia_vue_utility.cpp index 548800e..8068f3f 100644 --- a/esphome/components/emporia_vue_utility/emporia_vue_utility.cpp +++ b/esphome/components/emporia_vue_utility/emporia_vue_utility.cpp @@ -19,7 +19,7 @@ void EmporiaVueUtility::setup() { } void EmporiaVueUtility::update() { - send_meter_request(); + // send_meter_request(); } void EmporiaVueUtility::loop() { @@ -33,17 +33,17 @@ void EmporiaVueUtility::loop() { msg_len = read_msg(); now = ::time(&now); - /* sanity checks! */ - if (next_meter_request > - now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) { - ESP_LOGD(TAG, - "Time jumped back (%lld > %lld + %lld); resetting", - (long long) next_meter_request, - (long long) now, - (long long) (INITIAL_STARTUP_DELAY + - METER_REJOIN_INTERVAL)); - next_meter_request = next_meter_join = 0; - } + // /* sanity checks! */ + // if (next_meter_request > + // now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) { + // ESP_LOGD(TAG, + // "Time jumped back (%lld > %lld + %lld); resetting", + // (long long) next_meter_request, + // (long long) now, + // (long long) (INITIAL_STARTUP_DELAY + + // METER_REJOIN_INTERVAL)); + // next_meter_request = next_meter_join = 0; + // } if (msg_len != 0) { @@ -71,7 +71,7 @@ void EmporiaVueUtility::loop() { handle_resp_meter_join(); led_wifi(true); if (startup_step == 3) { - // send_meter_request(); + send_meter_request(); startup_step++; } break; diff --git a/esphome/components/emporia_vue_utility/emporia_vue_utility.h b/esphome/components/emporia_vue_utility/emporia_vue_utility.h index 328cd90..e236e8e 100644 --- a/esphome/components/emporia_vue_utility/emporia_vue_utility.h +++ b/esphome/components/emporia_vue_utility/emporia_vue_utility.h @@ -129,6 +129,12 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public uint16_t cost_unit = 0; void set_update_interval(uint32_t update_interval); + void set_power_sensor(sensor::Sensor *sensor) { power_sensor_ = sensor; } + void set_power_export_sensor(sensor::Sensor *sensor) { power_export_sensor_ = sensor; } + void set_power_import_sensor(sensor::Sensor *sensor) { power_import_sensor_ = sensor; } + void set_energy_sensor(sensor::Sensor *sensor) { energy_sensor_ = sensor; } + void set_energy_export_sensor(sensor::Sensor *sensor) { energy_export_sensor_ = sensor; } + void set_energy_import_sensor(sensor::Sensor *sensor) { energy_import_sensor_ = sensor; } void setup() override; void update() override; void loop() override; @@ -424,12 +430,15 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public } } - Wh_consumed->publish_state(float(consumed)); - Wh_returned->publish_state(float(returned)); - Wh_net->publish_state(watt_hours); - kWh_consumed->publish_state(float(consumed) / 1000.0); - kWh_returned->publish_state(float(returned) / 1000.0); - kWh_net->publish_state(watt_hours / 1000.0); + if (energy_import_sensor_ != nullptr) { + energy_import_sensor_->publish_state(float(consumed)); + } + if (energy_export_sensor_ != nullptr) { + energy_export_sensor_->publish_state(float(returned)); + } + if (energy_sensor_ != nullptr) { + energy_sensor_->publish_state(watt_hours); + } return(watt_hours); } @@ -469,14 +478,17 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public return(0); } - Wh_consumed->publish_state(float(consumed)); - Wh_returned->publish_state(float(returned)); - kWh_consumed->publish_state(float(consumed) / 1000.0); - kWh_returned->publish_state(float(returned) / 1000.0); - net = consumed - returned; - Wh_net->publish_state(float(net)); - kWh_net->publish_state(float(net) / 1000.0); + + if (energy_import_sensor_ != nullptr) { + energy_import_sensor_->publish_state(float(consumed)); + } + if (energy_export_sensor_ != nullptr) { + energy_export_sensor_->publish_state(float(returned)); + } + if (energy_sensor_ != nullptr) { + energy_sensor_->publish_state(net); + } prev_consumed = consumed; prev_returned = returned; @@ -524,13 +536,23 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public ESP_LOGE(TAG, "Unreasonable watts value %f", watts); last_reading_has_error = 1; } else { - W->publish_state(watts); + if (power_sensor_ != nullptr) { + power_sensor_->publish_state(watts); + } if (watts > 0) { - W_consumed->publish_state(watts); - W_returned->publish_state(0); + if (power_import_sensor_ != nullptr) { + power_import_sensor_->publish_state(watts); + } + if (power_export_sensor_ != nullptr) { + power_export_sensor_->publish_state(0); + } } else { - W_consumed->publish_state(0); - W_returned->publish_state(-watts); + if (power_import_sensor_ != nullptr) { + power_import_sensor_->publish_state(0); + } + if (power_export_sensor_ != nullptr) { + power_export_sensor_->publish_state(-watts); + } } } return(watts); @@ -550,13 +572,23 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public ESP_LOGE(TAG, "Unreasonable watts value %d", watts); last_reading_has_error = 1; } else { - W->publish_state(watts); + if (power_sensor_ != nullptr) { + power_sensor_->publish_state(watts); + } if (watts > 0) { - W_consumed->publish_state(watts); - W_returned->publish_state(0); + if (power_import_sensor_ != nullptr) { + power_import_sensor_->publish_state(watts); + } + if (power_export_sensor_ != nullptr) { + power_export_sensor_->publish_state(0); + } } else { - W_consumed->publish_state(0); - W_returned->publish_state(-watts); + if (power_import_sensor_ != nullptr) { + power_import_sensor_->publish_state(0); + } + if (power_export_sensor_ != nullptr) { + power_export_sensor_->publish_state(-watts); + } } } return(watts); @@ -671,15 +703,12 @@ class EmporiaVueUtility : public sensor::Sensor, public PollingComponent, public } private: uint32_t update_interval_; - Sensor *kWh_net = new Sensor(); - Sensor *kWh_consumed = new Sensor(); - Sensor *kWh_returned = new Sensor(); - Sensor *Wh_net = new Sensor(); - Sensor *Wh_consumed = new Sensor(); - Sensor *Wh_returned = new Sensor(); - Sensor *W = new Sensor(); - Sensor *W_consumed = new Sensor(); - Sensor *W_returned = new Sensor(); + sensor::Sensor *power_sensor_{nullptr}; + sensor::Sensor *power_export_sensor_{nullptr}; + sensor::Sensor *power_import_sensor_{nullptr}; + sensor::Sensor *energy_sensor_{nullptr}; + sensor::Sensor *energy_export_sensor_{nullptr}; + sensor::Sensor *energy_import_sensor_{nullptr}; }; } // namespace emporia_vue_utility diff --git a/esphome/components/emporia_vue_utility/sensor.py b/esphome/components/emporia_vue_utility/sensor.py index 55a7cc5..cf9a43b 100644 --- a/esphome/components/emporia_vue_utility/sensor.py +++ b/esphome/components/emporia_vue_utility/sensor.py @@ -13,9 +13,21 @@ from esphome.const import ( STATE_CLASS_TOTAL_INCREASING ) -DEPENDENCIES = ['uart'] +DEPENDENCIES = ["uart"] -SENSOR_OPTIONS = ["", "_export", "_import"] +POWER_SENSOR_TYPES = { + CONF_POWER: "set_power_sensor", + CONF_POWER + "_export": "set_power_export_sensor", + CONF_POWER + "_import": "set_power_import_sensor", +} + +ENERGY_SENSOR_TYPES = { + CONF_ENERGY: "set_energy_sensor", + CONF_ENERGY + "_export": "set_energy_export_sensor", + CONF_ENERGY + "_import": "set_energy_import_sensor", +} + +ALL_SENSOR_TYPES = {**POWER_SENSOR_TYPES, **ENERGY_SENSOR_TYPES} emporia_vue_utility_ns = cg.esphome_ns.namespace('emporia_vue_utility') EmporiaVueUtility = emporia_vue_utility_ns.class_('EmporiaVueUtility', cg.PollingComponent, uart.UARTDevice) @@ -25,22 +37,22 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(EmporiaVueUtility), **{ - cv.Optional(CONF_POWER + suffix): sensor.sensor_schema( + cv.Optional(name): sensor.sensor_schema( unit_of_measurement=UNIT_WATT, device_class=DEVICE_CLASS_POWER, state_class=STATE_CLASS_MEASUREMENT, - accuracy_decimals=2, + accuracy_decimals=0, ) - for suffix in SENSOR_OPTIONS + for name in POWER_SENSOR_TYPES }, **{ - cv.Optional(CONF_ENERGY + suffix): sensor.sensor_schema( + cv.Optional(name): sensor.sensor_schema( unit_of_measurement=UNIT_WATT_HOURS, device_class=DEVICE_CLASS_ENERGY, state_class=STATE_CLASS_TOTAL_INCREASING, accuracy_decimals=0, ) - for suffix in SENSOR_OPTIONS + for name in ENERGY_SENSOR_TYPES } } ) @@ -48,7 +60,12 @@ CONFIG_SCHEMA = cv.All( .extend(uart.UART_DEVICE_SCHEMA) ) -def to_code(config): +async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) - yield cg.register_component(var, config) - yield uart.register_uart_device(var, config) \ No newline at end of file + await cg.register_component(var, config) + await uart.register_uart_device(var, config) + + for key, funcName in ALL_SENSOR_TYPES.items(): + if key in config: + sens = await sensor.new_sensor(config[key]) + cg.add(getattr(var, funcName)(sens)) \ No newline at end of file