mirror of
https://github.com/esphome/esphome.git
synced 2024-11-14 02:58:11 +01:00
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:
parent
616e0a21d8
commit
28534ecc61
2 changed files with 13 additions and 20 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in a new issue