1 """Support for ZoneMinder."""
5 from requests.exceptions
import ConnectionError
as RequestsConnectionError
6 import voluptuous
as vol
7 from zoneminder.zm
import ZoneMinder
25 _LOGGER = logging.getLogger(__name__)
27 CONF_PATH_ZMS =
"path_zms"
30 DEFAULT_PATH_ZMS =
"/zm/cgi-bin/nph-zms"
33 DEFAULT_VERIFY_SSL =
True
36 HOST_CONFIG_SCHEMA = vol.Schema(
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,
48 CONFIG_SCHEMA = vol.Schema(
49 {DOMAIN: vol.All(cv.ensure_list, [HOST_CONFIG_SCHEMA])}, extra=vol.ALLOW_EXTRA
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}
58 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
59 """Set up the ZoneMinder component."""
61 hass.data[DOMAIN] = {}
65 for conf
in config[DOMAIN]:
66 protocol =
"https" if conf[CONF_SSL]
else "http"
68 host_name = conf[CONF_HOST]
69 server_origin = f
"{protocol}://{host_name}"
70 zm_client = ZoneMinder(
72 conf.get(CONF_USERNAME),
73 conf.get(CONF_PASSWORD),
75 conf.get(CONF_PATH_ZMS),
76 conf.get(CONF_VERIFY_SSL),
78 hass.data[DOMAIN][host_name] = zm_client
81 success = await hass.async_add_executor_job(zm_client.login)
and success
82 except RequestsConnectionError
as ex:
84 "ZoneMinder connection failure to %s: %s",
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):
97 "Unable to change ZoneMinder state. Host: %s, state: %s",
102 hass.services.async_register(
103 DOMAIN, SERVICE_SET_RUN_STATE, set_active_state, schema=SET_RUN_STATE_SCHEMA
106 hass.async_create_task(
bool async_setup(HomeAssistant hass, ConfigType config)
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)