[Frage] Aktionen ausführen wenn sich ein bestimmtes Gerät im LAN oder WLAN anmeldet.

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
433
Punkte für Reaktionen
7
Punkte
18
Hallo,

ich möchte die Fritzbox mit freetz bestimmte Aktionen ausführen lassen, wenn sich ein bestimmtes Gerät, wie bspw. ein Chromecast in das WLAN anmeldet. Eindeutig identifiziert am besten anhand der MAC Adresse oder wenn das nicht geht, anhand der IP oder Namen wie "Chromecast".

Wie kann man das mit freetz am besten realisieren?

Ideal wäre so etwas wie callmonitor zu haben, aber wo man auch interne Events wie an und Abmeldung von Geräten im Netz nutzen kann.

Beispiel: Ich will dass die fritzbox mir eine E-Mail sendet, wenn mein PC von Ruhemodus und 10MBit am LAN in den On Modus mit 1 GB LAN geht, oder umgekehrt, wenn mein PC aus geht, will ich sofort eine Push Nachricht haben. genauso, wenn mein Chromecast in WLAN verfgbar ist, will ich einen anderen PC per WOL aufweckne, und wenn der Chromecast nicht mehr im WLAN zu finden ist, soll die Fritzbox per HOL den PC abschalten.

Ich bin mir sicher, dass das realisierbar ist.

Weiß einer wie?
 
  • Like
Reaktionen: Micha0815
OK das sieht gut aus. Aber wie prüfe ich in einem script ob eine bestimmte MAC sich angemeldet hat.

Das script list auch die offline MACS auf.
 
ich habe mir mal ein Skript für den DNSMasq geschrieben, welches bei jeder IP-Zuteilung ausgeführt wird (dhcp-script=/var/tmp/flash/skripte/dhcp_publish_name.sh).

Für Dich dürfte der obere Teil interessant sein: Parameterübergabe vom dnsmasq. Weiter unten werden dann die übergebenen Daten, insbesondere die MAC ausgewertet und verarbeitet.

Wäre ein Beispiel. Du müsstest Dir natürlich selbst ein Skript basteln, mit den Anweisungen, was mit den übergebenen Daten passieren soll ;)

Code:
#!/bin/sh
#
# Skript für DNSMasq, wenn dieser eine IP
# zugeteilt hat, damit im AVM-WebIF der richtige
# HOSTNAME angezeigt wird.

DNSMASQ_ACTION=$1
DNSMASQ_MAC=$(echo $2 | tr [a-z] [A-Z])
DNSMASQ_IP=$3
DNSMASQ_HOSTNAME=${4:-UNKNOWNHOST}

echo "Parameterübergabe von DNSMasq: $@"

if [ -z $DNSMASQ_ACTION ] || [ -z $DNSMASQ_MAC ] || [ -z $DNSMASQ_IP ] || [ -z $DNSMASQ_HOSTNAME ]; then
        echo "Mindestens eine Variable wurde von DNSMasq nicht richtig übergeben"
        exit 1
fi

# entsprechendes LANDEVICE aus dem CTLMGR auslesen und anhand der MAC nach den Datenfeldern LANDEVICE und NAME aufsplitten
LANDEVICE_STRING=$(ctlmgr_ctl l landevice "settings/landevice/list(mac,name)" | grep $DNSMASQ_MAC)
LANDEVICE_TO_CHANGE=$(echo "$LANDEVICE_STRING" | cut -f 2)
LANDEVICE_OLD_NAME=$(echo "$LANDEVICE_STRING" | cut -f 4)

# HOSTNAME auf AVM-gültige Zeichen formatieren
DNSMASQ_HOSTNAME=$(echo $DNSMASQ_HOSTNAME | tr "_" "-" | tr -cd "[:alnum:]-")

if [ -z $LANDEVICE_TO_CHANGE ]; then
        echo "Keinen passenden Eintrag im CTLMGR_CTL gefunden!"
        exit 1
fi

if [ "$LANDEVICE_OLD_NAME" != "$DNSMASQ_HOSTNAME" ]; then
                ctlmgr_ctl w landevice "settings/$LANDEVICE_TO_CHANGE/name" $DNSMASQ_HOSTNAME | logger
                echo "Der Hostname des $LANDEVICE_TO_CHANGE wurde in $DNSMASQ_HOSTNAME geändert."
    else
        echo "Es wurden keine Änderungen am $LANDEVICE_TO_CHANGE durchgeführt."
fi

exit 0
 
Das ist genau das was ich brauche:

ctlmgr_ctl l landevice "settings/landevice/list(mac,name)" | grep 33:44:55:12:34:56

Dieser Befehl listet aber alle jemals erkannten Geräte auf.

Mit welchen Befehl suche ich nur in den aktuell aktiven Geräten?

OK ich habe das gefunden:

Mit dem Befehl:

Code:
ctlmgr_ctl r landevice settings/landevice2/active

kann man checken, ob das Gerät aktiv ist oder nicht. falls aktiv, ist return code 1 else 0.

Ich hoffe nur, dass die landevice ID sich nicht dauernd ändert.

Also wäre das script für mich in etwa so:


Code:
if ctlmgr_ctl r landevice settings/landevice2/active; then
    echo command returned true
else
    echo command returned some error
fi

EDIT: Hier habe ich noch was nützliches gefunden:


Code:
#!/bin/sh

while true; do
local looptime=180
wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3871&new_value=180' | echo $(date) Setze PhoneLoop $looptime auf Homematic
landevicelist() {
    local count=0
    local maxcount=$(ctlmgr_ctl r landevice settings/landevice/count)
    while [ $count -lt $maxcount ] ; do
        local name=$(ctlmgr_ctl r landevice settings/landevice$count/name)       
        if [ $name = Phone1-OneX ] ; then
            local active=$(ctlmgr_ctl r landevice settings/landevice$count/active)
            if [ $active -eq 1 ] ; then
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3867&new_value=true' | echo $(date) $name, Phone 1, angemeldet
            else
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3867&new_value=false' | echo $(date) $name, Phone 1, abgemeldet
            fi
        elif [ $name = Phone2-Wildfire ] ; then
            local active=$(ctlmgr_ctl r landevice settings/landevice$count/active)
            if [ $active -eq 1 ] ; then
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3868&new_value=true' | echo $(date) $name, Phone 2, angemeldet
            else
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3868&new_value=false' | echo $(date) $name, Phone 2, abgemeldet
            fi
        elif [ $name = Phone3-Lutea ] ; then
            local active=$(ctlmgr_ctl r landevice settings/landevice$count/active)
            if [ $active -eq 1 ] ; then
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3869&new_value=true' | echo $(date) $name, Phone 3, angemeldet
            else
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3869&new_value=false' | echo $(date) $name, Phone 3, abgemeldet
            fi
        elif [ $name = Phone4-iPhone ] ; then
            local active=$(ctlmgr_ctl r landevice settings/landevice$count/active)
            if [ $active -eq 1 ] ; then
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3870&new_value=true' | echo $(date) $name, Phone 4, angemeldet
            else
                wget -q -O /dev/null 'http://homematic.fritz.box/config/xmlapi/statechange.cgi?ise_id=3870&new_value=false' | echo $(date) $name, Phone 4, abgemeldet
            fi   
        fi
        : $((count++))
    done   
}
landevicelist
echo sleep $looptime
sleep $looptime
done

Ich werde mal damit experimentieren.


Gibt es irgendwo ein Befehlsliste für ctlmgr_ctl ? Es gab mal sowas auf wehavemorefun, aber die Seite ist down.

Wann soll ich das script laufen lassen? Gibt es eine intelligente alternative als über cron alle par sekunden das script laufen zu lassen?

Welches program ist dafür zuständig ein neues gerät im netz zu erkennen? Gibt es so etwas wie onlinechanged auch für das Erkennen von Netzwerkgeräten?
 
Zuletzt bearbeitet:
Moinsen


Obiges Skript wäre mir zu unflexibel, deswegen hab ich es mal so verändert, dass es in einem "IF THEN ELSE" angewendet werden kann und der Name des Gerätes als Parameter übergeben werden kann.

Skript: landevices.sh
Rich (BBCode):
landevice() {
#set -x
local count=0
local maxcount=$(ctlmgr_ctl r landevice settings/landevice/count)
while [ "${count}" != "${maxcount}" ]
do
local name=$(ctlmgr_ctl r landevice settings/landevice${count}/name)       
#echo "${count} = $(ctlmgr_ctl r landevice settings/landevice${count}/name)"
if [ ${name} == "${1}" ]
then
local active=$(ctlmgr_ctl r landevice settings/landevice${count}/active)
if [ ${active} -eq 1 ]
then
#set +x
echo 'Aktiv'
return 0
else
#set +x
echo 'Nicht Aktiv'
return 1
fi
fi
: $((count++))
done
#set +x   
return 1
}

Das Skript ist eine Funktion und muss mit dem führenden Punkt gesourced werden.
Also in einer Shell oder einem anderen Skript.
Bildschirmfoto vom 2020-08-08 17-08-27.png
(Anwendungsbeispiel)
 
Ich bekomme ne Fehlermeldung.

Code:
./landvice.sh: line 27: syntax error: unexpected "}" (expecting "then")
 
Komisch, wenn ich das so aufrufe kommt...
Code:
./landevices.sh
-ash: ./landevices.sh: Permission denied

Ich meinte aber "sourcen" mit dem Punkt.
Rich (BBCode):
. landevices.sh
# Nichts passiert, ausser, dass die Funktion in Shell oder Skript inkludiert wird
# Jetzt nur der Funktionsaufruf...
landevice 'oups' && echo da || echo nichtsda
nichtsda

Keine Erklärung auf die Schnelle in deutsch gefunden, vielleicht ist ja der erste Absatz von...
https://linuxhandbook.com/source-command/
...verständlicher?

PS: Wenn du die Kommentarzeichen ( # ) im Skript landevices.sh entfernst, kannst du in der Konsole sehen was die Funktion so treibt ;)

Und hier noch ein Beispiel für eine Aktion/Zugriff aufs Gerät
Code:
(landevice deepblue) && (wget -O- http://192.168.188.3/jason_boxinfo.xml) || (echo nichtda)
Connecting to 192.168.188.3 (192.168.188.3:80)

<j:BoxInfo xmlns:j="http://jason.avm.de/updatecheck/">
<j:Name>FRITZ!Box Fon WLAN 7360 SL</j:Name>
<j:HW>181</j:HW>
<j:Version>109.06.34</j:Version>
<j:Revision>38647</j:Revision>
<j:Serial>FFFFFFFFFFFF</j:Serial>
<j:OEM>avm</j:OEM>
<j:Lang>de</j:Lang>
<j:Annex>B</j:Annex>
<j:Lab></j:Lab>
<j:Country>049</j:Country>
-                    100% |***************************************************************************************************************|   364   0:00:00 ETA
Innerhalb der runden Klammern können auch mehrzeilige ( mit ; getrennte ) Kommandos stehen.
() = Subshellausführung == Ein exit kann so die aufrufende Shell nicht beenden
 
Zuletzt bearbeitet:
@R0cket nutzt du denn den DNSmasq ??!

ctlmgr_ctl l landevice "settings/landevice/list(mac,name)" | grep 33:44:55:12:34:56

Dieser Befehl listet aber alle jemals erkannten Geräte auf.

Nein! .. dieser sucht in allen bereits bekannten Geräten des multid, ob die vom DNSMasq übergebene MAC bereits bekannt ist..
 
Ich bekomme ne Fehlermeldung.

Code:
./landvice.sh: line 27: syntax error: unexpected "}" (expecting "then")

Die Fehlermeldung kommt, da das Script Eindos zeilenenden hat.

Aber das Script muss Unix zeilenenden haben.

Ich habe das nun etwas anders gelöst:

Code:
if [ "$(ping -c4 "Chromecast" | grep -c "seq")" -eq 4 ]; then
ether-wake -b MACDESZUWECKENDEPCS

sleep 10;

fi

exit 0

Das ganze in cron und alle par minuten ausgeführt sollte das Problem lösen.

Nein ich benutze kein dnsmasq, ist für die 7390 zu groß.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.