Add publish_initial_value option to rotary encoder (#2503)

This commit is contained in:
niklasweber 2021-10-27 21:09:37 +02:00 committed by GitHub
parent 68316cbcf9
commit 980c2d4cae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 1 deletions

View file

@ -189,9 +189,10 @@ void RotaryEncoderSensor::loop() {
this->store_.counter = 0; this->store_.counter = 0;
} }
int counter = this->store_.counter; int counter = this->store_.counter;
if (this->store_.last_read != counter) { if (this->store_.last_read != counter || this->publish_initial_value_) {
this->store_.last_read = counter; this->store_.last_read = counter;
this->publish_state(counter); this->publish_state(counter);
this->publish_initial_value_ = false;
} }
} }

View file

@ -58,6 +58,7 @@ class RotaryEncoderSensor : public sensor::Sensor, public Component {
void set_reset_pin(GPIOPin *pin_i) { this->pin_i_ = pin_i; } void set_reset_pin(GPIOPin *pin_i) { this->pin_i_ = pin_i; }
void set_min_value(int32_t min_value); void set_min_value(int32_t min_value);
void set_max_value(int32_t max_value); void set_max_value(int32_t max_value);
void set_publish_initial_value(bool publish_initial_value) { publish_initial_value_ = publish_initial_value; }
// ========== INTERNAL METHODS ========== // ========== INTERNAL METHODS ==========
// (In most use cases you won't need these) // (In most use cases you won't need these)
@ -79,6 +80,7 @@ class RotaryEncoderSensor : public sensor::Sensor, public Component {
InternalGPIOPin *pin_a_; InternalGPIOPin *pin_a_;
InternalGPIOPin *pin_b_; InternalGPIOPin *pin_b_;
GPIOPin *pin_i_{nullptr}; /// Index pin, if this is not nullptr, the counter will reset to 0 once this pin is HIGH. GPIOPin *pin_i_{nullptr}; /// Index pin, if this is not nullptr, the counter will reset to 0 once this pin is HIGH.
bool publish_initial_value_;
RotaryEncoderSensorStore store_{}; RotaryEncoderSensorStore store_{};

View file

@ -27,6 +27,7 @@ RESOLUTIONS = {
CONF_PIN_RESET = "pin_reset" CONF_PIN_RESET = "pin_reset"
CONF_ON_CLOCKWISE = "on_clockwise" CONF_ON_CLOCKWISE = "on_clockwise"
CONF_ON_ANTICLOCKWISE = "on_anticlockwise" CONF_ON_ANTICLOCKWISE = "on_anticlockwise"
CONF_PUBLISH_INITIAL_VALUE = "publish_initial_value"
RotaryEncoderSensor = rotary_encoder_ns.class_( RotaryEncoderSensor = rotary_encoder_ns.class_(
"RotaryEncoderSensor", sensor.Sensor, cg.Component "RotaryEncoderSensor", sensor.Sensor, cg.Component
@ -70,6 +71,7 @@ CONFIG_SCHEMA = cv.All(
cv.Optional(CONF_RESOLUTION, default=1): cv.enum(RESOLUTIONS, int=True), cv.Optional(CONF_RESOLUTION, default=1): cv.enum(RESOLUTIONS, int=True),
cv.Optional(CONF_MIN_VALUE): cv.int_, cv.Optional(CONF_MIN_VALUE): cv.int_,
cv.Optional(CONF_MAX_VALUE): cv.int_, cv.Optional(CONF_MAX_VALUE): cv.int_,
cv.Optional(CONF_PUBLISH_INITIAL_VALUE, default=False): cv.boolean,
cv.Optional(CONF_ON_CLOCKWISE): automation.validate_automation( cv.Optional(CONF_ON_CLOCKWISE): automation.validate_automation(
{ {
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
@ -99,6 +101,7 @@ async def to_code(config):
cg.add(var.set_pin_a(pin_a)) cg.add(var.set_pin_a(pin_a))
pin_b = await cg.gpio_pin_expression(config[CONF_PIN_B]) pin_b = await cg.gpio_pin_expression(config[CONF_PIN_B])
cg.add(var.set_pin_b(pin_b)) cg.add(var.set_pin_b(pin_b))
cg.add(var.set_publish_initial_value(config[CONF_PUBLISH_INITIAL_VALUE]))
if CONF_PIN_RESET in config: if CONF_PIN_RESET in config:
pin_i = await cg.gpio_pin_expression(config[CONF_PIN_RESET]) pin_i = await cg.gpio_pin_expression(config[CONF_PIN_RESET])