From 4d05983d82733faa35af04dd65f49f7b9bd86ec7 Mon Sep 17 00:00:00 2001 From: sirmrak Date: Mon, 12 Oct 2026 14:49:13 +0300 Subject: [PATCH] Update files/hostapd.user --- files/hostapd.user | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/files/hostapd.user b/files/hostapd.user index 9d58efa..184551b 100644 --- a/files/hostapd.user +++ b/files/hostapd.user @@ -1,18 +1,18 @@ #!/bin/sh -# hostapd_cli passes arguments as: -# $1 = global -# $2 = IFNAME= -# $3 = <3> -# $4 = MAC address +# hostapd_cli action script for OpenWrt HA Presence Tracker + +# Parse arguments: $1=IFNAME, $2=EVENT, $3=MAC +EVENT_RAW="$2" +MAC="$3" -MAC="$4" [ -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') STATES_DIR="/tmp/mqtt_ha_states" mkdir -p "$STATES_DIR" +# Read MQTT settings from UCI MQTT_HOST=$(uci get openwrt_ha.main.host) MQTT_PORT=$(uci get openwrt_ha.main.port) MQTT_USER=$(uci get openwrt_ha.main.user) @@ -29,15 +29,20 @@ fi echo "$NEW_STATE" > "${STATES_DIR}/${MAC_LOWER}" +# Find device by MAC find_device_by_mac() { local search_mac="$1" local i=1 + while true; do device_name="device${i}" + if ! uci -q get openwrt_ha.${device_name}.name >/dev/null 2>&1; then break fi + device_macs=$(uci get openwrt_ha.${device_name}.macs) + for mac in $device_macs; do mac_lower=$(echo "$mac" | tr 'A-Z' 'a-z') if [ "$mac_lower" = "$search_mac" ]; then @@ -45,6 +50,7 @@ find_device_by_mac() { return 0 fi done + i=$((i + 1)) done return 1 @@ -62,12 +68,14 @@ DEVICE_DELAY=$(uci -q get openwrt_ha.${DEVICE_NAME}.delay) [ -z "$DEVICE_TYPE" ] && DEVICE_TYPE="tracker" [ -z "$DEVICE_DELAY" ] && DEVICE_DELAY="0" +# Log 1: Wi-Fi Event if [ "$EVENT" = "AP-STA-CONNECTED" ]; then logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) connected" elif [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} (${MAC_LOWER}) disconnected" fi +# Aggregate state get_aggregated_state() { local state="not_home" for mac in $DEVICE_MACS; do @@ -83,9 +91,11 @@ get_aggregated_state() { echo "$state" } +# Convert state based on type convert_state() { local state="$1" local type="$2" + if [ "$type" = "alarm" ]; then [ "$state" = "home" ] && echo "online" || echo "offline" else @@ -103,31 +113,42 @@ STATE_FILE="${STATES_DIR}/grace_${DEVICE_NUM}" if [ "$EVENT" = "AP-STA-CONNECTED" ]; then rm -f "$STATE_FILE" 2>/dev/null + CURRENT_STATE=$(get_aggregated_state) 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}" fi if [ "$EVENT" = "AP-STA-DISCONNECTED" ]; then CURRENT_STATE=$(get_aggregated_state) + if [ "$CURRENT_STATE" = "home" ]; then rm -f "$STATE_FILE" 2>/dev/null logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: ${CURRENT_STATE} (another MAC active)" else if [ "$DEVICE_DELAY" = "0" ]; then 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}" else echo "pending" > "$STATE_FILE" + ( sleep "$DEVICE_DELAY" + if [ -f "$STATE_FILE" ]; then FINAL_STATE=$(get_aggregated_state) if [ "$FINAL_STATE" = "not_home" ]; then 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)" else logger -t "wifi_tracker" "${DEVICE_NAME_TEXT} -> HA: cancelled (device reconnected)"