Battery API

Eis mais uma nova API HTML5 de acesso à dispositivos. A Battery API permite que tenhamos acesso a informações sobre a bateria do nosso dispositivo – seja ele um dispositivo móvel (smartphone ou tablet) ou um laptop. No caso de computadores desktop, não teremos esta informação disponível. Veja o status da sua bateria neste pequeno exeperimento que desenvolvi a la windows 8:

OBS.: O exeperimento acima funciona apenas no navegador Firefox atualizado por enquanto (no momento em que escrevo este post, estou usando a versão 19).

Sobre o exeperimento

Além de informar o nível da bateria, o canto inferior direito pode indicar se sua bateria está sendo carregada (ícone de um raio) ou se seu dispositivo está sendo alimentado diretamente por uma fonte de energia (ícone de uma tomada) – é o caso se sua bateria estiver totalmente carregada e ligada a uma fonte de energia. O exeperimento encontra-se disponível no GitHub.

Todas as funcionalidades relacionadas a bateria estão definidas na interface BatteryManager, que é acessível através do objeto navigator.battery.

if( navigator.battery ){
    // seu navegador suporta a Battery API
}

// testando com os vendor prefixes
var battery = navigator.battery || navigator.mozBattery || navigator.webkitBattery

if( battery ){
    // seu navegador suporta a Battery API
}

Como já mencionado, apenas a implementação navigator.mozBattery existe atualmente.

Propriedades

A API possui apenas 4 propriedades bem simples: charging, chargingTime, dischargingTime e level. Justamente pela simplicidade, cada uma delas já se auto explica apenas pelo seu nome.

charging

Booleano que indica se a bateria do dispositivo está ou não sendo carregada. Note que isto não é o mesmo que dizer se a bateria está (ou não) conectada a uma fonte de energia, pois temos o caso de estar ligada na fonte e 100% carregada, o que implica em dizer que o dispositivo talvez passe a utilizar a energia proveniente da fonte – isto acontece no MacBook e nos dispositivos iOS.

if( navigator.battery.charging ){
    // a bateria está sendo carregada
}

chargingTime

Fornece o tempo estimado para que a bateria carregue totalmente. Se a bateria estiver carregando – ou seja, se charging == true –, seu valor será um inteiro que representa o tempo em segundos. Caso contrário, será 'Infinity' – o que faz sentido pois se a bateria não está carregando, podemos dizer que o tempo estimado é infinito.

if( navigator.battery.charging ){
    console.log( navigator.battery.chargingTime ) // 3226s
    // faltam 53.7min para terminar de carregar
}

dischargingTime

Ao contrário de chargingTime, fornece o tempo estimado para que a bateria descarregue totalmente. Se a bateria não estiver carregando – quando charging == false –, seu valor será um inteiro que representa o tempo em segundos. Caso contrário, será 'Infinity'.

if( !navigator.battery.charging ){
    console.log( navigator.battery.dischargingTime ) // 5564s
    // faltam 1h32min para descarregar totalmente
}

level

Indica o nível de carga atual da bateria – float de 0 a 1.

console.log( navigator.battery.level ) // 0.34 = 34% de carga

Eventos

Para cada uma das 4 propriedades mostradas acima, temos um evento associado.

onchargingchange

onchargingchange será disparado toda vez que o valor de charging mudar.

navigator.battery.addEventListener( 'chargingchange', function(){
    if( navigator.battery.charging ){
        console.log( 'Bateria carregando' )
    } else {
        console.log( 'Bateria DEScarregando' )
    }
}, false)

onchargingtimechange

Se a bateria estiver carregando, onchargingtimechange será disparado toda vez que o valor de chargingTime mudar.

navigator.battery.addEventListener( 'chargingtimechange', function(){
    var tempoRestante = navigator.battery.chargingTime / 60
    console.log( 'Faltam ' + tempoRestante + ' minutos para terminar de carregar' )
}, false)

ondischargingtimechange

De maneira análoga a onchargingtimechange, se a bateria não estiver carregando, ondischargingtimechange será disparado toda vez que o valor de dischargingTime mudar.

navigator.battery.addEventListener( 'dischargingtimechange', function(){
    var tempoRestante = navigator.battery.dischargingTime / 60
    console.log( 'Faltam ' + tempoRestante + ' minutos para descarregar totalmente' )
}, false)

onlevelchange

onlevelchange será disparado toda vez que o valor de level mudar.

navigator.battery.addEventListener( 'levelchange', function(){
    var nivel = navigator.battery.level * 100
    console.log( 'O nível da bateria mudou para ' + nivel + '%' )
}, false)

Pra quê isso em JavaScript?

É bem provável que você esteja ai pensando: “mas que coisa inútil” – o que seria bem compreensível, mas, vamos pensar melhor.

A principal utilidade desta API se dá na plataforma móvel, onde geralmente temos recursos bem mais escassos em relação aos outros tipos de dispositivos com os quais estamos acostumados (desktops e laptops). Um destes recursos é justamente a quantidade de energia disponível.

Sem saber qual o status da bateria, um desenvolvedor terá que projetar uma aplicação assumindo o de risco que sempre haverá quantidade de energia suficiente para realizar seja qual for a tarefa pretendida. Isto significa que uma aplicação mal implementada – no sentido de ser ineficiente – poderá exaurir a bateria do usuário facilmente, piorando assim a experiência do usuário.

Um exemplo

Vamos imaginar que desenvolvemos uma web app para o novíssimo Firefox OS. Nossa app deverá realizar polling, isto é, deverá, de tempos em tempos, acessar uma determinada fonte de dados para checar se há informação nova disponível – digamos, por exemplo que nossa app pergunta ao Facebook de 5 em 5 segundos se há algo de novo. Em um intervalo de 1 hora, nossa aplicação fará 720 requisições só pra saber se tem algo de novo (obter as novidades de fato já são outros quinhentos). 720 requisições por hora pode facilmente comprometer a bateria de um dispositivo móvel, então, o ideal seria, por exemplo, fazer essas requisições de 20 em 20 segundos (baixando a quantidade de requisições por hora para 180) quando o dispositivo não estiver carregando e manter os 5 segundos para quando estiver conectado a uma fonte de energia.

Com a Battery API será possível aos desenvolvedores ter um feedback mais apurado em relação a este tipo de problema, o que auxiliará na tomada de decisão e consequentemente na melhora da qualidade de software.

Suporte

Battery API----16 *----
* O Firefox já dava suporte prefixado desde a versão 10 (mozBattery)
#38