1 """Support for NX584 alarm control panels."""
3 from __future__
import annotations
5 from datetime
import timedelta
8 from nx584
import client
10 import voluptuous
as vol
13 PLATFORM_SCHEMA
as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA,
14 AlarmControlPanelEntity,
15 AlarmControlPanelEntityFeature,
16 AlarmControlPanelState,
26 _LOGGER = logging.getLogger(__name__)
30 DEFAULT_HOST =
"localhost"
31 DEFAULT_NAME =
"NX584"
33 SERVICE_BYPASS_ZONE =
"bypass_zone"
34 SERVICE_UNBYPASS_ZONE =
"unbypass_zone"
37 PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend(
39 vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
40 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
41 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
49 async_add_entities: AddEntitiesCallback,
50 discovery_info: DiscoveryInfoType |
None =
None,
52 """Set up the NX584 platform."""
53 name: str = config[CONF_NAME]
54 host: str = config[CONF_HOST]
55 port: int = config[CONF_PORT]
57 url = f
"http://{host}:{port}"
60 alarm_client = client.Client(url)
61 await hass.async_add_executor_job(alarm_client.list_zones)
62 except requests.exceptions.ConnectionError
as ex:
64 "Unable to connect to %(host)s: %(reason)s",
65 {
"host": url,
"reason": ex},
67 raise PlatformNotReady
from ex
72 platform = entity_platform.async_get_current_platform()
74 platform.async_register_entity_service(
76 {vol.Required(ATTR_ZONE): cv.positive_int},
80 platform.async_register_entity_service(
81 SERVICE_UNBYPASS_ZONE,
82 {vol.Required(ATTR_ZONE): cv.positive_int},
88 """Representation of a NX584-based alarm panel."""
90 _attr_code_format = CodeFormat.NUMBER
91 _attr_supported_features = (
92 AlarmControlPanelEntityFeature.ARM_HOME
93 | AlarmControlPanelEntityFeature.ARM_AWAY
95 _attr_code_arm_required =
False
97 def __init__(self, name: str, alarm_client: client.Client, url: str) ->
None:
98 """Init the nx584 alarm panel."""
104 """Process new events from panel."""
106 part = self.
_alarm_alarm.list_partitions()[0]
107 zones = self.
_alarm_alarm.list_zones()
108 except requests.exceptions.ConnectionError
as ex:
110 "Unable to connect to %(host)s: %(reason)s",
111 {
"host": self.
_url_url,
"reason": ex},
116 _LOGGER.error(
"NX584 reports no partitions")
124 "Zone %(zone)s is bypassed, assuming HOME",
125 {
"zone": zone[
"number"]},
130 if not part[
"armed"]:
137 for flag
in part[
"condition_flags"]:
138 if flag ==
"Siren on":
142 """Send disarm command."""
143 self.
_alarm_alarm.disarm(code)
146 """Send arm home command."""
147 self.
_alarm_alarm.arm(
"stay")
150 """Send arm away command."""
151 self.
_alarm_alarm.arm(
"exit")
154 """Send bypass command."""
155 self.
_alarm_alarm.set_bypass(zone,
True)
158 """Send bypass command."""
159 self.
_alarm_alarm.set_bypass(zone,
False)
None __init__(self, str name, client.Client alarm_client, str url)
None alarm_unbypass(self, int zone)
None alarm_arm_home(self, str|None code=None)
None alarm_bypass(self, int zone)
None alarm_disarm(self, str|None code=None)
None alarm_arm_away(self, str|None code=None)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)