From 002861f13b2e3a9dfd16a1157b12894daf08a6cb Mon Sep 17 00:00:00 2001 From: dubit0 Date: Fri, 2 Oct 2020 00:55:42 +0200 Subject: [PATCH] Float output: Fix min_power and max_power adjusting when output is inverted (#1250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch fixes faulty behaviour when both, invert and min_power/max_power are set for a float output (e.g. PWM). The current code scales the output level to the range [min_power, max_power] and subsequently inverts the value. This leads to values that are outside the range [min_power, max_power]. This patch fixes the problem by inverting the requested level first and then scaling it to the interval [min_power, max_power]. Co-authored-by: Thomas Niederprüm --- esphome/components/output/float_output.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/output/float_output.cpp b/esphome/components/output/float_output.cpp index 0d536d0946..d9f2db559c 100644 --- a/esphome/components/output/float_output.cpp +++ b/esphome/components/output/float_output.cpp @@ -29,10 +29,9 @@ void FloatOutput::set_level(float state) { this->power_.unrequest(); } #endif - - float adjusted_value = (state * (this->max_power_ - this->min_power_)) + this->min_power_; if (this->is_inverted()) - adjusted_value = 1.0f - adjusted_value; + state = 1.0f - state; + float adjusted_value = (state * (this->max_power_ - this->min_power_)) + this->min_power_; this->write_state(adjusted_value); }