Evento baseado no nível de carga da bateria

11

Ainda não encontrei nada, então esperava que talvez alguém aqui tivesse uma idéia.

Quero iniciar um processo baseado na bateria de um laptop Apple que atinja um determinado nível de carga ou quando a bateria estiver totalmente carregada.

Sei que posso executar algo periodicamente, verificar o nível da bateria e decidir o que fazer, mas prefiro o evento, se possível.

FaughtJuggler
fonte

Respostas:

5

O Power Manager não é gratuito, mas suporta eventos de disparo com base nos níveis da bateria (interna ou no-break). Os eventos podem executar scripts, iniciar aplicativos ou executar tarefas como desligar.

O Power Manager é orientado a eventos e não pesquisa mudanças na bateria.

Em vez disso, o Power Manager se conecta à camada IOKit do OS X e aguarda atualizações do hardware. Eventos podem ser acionados quando ninguém está logado; não depende de um usuário ativo.

Power Manager - Execute um script com a bateria restante

As tarefas internas do Schedule Assistant se concentram na execução quando a bateria cai para um nível específico, mas elas podem ser ajustadas para verificar aumentos na porcentagem da bateria ou no tempo restante.

Esses dois posts falam sobre fontes de energia do no-break, mas são facilmente adaptáveis ​​à bateria interna do seu MacBook:

Divulgação: Eu sou um engenheiro de software por trás do Power Manager.

Graham Miln
fonte
3

Eu quero que isso seja baseado no sistema operacional, então não preciso de uma conexão à Internet ou de um navegador aberto, etc. Apenas algo que pode acontecer em segundo plano

A maneira mais fácil de fazer isso seria com um aplicativo, mas veja como fazê-lo apenas com comandos do sistema operacional interno. Sei que você deseja que ele seja direcionado a eventos, mas não tenho certeza de como fazer isso, então aqui está uma maneira de verificar o nível da bateria e fazer outra coisa se estiver acima / abaixo de um limite.

Você pode considerar um launchdprocesso, essa é basicamente uma tarefa agendada que é executada a cada xminuto. Eles geralmente são usados ​​por usuários avançados, mas não são muito difíceis de configurar. Você configura uma tarefa agendada launchd com um arquivo .plist que você coloca neste diretório: Macintosh HD\Library\LaunchDaemonse é assim que você estrutura o arquivo .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>

Se você salvar esse arquivo como com.me.BatteryInfona LaunchDaemonspasta mencionada acima, ele criará uma tarefa agendada que será executada a cada 30 minutos. O número, 1800diretamente acima, </dict>é o tempo em segundos da frequência com que você deseja que a tarefa seja executada. Onde diz <string>/Users/yourusername/batt.sh</string>é onde você especifica qual script é executado dentro do cronograma. Você deve sair <string>e </sting>intacto.

A linha <string>com.me.BatteryInfo</string>é o nome exclusivo da tarefa agendada. Se você quiser criar mais de um, verifique se cada .plist tem um nome exclusivo aqui.

A próxima coisa que você precisa fazer é alterar a propriedade do .plist para root. Isso é necessário como um recurso de segurança (para impedir que software / usuários criem tarefas maliciosas agendadas, presumo). Para alterar a propriedade do arquivo, faça sudo chown root \Library\LaunchDaemons\yourtask.plist(substitua yourtask.plist pelo nome real do arquivo .plist que você criou). Esta tarefa solicitará uma senha.

Agora você precisa criar o script que será executado periodicamente. Você precisa criar um arquivo .sh (um script do bash) para informar ao computador o que fazer. Para criar um arquivo .sh, abra um editor de texto de programadores, como Sublime Text ou Komodo Edit . NÃO use o Text Edit, pois geralmente adiciona texto aos seus arquivos, o que interferiria no seu script. A edição de texto não deve realmente ser usada para código.

Crie um script (arquivo .sh) com o seguinte código;

#!/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

Substitua echo 'charged.'pelo (s) comando (s) do terminal que você deseja executar quando a bateria estiver carregada. open /Applications/Notes.appabrirá o aplicativo Notes; você pode alterar o diretório para abrir um aplicativo diferente.

$percent > 95Isso indica à próxima linha para funcionar somente quando a bateria estiver mais do que 95carregada. Você pode mudar isso para o que quiser. O nível da bateria aqui geralmente será ligeiramente diferente do que é exibido na barra de menus na parte superior. Se você quiser 'funcionar com a bateria totalmente carregada', recomendo deixá-lo como> 95 . Se você deseja que a tarefa seja executada quando a bateria ficar abaixo de 20%, por exemplo, altere-a para$percent < 20

NOTA: Como essa é uma tarefa agendada, seu script será executado a cada xnúmero de minutos. Isso significa que, se você open \Applications\Notes.appinserir seu script, o aplicativo Notes será iniciado a cada xminuto (se a bateria estiver carregada)

Esta tarefa será executada mesmo se ninguém estiver conectado.

Sei que você fez essa pergunta há um tempo, mas espero que isso ajude alguém.

Joseph
fonte
2

Isso não é específico do Mac, mas o Mozilla Aurora possui API interna que contém uma variedade de funções relacionadas à bateria. Pode-se detectar o status da bateria (esteja sendo carregada ou não), quanto mais tempo levará para a bateria descarregar / carregar e seu nível. Há um exemplo simples de como adicionar um EventListener para chamar uma função quando o nível da bateria está em um determinado ponto.

Andrew Ng
fonte
Eu quero que isso seja baseado no sistema operacional, então não preciso de uma conexão à Internet ou de um navegador aberto, etc. Apenas algo que possa acontecer em segundo plano.
FaultyJuggler