1 """Integrate with FreeDNS Dynamic DNS service at freedns.afraid.org."""
4 from datetime
import datetime, timedelta
8 import voluptuous
as vol
17 _LOGGER = logging.getLogger(__name__)
24 UPDATE_URL =
"https://freedns.afraid.org/dynamic/update.php"
26 CONFIG_SCHEMA = vol.Schema(
30 vol.Exclusive(CONF_URL, DOMAIN): cv.string,
31 vol.Exclusive(CONF_ACCESS_TOKEN, DOMAIN): cv.string,
32 vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL): vol.All(
33 cv.time_period, cv.positive_timedelta
38 extra=vol.ALLOW_EXTRA,
42 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
43 """Initialize the FreeDNS component."""
45 url = conf.get(CONF_URL)
46 auth_token = conf.get(CONF_ACCESS_TOKEN)
47 update_interval = conf[CONF_SCAN_INTERVAL]
56 async
def update_domain_callback(now: datetime) ->
None:
57 """Update the FreeDNS entry."""
61 hass, update_domain_callback, update_interval, cancel_on_shutdown=
True
74 if auth_token
is not None:
76 params[auth_token] =
""
79 async
with asyncio.timeout(TIMEOUT):
80 resp = await session.get(url, params=params)
81 body = await resp.text()
83 if "has not changed" in body:
85 _LOGGER.debug(
"FreeDNS update skipped: IP has not changed")
88 if "ERROR" not in body:
89 _LOGGER.debug(
"Updating FreeDNS was successful: %s", body)
92 if "Invalid update URL" in body:
93 _LOGGER.error(
"FreeDNS update token is invalid")
95 _LOGGER.warning(
"Updating FreeDNS failed: %s", body)
97 except aiohttp.ClientError:
98 _LOGGER.warning(
"Can't connect to FreeDNS API")
101 _LOGGER.warning(
"Timeout from FreeDNS API at %s", url)
bool async_setup(HomeAssistant hass, ConfigType config)
def _update_freedns(hass, session, url, auth_token)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)