Binary map bugfixes (#4636)

* limit configuration to 64 binary sensors to match code limitation

* remove superfluous debug logging

* improve state publishing logic eliminating NAN being sent on boot in certain cases

* adjust type for bitmask shift to match mask variable type
This commit is contained in:
kahrendt 2023-03-31 00:27:24 -04:00 committed by GitHub
parent 616e0a21d8
commit 28534ecc61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 20 deletions

View file

@ -30,7 +30,7 @@ void BinarySensorMap::process_group_() {
if (bs.binary_sensor->state) { if (bs.binary_sensor->state) {
num_active_sensors++; num_active_sensors++;
total_current_value += bs.sensor_value; total_current_value += bs.sensor_value;
mask |= 1 << i; mask |= 1ULL << i;
} }
} }
// check if the sensor map was touched // check if the sensor map was touched
@ -38,12 +38,11 @@ void BinarySensorMap::process_group_() {
// did the bit_mask change or is it a new sensor touch // did the bit_mask change or is it a new sensor touch
if (this->last_mask_ != mask) { if (this->last_mask_ != mask) {
float publish_value = total_current_value / num_active_sensors; float publish_value = total_current_value / num_active_sensors;
ESP_LOGD(TAG, "'%s' - Publishing %.2f", this->name_.c_str(), publish_value);
this->publish_state(publish_value); this->publish_state(publish_value);
} }
} else if (this->last_mask_ != 0ULL) { } else if (this->last_mask_ != 0ULL) {
// is this a new sensor release // is this a new sensor release
ESP_LOGD(TAG, "'%s' - No binary sensor active, publishing NAN", this->name_.c_str()); ESP_LOGV(TAG, "'%s' - No binary sensor active, publishing NAN", this->name_.c_str());
this->publish_state(NAN); this->publish_state(NAN);
} }
this->last_mask_ = mask; this->last_mask_ = mask;
@ -52,28 +51,22 @@ void BinarySensorMap::process_group_() {
void BinarySensorMap::process_sum_() { void BinarySensorMap::process_sum_() {
float total_current_value = 0.0; float total_current_value = 0.0;
uint64_t mask = 0x00; uint64_t mask = 0x00;
// check all binary_sensors for its state. when active add its value to total_current_value. // - check all binary_sensor states
// create a bitmask for the binary_sensor status on all channels // - if active, add its value to total_current_value
// - creates a bitmask for the binary_sensor status on all channels
for (size_t i = 0; i < this->channels_.size(); i++) { for (size_t i = 0; i < this->channels_.size(); i++) {
auto bs = this->channels_[i]; auto bs = this->channels_[i];
if (bs.binary_sensor->state) { if (bs.binary_sensor->state) {
total_current_value += bs.sensor_value; total_current_value += bs.sensor_value;
mask |= 1 << i; mask |= 1ULL << i;
} }
} }
// check if the sensor map was touched
if (mask != 0ULL) { // update state only if the binary sensor states have changed or if no state has ever been sent on boot
// did the bit_mask change or is it a new sensor touch if ((this->last_mask_ != mask) || (!this->has_state())) {
if (this->last_mask_ != mask) { this->publish_state(total_current_value);
float publish_value = total_current_value;
ESP_LOGD(TAG, "'%s' - Publishing %.2f", this->name_.c_str(), publish_value);
this->publish_state(publish_value);
}
} else if (this->last_mask_ != 0ULL) {
// is this a new sensor release
ESP_LOGD(TAG, "'%s' - No binary sensor active, publishing 0", this->name_.c_str());
this->publish_state(0.0);
} }
this->last_mask_ = mask; this->last_mask_ = mask;
} }

View file

@ -39,7 +39,7 @@ CONFIG_SCHEMA = cv.typed_schema(
).extend( ).extend(
{ {
cv.Required(CONF_CHANNELS): cv.All( cv.Required(CONF_CHANNELS): cv.All(
cv.ensure_list(entry), cv.Length(min=1) cv.ensure_list(entry), cv.Length(min=1, max=64)
), ),
} }
), ),
@ -50,7 +50,7 @@ CONFIG_SCHEMA = cv.typed_schema(
).extend( ).extend(
{ {
cv.Required(CONF_CHANNELS): cv.All( cv.Required(CONF_CHANNELS): cv.All(
cv.ensure_list(entry), cv.Length(min=1) cv.ensure_list(entry), cv.Length(min=1, max=64)
), ),
} }
), ),