ISC Kea lease hook script
This is just an update for MQTT based presence detection, but using the ISC Kea lease hook library to send MQTT messages.
The script
First, the shell script I’m using. It’s more or less stolen from the ISC Kea
documentation, but I’ve added a :
in each empty function to avoid syntax
errors. :-)
#!/bin/bash
unknown_handle() {
echo "Unhandled function call ${*}"
exit 123
}
publish_mqtt () {
MAC=$1
STATE=$2
HOSTNAME=$3
UNIQUE_ID=$(echo "$MAC" | tr -d ":")
TIME=$(date +%s)
JSON=$(jq -n --arg mac "$MAC" --arg state "$STATE" --arg time "$TIME" --arg hostname "$HOSTNAME" '{mac: $mac, state: $state, update: $time, hostname: $hostname }' )
AUTO_DISCOVERY=$(jq -n --arg state_topic "location/${MAC}/state"\
--arg name "${HOSTNAME}" \
--arg payload_home "home"\
--arg payload_not_home "not_home"\
--arg source_type "router"\
'{state_topic: $state_topic, name: $name, payload_home: $payload_home, payload_not_home: $payload_not_home, source_type: $source_type }')
mosquitto_pub -h {{ dnsmasq_mqtt_address }} -u {{ dnsmasq_mqtt_username }} -P {{ dnsmasq_mqtt_password }} -t "homeassistant/device_tracker/${UNIQUE_ID}/config" -m "$AUTO_DISCOVERY"
mosquitto_pub -h {{ dnsmasq_mqtt_address }} -u {{ dnsmasq_mqtt_username }} -P {{ dnsmasq_mqtt_password }} -t "location/$MAC/attributes" -m "$JSON"
mosquitto_pub -h {{ dnsmasq_mqtt_address }} -u {{ dnsmasq_mqtt_username }} -P {{ dnsmasq_mqtt_password }} -t "location/$MAC/state" -m "$STATE"
}
lease4_renew () {
publish_mqtt "$LEASE4_HWADDR" "home" "$LEASE4_HOSTNAME"
}
lease4_expire () {
publish_mqtt "$LEASE4_HWADDR" "not_home" "$LEASE4_HOSTNAME"
}
lease4_recover () {
publish_mqtt "$LEASE4_HWADDR" "home" "$LEASE4_HOSTNAME"
}
leases4_committed () {
:
}
lease4_release () {
publish_mqtt "$LEASE4_HWADDR" "not_home" "$LEASE4_HOSTNAME"
}
lease4_decline () {
:
}
lease6_renew () {
:
}
lease6_rebind () {
:
}
lease6_expire () {
:
}
lease6_recover () {
:
}
leases6_committed () {
:
}
lease6_release () {
:
}
lease6_decline () {
:
}
case "$1" in
"lease4_renew")
lease4_renew
;;
"lease4_expire")
lease4_expire
;;
"lease4_recover")
lease4_recover
;;
"leases4_committed")
leases4_committed
;;
"lease4_release")
lease4_release
;;
"lease4_decline")
lease4_decline
;;
"lease6_renew")
lease6_renew
;;
"lease6_rebind")
lease6_rebind
;;
"lease6_expire")
lease6_expire
;;
"lease6_recover")
lease6_recover
;;
"leases6_committed")
leases6_committed
;;
"lease6_release")
lease6_release
;;
"lease6_decline")
lease6_decline
;;
*)
unknown_handle "${@}"
;;
esac
Nothing interesting, just using the same script and jq
to generate the json
payload. Just remember to make the script executable, and have mosquitto, bash
& jq installed.
ISC Kea configuration
And for the final configuration in ISC Kea:
{
"hooks-libraries": [
{
"library": "/usr/local/lib/libdhcp_run_script.so",
"parameters": {
"name": "/full_path_to/script_name.sh",
"sync": false
}
}
]
}
That’s it, now your ISC Kea will send a MQTT message for when new leases are handed out, and when old ones expires. I’m using this as a device tracker in Home Assistant.
Home Assistant configuration
I used to manually setup these device trackers in Home Assistant as it was quite easy:
# Before using autodiscovery
device_tracker:
- name: "Oscar iPhone"
state_topic: !secret oscar_iphone_attributes_topic
value_template: "{{ value_json.state }}"
source_type: "router"
…but I’ve now taken the approx. 2 minutes needed to read the auto discovery documentation, and implement it in my lease script above.