1 """Support for Concord232 alarm control panels."""
3 from __future__
import annotations
8 from concord232
import client
as concord232_client
10 import voluptuous
as vol
13 PLATFORM_SCHEMA
as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA,
14 AlarmControlPanelEntity,
15 AlarmControlPanelEntityFeature,
16 AlarmControlPanelState,
25 _LOGGER = logging.getLogger(__name__)
27 DEFAULT_HOST =
"localhost"
28 DEFAULT_NAME =
"CONCORD232"
30 DEFAULT_MODE =
"audible"
32 SCAN_INTERVAL = datetime.timedelta(seconds=10)
34 PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend(
36 vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
37 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
38 vol.Optional(CONF_CODE): cv.string,
39 vol.Optional(CONF_MODE, default=DEFAULT_MODE): cv.string,
40 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
48 add_entities: AddEntitiesCallback,
49 discovery_info: DiscoveryInfoType |
None =
None,
51 """Set up the Concord232 alarm control panel platform."""
52 name = config[CONF_NAME]
53 code = config.get(CONF_CODE)
54 mode = config[CONF_MODE]
55 host = config[CONF_HOST]
56 port = config[CONF_PORT]
58 url = f
"http://{host}:{port}"
62 except requests.exceptions.ConnectionError
as ex:
63 _LOGGER.error(
"Unable to connect to Concord232: %s",
str(ex))
67 """Representation of the Concord232-based alarm panel."""
69 _attr_code_format = CodeFormat.NUMBER
70 _attr_supported_features = (
71 AlarmControlPanelEntityFeature.ARM_HOME
72 | AlarmControlPanelEntityFeature.ARM_AWAY
76 """Initialize the Concord232 alarm panel."""
83 self.
_alarm_alarm = concord232_client.Client(self.
_url_url)
84 self.
_alarm_alarm.partitions = self.
_alarm_alarm.list_partitions()
87 """Update values from API."""
89 part = self.
_alarm_alarm.list_partitions()[0]
90 except requests.exceptions.ConnectionError
as ex:
92 "Unable to connect to %(host)s: %(reason)s",
93 {
"host": self.
_url_url,
"reason": ex},
97 _LOGGER.error(
"Concord232 reports no partitions")
100 if part[
"arming_level"] ==
"Off":
102 elif "Home" in part[
"arming_level"]:
108 """Send disarm command."""
109 if not self.
_validate_code_validate_code(code, AlarmControlPanelState.DISARMED):
111 self.
_alarm_alarm.disarm(code)
114 """Send arm home command."""
115 if not self.
_validate_code_validate_code(code, AlarmControlPanelState.ARMED_HOME):
117 if self.
_mode_mode ==
"silent":
118 self.
_alarm_alarm.arm(
"stay",
"silent")
120 self.
_alarm_alarm.arm(
"stay")
123 """Send arm away command."""
124 if not self.
_validate_code_validate_code(code, AlarmControlPanelState.ARMED_AWAY):
126 self.
_alarm_alarm.arm(
"away")
129 """Validate given code."""
130 if self.
_code_code
is None:
132 alarm_code = self.
_code_code
133 check =
not alarm_code
or code == alarm_code
135 _LOGGER.warning(
"Invalid code given for %s", state)
_alarm_control_panel_option_default_code
None alarm_arm_away(self, str|None code=None)
None alarm_disarm(self, str|None code=None)
def _validate_code(self, code, state)
None alarm_arm_home(self, str|None code=None)
def __init__(self, url, name, code, mode)
_alarm_control_panel_option_default_code
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)