13static const char *
const TAG =
"template.alarm_control_panel";
17#ifdef USE_BINARY_SENSOR
23 alarm_sensor.
sensor = sensor;
27 this->
sensors_.push_back(alarm_sensor);
34 return LOG_STR(
"instant");
36 return LOG_STR(
"delayed_follower");
38 return LOG_STR(
"instant_always");
41 return LOG_STR(
"delayed");
48 "TemplateAlarmControlPanel:\n"
49 " Current State: %s\n"
50 " Number of Codes: %zu\n"
51 " Requires Code To Arm: %s\n"
52 " Arming Away Time: %" PRIu32
"s\n"
53 " Arming Home Time: %" PRIu32
"s\n"
54 " Arming Night Time: %" PRIu32
"s\n"
55 " Pending Time: %" PRIu32
"s\n"
56 " Trigger Time: %" PRIu32
"s\n"
57 " Supported Features: %" PRIu32,
59 YESNO(!this->
codes_.empty() && this->requires_code_to_arm_), (this->arming_away_time_ / 1000),
60 (this->arming_home_time_ / 1000), (this->arming_night_time_ / 1000), (this->pending_time_ / 1000),
61 (this->trigger_time_ / 1000), this->get_supported_features());
62#ifdef USE_BINARY_SENSOR
63 for (
const auto &alarm_sensor : this->
sensors_) {
64 const uint16_t
flags = alarm_sensor.info.flags;
69 " Armed home bypass: %s\n"
70 " Armed night bypass: %s\n"
73 alarm_sensor.sensor->get_name().c_str(), LOG_STR_ARG(sensor_type_to_string(alarm_sensor.info.type)),
121 bool delayed_sensor_faulted =
false;
122 bool instant_sensor_faulted =
false;
124#ifdef USE_BINARY_SENSOR
126 for (
const auto &alarm_sensor : this->
sensors_) {
127 const auto &info = alarm_sensor.info;
128 auto *sensor = alarm_sensor.sensor;
132 if ((!this->
sensor_data_[info.store_index].last_chime_state) && (sensor->state)) {
139 this->
sensor_data_[info.store_index].last_chime_state = sensor->state;
145 info.store_index) == 1) {
162 instant_sensor_faulted =
true;
167 delayed_sensor_faulted =
true;
169 instant_sensor_faulted =
true;
174 delayed_sensor_faulted =
true;
179 bool sensors_ready = !(instant_sensor_faulted || delayed_sensor_faulted);
190 if (instant_sensor_faulted) {
192 }
else if (delayed_sensor_faulted) {
206 if (!this->
codes_.empty()) {
208 ESP_LOGVV(TAG,
"Checking code: %s", code.
value().c_str());
209 return (std::count(this->
codes_.begin(), this->codes_.end(), code.
value()) == 1);
211 ESP_LOGD(TAG,
"No code provided");
231 ESP_LOGW(TAG,
"Cannot arm when not disarmed");
235 ESP_LOGW(TAG,
"Not arming code doesn't match");
248#ifdef USE_BINARY_SENSOR
249 for (
const auto &alarm_sensor : this->
sensors_) {
252 ESP_LOGW(TAG,
"'%s' is faulted and will be automatically bypassed", alarm_sensor.sensor->get_name().c_str());
260 if (
call.get_state()) {
269 ESP_LOGW(TAG,
"Not disarming code doesn't match");
274#ifdef USE_BINARY_SENSOR
282 ESP_LOGE(TAG,
"State not yet implemented: %s",
virtual ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)=0
uint32_t get_preference_hash()
Get a unique hash for storing preferences/settings for this entity.
const optional< std::string > & get_code() const
const optional< AlarmControlPanelState > & get_state() const
AlarmControlPanelState desired_state_
bool is_state_armed(AlarmControlPanelState state)
ESPPreferenceObject pref_
AlarmControlPanelState current_state_
CallbackManager< void()> chime_callback_
void publish_state(AlarmControlPanelState state)
Set the state of the alarm_control_panel.
CallbackManager< void()> ready_callback_
Base class for all binary_sensor-type classes.
value_type const & value() const
uint32_t arming_away_time_
TemplateAlarmControlPanelRestoreMode restore_mode_
uint32_t arming_home_time_
std::vector< std::string > codes_
void arm_(optional< std::string > code, alarm_control_panel::AlarmControlPanelState state, uint32_t delay)
void add_sensor(binary_sensor::BinarySensor *sensor, uint16_t flags=0, AlarmSensorType type=ALARM_SENSOR_TYPE_DELAYED)
Add a binary_sensor to the alarm_panel.
uint32_t arming_night_time_
void dump_config() override
uint32_t get_supported_features() const override
uint8_t next_store_index_
void bypass_before_arming()
FixedVector< AlarmSensor > sensors_
bool requires_code_to_arm_
std::vector< SensorDataStore > sensor_data_
void control(const alarm_control_panel::AlarmControlPanelCall &call) override
std::vector< uint8_t > bypassed_sensor_indicies_
bool is_code_valid_(optional< std::string > code)
TemplateAlarmControlPanel()
const LogString * alarm_control_panel_state_to_string(AlarmControlPanelState state)
Returns a string representation of the state.
@ ALARM_SENSOR_TYPE_DELAYED
@ ALARM_SENSOR_TYPE_INSTANT
@ ALARM_SENSOR_TYPE_INSTANT_ALWAYS
@ ALARM_SENSOR_TYPE_DELAYED_FOLLOWER
@ 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
ESPPreferences * global_preferences
void IRAM_ATTR HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()
binary_sensor::BinarySensor * sensor