OpenWRT - Status Wifi-Teilnehmer via MQTT an FHEM senden

Begonnen von rob, 13 August 2020, 16:39:12

Vorheriges Thema - Nächstes Thema

valknut

#15
Danke für die Antwort.

Ich habe jetzt nochmal alles neu gestartet und probiert. Wahrscheinlich hat sich bei meinen Tests irgendwas überschnitten.

Es klappt alles. "DISCONNECT" kommt ca. 3 min nach der Abmeldung des Hosts (unabhängig der eingestellten Lease Time des Netzwerks)
cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
ergibt bei mir 60 für den arp-cache

#!/bin/sh
echo "`date` - gefunden - name ${1} Event ${2} MAC $3" >> /tmp/testhostapd.log


Mon Mar  1 11:34:31 CET 2021 - gefunden - name wlan0 Event AP-STA-DISCONNECTED MAC 00:11:22:33:44:55
Mon Mar  1 11:34:57 CET 2021 - gefunden - name wlan0 Event AP-STA-CONNECTED MAC 00:11:22:33:44:55
Mon Mar  1 11:40:50 CET 2021 - gefunden - name wlan0 Event AP-STA-DISCONNECTED MAC 00:11:22:33:44:55
Mon Mar  1 11:41:05 CET 2021 - gefunden - name wlan0 Event AP-STA-CONNECTED MAC 00:11:22:33:44:55


Das kommt bei mir nur auf dem Router, wo DHCP aktiv ist und auch nur dann, wenn sich der Host an dessen WLAN anmeldet. Am Ende liegt es wirklich irgendwie an der Konfiguration des AP.

Ich muss auch if [ "$op" == "arp-del" ] nehmen, da dieser Zustand immer beim Abmelden des Clients kommt.

Ich habe jetzt diese Variante
#!/bin/sh

# configure dnsmasq with --dhcp-script= this script
# based on this article: https://jpmens.net/2013/10/21/tracking-dhcp-leases-with-dnsmasq/
op="${1:-op}"
mac=$(echo $2 | tr a-z A-Z)
ip="${3:-ip}"
#hostname="${4}"
myMQTT_device=DHCP
#tstamp="`date '+%Y-%m-%d %H:%M:%S'`"

topic="dhcp/${mac}"

myvar1=$(uci show dhcp | grep -oE "host\[\d+\].mac='"${mac}"'"|grep -oE "\[(\d+)\]")
myHostName=$(uci get dhcp.@host$myvar1.name)

if [ "$op" == "arp-del" ]
  then payload="DISCONNECTED"
  else payload="CONNECTED"
fi

if [ -z "$myHostName" ]
  then myMQTT_topic="dhcp/unknownhost:${mac}"
  else myMQTT_topic="dhcp/$myHostName:${mac}"
fi

mosquitto_pub -h 10.2.89.2 -t "${myMQTT_topic}" -m "${payload}" -i $myMQTT_device


erfolgreich am laufen. Das Skript läuft nur auf dem Main-Router und wurde in der dhcp.conf unter "dnsmasq" mitoption dhcpscript '/etc/config/send_MQTT_dhcp.sh eingebunden. Das hostapd skript habe ich erstmal deaktiviert.

Ich werde das jetzt mal ausgiebig testen und ggf. Änderungen hier posten, falls was nicht funktionieren sollte. Ein paar Tests mit unbekannten Hosts stehen noch aus.

Vielen Dank für deine Zeit und Hilfe.

valknut

Habe jetzt deine Variante#!/bin/sh

# configure dnsmasq with --dhcp-script= this script
# based on this article: https://jpmens.net/2013/10/21/tracking-dhcp-leases-with-dnsmasq/
op=$1
mac=$(echo $2 | tr a-z A-Z)
ip="${3:-ip}"
#hostname="${4}"
myMQTT_device=DHCP
#tstamp="`date '+%Y-%m-%d %H:%M:%S'`"

topic="dhcp/${mac}"

#myvar1=$(uci show dhcp | grep -oE "host\[\d+\].mac='"${mac}"'"|grep -oE "\[(\d+)\]")
myHostName=$4

if [ "$op" == "del" ]
  then payload="DISCONNECTED"
  else payload="CONNECTED"
fi

if [ -z "$myHostName" ]
  then myMQTT_topic="dhcp/unknownhost:${mac}"
  else myMQTT_topic="dhcp/$myHostName:${mac}"
fi

mosquitto_pub -h 10.2.89.2 -t "${myMQTT_topic}" -m "${payload}" -i $myMQTT_device


getestet. Da erhalte ich aber alle Geräte doppelt. Einmal mit Hostname, der auch im Router abgebildet wird und nach kurzer Zeit nochmal als unknownhost... und mit "del" kommt der DISCONNECT Status nicht

rob

Zitat von: valknut am 01 März 2021, 16:32:27
... und mit "del" kommt der DISCONNECT Status nicht
Supi, danke Dir fürs Austesten und gut wenn es auch so hinhaut. Echt interessant, dass es im Detail solche Unterschiede gibt. Das hat schnell Verzweiflungspotenzial  ;D

Viele Grüße
rob

valknut

Hallo zusammen.

Es gibt Neuigkeiten, die ich euch nicht vorenthalten möchte. Bei dem zuletzt besprochenen Skript hatte ich das Problem, dass es nur bei dem Aufruf bei Änderung im Router ausgeführt werden konnte.
Ich wollte aber dann gerne etwas haben, was mir die gesamte Arp-Tabelle scannt und dann via mqtt verschickt.
Also habe ich mein vorheriges Skript durch folgendes Skript ersetzt und zusätzlich einen cronjob angelegt, welcher mir das Skript regelmäßig ausführt, um so evtl. übersehene Events auszugleichen.

Es ist eine Mischung aus dem bisherigen und dem von hier https://github.com/onemarcfifty/openwrt-scripts/blob/master/ipscan
Dabei habe ich auch durch eine zusätzliche if Bedingung für "myvar1" auch noch einen Fehler in meinem Log wegbekommen, der erzeugt wurde, wenn diese Variable leer war.

#!/bin/ash

do_arp_cache () {


for SCANNED_HOST in $(cat /proc/1/net/arp | /usr/bin/gawk -F " "  '{ print "SCANHOSTIP=" $1  ";SCANHOSTMAC="  $4 ";SCANHOSTSTATUS="  $3 ";SCANHOSTNETWORK="  $6  }')
do
eval $SCANNED_HOST
mac=$(echo $SCANHOSTMAC | tr a-z A-Z)
ip=$(echo $SCANHOSTIP | tr \. \-)
myvar1=$(uci show dhcp | grep -oE "host\[\d+\].mac='"${mac}"'"|grep -oE "\[(\d+)\]")


if ! [[ -z "$myvar1" ]]; then
  myHostName=$(uci get dhcp.@host"$myvar1".name)
  myMQTT_topic="arp-cache/$SCANHOSTNETWORK/$myHostName/$ip"
else myMQTT_topic="arp-cache/$SCANHOSTNETWORK/unknownhost/$ip"

fi

if [ "$SCANHOSTNETWORK" != "HW" ] ; then

if [ "$SCANHOSTSTATUS" == "0x0" ]
  then payload="false"
  elif [ "$SCANHOSTSTATUS" == "0x2" ]
  then payload="true"
fi


/usr/bin/mosquitto_pub -h <IP vom ZIEL> -p 1884 -t "${myMQTT_topic}" -m "${payload}" -i $myMQTT_device

fi

done
}


do_arp_cache



rob

angeregt durch den MQTT-Workshop von @Beta-User, möchte ich gleich den "Exkurs - überholte Readings" hier reinempfehlen (https://forum.fhem.de/index.php/topic,116162.msg1111136.html#msg1111136). Vielen Dank an dieser Stelle :)
Gerade beim Gäste-Device kann es vorkommen, dass Readings ewig alt sind, weil der Gast sich nie wieder blicken lässt (warum auch immer ;) ), selten da ist oder ein anderes Telefon hat etc. pp.

Also lassen wir uns von nun an die alten Readings automatisch löschen.

Am Beispiel Gäste-Wifi:

attr MQTT2_OpenWRT_wlan0 setList deleteOldReadings:noArg {fhem "deletereading -q $NAME (?!IODev|state).* 86400"}
attr MQTT2_OpenWRT_wlan0 periodicCmd deleteOldReadings:1440

IODev und state werden ausgenommen. Zumindest bei mir werden Router und AP nicht oft neu gestartet, sodass diese Readings älter sein dürfen + sollen (Stichwort Uptime/ letzer Connect usw).
Die Zeitwerte habe ich übernommen, weil ich 24h absolut passend finde. (86400 ist in Sekunden, 1400 in Minuten)

Ausgestattet habe ich damit nun alle drei Wifi-Netze bei mir. Jetzt herrscht Ordnung ;)

Viele Grüße
rob