web-dev-qa-db-fra.com

Mise à jour du niveau de luminosité en fonction de la source d'alimentation sous 16.04 LTS

J'ai récemment migré vers le 64 bits 16.04 LTS à partir du 32 bits 14.04 LTS sur mon ordinateur portable Toshiba L645. Dans le système 14.04 LTS, j'avais un script qui mettait automatiquement à jour le niveau de luminosité en fonction de la source d'alimentation. Malheureusement, je n'ai pas sauvegardé ce script avant d'écraser le système. Actuellement, j'utilise le script suivant

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: February 26 2016 
# Purpose: Brightness control that polls for
#          ac adapter presence. Uses
# Dependencies: on_ac_power script, dbus, Unity/Gnome 
# Written for: http://askubuntu.com/q/739617/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.

# uncomment the line bellow for debugging
#set -x

ARGV0="$0"
ARGC=$#


main()
{

  # defaults
  local DISPLAY=:0
  local DECREASE=30
  local INCREASE=75
  local RCFILE="$HOME/.auto-backlightrc"
  #---

  # Check the settings
  if [ -f $RCFILE ]
  then 
       source $RCFILE 
  else
       create_rcfile $DECREASE $INCREASE
  fi
  #---

  # now actually test if we're using ac adapter
  if ! on_ac_power 
  then 
        change_brightness $DECREASE
  # The two lines bellow are optional for 
  # setting brightness if on AC. remove # 
  # if you want to use these two

  # else 
       # change_brightness $INCREASE
  fi

}

change_brightness()
{
  dbus-send --session --print-reply\
    --dest=org.gnome.SettingsDaemon.Power\
    /org/gnome/SettingsDaemon/Power \
    org.gnome.SettingsDaemon.Power.Screen.SetPercentage uint32:"$1"
}

create_rcfile()
{
  echo "DECREASE="$1 >  "$RCFILE"
  echo "INCREASE="$2 >> "$RCFILE"
}


while true
do
   main
   sleep 0.25
done

Cependant, ce script ne fonctionne que lorsque l'alimentation est commutée de l'alimentation secteur à la batterie et ne rétablit pas le niveau de luminosité une fois que l'alimentation secteur est réactivée. En outre, une fois sur batterie, ce script essaie systématiquement de régler la luminosité au niveau prédéfini et même si j'essaie de le modifier manuellement, il réinitialise ce paramètre. J'aimerais pouvoir modifier manuellement le niveau de luminosité si je le souhaite, même en mode batterie.

7
thethakuri

Le script de Serg semblait fonctionner au début. Cependant, après un certain temps, le pourcentage était mal évalué, en particulier après le retour de l'hibernation. Il y a peut-être eu des problèmes avec qdbus, mais le niveau de luminosité ne changera pas. J'ai donc décidé de coder en dur le niveau de luminosité en utilisant la valeur du fichier max_brightness. Voici mon /usr/local/bin/auto-backlight.sh:

#!/usr/bin/env bash

read MAX_BRIGHTNESS < /sys/class/backlight/intel_backlight/max_brightness

declare -i -r BATT_PERCENTAGE=45 
declare -i -r AC_PERCENTAGE=90 
declare -i -r ON_BATT=$(($MAX_BRIGHTNESS*$BATT_PERCENTAGE/100)) 
declare -i -r ON_AC=$(($MAX_BRIGHTNESS*$AC_PERCENTAGE/100))

wait_ac_connect() {   while ! on_ac_power ; do : ; sleep 0.25 ; done   echo "Adapter plugged in. Brightness level at $ON_AC" }

wait_ac_disconnect() {   while on_ac_power ; do : ; sleep 1.25 ; done  echo "Running on battery. Brightness level at $ON_BATT" }

main() {  
    while true
    do

      if on_ac_power ; then
        wait_ac_disconnect
         echo $ON_BATT > /sys/class/backlight/intel_backlight/brightness
      else
        wait_ac_connect
         echo $ON_AC > /sys/class/backlight/intel_backlight/brightness
      fi

      sleep 0.25

    done

}

main "$@"

Contrairement au script de Serg, celui-ci nécessite un privilège root pour écrire dans le fichier brightness. J'ai donc créé un systemd service à /etc/systemd/system/auto-backlight.service:

[Unit]
Description=Change backlight on power source
ConditionFileIsExecutable=/usr/local/bin/auto-backlight.sh

[Service]
Type=simple
ExecStart=/usr/local/bin/auto-backlight.sh

[Install]
WantedBy=multi-user.target

Enfin, chargez le service au démarrage avec les privilèges root:

Sudo systemctl enable auto-backlight.service
1
thethakuri

Intro

Le script ci-dessous permet de mémoriser les niveaux de luminosité en fonction de la source d'alimentation utilisée par un ordinateur portable. La valeur par défaut est 50% sur la batterie, 90% sur le secteur.

Aperçu des options et de l'utilisation

source_monitor.sh [-a INT] [-b INT] [-v] [-h]

-a set initial brightness on AC adapter
-b set initial brightness on batter
-v enable verbose output
-h prints this help text

Installation

Installation à l'aide de git via un terminal:

  1. Exécutez Sudo apt-get install git pour installer git
  2. Exécutez mkdir $HOME/bin. Ignore cette étape si $HOME/bin existe déjà
  3. cd $HOME/bin
  4. Exécuter git clone https://github.com/SergKolo/sergrep.git
  5. Le script sera dans $HOME/bin/sergrep/source_monitor.sh. Assurez-vous que le script est exécutable avec chmod +x $HOME/bin/sergrep/source_monitor.sh
  6. Ajoutez le script en tant qu'application de démarrage. Recherchez le menu Applications de démarrage dans la recherche Unity Dash ou Gnome. Vous pouvez également exécuter la commande gnome-session-properties dans le terminal pour lancer le menu. Ajoutez le chemin d'accès complet au script en tant qu'application de démarrage afin qu'il se lance chaque fois que vous vous connectez à l'interface graphique.

Vous pouvez également copier et enregistrer la source de script par vous-même, chmod +x file, et passer à l'étape 6 décrite ci-dessus.

Pour que le script démarre automatiquement chaque fois que vous vous connectez à Gnome ou à Unity, utilisez l'utilitaire Applications de démarrage .

Source du script

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: June 18th 2016
# Purpose: Script that remembers and sets brightness
#      depending on power sources
# 
# Written for: https://askubuntu.com/q/788383/295286
# Tested on: Ubuntu 16.04 LTS , Ubuntu Kylin 16.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.

ARGV0="$0"
ARGC=$#
wait_ac_connect()
{
  while ! on_ac_power ; do : ; sleep 0.25 ; done
  $VERBOSE && echo "<<< adapter plugged in"
}

wait_ac_disconnect()
{
  while on_ac_power ; do : ; sleep 1.25 ; done 
  $VERBOSE && echo "<<< adapter unplugged"
}

change_brightness()
{
  qdbus org.gnome.SettingsDaemon \
       /org/gnome/SettingsDaemon/Power \
      org.gnome.SettingsDaemon.Power.Screen.SetPercentage "$1"
}

get_brightness()
{
  qdbus org.gnome.SettingsDaemon \
        /org/gnome/SettingsDaemon/Power \
        org.gnome.SettingsDaemon.Power.Screen.GetPercentage
}

print_usage()
{
cat <<EOF

source_monitor.sh [-a INT] [-b INT] [-v] [-h]

-a set initial brightness on AC adapter
-b set initial brightness on batter
-v enable verbose output
-h prints this help text

Copyright Serg Kolo , 2016
EOF
}

parse_args()
{
 # boiler-pate code for reusing, options may change
 local OPTIND opt  # OPTIND must be there, 
                   # opt can be renamed to anything
 # no leading : means errors reported(which is what i want)
 # : after letter means options takes args, no :  - no args
 while getopts "a:b:vh" opt
 do
   case ${opt} in
      a)  AC_PERCENTAGE="${OPTARG}"
        ;;
      b) BAT_PERCENTAGE="${OPTARG}"
        ;;
      v) VERBOSE=true
        ;;
      h) print_usage && exit 0
        ;;
     \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
    esac
  done
  shift $((OPTIND-1))
}

main()
{

    # default values, if -a,-b, or -v options given
    # they will be changed
    local BAT_PERCENTAGE=50
    local AC_PERCENTAGE=90
    local VERBOSE=false # for debugging

    parse_args "$@"

    while true
    do

      if on_ac_power ; then
         wait_ac_disconnect
          AC_PERCENTAGE=$(($(get_brightness)+1)) # too long to explain why +1
                         # just try it for yourself
          sleep 0.25
          change_brightness "$BAT_PERCENTAGE" > /dev/null
      else
          wait_ac_connect
          BAT_PERCENTAGE=$(($(get_brightness)+1))
          sleep 0.25
          change_brightness "$AC_PERCENTAGE" > /dev/null
      fi

      sleep 0.25

    done

}

main "$@"
3

Vous pouvez également créer des règles pour udev et appeler un simple script pour modifier la valeur de brighness: créez d’abord un fichier nommé auto-backlight.sh dans votre répertoire personnel (ou dans tout autre répertoire de votre choix) avec votre éditeur favori, tel que gedit. et copiez et collez le code suivant:

#!/bin/sh
# Adjust brightness of backlights based on power source
case $1 in
    # On battery
    true)
        # Dim screen backlight
        expr `cat /sys/class/backlight/intel_backlight/max_brightness` / 10 > \
            /sys/class/backlight/intel_backlight/brightness
    ;;

    # On AC
    false)
        # Dim screen backlight
        cat /sys/class/backlight/intel_backlight/max_brightness > \
            /sys/class/backlight/intel_backlight/brightness
    ;;
esac

return 0

Veuillez noter que /sys/class/backlight/intel_backlight/ pourrait être différent de votre système, comme /sys/class/backlight/acpi_video0/. Notez également que vous devez éventuellement modifier la valeur de / 10 en fonction de la valeur de max_brightness, qui peut être égal à 100, 50, 5, etc., car il s’agit d’un facteur de division.

Accordez des autorisations d'exécution au nouveau script créé: chmod 771 auto-backlight.sh

Créez ensuite un fichier nommé 99auto-backlight.rules avec votre éditeur favori et placez-le dans le dossier /etc/udev/rules.d/: Sudo gedit /etc/udev/rules.d/99auto-backlight.rules (ou associez-le à l'aide de la commande "ln"), contenant les deux lignes suivantes:

SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script/auto-backlight.sh true"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script/auto-backlight.sh false"

Remplacez /path/to/your/script/ par le chemin réel dans lequel se trouve le script auto-backlight.sh.

Nous remercions Alex Layton pour son idée ici: https://unix.stackexchange.com/a/110469 et pour Pilot6 pour son idée ici: https://askubuntu.com/a/613816

1
Ectatomma

Cuttlefish est un outil qui permet d’automatiser les modifications de paramètres en fonction d’événements tels que le branchement et le débranchement de l’alimentation.

0
Amias