#!/usr/bin/env bashio DATA_STORE="/data/.local/share/dresden-elektronik/deCONZ/zll.db" function hassio_discovery() { local api_key local config local query local retries local serial # Remove old discovery data storage (cleanup) # We now query the deCONZ database for it directly. if bashio::fs.file_exists /data/hassio.json; then rm /data/hassio.json fi # Try to get API key from deCONZ database query='SELECT apikey FROM auth WHERE devicetype="Home Assistant" ORDER BY createdate DESC LIMIT 1' api_key=$(sqlite3 "${DATA_STORE}" "${query}" .exit) if ! bashio::var.has_value "${api_key}"; then # Register an API key for Home Assistant if ! result="$(curl --silent --show-error --request POST -d '{"devicetype": "Home Assistant"}' "http://127.0.0.1:40850/api")"; then bashio::log.debug "${result}" bashio::exit.nok "Can't get API key from deCONZ gateway" fi api_key="$(bashio::jq "${result}" '.[0].success.username')" fi # Try to get the bridge ID/serial, try to avoid using 0000000000000000 retries=25 serial="0000000000000000" while [[ "${serial}" = "0000000000000000" ]]; do bashio::log.debug "Waiting for bridge ID..." sleep 10 # If we tried 25 times, just abort. if [[ "${retries}" -eq 0 ]]; then bashio::exit.nok "Failed to get a valid bridge ID. Discovery aborted." fi # Get bridge ID from API if ! result="$(curl --silent --show-error --request GET "http://127.0.0.1:40850/api/${api_key}/config")"; then bashio::log.debug "${result}" bashio::exit.nok "Can't get data from deCONZ gateway" fi serial="$(bashio::jq "${result}" '.bridgeid')" ((retries--)) done # Create config payload for Home Assistant config=$(bashio::var.json \ host "$(bashio::addon.ip_address)" \ port "^40850" \ api_key "${api_key}" \ serial "${serial}" \ ) # Send discovery info if bashio::discovery "deconz" "${config}" > /dev/null; then bashio::log.info "Successfully send discovery information to Home Assistant." else bashio::log.error "Discovery message to Home Assistant failed!" fi }