Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Interfaces with Egardia/Woonveilig alarm control panel."""
2 
3 import logging
4 
5 from pythonegardia import egardiadevice, egardiaserver
6 import requests
7 import voluptuous as vol
8 
9 from homeassistant.const import (
10  CONF_HOST,
11  CONF_NAME,
12  CONF_PASSWORD,
13  CONF_PORT,
14  CONF_USERNAME,
15  EVENT_HOMEASSISTANT_STOP,
16  Platform,
17 )
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers import discovery
21 from homeassistant.helpers.typing import ConfigType
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 ATTR_DISCOVER_DEVICES = "egardia_sensor"
26 
27 CONF_REPORT_SERVER_CODES = "report_server_codes"
28 CONF_REPORT_SERVER_ENABLED = "report_server_enabled"
29 CONF_REPORT_SERVER_PORT = "report_server_port"
30 CONF_VERSION = "version"
31 
32 DEFAULT_NAME = "Egardia"
33 DEFAULT_PORT = 80
34 DEFAULT_REPORT_SERVER_ENABLED = False
35 DEFAULT_REPORT_SERVER_PORT = 52010
36 DEFAULT_VERSION = "GATE-01"
37 DOMAIN = "egardia"
38 
39 EGARDIA_DEVICE = "egardiadevice"
40 EGARDIA_NAME = "egardianame"
41 EGARDIA_REPORT_SERVER_CODES = "egardia_rs_codes"
42 EGARDIA_REPORT_SERVER_ENABLED = "egardia_rs_enabled"
43 EGARDIA_SERVER = "egardia_server"
44 
45 NOTIFICATION_ID = "egardia_notification"
46 NOTIFICATION_TITLE = "Egardia"
47 
48 REPORT_SERVER_CODES_IGNORE = "ignore"
49 
50 SERVER_CODE_SCHEMA = vol.Schema(
51  {
52  vol.Optional("arm"): vol.All(cv.ensure_list_csv, [cv.string]),
53  vol.Optional("disarm"): vol.All(cv.ensure_list_csv, [cv.string]),
54  vol.Optional("armhome"): vol.All(cv.ensure_list_csv, [cv.string]),
55  vol.Optional("triggered"): vol.All(cv.ensure_list_csv, [cv.string]),
56  vol.Optional("ignore"): vol.All(cv.ensure_list_csv, [cv.string]),
57  }
58 )
59 
60 CONFIG_SCHEMA = vol.Schema(
61  {
62  DOMAIN: vol.Schema(
63  {
64  vol.Required(CONF_HOST): cv.string,
65  vol.Required(CONF_PASSWORD): cv.string,
66  vol.Required(CONF_USERNAME): cv.string,
67  vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): cv.string,
68  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
69  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
70  vol.Optional(CONF_REPORT_SERVER_CODES, default={}): SERVER_CODE_SCHEMA,
71  vol.Optional(
72  CONF_REPORT_SERVER_ENABLED, default=DEFAULT_REPORT_SERVER_ENABLED
73  ): cv.boolean,
74  vol.Optional(
75  CONF_REPORT_SERVER_PORT, default=DEFAULT_REPORT_SERVER_PORT
76  ): cv.port,
77  }
78  )
79  },
80  extra=vol.ALLOW_EXTRA,
81 )
82 
83 
84 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
85  """Set up the Egardia platform."""
86 
87  conf = config[DOMAIN]
88  username = conf.get(CONF_USERNAME)
89  password = conf.get(CONF_PASSWORD)
90  host = conf.get(CONF_HOST)
91  port = conf.get(CONF_PORT)
92  version = conf.get(CONF_VERSION)
93  rs_enabled = conf.get(CONF_REPORT_SERVER_ENABLED)
94  rs_port = conf.get(CONF_REPORT_SERVER_PORT)
95  try:
96  device = hass.data[EGARDIA_DEVICE] = egardiadevice.EgardiaDevice(
97  host, port, username, password, "", version
98  )
99  except requests.exceptions.RequestException:
100  _LOGGER.error(
101  "An error occurred accessing your Egardia device. "
102  "Please check configuration"
103  )
104  return False
105  except egardiadevice.UnauthorizedError:
106  _LOGGER.error("Unable to authorize. Wrong password or username")
107  return False
108  # Set up the egardia server if enabled
109  if rs_enabled:
110  _LOGGER.debug("Setting up EgardiaServer")
111  try:
112  if EGARDIA_SERVER not in hass.data:
113  server = egardiaserver.EgardiaServer("", rs_port)
114  bound = server.bind()
115  if not bound:
116  raise OSError( # noqa: TRY301
117  "Binding error occurred while starting EgardiaServer."
118  )
119  hass.data[EGARDIA_SERVER] = server
120  server.start()
121 
122  def handle_stop_event(event):
123  """Handle Home Assistant stop event."""
124  server.stop()
125 
126  # listen to Home Assistant stop event
127  hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, handle_stop_event)
128 
129  except OSError:
130  _LOGGER.error("Binding error occurred while starting EgardiaServer")
131  return False
132 
133  discovery.load_platform(
134  hass, Platform.ALARM_CONTROL_PANEL, DOMAIN, discovered=conf, hass_config=config
135  )
136 
137  # Get the sensors from the device and add those
138  sensors = device.getsensors()
139  discovery.load_platform(
140  hass, Platform.BINARY_SENSOR, DOMAIN, {ATTR_DISCOVER_DEVICES: sensors}, config
141  )
142 
143  return True
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:84