core/homeassistant/components/zeroconf/__init__.py

60 lines
1.7 KiB
Python
Raw Normal View History

"""Support for exposing Home Assistant via Zeroconf."""
2016-04-10 22:34:04 +00:00
import logging
import socket
import voluptuous as vol
from homeassistant import util
from homeassistant.const import (EVENT_HOMEASSISTANT_STOP, __version__)
2016-04-10 22:34:04 +00:00
_LOGGER = logging.getLogger(__name__)
2016-04-10 22:34:04 +00:00
DOMAIN = 'zeroconf'
2016-04-10 22:34:04 +00:00
ZEROCONF_TYPE = '_home-assistant._tcp.local.'
2016-04-10 22:34:04 +00:00
CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({}),
}, extra=vol.ALLOW_EXTRA)
2016-04-10 22:34:04 +00:00
async def async_setup(hass, config):
"""Set up Zeroconf and make Home Assistant discoverable."""
from aiozeroconf import Zeroconf, ServiceInfo
2016-04-10 22:34:04 +00:00
zeroconf = Zeroconf(hass.loop)
2016-04-10 22:34:04 +00:00
zeroconf_name = '{}.{}'.format(hass.config.location_name, ZEROCONF_TYPE)
2016-04-10 22:34:04 +00:00
params = {
'version': __version__,
'base_url': hass.config.api.base_url,
# always needs authentication
'requires_api_password': True,
}
2016-04-10 22:34:04 +00:00
host_ip = util.get_local_ip()
2016-12-02 05:43:33 +00:00
try:
host_ip_pton = socket.inet_pton(socket.AF_INET, host_ip)
info = ServiceInfo(ZEROCONF_TYPE, zeroconf_name, address=host_ip_pton,
port=hass.http.server_port, weight=0, priority=0,
properties=params)
2016-12-02 05:43:33 +00:00
except socket.error:
host_ip_pton = socket.inet_pton(socket.AF_INET6, host_ip)
info = ServiceInfo(ZEROCONF_TYPE, zeroconf_name, address6=host_ip_pton,
port=hass.http.server_port, weight=0, priority=0,
properties=params)
await zeroconf.register_service(info)
2016-04-10 22:34:04 +00:00
async def stop_zeroconf(event):
"""Stop Zeroconf."""
await zeroconf.unregister_service(info)
await zeroconf.close()
2016-04-10 22:34:04 +00:00
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_zeroconf)
2016-04-10 22:34:04 +00:00
return True