mirror of
https://github.com/esphome/esphome.git
synced 2025-11-01 15:41:52 +00:00
template_alarm_control_panel readability improvements (#11593)
This commit is contained in:
@@ -25,6 +25,20 @@ void TemplateAlarmControlPanel::add_sensor(binary_sensor::BinarySensor *sensor,
|
|||||||
this->sensor_data_.push_back(sd);
|
this->sensor_data_.push_back(sd);
|
||||||
this->sensor_map_[sensor].store_index = this->next_store_index_++;
|
this->sensor_map_[sensor].store_index = this->next_store_index_++;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const LogString *sensor_type_to_string(AlarmSensorType type) {
|
||||||
|
switch (type) {
|
||||||
|
case ALARM_SENSOR_TYPE_INSTANT:
|
||||||
|
return LOG_STR("instant");
|
||||||
|
case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
|
||||||
|
return LOG_STR("delayed_follower");
|
||||||
|
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
||||||
|
return LOG_STR("instant_always");
|
||||||
|
case ALARM_SENSOR_TYPE_DELAYED:
|
||||||
|
default:
|
||||||
|
return LOG_STR("delayed");
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void TemplateAlarmControlPanel::dump_config() {
|
void TemplateAlarmControlPanel::dump_config() {
|
||||||
@@ -46,35 +60,20 @@ void TemplateAlarmControlPanel::dump_config() {
|
|||||||
" Supported Features: %" PRIu32,
|
" Supported Features: %" PRIu32,
|
||||||
(this->pending_time_ / 1000), (this->trigger_time_ / 1000), this->get_supported_features());
|
(this->pending_time_ / 1000), (this->trigger_time_ / 1000), this->get_supported_features());
|
||||||
#ifdef USE_BINARY_SENSOR
|
#ifdef USE_BINARY_SENSOR
|
||||||
for (auto sensor_info : this->sensor_map_) {
|
for (auto const &[sensor, info] : this->sensor_map_) {
|
||||||
ESP_LOGCONFIG(TAG, " Binary Sensor:");
|
|
||||||
ESP_LOGCONFIG(TAG,
|
ESP_LOGCONFIG(TAG,
|
||||||
|
" Binary Sensor:\n"
|
||||||
" Name: %s\n"
|
" Name: %s\n"
|
||||||
|
" Type: %s\n"
|
||||||
" Armed home bypass: %s\n"
|
" Armed home bypass: %s\n"
|
||||||
" Armed night bypass: %s\n"
|
" Armed night bypass: %s\n"
|
||||||
" Auto bypass: %s\n"
|
" Auto bypass: %s\n"
|
||||||
" Chime mode: %s",
|
" Chime mode: %s",
|
||||||
sensor_info.first->get_name().c_str(),
|
sensor->get_name().c_str(), LOG_STR_ARG(sensor_type_to_string(info.type)),
|
||||||
TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME),
|
TRUEFALSE(info.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME),
|
||||||
TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT),
|
TRUEFALSE(info.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT),
|
||||||
TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_AUTO),
|
TRUEFALSE(info.flags & BINARY_SENSOR_MODE_BYPASS_AUTO),
|
||||||
TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_CHIME));
|
TRUEFALSE(info.flags & BINARY_SENSOR_MODE_CHIME));
|
||||||
const char *sensor_type;
|
|
||||||
switch (sensor_info.second.type) {
|
|
||||||
case ALARM_SENSOR_TYPE_INSTANT:
|
|
||||||
sensor_type = "instant";
|
|
||||||
break;
|
|
||||||
case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
|
|
||||||
sensor_type = "delayed_follower";
|
|
||||||
break;
|
|
||||||
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
|
||||||
sensor_type = "instant_always";
|
|
||||||
break;
|
|
||||||
case ALARM_SENSOR_TYPE_DELAYED:
|
|
||||||
default:
|
|
||||||
sensor_type = "delayed";
|
|
||||||
}
|
|
||||||
ESP_LOGCONFIG(TAG, " Sensor type: %s", sensor_type);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -123,39 +122,37 @@ void TemplateAlarmControlPanel::loop() {
|
|||||||
bool instant_sensor_faulted = false;
|
bool instant_sensor_faulted = false;
|
||||||
|
|
||||||
#ifdef USE_BINARY_SENSOR
|
#ifdef USE_BINARY_SENSOR
|
||||||
// Test all of the sensors in the list regardless of the alarm panel state
|
// Test all of the sensors regardless of the alarm panel state
|
||||||
for (auto sensor_info : this->sensor_map_) {
|
for (auto const &[sensor, info] : this->sensor_map_) {
|
||||||
// Check for chime zones
|
// Check for chime zones
|
||||||
if ((sensor_info.second.flags & BINARY_SENSOR_MODE_CHIME)) {
|
if (info.flags & BINARY_SENSOR_MODE_CHIME) {
|
||||||
// Look for the transition from closed to open
|
// Look for the transition from closed to open
|
||||||
if ((!this->sensor_data_[sensor_info.second.store_index].last_chime_state) && (sensor_info.first->state)) {
|
if ((!this->sensor_data_[info.store_index].last_chime_state) && (sensor->state)) {
|
||||||
// Must be disarmed to chime
|
// Must be disarmed to chime
|
||||||
if (this->current_state_ == ACP_STATE_DISARMED) {
|
if (this->current_state_ == ACP_STATE_DISARMED) {
|
||||||
this->chime_callback_.call();
|
this->chime_callback_.call();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Record the sensor state change
|
// Record the sensor state change
|
||||||
this->sensor_data_[sensor_info.second.store_index].last_chime_state = sensor_info.first->state;
|
this->sensor_data_[info.store_index].last_chime_state = sensor->state;
|
||||||
}
|
}
|
||||||
// Check for faulted sensors
|
// Check for faulted sensors
|
||||||
if (sensor_info.first->state) { // Sensor triggered?
|
if (sensor->state) {
|
||||||
// Skip if auto bypassed
|
// Skip if auto bypassed
|
||||||
if (std::count(this->bypassed_sensor_indicies_.begin(), this->bypassed_sensor_indicies_.end(),
|
if (std::count(this->bypassed_sensor_indicies_.begin(), this->bypassed_sensor_indicies_.end(),
|
||||||
sensor_info.second.store_index) == 1) {
|
info.store_index) == 1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Skip if bypass armed home
|
// Skip if bypass armed home
|
||||||
if (this->current_state_ == ACP_STATE_ARMED_HOME &&
|
if ((this->current_state_ == ACP_STATE_ARMED_HOME) && (info.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME)) {
|
||||||
(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Skip if bypass armed night
|
// Skip if bypass armed night
|
||||||
if (this->current_state_ == ACP_STATE_ARMED_NIGHT &&
|
if ((this->current_state_ == ACP_STATE_ARMED_NIGHT) && (info.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT)) {
|
||||||
(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sensor_info.second.type) {
|
switch (info.type) {
|
||||||
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
||||||
next_state = ACP_STATE_TRIGGERED;
|
next_state = ACP_STATE_TRIGGERED;
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
@@ -247,11 +244,11 @@ void TemplateAlarmControlPanel::arm_(optional<std::string> code, alarm_control_p
|
|||||||
|
|
||||||
void TemplateAlarmControlPanel::bypass_before_arming() {
|
void TemplateAlarmControlPanel::bypass_before_arming() {
|
||||||
#ifdef USE_BINARY_SENSOR
|
#ifdef USE_BINARY_SENSOR
|
||||||
for (auto sensor_info : this->sensor_map_) {
|
for (auto const &[sensor, info] : this->sensor_map_) {
|
||||||
// Check for faulted bypass_auto sensors and remove them from monitoring
|
// Check for faulted bypass_auto sensors and remove them from monitoring
|
||||||
if ((sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_AUTO) && (sensor_info.first->state)) {
|
if ((info.flags & BINARY_SENSOR_MODE_BYPASS_AUTO) && (sensor->state)) {
|
||||||
ESP_LOGW(TAG, "'%s' is faulted and will be automatically bypassed", sensor_info.first->get_name().c_str());
|
ESP_LOGW(TAG, "'%s' is faulted and will be automatically bypassed", sensor->get_name().c_str());
|
||||||
this->bypassed_sensor_indicies_.push_back(sensor_info.second.store_index);
|
this->bypassed_sensor_indicies_.push_back(info.store_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user