Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for ZoneMinder."""
2 
3 import logging
4 
5 from requests.exceptions import ConnectionError as RequestsConnectionError
6 import voluptuous as vol
7 from zoneminder.zm import ZoneMinder
8 
9 from homeassistant.const import (
10  ATTR_ID,
11  ATTR_NAME,
12  CONF_HOST,
13  CONF_PASSWORD,
14  CONF_PATH,
15  CONF_SSL,
16  CONF_USERNAME,
17  CONF_VERIFY_SSL,
18  Platform,
19 )
20 from homeassistant.core import HomeAssistant, ServiceCall
22 from homeassistant.helpers.discovery import async_load_platform
23 from homeassistant.helpers.typing import ConfigType
24 
25 _LOGGER = logging.getLogger(__name__)
26 
27 CONF_PATH_ZMS = "path_zms"
28 
29 DEFAULT_PATH = "/zm/"
30 DEFAULT_PATH_ZMS = "/zm/cgi-bin/nph-zms"
31 DEFAULT_SSL = False
32 DEFAULT_TIMEOUT = 10
33 DEFAULT_VERIFY_SSL = True
34 DOMAIN = "zoneminder"
35 
36 HOST_CONFIG_SCHEMA = vol.Schema(
37  {
38  vol.Required(CONF_HOST): cv.string,
39  vol.Optional(CONF_PASSWORD): cv.string,
40  vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string,
41  vol.Optional(CONF_PATH_ZMS, default=DEFAULT_PATH_ZMS): cv.string,
42  vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean,
43  vol.Optional(CONF_USERNAME): cv.string,
44  vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean,
45  }
46 )
47 
48 CONFIG_SCHEMA = vol.Schema(
49  {DOMAIN: vol.All(cv.ensure_list, [HOST_CONFIG_SCHEMA])}, extra=vol.ALLOW_EXTRA
50 )
51 
52 SERVICE_SET_RUN_STATE = "set_run_state"
53 SET_RUN_STATE_SCHEMA = vol.Schema(
54  {vol.Required(ATTR_ID): cv.string, vol.Required(ATTR_NAME): cv.string}
55 )
56 
57 
58 async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
59  """Set up the ZoneMinder component."""
60 
61  hass.data[DOMAIN] = {}
62 
63  success = True
64 
65  for conf in config[DOMAIN]:
66  protocol = "https" if conf[CONF_SSL] else "http"
67 
68  host_name = conf[CONF_HOST]
69  server_origin = f"{protocol}://{host_name}"
70  zm_client = ZoneMinder(
71  server_origin,
72  conf.get(CONF_USERNAME),
73  conf.get(CONF_PASSWORD),
74  conf.get(CONF_PATH),
75  conf.get(CONF_PATH_ZMS),
76  conf.get(CONF_VERIFY_SSL),
77  )
78  hass.data[DOMAIN][host_name] = zm_client
79 
80  try:
81  success = await hass.async_add_executor_job(zm_client.login) and success
82  except RequestsConnectionError as ex:
83  _LOGGER.error(
84  "ZoneMinder connection failure to %s: %s",
85  host_name,
86  ex,
87  )
88 
89  def set_active_state(call: ServiceCall) -> None:
90  """Set the ZoneMinder run state to the given state name."""
91  zm_id = call.data[ATTR_ID]
92  state_name = call.data[ATTR_NAME]
93  if zm_id not in hass.data[DOMAIN]:
94  _LOGGER.error("Invalid ZoneMinder host provided: %s", zm_id)
95  if not hass.data[DOMAIN][zm_id].set_active_state(state_name):
96  _LOGGER.error(
97  "Unable to change ZoneMinder state. Host: %s, state: %s",
98  zm_id,
99  state_name,
100  )
101 
102  hass.services.async_register(
103  DOMAIN, SERVICE_SET_RUN_STATE, set_active_state, schema=SET_RUN_STATE_SCHEMA
104  )
105 
106  hass.async_create_task(
107  async_load_platform(hass, Platform.BINARY_SENSOR, DOMAIN, {}, config)
108  )
109 
110  return success
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:58
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)
Definition: discovery.py:152