8#ifdef USE_ALARM_CONTROL_PANEL
12static const char *
const TAG =
"mqtt.alarm_control_panel";
17PROGMEM_STRING_TABLE(AlarmMqttStateStrings,
"disarmed",
"armed_home",
"armed_away",
"armed_night",
"armed_vacation",
18 "armed_custom_bypass",
"pending",
"arming",
"disarming",
"triggered",
"unknown");
21 return AlarmMqttStateStrings::get_progmem_str(
static_cast<uint8_t
>(
state), AlarmMqttStateStrings::LAST_INDEX);
25 : alarm_control_panel_(alarm_control_panel) {}
28 if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"ARM_AWAY")) == 0) {
30 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"ARM_HOME")) == 0) {
32 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"ARM_NIGHT")) == 0) {
34 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"ARM_VACATION")) == 0) {
36 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"ARM_CUSTOM_BYPASS")) == 0) {
38 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"DISARM")) == 0) {
40 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"PENDING")) == 0) {
42 }
else if (ESPHOME_strcasecmp_P(
state, ESPHOME_PSTR(
"TRIGGERED")) == 0) {
55 if (!payload.empty() && payload[0] ==
'{') {
58 JsonObject root = doc.as<JsonObject>();
60 const char *
state = root[ESPHOME_F(
"state")];
61 if (
state ==
nullptr) {
62 ESP_LOGW(TAG,
"'%s': JSON payload missing 'state' key", this->
friendly_name_().c_str());
64 ESP_LOGW(TAG,
"'%s': Received unknown state in JSON payload: %s", this->
friendly_name_().c_str(),
state);
66 const char *code = root[ESPHOME_F(
"code")];
67 if (code !=
nullptr) {
72 }
else if (!apply_command(
call, payload.c_str())) {
73 ESP_LOGW(TAG,
"'%s': Received unknown command payload %s", this->
friendly_name_().c_str(), payload.c_str());
81 LOG_MQTT_COMPONENT(
true,
true);
83 " Supported Features: %" PRIu32
"\n"
84 " Requires Code to Disarm: %s\n"
85 " Requires Code To Arm: %s",
93 JsonArray supported_features = root[MQTT_SUPPORTED_FEATURES].to<JsonArray>();
96 supported_features.add(ESPHOME_F(
"arm_away"));
99 supported_features.add(ESPHOME_F(
"arm_home"));
102 supported_features.add(ESPHOME_F(
"arm_night"));
105 supported_features.add(ESPHOME_F(
"arm_vacation"));
108 supported_features.add(ESPHOME_F(
"arm_custom_bypass"));
111 supported_features.add(ESPHOME_F(
"trigger"));
122 char topic_buf[MQTT_DEFAULT_TOPIC_MAX_LEN];
const StringRef & get_name() const
constexpr const char * c_str() const
AlarmControlPanelCall & triggered()
AlarmControlPanelCall & arm_night()
AlarmControlPanelCall & disarm()
AlarmControlPanelCall & arm_custom_bypass()
AlarmControlPanelCall & arm_away()
AlarmControlPanelCall & pending()
AlarmControlPanelCall & arm_home()
AlarmControlPanelCall & arm_vacation()
void add_on_state_callback(F &&callback)
Add a callback for when the state of the alarm_control_panel changes.
virtual uint32_t get_supported_features() const =0
A numeric representation of the supported features as per HomeAssistant.
AlarmControlPanelState get_state() const
Get the state.
virtual bool get_requires_code_to_arm() const =0
Returns if the alarm_control_panel requires a code to arm.
virtual bool get_requires_code() const =0
Returns if the alarm_control_panel has a code.
AlarmControlPanelCall make_call()
Make a AlarmControlPanelCall.
MQTTAlarmControlPanelComponent(alarm_control_panel::AlarmControlPanel *alarm_control_panel)
bool send_initial_state() override
void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override
alarm_control_panel::AlarmControlPanel * alarm_control_panel_
void dump_config() override
bool publish(const std::string &topic, const std::string &payload)
Send a MQTT message.
StringRef get_state_topic_to_(std::span< char, MQTT_DEFAULT_TOPIC_MAX_LEN > buf) const
Get the MQTT state topic into a buffer (no heap allocation for non-lambda custom topics).
const StringRef & friendly_name_() const
Get the friendly name of this MQTT component.
std::string get_command_topic_() const
Get the MQTT topic for listening to commands (allocates std::string).
void subscribe(const std::string &topic, mqtt_callback_t callback, uint8_t qos=0)
Subscribe to a MQTT topic.
PROGMEM_STRING_TABLE(AlarmControlPanelStateStrings, "DISARMED", "ARMED_HOME", "ARMED_AWAY", "ARMED_NIGHT", "ARMED_VACATION", "ARMED_CUSTOM_BYPASS", "PENDING", "ARMING", "DISARMING", "TRIGGERED", "UNKNOWN")
@ ACP_FEAT_ARM_CUSTOM_BYPASS
bool parse_json(const std::string &data, const json_parse_t &f)
Parse a JSON string and run the provided json parse function if it's valid.
MQTT_COMPONENT_TYPE(MQTTAlarmControlPanelComponent, "alarm_control_panel") const EntityBase *MQTTAlarmControlPanelComponent
const __FlashStringHelper * ProgmemStr
Simple Helper struct used for Home Assistant MQTT send_discovery().