Meldung bei geringem Akuladestand

krisztian

New member
Themenstarter
Registriert
17 Juli 2013
Beiträge
17
Hallo,

ich hab hier ein Debian Wheezy welches ich ohne DE und mit xmonad als WM betreibe. Das ganze auf einem x230.

Nun würde ich gern den Rechner in den suspend2both modus schicken wenn der Akkuladestand eine Schwelle unterschreitet.
Mittel meiner Wahl war acpi. Allerdings habe ich nun gemerkt, dass das acpi event

1 event=battery.*
2 action=/etc/acpi/warn_battery.sh %e

nur eintritt wenn ich das Ladegerät abziehe und eben nicht wenn der Ladestand niedrig ist.

Frage ist nun wie ich es am besten realisiere, ein Skript auszuführen wenn eine Ladeschwelle unterschritten wird ohne ständig den Ladestand zu pollen. Also irgend eine event basierte Lösung.

Gibt es so etwas?

Danke und Gruß,
krisztian
 
Hallo,

bin gerade über acpid gestolpert. Ist das Programm noch aktuell? Es scheint mir etwas viel zu machen und die meisten dieser Dinge brauche ich gar nicht (irgendwelche Sondertasten, etc.). Desweiteren kann der Dämon ja auch kein acpi-Event herzaubern das es nicht gibt oder?

Generell bin ich schon länger mit obiger Problematik beschäftigt und über jede Hilfe dankbar.

Gruß,
krisztian

Nachtrag: Ok, acpid ist eh schon installiert. Man liest immer von der handerls.sh unter /etc/acpi. So etwas hab ich nicht. Ist das nutzen der Datei veraltet? Ich hab eigentlich alles unter /etc/acpi/events und die entsprechenden Skripte ein Verzeichnis weiter oben.
 
Zuletzt bearbeitet:
Verstehe ich da was falsch? Wenn das Ladegerät angeschlossen ist und der Ladestand niedrig ist, dann wird wohl der Akku geladen. Willst du dann wirklich suspend ausführen?
 
Hallo :)

Nein, das Szenario ist, dass das Notebook am Akku hängt. Mein Eindruck war nur, dass das battery event nur ausgelöst wird wenn ich das Ladegerät abziehe.
 
Hi,

Allerdings habe ich nun gemerkt, dass das acpi event

1 event=battery.*
2 action=/etc/acpi/warn_battery.sh %e

nur eintritt wenn ich das Ladegerät abziehe und eben nicht wenn der Ladestand niedrig ist.

Das ACPI-Event tritt ein, wenn irgendwas mit dem Akku passiert, u.a. sollte bei sehr niedrigem Ladezustand eines ausgelöst werden. Du musst in warn_battery.sh dann also den Ladezustand prüfen (verbleibende %, "entlädt", kein Ultrabay-Akku vorhanden, der übernehmen könnte, Aktion nicht bereits ausgeführt/uptime, ...) und darauf entsprechend reagieren. Der Grenzwert für das Event scheint nicht konfigurierbar zu sein.


Frage ist nun wie ich es am besten realisiere, ein Skript auszuführen wenn eine Ladeschwelle unterschritten wird ohne ständig den Ladestand zu pollen. Also irgend eine event basierte Lösung.

Gibt es so etwas?

Abgesehen von laptop-mode-tools (nutzt definitiv das ACPI-Event) und den Power-Managern der großen DEs (braucht laufende X session(?), bspw. xfce4-power-manager) kenne ich da nichts. Wobei da nur Suspend/Hibernate/... möglich sind und der Grenzwert fest vorgegeben ist (ggf. wird hier auch nur das ACPI-Event abgefangen). Wie es (mittlerweile) bei GNOME/KDE aussieht, weiß ich nicht.

Folgende Möglichkeiten bieten sich meinen Erkentnissen nach an/nicht an:

  • acpi(d), siehe oben (lässt sich mit "acpi_listen" prüfen) (-)
  • udev-Events/Regeln sind hier in etwa mit acpi(d) vergleichbar (-> "udevadm monitor --udev --kernel") (-)
  • UPower (+)
    • löst spätestens alle 30 Sekunden ein D-Bus-Event aus (-> "upower --monitor-detail")
    • schwache Dokumentation (nur in-Code) -- oder gut versteckt (-)
    • Daemon nötig, um die Ereignisse zu erhalten (fertige Lösungen hierzu sind mir nicht bekannt, Ideen gibt es u.a. hier, in C)
    • der upowerd-Daemon muss ebenfalls laufen
    • braucht udev, dbus
    • die Akkuinformation (%, Anzahl der Akkus, ...) sind einfach (hardware-unabhängig) zu erhalten (+, in deinem Fall aber nicht so wichtig)
    • Umsetzung als Skript möglich, wäre mir aber zu ineffizient und fehleranfällig (Textausgabe muss ausgewertet werden):
      Code:
      #!/bin/[b]bash[/b] -u
      readonly UPOWER=/usr/bin/upower
      
      while read -r event; do
          echo "event = '${event}'" ## dbg
          while read -r dump_data; do
              # auswerten
              true
          done < <(${UPOWER} --dump)
      done < <(${UPOWER} --monitor)
  • Polling-basierte Lösung
    • auch als Skript umsetzbar (oder Cronjob + Skript)
    • (naive) Lösung ist mehr oder weniger offensichtlich und kurz (+)
      Code:
      #!/bin/sh -u
      ## kein echtes Skript!
      
      POLL_INTERVAL=30
      while sleep ${POLL_INTERVAL:?}; do
          if <bat is low and discharging> and <CONDITIONS>; then ## and <not on AC>?
              <ACTION>
          fi
      done
    • die Akkuinformation muss man selbst ermitteln (Fehlerquelle/recht schnell hardware-spezifisch) (-)

Für die Problemstellung "Führe Skript S1 aus, falls Akkzustand in Bereich B1_low..B1_high, S2, falls B2 usf." hätte ich ggf. was halbfertiges, auf UPower aufbauend. Halbfertig heißt wenig getestet, Anforderungen werden grob erfüllt, Name des Programms nicht final ;) Kann ich bei Interesse <irgendwo> (Anmerkung: Link folgt - irgendwann) zur Verfügung stellen, ein paar Konsolenkenntnisse (cd,git-clone,make) und etwas Lesen sind allerdings erforderlich.

vg,
dywi
 
Hallo,

also ja Du hattest recht. Es gibt acpi-events. acpi_listen hat geholfen. Erster Fehler bei mir war, dass mein Skript nicht so hieß wie gedacht (Binde- statt Unterstrich). Nachdem ich das behoben hatte hab ich gemerkt, dass in meinem Skript ein großer Denkfehler ist. Mein Skript war eher augf Polling ausgelegt. Wenn also das acpi-event für LowBat kommt (bei 15% übrigens) wird mein Skript aufgerufen. Da ich meine Schwellen aber niederiger hatte (und zudem neben dem Ladestand auch noch die aktuelle Restzeit in Betracht ziehe) wird mein Skript direkt beim ersten if wieder beendet. Die zweite Meldung kommt dann bei 5% und lösst das suspend2both wie erwartet aus, da meine Schwelle da auch bei 5% liegt.

Nun bin ich etwas am überlegen ob ich nicht mit der BatLow Meldung ein pollendes Skript starten soll welches dann bei 10% eine Warnung ausgibt. 15% ist bei einem 9Zellen-Akku einfach zu viel an Restzeit. Diese Warnung vergess ich dann eh wieder.

Egal. Das bekomm ich hin. Hauptproblem war eigene Unfähigkeit und Haupthilfe war acpi_listen. Vielen Dank also. :)

Gruß,
krisztian
 
Nun bin ich etwas am überlegen ob ich nicht mit der BatLow Meldung ein pollendes Skript starten soll welches dann bei 10% eine Warnung ausgibt. 15% ist bei einem 9Zellen-Akku einfach zu viel an Restzeit. Diese Warnung vergess ich dann eh wieder.

Wenn du die % "runterzählen" möchtest, dann ist das "upower --monitor" bash-Schnipsel weiter oben die bessere Variante (sofern upower vorhanden). Die innere Schleife (upower --dump) kannst du auch durch ein "cat /sys/class/power_supply/BATX/..." ersetzen (und daran denken, das Skript bei Zustandswechsel abzubrechen!).

dywi schrieb:
Für die Problemstellung "Führe Skript S1 aus, falls Akkzustand in Bereich B1_low..B1_high, S2, falls B2 usf." hätte ich ggf. was halbfertiges, auf UPower aufbauend. Halbfertig heißt wenig getestet, Anforderungen werden grob erfüllt, Name des Programms nicht final Kann ich bei Interesse <irgendwo> (Anmerkung: Link folgt - irgendwann) zur Verfügung stellen, ein paar Konsolenkenntnisse (cd,git-clone,make) und etwas Lesen sind allerdings erforderlich.

Siehe http://thinkpad-forum.de/threads/17...te-in-Abhängigkeit-des-Akkuzustands-ausführen

vg,
dywi
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben