14static const char *
const TAG =
"template.alarm_control_panel";
18#ifdef USE_BINARY_SENSOR
22 alarm_sensor.
sensor = sensor;
27 this->
sensors_.push_back(alarm_sensor);
34 return AlarmSensorTypeStrings::get_log_str(
static_cast<uint8_t
>(
type), 0);
40 "TemplateAlarmControlPanel:\n"
41 " Current State: %s\n"
42 " Number of Codes: %zu\n"
43 " Requires Code To Arm: %s\n"
44 " Arming Away Time: %" PRIu32
"s\n"
45 " Arming Home Time: %" PRIu32
"s\n"
46 " Arming Night Time: %" PRIu32
"s\n"
47 " Pending Time: %" PRIu32
"s\n"
48 " Trigger Time: %" PRIu32
"s\n"
49 " Supported Features: %" PRIu32,
51 YESNO(!this->
codes_.
empty() && this->requires_code_to_arm_), (this->arming_away_time_ / 1000),
52 (this->arming_home_time_ / 1000), (this->arming_night_time_ / 1000), (this->pending_time_ / 1000),
53 (this->trigger_time_ / 1000), this->get_supported_features());
54#ifdef USE_BINARY_SENSOR
55 for (
const auto &alarm_sensor : this->
sensors_) {
56 const uint8_t
flags = alarm_sensor.info.flags;
61 " Armed home bypass: %s\n"
62 " Armed night bypass: %s\n"
65 alarm_sensor.sensor->get_name().c_str(), LOG_STR_ARG(sensor_type_to_string(alarm_sensor.info.type)),
113 bool delayed_sensor_faulted =
false;
114 bool instant_sensor_faulted =
false;
116#ifdef USE_BINARY_SENSOR
118 for (
auto &alarm_sensor : this->
sensors_) {
119 auto &info = alarm_sensor.info;
120 auto *sensor = alarm_sensor.sensor;
124 if ((!info.chime_active) && (sensor->state)) {
131 info.chime_active = sensor->state;
136 if (info.auto_bypassed) {
153 instant_sensor_faulted =
true;
158 delayed_sensor_faulted =
true;
160 instant_sensor_faulted =
true;
165 delayed_sensor_faulted =
true;
170 bool sensors_ready = !(instant_sensor_faulted || delayed_sensor_faulted);
181 if (instant_sensor_faulted) {
183 }
else if (delayed_sensor_faulted) {
198 if (code.has_value()) {
199 ESP_LOGVV(TAG,
"Checking code: %s", code.value().c_str());
201 const char *code_cstr = code.value().c_str();
202 for (
const char *stored_code : this->
codes_) {
203 if (strcmp(stored_code, code_cstr) == 0)
208 ESP_LOGD(TAG,
"No code provided");
228 ESP_LOGW(TAG,
"Cannot arm when not disarmed");
232 ESP_LOGW(TAG,
"Not arming code doesn't match");
245#ifdef USE_BINARY_SENSOR
246 for (
auto &alarm_sensor : this->
sensors_) {
247 auto &info = alarm_sensor.info;
248 auto *sensor = alarm_sensor.sensor;
251 ESP_LOGW(TAG,
"'%s' is faulted and will be automatically bypassed", sensor->get_name().c_str());
252 info.auto_bypassed =
true;
259#ifdef USE_BINARY_SENSOR
260 for (
auto &alarm_sensor : this->
sensors_) {
261 alarm_sensor.info.auto_bypassed =
false;
267 auto opt_state =
call.get_state();
269 auto state = *opt_state;
278 ESP_LOGW(TAG,
"Not disarming code doesn't match");
ESPPreferenceObject make_entity_preference(uint32_t version=0)
Create a preference object for storing this entity's state/settings.
const optional< std::string > & get_code() const
AlarmControlPanelState desired_state_
LazyCallbackManager< void()> ready_callback_
bool is_state_armed(AlarmControlPanelState state)
ESPPreferenceObject pref_
LazyCallbackManager< void()> chime_callback_
AlarmControlPanelState current_state_
void publish_state(AlarmControlPanelState state)
Set the state of the alarm_control_panel.
Base class for all binary_sensor-type classes.
uint32_t arming_away_time_
TemplateAlarmControlPanelRestoreMode restore_mode_
FixedVector< const char * > codes_
uint32_t arming_home_time_
void arm_(optional< std::string > code, alarm_control_panel::AlarmControlPanelState state, uint32_t delay)
uint32_t arming_night_time_
void dump_config() override
uint32_t get_supported_features() const override
FixedVector< AlarmSensor > sensors_
bool requires_code_to_arm_
void clear_auto_bypassed_sensors_()
void add_sensor(binary_sensor::BinarySensor *sensor, uint8_t flags=0, AlarmSensorType type=ALARM_SENSOR_TYPE_DELAYED)
Add a binary_sensor to the alarm_panel.
void control(const alarm_control_panel::AlarmControlPanelCall &call) override
void auto_bypass_sensors_()
bool is_code_valid_(optional< std::string > code)
TemplateAlarmControlPanel()
PROGMEM_STRING_TABLE(AlarmControlPanelStateStrings, "DISARMED", "ARMED_HOME", "ARMED_AWAY", "ARMED_NIGHT", "ARMED_VACATION", "ARMED_CUSTOM_BYPASS", "PENDING", "ARMING", "DISARMING", "TRIGGERED", "UNKNOWN")
const LogString * alarm_control_panel_state_to_string(AlarmControlPanelState state)
Returns a string representation of the state.
@ BINARY_SENSOR_MODE_BYPASS_AUTO
@ BINARY_SENSOR_MODE_CHIME
@ BINARY_SENSOR_MODE_BYPASS_ARMED_HOME
@ BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT
@ ALARM_CONTROL_PANEL_RESTORE_DEFAULT_DISARMED
@ ALARM_SENSOR_TYPE_DELAYED
@ ALARM_SENSOR_TYPE_INSTANT
@ ALARM_SENSOR_TYPE_INSTANT_ALWAYS
@ ALARM_SENSOR_TYPE_DELAYED_FOLLOWER
void HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()
binary_sensor::BinarySensor * sensor