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

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
373
Punkte für Reaktionen
1
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?
 

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
373
Punkte für Reaktionen
1
Punkte
18
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.
 

WileC

Mitglied
Mitglied seit
28 Nov 2007
Beiträge
321
Punkte für Reaktionen
6
Punkte
18
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: [email protected]"

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
 

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
373
Punkte für Reaktionen
1
Punkte
18
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:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,558
Punkte für Reaktionen
329
Punkte
83
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)
 

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
373
Punkte für Reaktionen
1
Punkte
18
Ich bekomme ne Fehlermeldung.

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

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,558
Punkte für Reaktionen
329
Punkte
83
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:

WileC

Mitglied
Mitglied seit
28 Nov 2007
Beiträge
321
Punkte für Reaktionen
6
Punkte
18
@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..
 

R0cket

Mitglied
Mitglied seit
20 Sep 2009
Beiträge
373
Punkte für Reaktionen
1
Punkte
18
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ß.
 
3CX

Statistik des Forums

Themen
235,868
Beiträge
2,066,966
Mitglieder
356,839
Neuestes Mitglied
FH2020