ubuntuusers.de

WLAN bei Akkubetrieb automatisch ausschalten

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

broseman

Anmeldungsdatum:
15. Februar 2005

Beiträge: 42

Hallo Forum,

ich möchte gern mein WLAN-Modul automatisch deaktivieren, wenn ich den Rechner unterwegs nutze – um Strom zu sparen. Daher suche ich ein Skript (oder Programm, Applet, ...), mit dem ich abfragen kann, ob sich der Rechner im Akku-Betrieb befindet und mit dem ich dann das WLAN abschalten kann. Umgekehrt genauso: Netzbetrieb → WLAN an.

Wer kann mir weiterhelfen?

Besten Dank

broseman

unmensch

Anmeldungsdatum:
29. Mai 2010

Beiträge: 170

Hallo,

per Skript, für eine einfache Abfrage, kannst du die Dateien /proc/acpi/ac_adapter/AC0/state und /proc/acpi/battery/BAT0/state im Pseudo-Dateisystem proc verwenden. Wenn der Netzstecker eingesteckt ist, ist in der ersten Datei on-line, ansonsten off-line, wenn der Akku drin ist, endet die erste Zeile der zweiten Datei mit yes bzw. no.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Vermutlich wird das an- und abstöpseln des Netzkabels doch auch über den dbus gemeldet.
Das wäre noch eine Alternative zum ständigen abfragen des /proc/... Status.

Starte mal den dbus-monitor im Terminal und beobachte, was er beim an- und abstöpseln meldet.
Eine Anleitung wie man dann damit was basteln kann findest Du z.B. hier: http://dbus.freedesktop.org/doc/dbus-tutorial.html
Im Prinzip brauchst Du aber nur die betreffenden dbus-Meldungen zu abbonieren.

LG,

track

broseman

(Themenstarter)

Anmeldungsdatum:
15. Februar 2005

Beiträge: 42

Die Dateien unter /proc/... scheinen das zu sein, was ich suche. Besten Dank! dbus klingt auch interessant, aber auf den ersten Blick ist mir das zu kompliziert – zumal ich den Status auch nur ein einziges Mal abfragen möchte.

Noch eine Frage: Ich möchte WLAN nur dann abschalten, wenn der Rechner mein Heim-Netzwerk nicht findet. Wie kann ich abfragen, ob das Netzwerk mit einer bestimmt ssid in Reichweite ist bzw. ob sich mein Rechner damit bereits verbunde hat?

Gruß und Dank

broseman

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Den Scan auf erreichbare Wlans machst Du mit

sudo iwlist scan

und zum testen, ob Du in Deinem Netzwerk eingebucht bist, würde ich einfach einen ping auf den Router verwenden.
(oder ifconfig und iwconfig , die erzählen auch etwas zu dem Thema)

LG,

track

Marco_S

Anmeldungsdatum:
12. März 2006

Beiträge: 189

Wohnort: Dortmund

Hallo broseman,

ich habe das mit acpi gemacht. Du musst dafür auf jeden Fall die Pakete acpi und acpid installiert haben:

sudo apt-get install acpi acpid

Jetzt kannst du dir mit dem Befehl acpi_listen das Singal anzeigen lassen, welches gesendet wird, sobald du dein Netzteil abziehst. Bei mir sieht das so aus:

#Netzteil abgezogen
battery BAT0 00000081 00000001
battery BAT0 00000080 00000001
ac_adapter ACAD 00000080 00000000
processor CPU0 00000081 00000000
processor CPU1 00000081 00000000

# Netzteil angestöpselt
battery BAT0 00000081 00000001
battery BAT0 00000080 00000001
ac_adapter ACAD 00000080 00000001

Damit du auf diese Events reagieren kannst, musst du eine kleine Datei in /etc/acpi/events/ anlegen (ich habe diese einfach acpower genannt).

sudo vi /etc/acpi/events/acpower

In diese Datei kommt dann (Achtung, der Wert 00000080 sollte stimmig mit deiner Ausgabe aus acpi_listen sein):

event=ac_adapter ACAD 00000080
action=/etc/acpi/acpower.sh %e

Ok, um jetzt auf diese Events zu reagieren, habe ich ein kleines Script geschrieben (/etc/acpi/acpower.sh):

#!/bin/bash
LOGFILE=/var/log/acpid.log
echo "$1" >> $LOGFILE
action=`acpi -a |awk -F' ' '{print $3}'`
echo  "$action" >> $LOGFILE
if [ $action == "on-line" ];then
        ifup eth1 >> $LOGFILE 2>&1;
elif [ $action == "off-line" ];then
        ifdown eth1 >> $LOGFILE 2>&1;
fi

Dem Script jetzt noch die Rechte geben:

sudo chmod 755 /etc/acpi/acpower.sh

und acpid neustarten:

sudo /etc/init.d/acpid restart

Die Logausgaben kannst du natürlich nach dem Test weglassen.

Gruß Marco

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

Du könntest das auch so lösen:

#!/bin/bash

while true
do
var=` cat /proc/acpi/battery/BAT1/state | grep -i "discharging" | awk '{ print $3 }'`
if [[ "$var" == "discharging" ]]
then
sudo ifdown ath0
else
sudo ifup ath0
fi
sleep 10s # Gaaaaanz Wichtig !!!!
done

Dieses Skript läuft die ganze Zeit im Hintergrund.

Damit es funktioniert, müßtest du im /etc/sudoers das schreiben:

ACHTUNG !! Um /etc/sudoers zu editieren:

sudo visudo

Drin und nach der Zeilen:

# User privilege specification
root    ALL=(ALL) ALL

folgendes schreiben:

meinusername  mypcname = NOPASSWD: /sbin/ifup
meinusername  mypcname = NOPASSWD: /sbin/ifdown

broseman

(Themenstarter)

Anmeldungsdatum:
15. Februar 2005

Beiträge: 42

Spannend, wie viele Wege zum Ziel führen. Vielen Dank für eure ausführlichen Antworten!

Befehle, die Root-Rechte benötigen, würde ich gerne vermeiden. ifdown hat außerdem den Haken, dass ich das WLAN-Modul nur mit ifup wieder einschalten kann, nicht über das Menu oder den Schiebschalter am Notebook. Gleiches gilt für rfkill. (btw, was ist eigentlich der Unterschied zwischen ifdown und rfkill?). Stattdessen bin ich über eine längere Befehls-Zeile mit dbus-send gestolpert. (@track: also doch dbus ☺) Ein kleiner Schönheitsfehler bleibt, ich muss danach zweimal den Schiebeschalter betätigen, um WLAN wieder einzuschalten. Aber damit kann ich leben.

Um mein Heim-Netzwerk zu finden, habe ich "nm-tool" gefunden, in dem ich nach dem Namen des Netzes suchen kann. Ein Ping auf den Router fand ich zwar auch eine interessante Idee, aber viele Router benutzen ja die gleiche (interne) IP.

Kurzum, hier mein derzeitiges Script:

#!/bin/bash
sleep 30
if grep -q off-line /proc/acpi/ac_adapter/ACAD/state; then
	if !(nm-tool | grep -q NETZWERKNAME); then
		gdialog --yesno "WLAN abschalten?"
		if [ $? -eq 0 ]; then
			dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:false
		fi
	fi
fi
Antworten |