Vraag Hoe een script schrijven om te "luisteren" naar de batterijstatus en me waarschuwen wanneer het boven de 60% of onder de 40% is?


Ik wil een tool maken die waarschuwt wanneer de batterij onder de 40% of boven de 60% is, zodat ik het opladen dienovereenkomstig kan starten / stoppen.

Ik weet dat sommige gereedschappen waarschuwen wanneer de batterij bijna leeg is, dat is niet voldoende. Is er een tool die het doet wanneer de vleermuis hoog is?

Ik zou graag een script willen schrijven - shell of python, die dit kan doen. Ik ken het bevel om de bat-status te controleren:

upower -i /org/freedesktop/UPower/devices/battery_BAT0

Maar ik weet niet hoe ik naar de batterij moet "luisteren", zodat wanneer de status verandert, ik automatisch een actie kan uitvoeren. Een link naar docs zal leuk zijn, een tutorial nog beter.


4
2017-09-01 22:19


oorsprong




antwoorden:



Oké, ik denk dat ik dat wist. U wilt de batterijstatus controleren in elk X-interval. Het is de gemakkelijkste manier om het op de achtergrond uit te voeren, binnen een while-lus:

while true
 do
    # Any script or command
    sleep [number of seconds]
 done

En als u het script bij het opstarten en vanaf dan om de 5 minuten wilt uitvoeren, dan zou de constructie zijn:

  • Voeg een regel toe /etc/rc.local om je script te bellen (jouw battery_status.sh) + "&" om het te verlaten.
  • Voeg de opdrachten toe die u wilt uitvoeren in de battery_status.sh uitvoeren in een while-lus (binnen battery_status.sh).

Merk op dat als u het wilt uitvoeren cron, je moet het volledige pad instellen, sinds cron wordt uitgevoerd met een beperkt aantal omgevingsvariabelen.

Voorbeeld

#!/bin/bash
while true
do
    battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
    if [ $battery_level -ge 60 ]; then
       notify-send "Battery is above 60%!" "Charging: ${battery_level}%"    
    else [ $battery_level -le 40 ]
       notify-send "Battery is lower 40%!" "Charging: ${battery_level}%"    
    fi

    sleep 300 # 300 seconds or 5 minutes
done

Bewaar dit bestand op naam battery_status.sh op je favoriete locatie (de mijne is Home map) en voeg deze regel toe /etc/rc.local bestand (in mijn voorbeeld vervang je gewoon je battery_status.sh locatie door /home/kasiya/):

sh /home/kasiya/battery_status.sh &

Dat is alles. Start opnieuw op en zie de magie.

Als je geen instell hebt acpi, installeer gewoon dat met sudo apt-get install acpi

een BONUS 

Als u wilt dat dit script verantwoordelijk wordt gemaakt voor de AC-adapter, hebt u geen extra variabele nodig om die run een keer te controleren. Als uw AC-adapter is aangesloten en de batterij meer dan 60% is opgeladen, wordt er een waarschuwing weergegeven om "Uw adapter los te koppelen!" totdat je dat niet loskoppelt. Als het alarm u dat vertelt

enter image description here

gewoon de stekker van de netadapter uit het stopcontact halen, dan verschijnt het bericht pas weer als de batterij tot 40% is opgeladen. Dan waarschuwt een ander bericht en vertelt het u

enter image description here

als u de wisselstroomadapter niet loskoppelt van meer dan 60% of de wisselstroomadapter niet onder de 40% plaatst, wordt het waarschuwingsbericht om de 5 minuten weergegeven (u kunt dit zelf in de code aanpassen, zie sleep [seconds]) tonen en zullen u eraan herinneren.

 #!/bin/bash

    while true
    do
        export DISPLAY=:0.0
        battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
        if on_ac_power; then
            if [ $battery_level -ge 60 ]; then
                notify-send "Battery charging above 60%. Please unplug your AC adapter!" "Charging: ${battery_level}% "
                sleep 20
                if on_ac_power; then
                    gnome-screensaver-command -l   ## lock the screen if you don't unplug AC adapter after 20 seconds
                fi
             fi
        else
             if [ $battery_level -le 40 ]; then
                notify-send "Battery is lower 40%. Need to charging! Please plug your AC adapter." "Charging: ${battery_level}%"
                sleep 20
                if ! on_ac_power; then
                    gnome-screensaver-command -l   ## lock the screen if you don't plug AC adapter after 20 seconds
                fi
             fi
        fi

        sleep 300 # 300 seconds or 5 minutes
    done

15
2017-09-01 23:27



De bonus is precies wat ik wilde. Bedankt! - Taylor R


U kunt geen zelfstudie schrijven om te maken een script. Dat zou vergelijkbaar zijn met een algemene python-tutorial, die je op veel plaatsen op internet kunt vinden.

Wat ik deed, was een klein script schrijven, met opmerkingen om uit te leggen wat ik deed, om de batterijlading elke 10 seconden te controleren. Dat kan overdreven zijn. Verander de lijn time.sleep(10) om het interval in te stellen (in seconden). De commando's kunnen natuurlijk worden gewijzigd, ik heb ervoor gezorgd dat het een melding stuurt zoals het is.

enter image description here

Ik heb ervoor gezorgd dat het bericht wordt uitgevoerd, of welk commando je ook geeft, maar slechts één keer per incident, dus als de lading bijvoorbeeld hoger is dan 80%, wordt de opdracht slechts één keer uitgevoerd, tot de volgende keer dat de gedefinieerde waarden worden overschreden.

Hoe te gebruiken

Het script moet op de achtergrond worden uitgevoerd; kopieer het naar een leeg bestand, sla het op als check_battery.py maak het uitvoerbaar en laat het draaien bij inloggen: Dash> Start-apps> Toevoegen, voeg de opdracht toe:

/path/to/check_battery.py

Het script

#!/usr/bin/env python3

import subprocess
import time

def read_status():
    """
    This function reads the output of your command, finds the line with
    'percentage' (line 17, where first line = 0) and reads the figure
    """
    command = "upower -i $(upower -e | grep BAT) | grep --color=never -E percentage|xargs|cut -d' ' -f2|sed s/%//"
    get_batterydata = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
    return get_batterydata.communicate()[0].decode("utf-8").replace("\n", "")

def take_action():
    """
    When the charge is over 60% or below 40%, I assume the action does
    not have to be repeated every 10 seconds. As it is, it only runs
    1 time if charge exceeds the values. Then only if it exceeds the
    limit again.
    """
    # the two commands to run if charged over 80% or below 60%
    command_above = "notify-send 'charged over 80'%"
    command_below = "notify-send 'charged below 80%'"
    times = 0
    while True:
        charge = int(read_status())
        if charge > 60:
            if times == 0:
                subprocess.Popen(["/bin/bash", "-c", command_above])
                times = 1
        elif charge < 40:
            if times == 0:
                subprocess.Popen(["/bin/bash", "-c", command_below])
                times = 1
        else:
            times = 0
        time.sleep(10)

take_action()

8
2017-09-02 06:27