1 """Support for Satel Integra devices."""
6 from satel_integra.satel_integra
import AsyncSatel
7 import voluptuous
as vol
16 DEFAULT_ALARM_NAME =
"satel_integra"
18 DEFAULT_CONF_ARM_HOME_MODE = 1
19 DEFAULT_DEVICE_PARTITION = 1
20 DEFAULT_ZONE_TYPE =
"motion"
22 _LOGGER = logging.getLogger(__name__)
24 DOMAIN =
"satel_integra"
26 DATA_SATEL =
"satel_integra"
28 CONF_DEVICE_CODE =
"code"
29 CONF_DEVICE_PARTITIONS =
"partitions"
30 CONF_ARM_HOME_MODE =
"arm_home_mode"
31 CONF_ZONE_NAME =
"name"
32 CONF_ZONE_TYPE =
"type"
34 CONF_OUTPUTS =
"outputs"
35 CONF_SWITCHABLE_OUTPUTS =
"switchable_outputs"
39 SIGNAL_PANEL_MESSAGE =
"satel_integra.panel_message"
40 SIGNAL_PANEL_ARM_AWAY =
"satel_integra.panel_arm_away"
41 SIGNAL_PANEL_ARM_HOME =
"satel_integra.panel_arm_home"
42 SIGNAL_PANEL_DISARM =
"satel_integra.panel_disarm"
44 SIGNAL_ZONES_UPDATED =
"satel_integra.zones_updated"
45 SIGNAL_OUTPUTS_UPDATED =
"satel_integra.outputs_updated"
47 ZONE_SCHEMA = vol.Schema(
49 vol.Required(CONF_ZONE_NAME): cv.string,
50 vol.Optional(CONF_ZONE_TYPE, default=DEFAULT_ZONE_TYPE): cv.string,
53 EDITABLE_OUTPUT_SCHEMA = vol.Schema({vol.Required(CONF_ZONE_NAME): cv.string})
54 PARTITION_SCHEMA = vol.Schema(
56 vol.Required(CONF_ZONE_NAME): cv.string,
57 vol.Optional(CONF_ARM_HOME_MODE, default=DEFAULT_CONF_ARM_HOME_MODE): vol.In(
65 """Check if alarm code must be configured."""
66 if value.get(CONF_SWITCHABLE_OUTPUTS)
and CONF_DEVICE_CODE
not in value:
67 raise vol.Invalid(
"You need to specify alarm code to use switchable_outputs")
72 CONFIG_SCHEMA = vol.Schema(
76 vol.Required(CONF_HOST): cv.string,
77 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
78 vol.Optional(CONF_DEVICE_CODE): cv.string,
79 vol.Optional(CONF_DEVICE_PARTITIONS, default={}): {
80 vol.Coerce(int): PARTITION_SCHEMA
82 vol.Optional(CONF_ZONES, default={}): {vol.Coerce(int): ZONE_SCHEMA},
83 vol.Optional(CONF_OUTPUTS, default={}): {vol.Coerce(int): ZONE_SCHEMA},
84 vol.Optional(CONF_SWITCHABLE_OUTPUTS, default={}): {
85 vol.Coerce(int): EDITABLE_OUTPUT_SCHEMA
88 is_alarm_code_necessary,
91 extra=vol.ALLOW_EXTRA,
95 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
96 """Set up the Satel Integra component."""
99 zones = conf.get(CONF_ZONES)
100 outputs = conf.get(CONF_OUTPUTS)
101 switchable_outputs = conf.get(CONF_SWITCHABLE_OUTPUTS)
102 host = conf.get(CONF_HOST)
103 port = conf.get(CONF_PORT)
104 partitions = conf.get(CONF_DEVICE_PARTITIONS)
106 monitored_outputs = collections.OrderedDict(
107 list(outputs.items()) +
list(switchable_outputs.items())
110 controller = AsyncSatel(host, port, hass.loop, zones, monitored_outputs, partitions)
112 hass.data[DATA_SATEL] = controller
114 result = await controller.connect()
123 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _close)
125 _LOGGER.debug(
"Arm home config: %s, mode: %s ", conf, conf.get(CONF_ARM_HOME_MODE))
127 hass.async_create_task(
131 hass.async_create_task(
134 Platform.BINARY_SENSOR,
136 {CONF_ZONES: zones, CONF_OUTPUTS: outputs},
141 hass.async_create_task(
147 CONF_SWITCHABLE_OUTPUTS: switchable_outputs,
148 CONF_DEVICE_CODE: conf.get(CONF_DEVICE_CODE),
155 def alarm_status_update_callback():
156 """Send status update received from alarm to Home Assistant."""
157 _LOGGER.debug(
"Sending request to update panel state")
161 def zones_update_callback(status):
162 """Update zone objects as per notification from the alarm."""
163 _LOGGER.debug(
"Zones callback, status: %s", status)
167 def outputs_update_callback(status):
168 """Update zone objects as per notification from the alarm."""
169 _LOGGER.debug(
"Outputs updated callback , status: %s", status)
174 hass.loop.create_task(controller.keep_alive())
175 hass.loop.create_task(
176 controller.monitor_status(
177 alarm_status_update_callback, zones_update_callback, outputs_update_callback
bool async_setup(HomeAssistant hass, ConfigType config)
def is_alarm_code_necessary(value)
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)