Update files/hostapd.user
This commit is contained in:
+31
-10
@@ -1,18 +1,18 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# hostapd_cli passes arguments as:
|
# hostapd_cli action script for OpenWrt HA Presence Tracker
|
||||||
# $1 = global
|
|
||||||
# $2 = IFNAME=<interface>
|
# Parse arguments: $1=IFNAME, $2=EVENT, $3=MAC
|
||||||
# $3 = <3><event>
|
EVENT_RAW="$2"
|
||||||
# $4 = MAC address
|
MAC="$3"
|
||||||
|
|
||||||
MAC="$4"
|
|
||||||
[ -z "$MAC" ] && exit 0
|
[ -z "$MAC" ] && exit 0
|
||||||
|
|
||||||
EVENT=$(echo "$3" | sed 's/^<[0-9]*>//')
|
EVENT=$(echo "$EVENT_RAW" | sed 's/^<[0-9]*>//')
|
||||||
MAC_LOWER=$(echo "$MAC" | tr 'A-Z' 'a-z')
|
MAC_LOWER=$(echo "$MAC" | tr 'A-Z' 'a-z')
|
||||||
STATES_DIR="/tmp/mqtt_ha_states"
|
STATES_DIR="/tmp/mqtt_ha_states"
|
||||||
mkdir -p "$STATES_DIR"
|
mkdir -p "$STATES_DIR"
|
||||||
|
|
||||||
|
# Read MQTT settings from UCI
|
||||||
MQTT_HOST=$(uci get openwrt_ha.main.host)
|
MQTT_HOST=$(uci get openwrt_ha.main.host)
|
||||||
MQTT_PORT=$(uci get openwrt_ha.main.port)
|
MQTT_PORT=$(uci get openwrt_ha.main.port)
|
||||||
MQTT_USER=$(uci get openwrt_ha.main.user)
|
MQTT_USER=$(uci get openwrt_ha.main.user)
|
||||||
@@ -29,15 +29,20 @@ fi
|
|||||||
|
|
||||||
echo "$NEW_STATE" > "${STATES_DIR}/${MAC_LOWER}"
|
echo "$NEW_STATE" > "${STATES_DIR}/${MAC_LOWER}"
|
||||||
|
|
||||||
|
# Find device by MAC
|
||||||
find_device_by_mac() {
|
find_device_by_mac() {
|
||||||
local search_mac="$1"
|
local search_mac="$1"
|
||||||
local i=1
|
local i=1
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
device_name="device${i}"
|
device_name="device${i}"
|
||||||
|
|
||||||
if ! uci -q get openwrt_ha.${device_name}.name >/dev/null 2>&1; then
|
if ! uci -q get openwrt_ha.${device_name}.name >/dev/null 2>&1; then
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
|
||||||
device_macs=$(uci get openwrt_ha.${device_name}.macs)
|
device_macs=$(uci get openwrt_ha.${device_name}.macs)
|
||||||
|
|
||||||
for mac in $device_macs; do
|
for mac in $device_macs; do
|
||||||
mac_lower=$(echo "$mac" | tr 'A-Z' 'a-z')
|
mac_lower=$(echo "$mac" | tr 'A-Z' 'a-z')
|
||||||
if [ "$mac_lower" = "$search_mac" ]; then
|
if [ "$mac_lower" = "$search_mac" ]; then
|
||||||
@@ -45,6 +50,7 @@ find_device_by_mac() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
i=$((i + 1))
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
return 1
|
return 1
|
||||||
@@ -62,12 +68,14 @@ DEVICE_DELAY=$(uci -q get openwrt_ha.${DEVICE_NAME}.delay)
|
|||||||
[ -z "$DEVICE_TYPE" ] && DEVICE_TYPE="tracker"
|
[ -z "$DEVICE_TYPE" ] && DEVICE_TYPE="tracker"
|
||||||
[ -z "$DEVICE_DELAY" ] && DEVICE_DELAY="0"
|
[ -z "$DEVICE_DELAY" ] && DEVICE_DELAY="0"
|
||||||
|
|
||||||
|
# Log 1: Wi-Fi Event
|
||||||
if [ "$EVENT" = "AP-STA-CONNECTED" ]; then
|
if [ "$EVENT" = "AP-STA-CONNECTED" ]; then
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) connected"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) connected"
|
||||||
elif [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then
|
elif [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) disconnected"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) disconnected"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Aggregate state
|
||||||
get_aggregated_state() {
|
get_aggregated_state() {
|
||||||
local state="not_home"
|
local state="not_home"
|
||||||
for mac in $DEVICE_MACS; do
|
for mac in $DEVICE_MACS; do
|
||||||
@@ -83,9 +91,11 @@ get_aggregated_state() {
|
|||||||
echo "$state"
|
echo "$state"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Convert state based on type
|
||||||
convert_state() {
|
convert_state() {
|
||||||
local state="$1"
|
local state="$1"
|
||||||
local type="$2"
|
local type="$2"
|
||||||
|
|
||||||
if [ "$type" = "alarm" ]; then
|
if [ "$type" = "alarm" ]; then
|
||||||
[ "$state" = "home" ] && echo "online" || echo "offline"
|
[ "$state" = "home" ] && echo "online" || echo "offline"
|
||||||
else
|
else
|
||||||
@@ -103,31 +113,42 @@ STATE_FILE="${STATES_DIR}/grace_${DEVICE_NUM}"
|
|||||||
|
|
||||||
if [ "$EVENT" = "AP-STA-CONNECTED" ]; then
|
if [ "$EVENT" = "AP-STA-CONNECTED" ]; then
|
||||||
rm -f "$STATE_FILE" 2>/dev/null
|
rm -f "$STATE_FILE" 2>/dev/null
|
||||||
|
|
||||||
CURRENT_STATE=$(get_aggregated_state)
|
CURRENT_STATE=$(get_aggregated_state)
|
||||||
MQTT_PAYLOAD=$(convert_state "$CURRENT_STATE" "$DEVICE_TYPE")
|
MQTT_PAYLOAD=$(convert_state "$CURRENT_STATE" "$DEVICE_TYPE")
|
||||||
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" -t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
|
||||||
|
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \
|
||||||
|
-t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
||||||
|
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD}"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then
|
if [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then
|
||||||
CURRENT_STATE=$(get_aggregated_state)
|
CURRENT_STATE=$(get_aggregated_state)
|
||||||
|
|
||||||
if [ "$CURRENT_STATE" = "home" ]; then
|
if [ "$CURRENT_STATE" = "home" ]; then
|
||||||
rm -f "$STATE_FILE" 2>/dev/null
|
rm -f "$STATE_FILE" 2>/dev/null
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${CURRENT_STATE} (another MAC active)"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${CURRENT_STATE} (another MAC active)"
|
||||||
else
|
else
|
||||||
if [ "$DEVICE_DELAY" = "0" ]; then
|
if [ "$DEVICE_DELAY" = "0" ]; then
|
||||||
MQTT_PAYLOAD=$(convert_state "not_home" "$DEVICE_TYPE")
|
MQTT_PAYLOAD=$(convert_state "not_home" "$DEVICE_TYPE")
|
||||||
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" -t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \
|
||||||
|
-t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
||||||
|
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD}"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD}"
|
||||||
else
|
else
|
||||||
echo "pending" > "$STATE_FILE"
|
echo "pending" > "$STATE_FILE"
|
||||||
|
|
||||||
(
|
(
|
||||||
sleep "$DEVICE_DELAY"
|
sleep "$DEVICE_DELAY"
|
||||||
|
|
||||||
if [ -f "$STATE_FILE" ]; then
|
if [ -f "$STATE_FILE" ]; then
|
||||||
FINAL_STATE=$(get_aggregated_state)
|
FINAL_STATE=$(get_aggregated_state)
|
||||||
if [ "$FINAL_STATE" = "not_home" ]; then
|
if [ "$FINAL_STATE" = "not_home" ]; then
|
||||||
MQTT_PAYLOAD=$(convert_state "not_home" "$DEVICE_TYPE")
|
MQTT_PAYLOAD=$(convert_state "not_home" "$DEVICE_TYPE")
|
||||||
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" -t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \
|
||||||
|
-t "$TOPIC" -m "$MQTT_PAYLOAD" -r
|
||||||
|
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD} (after ${DEVICE_DELAY}s delay)"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${MQTT_PAYLOAD} (after ${DEVICE_DELAY}s delay)"
|
||||||
else
|
else
|
||||||
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: cancelled (device reconnected)"
|
logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: cancelled (device reconnected)"
|
||||||
|
|||||||
Reference in New Issue
Block a user