Événement basé sur le niveau de charge de la batterie

11

Je n'ai encore rien trouvé alors j'espérais que quelqu'un ici aurait une idée.

Je veux lancer un événement basé sur la batterie d'un ordinateur portable Apple atteignant un certain niveau de charge ou lorsque la batterie est complètement chargée.

Je sais que je peux faire exécuter quelque chose périodiquement, vérifier le niveau de la batterie et décider quoi faire, mais je préfère les événements si possible.

Jongleur défectueux
la source

Réponses:

5

Power Manager n'est pas gratuit mais prend en charge le déclenchement d'événements en fonction des niveaux de batterie (interne ou UPS). Les événements peuvent exécuter des scripts, lancer des applications ou effectuer des tâches telles que l'arrêt.

Power Manager est piloté par les événements et n'interroge pas sur les changements de batterie.

Au lieu de cela, Power Manager se connecte à la couche IOKit d'OS X et attend les mises à jour du matériel. Les événements peuvent être déclenchés lorsque personne n'est connecté; il ne dépend pas d'un utilisateur actif.

Power Manager - Exécutez un script sur la batterie restante

Les tâches intégrées de Schedule Assistant se concentrent sur les performances lorsque la batterie tombe à un niveau particulier, mais elles peuvent être modifiées pour vérifier les augmentations du pourcentage de batterie ou du temps restant.

Ces deux articles parlent des sources d'alimentation UPS, mais ils s'adaptent facilement à la batterie interne de votre MacBook:

Divulgation: Je suis ingénieur logiciel derrière Power Manager.

Graham Miln
la source
3

Je veux que ce soit basé sur le système d'exploitation, donc je n'ai pas besoin d'une connexion Internet ou d'un navigateur ouvert, etc. Juste quelque chose qui peut arriver en arrière-plan

La façon la plus simple de le faire serait avec une application, mais voici comment le faire avec les commandes du système d'exploitation intégrées uniquement. Je sais que vous voulez qu'elle soit pilotée par les événements, mais je ne sais pas comment y parvenir, alors voici une façon de vérifier le niveau de la batterie, puis de faire autre chose si elle est supérieure / inférieure à un seuil.

Vous pouvez envisager un launchdprocessus, il s'agit essentiellement d'une tâche planifiée qui s'exécute toutes les xminutes. Ils sont souvent utilisés par les utilisateurs avancés, mais ne sont pas trop difficiles à configurer. Vous configurez une tâche planifiée launchd avec un fichier .plist que vous placez dans ce répertoire: Macintosh HD\Library\LaunchDaemonset c'est ainsi que vous structurez le fichier .plist;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Debug</key>
<true/>
<key>ExitTimeOut</key>
<integer>120</integer>
<key>Label</key>
<string>com.me.BatteryInfo</string>
<key>ProgramArguments</key>
<array>
    <string>/Users/yourusername/batt.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>

Si vous deviez enregistrer ce fichier comme com.me.BatteryInfodans le LaunchDaemonsdossier mentionné ci-dessus, cela créerait une tâche planifiée qui s'exécute toutes les 30 minutes. Le nombre, 1800directement au </dict>- dessus est le temps en secondes de la fréquence à laquelle vous souhaitez que la tâche s'exécute. Où il <string>/Users/yourusername/batt.sh</string>est indiqué est l'endroit où vous spécifiez quel script s'exécute dans les délais. Vous devez partir <string>et </sting>intact.

La ligne <string>com.me.BatteryInfo</string>est le nom unique de la tâche planifiée. Si vous allez en créer plusieurs, assurez-vous que chaque .plist porte un nom unique ici.

La prochaine chose que vous devez faire est de changer la propriété du .plist en root. Ceci est nécessaire en tant que fonction de sécurité (pour empêcher les logiciels / utilisateurs de créer des tâches malveillantes planifiées, je suppose). Pour changer la propriété du fichier, faites sudo chown root \Library\LaunchDaemons\yourtask.plist(remplacez yourtask.plist par le nom de fichier réel du .plist que vous avez créé). Cette tâche vous demandera un mot de passe.

Vous devez maintenant créer le script qui s'exécutera périodiquement. Vous devez créer un fichier .sh (un script bash) pour indiquer à l'ordinateur quoi faire. Pour créer un fichier .sh, ouvrez un éditeur de texte de programmeur, tel que Sublime Text ou Komodo Edit . N'UTILISEZ PAS Text Edit, car il ajoute souvent du texte à vos fichiers qui pourrait interférer avec votre script. L'édition de texte ne devrait pas vraiment être utilisée pour le code.

Créez un script (fichier .sh) avec le code suivant;

#!/bin/sh

percent=$(ioreg -l | awk '$3~/Capacity/{c[$3]=$5}END{OFMT="%.3f";max=c["\"MaxCapacity\""];print(max>0?100*c["\"CurrentCapacity\""]/max:"?")}')

if [ $percent > 95 ]
    then
        echo 'charged.'
fi
exit 0

Remplacez-la echo 'charged.'par la ou les commandes de terminal que vous souhaitez exécuter lorsque la batterie est chargée. open /Applications/Notes.appouvrira l'application Notes; vous pouvez modifier le répertoire pour ouvrir une autre application.

$percent > 95Cela indique à la ligne suivante de ne fonctionner que lorsque la batterie est plus que 95chargée. Vous pouvez changer cela en ce que vous voulez. Le niveau de la batterie ici sera souvent légèrement différent de ce qui est affiché dans la barre de menu en haut. Si vous souhaitez `` fonctionner lorsque la batterie est complètement chargée '', je recommande de laisser ceci comme> 95 . Si vous souhaitez que la tâche s'exécute lorsque votre batterie tombe en dessous de 20% par exemple, remplacez-la par$percent < 20

REMARQUE: comme il s'agit d'une tâche planifiée, votre script s'exécutera toutes les xminutes. Cela signifie que si vous mettez à l' open \Applications\Notes.appintérieur de votre script, l'application Notes démarrera toutes les xminutes (si votre batterie est chargée)

Cette tâche s'exécutera même si personne n'est connecté.

Je sais que vous avez posé cette question il y a quelque temps, mais j'espère que cela aidera quelqu'un.

Joseph
la source
2

Ce n'est pas spécifique à Mac, mais Mozilla Aurora possède une API intégrée qui contient une variété de fonctions liées à la batterie. On peut détecter l'état de la batterie (qu'elle soit en charge ou non), combien de temps il faudra pour que la batterie se décharge / se charge et son niveau. Il existe un exemple simple de la façon d'ajouter un EventListener pour appeler une fonction lorsque le niveau de la batterie est à un certain point.

Andrew Ng
la source
Je veux que ce soit basé sur le système d'exploitation, donc je n'ai pas besoin d'une connexion Internet ou d'un navigateur ouvert, etc. Juste quelque chose qui peut arriver en arrière-plan.
FaultyJuggler