WLAN Auto Off: Check nach local user alle 5 Minuten

ckohrt

Neuer User
Mitglied seit
23 Mrz 2010
Beiträge
11
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich möchte eine Lösung vorstellen, die die 2,4GHz WLAN Schnittstelle automatisch ausschaltet wenn kein lokaler Benutzer mehr aktiv ist.

Zunächst hier das Script für die FB 7390, das in die debug.cfg eingetragen werden kann (also ohne irgendwelche Addons installieren zu müssen):

Code:
 ######################
 # WLAN AUTO OFF      #
 ######################

logfileCheckWLAN="/var/tmp/CheckWLAN.log" 

# Zeit
time=`date` 

echo "$time: Start WLAN Auto Off." >>$logfileCheckWLAN


checkWLAN() {

echo "$time: Execute CheckWLAN" >>$logfileCheckWLAN

# Liste der zu testenden Adressen
# nicht zu überprüfende lassen
# sich auskommentieren
HOSTS=`grep -v ^# <<!
#192.168.66.1 Fritzbox Router 7390
#192.168.66.2 Fritzbox Router 7170
192.168.66.50
192.168.66.51
192.168.66.52
#192.168.66.36 AppleTv
#192.168.66.37 Server!`

# Ping-Befehl mit Parametern
# hier: sendet eine Anfrage mit timeout 1s
PING="ping -c 1 -W 1"
ACTIVE=false

for ADDR in ${HOSTS}
do

  # Zeit
  time=`date` 

  #echo ${PING} ${ADDR}
  ${PING} ${ADDR} > /dev/null 

  if [ $? -eq 0 ]
   then
    echo "$time: ${ADDR} is active!" >>$logfileCheckWLAN
    ACTIVE=true
    continue
   else
    echo "$time: ${ADDR} is not active!" >>$logfileCheckWLAN
   fi
done



# Zeit
time=`date`

if [ "${ACTIVE}" = "false" ]
then
    echo "$time: No PCs active, turn WLAN OFF!" >>$logfileCheckWLAN
    ctlmgr_ctl w wlan settings/ap_enabled 0
else
    echo "$time: Do nothing, some PCs are active." >>$logfileCheckWLAN
fi

(sleep 300; checkWLAN) &
}

(sleep 300; checkWLAN) &

Es wird unter /var/tmp/CheckWLAN.log ein Logfile erstellt. Das script checkt alle 5 Minuten (=300 Sekunden) ob ein lokaler client activ ist. Lokale Clients sind alle PCs von Usern, also keine Server, Internetradios usw. die ständig an sind. In der FB habe ich den IP Bereich entsprechend angepaßt, damit zB dynamisch nur der Bereich 192.168.66.50 - .52 vergeben wird, wie in der Hostliste zu sehen.

Viel Spaß damit!

Wer kann dieses Skript verbessern? Vom Timing her könnte es passieren, dass sich jemand ins Netz kommt mit WLAN und im selben Augenblick das WLAn abgeschaltet wird, da 5 Min vorbei. Wie kann das behoben werden? Danke!

Ist es ein Problem, wenn ich die Funktion rekursiv aufrufe?
 
Zuletzt bearbeitet:
Versionsupdate :)

Hallo,

ich habe den vorstehenden Code mal etwas erweitert, weil er mir zu statisch war. Im Script wird nun in der Liste der an der FB registrierten Devices nach WLAN-Geräten gesucht. Ist eines dieser Geräte noch aktiv, bleibt das WLAN eingeschaltet. 5min später wird erneut gesucht (in der Liste der Geräte, es könnte ja ein neues kommen) und die Zeit verläuft, sollte eines der Geräte eingeschaltet sein.

Wichtig: Die Auswertung der PING-Antwort vom WLAN-Client wird ggf. durch dessen Firewall nicht funktionieren, das habe ich (noch) nicht getestet.

Die Logfile-Ausgaben sollte man nach einigen Tests reduzieren, daß bspw. nur noch der Programmstart und das Abschalten erfaßt wird.

Code:
 ######################
 # WLAN AUTO OFF      #
 ######################

#!/bin/sh
logfileCheckWLAN="/var/tmp/CheckWLAN.log" 

# Zeit
time=`date` 
echo "$time: Start WLAN Auto Off." >>$logfileCheckWLAN

checkWLAN() {
echo "$time: Execute CheckWLAN" >>$logfileCheckWLAN
count=0
HOSTS=""
# Anzahl bekannter Geraete
maxcount=`ctlmgr_ctl r landevice settings/landevice/count`

# WLAN-Geraete
while [ $count -lt $maxcount ] ; do
	is_wlan=`ctlmgr_ctl r landevice settings/landevice$count/wlan`
	if [ "$is_wlan" = "1" ] ; then
		name=`ctlmgr_ctl r landevice settings/landevice$count/name`
		ip=`ctlmgr_ctl r landevice settings/landevice$count/ip`
		echo Device$count: $name $ip >>$logfileCheckWLAN
		HOSTS="$HOSTS $ip"
	fi
	let count+=1
done

# Ping-Befehl mit Parametern
# hier: sendet eine Anfrage mit timeout 1s
PING="ping -c 1 -W 1"
ACTIVE=false

for ADDR in ${HOSTS}
do

  # Zeit
  time=`date` 

  #echo ${PING} ${ADDR}
  ${PING} ${ADDR} > /dev/null 

  if [ $? -eq 0 ]
   then
    echo "$time: ${ADDR} is active!" >>$logfileCheckWLAN
    ACTIVE=true
    continue
   else
    echo "$time: ${ADDR} is not active!" >>$logfileCheckWLAN
   fi
done

# Zeit
time=`date`

if [ "${ACTIVE}" = "false" ]
then
    echo "$time: No PCs active, turn WLAN OFF!" >>$logfileCheckWLAN
    ctlmgr_ctl w wlan settings/ap_enabled 0
else
    echo "$time: Do nothing, some PCs are active." >>$logfileCheckWLAN
fi

(sleep 300; checkWLAN) &
}

(sleep 300; checkWLAN) &

Verbesserungsvorschäge / Korrekturen sehe ich gern, denn es holpert noch sehr mit meinem Programmcode :)
Das Script liegt auf einem USB-Stick, gestartet wird es durch folgende Einträge in der debug.cfg:
Code:
cp /var/media/ftp/takeMS-MiniR-01/autowlanoff /var/tmp/
chmod +x /var/tmp/autowlanoff
/bin/sh /var/tmp/autowlanoff &
Vorher läuft die Prüfung, ob der USB-Datenträger bereit ist (findet man im Forum).

Viele Grüße,
Henry
 
[..]
let count+=1
[..]
Statt dem könntest auch folgendes machen:
[..]
count=$((count+1))
[..]

Und ich würde auch die kurze Variante von if-then-else verwenden. Statt:

[..]
if [ $? -eq 0 ]
then
echo "$time: ${ADDR} is active!" >>$logfileCheckWLAN
ACTIVE=true
continue
else
echo "$time: ${ADDR} is not active!" >>$logfileCheckWLAN
fi
[..]

verwende dieses hier:
[..]
[ $? -eq 0 ] && {
echo "$time: ${ADDR} is active!" >>$logfileCheckWLAN
ACTIVE=true
continue
} || {
echo "$time: ${ADDR} is not active!" >>$logfileCheckWLAN
}
[..]
Und noch was. Statt dem:
[..]
PING="ping -c 1 -W 1"
[..]
dieses:
[..]
PING=$(ping -c 1 -W 1)
[..]
 
Zuletzt bearbeitet:
Hallo,

vielen Dank für die Änderungen. Zu den Vorschlägen:

"If/then/else" würde ich nicht kürzen, weil dieses "WLAN Auto Off" Feature Skript auch nicht-Programmierer, also einfache Anwender der FB, nutzen wollen. Ich wäre geneigt, das Skript so zu schreiben, dass möglichst viele es verstehen. Programmierer gehen ja oft den kürzesten aber leider nicht den verständlichsten Weg. Ist aber Ansichtssache...

Ich finde die Idee super, WLAN Geräte aus der FB auszulesen.

Wichtig: Die Auswertung der PING-Antwort vom WLAN-Client wird ggf. durch dessen Firewall nicht funktionieren, das habe ich (noch) nicht getestet.
Also einen Ping hat bei jedes Gerät noch beantwortet... ich bin mir nicht sicher was du meinst. (?)

Kann mir jemand die Sache mit dem
[..]
count=$((count+1))
[..]
erklären? Sicher macht es einen Unterschied, aber welchen?

Ist es ein Problem, wenn ich die Funktion rekursiv aufrufe?
Bei mir keines, da seit Monaten so aktiv....



Wer kann dieses Skript verbessern? Vom Timing her könnte es passieren, dass sich jemand ins Netz kommt mit WLAN und im selben Augenblick das WLAn abgeschaltet wird, da 5 Min vorbei. Wie kann das behoben werden? Danke!
War bisher bei mir auch kein Problem...

Danke und Gruß,
Christian

PS
Vielleicht sollten wir auch nochmal den Jungs von Heise danken, die dieses Skript ursprünglich bereitgestellt haben. Das war eine gute Ausgangsbasis. :)

PPS
Die FB hat ja auch die Energiesparfunktion, nämlich reduziert sie die WLAN Sendeleistung automatisch. Reduziert heißt nicht aus, aber bei mir ist WLAN eigentlich immer an, weil meine Frau und ich jeden Tag WLAN nutzen. Von daher auch nochmal die grundsätzliche Frage, ob man das überhaupt braucht. Nachts geht das Ding natürlich aus, aber das kann man auch in der FB einstellen per Timer.
 
Ob das nun noch nötig ist?

Zumindest für FB mit neuer FW kann man es auch über das WebIF machen.

"Zeitschaltung für das WLAN-Funknetz verwenden" + "Das Funknetz wird erst abgeschaltet, wenn kein WLAN-Netzwerkgerät mehr aktiv ist." als Zeit kann man ja z.B. von 00:01 bis 00:00 angeben über über den Plan auch täglich abweichende Zeiten.
 
Hallo,
"Zeitschaltung für das WLAN-Funknetz verwenden" + "Das Funknetz wird erst abgeschaltet, wenn kein WLAN-Netzwerkgerät mehr aktiv ist."
ich hatte das tatsächlich einmal vor Anpassung des Scriptes hier probiert, aber nicht mit 00:01 -00:00. Nun habe ich das aber nochmals probiert und mein Ergebnis von seinerzeit bestätigt:

AVM hat eine falsche Logik für die Option "... wird erst abgeschaltet, wenn kein WLAN-Netzwerkgerät mehr ...". Denn es wird nur dann der Trigger für diese Abschaltung aktiv, wenn ein Gerät nach WLAN-Anschalten angemeldet war. Ansonsten ist das WLAN nach Zeitplan an. Schaltet man es dann nach automatischer Abschaltung wieder ein, ist es bis zur nächsten Abschaltung an, wenn kein Gerät angemeldet war. Also im Grunde unbrauchbar.

Das obige Script schaltet immer zum angegebenen Zeitablauf ab, auch dann, wenn WLAN "versehentlich" eingeschaltet wurde oder eben dann doch vergessen worden ist, das WLAN-Gerät zu benutzen...

Für AVM ist es theoretisch eine Kleinigkeit, die Funktion in der Systematik zu korrigieren... aber vielleicht ist das auch genau so vom PM gewünscht gewesen, damit das WLAN eben wirklich erst nach erfolgter Benutzung aus geht :eek:

Grüße,
Henry
 
Hallo,

danke von mir für die Änderungsvorschläge zum Script! Ich sehe den Ansatz vom TS Christian allerdings als sehr wertvoll, denn allein dadurch wurde es mir ja auch einfacher :) Werde also den Code überabeiten und einfach beide Varianten hier stehen lassen.

Aktuell habe ich eine Ergänzung vorgenommen: Die ganze Schleife wird nun erst ausgeführt, wenn WLAN überhaupt an ist (war mir ursprünglich in den Sinn gekommen, aber vergessen).

Zum Beginn der Funktion also zwei neue Zeilen:
Code:
checkWLAN() {

wlan_status=`ctlmgr_ctl r wlan settings/ap_enabled`

if [ "$wlan_status" = "1" ]; then
Und am Ende kommt noch ein weiteres 'fi'
Code:
echo "$time: Do nothing, some PCs are active."  >>$logfileCheckWLAN
 fi
fi

(sleep 300; checkWLAN) &

Klappt bestens hier - bis auf jeweils im Rahmen der aktuellen FW-Beta-Updates ein Phänomen: Ich mußte nach Update im aktivierten WLAN den Gastzugang aktivieren, deaktiviern und dann WLAN deaktivieren. Erst dann lief WLAN (ohne script) ohne Endgerät konsequent - zuvor hatte ich eine Abschaltung die Zeitlich zur WLAN-Energiesparfunktion paßt (aber nichts mit dem Script zu tun hatte, weil das erst nach fünf min gekommen wäre).


Also einen Ping hat bei jedes Gerät noch beantwortet... ich bin mir nicht sicher was du meinst. (?)
Die FW vom Endgerät kann die Ping-Antwort verwerfen, so daß kein PING also Meldung verwendet werden kann, daß das Gerät noch an ist.

Die FB hat ja auch die Energiesparfunktion, nämlich reduziert sie die WLAN Sendeleistung automatisch. Reduziert heißt nicht aus, aber bei mir ist WLAN eigentlich immer an, weil meine Frau und ich jeden Tag WLAN nutzen. Von daher auch nochmal die grundsätzliche Frage, ob man das überhaupt braucht. Nachts geht das Ding natürlich aus, aber das kann man auch in der FB einstellen per Timer.
Klar ist das eine individuelle Sache. Hier wird es sehr selten gebraucht und der Knopfdruck am Gerät oder im Menü des MT-F ist kein Thema... nach erfolgter Nutzung wäre es dann aber für Stunden unsinnig an.

Als würde es nicht besser vom Timing passen, kam heute per Mail vom Umweltinstitut München e.V: "Mobilfunk-Broschüre neu aufgelegt", hier der Link: http://www.umweltinstitut.org/downl...ahlung_Broschuere_Umweltinstitut_Muenchen.pdf (ab Seite 12 geht es um WLAN)

Meine DECT-Deaktivierung als komplette Nachtschaltung der FB ist auch schon gut fertig, stelle ich in Kürze ins Forum ein.

Grüße,
Henry
 
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.