energy watcher
Powertop pokazuje ciekawą informację o aktualnym poborze mocy, którą to chciałem mieć pokazaną w Conky. Niestety nie znalazłem ku temu żadnych gotowych skryptów ani programów. Uznałem więc, że jest potrzeba – i sam zabrałem się za pisanie. Na początku myślałem by wykonać to w c++, jednak niestety parsowanie stringów tam jest nie na moje nerwy. Więc poszedłem na łatwiznę, i napisałem stosowny skrypt w php.
#!/usr/bin/php
<?php
/* CONFIG */
define ('BATTERY','BAT0'); //set to your acpi batt (/proc/acpi/battery/XXX)
/* END OF CONFIG */
if (!is_file('/proc/acpi/battery/'.BATTERY.'/state')) die("Battery state file not found!\n\r");
function showhelp() {
echo "Energy Watcher 0.2\n\r";
echo "Usage: ewatcher [-vw]\n\r";
echo " -v verbose mode\n\r";
echo " -w show only W\n\r";
}
$verbose = false;
$onlywatt = false;
$arguments = getopt('hvw');
if (isset($arguments['h'])) {
showhelp(); exit();
}
if (isset($arguments['v'])) $verbose = true;
if (isset($arguments['w'])) $onlywatt = true;
/* get last timestamp & amp */
if (is_file('last_timestamp')) $last_timestamp = file_get_contents('last_timestamp');
else $last_timestamp = time();
if (is_file('last_amp')) $last_amp = file_get_contents('last_amp');
else $last_amp = 1;
/* get current timestamp */
$current_timestamp=time();
/* get current amp */
$battery_state = file_get_contents('/proc/acpi/battery/'.BATTERY.'/state');
$pattern = "/remaining capacity\:[\ ]+([0-9]+)/";
preg_match($pattern,$battery_state,$matches);
$current_amp = intval($matches[1]);
if ( $current_timestamp > ($last_timestamp+60) ) {
/* get current voltage */
$pattern = "/present voltage\:[\ ]+([0-9]+)/";
preg_match($pattern,$battery_state,$matches);
$current_voltage = intval($matches[1]);
/* echo infos */
if ($verbose) {
echo 'Last timestamp: ' . $last_timestamp . "\n\r";
echo 'Current timestamp: '. $current_timestamp . "\n\r";
echo 'Last amp: '. $last_amp/1000 . " Ah\n\r";
echo 'Current amp: '. $current_amp/1000 ." Ah\n\r";
echo 'Current voltage: '. $current_voltage/1000 ." V\n\r";
}
/* calculate battery usage */
$time_diff = $current_timestamp - $last_timestamp;
$amp_diff = ($last_amp - $current_amp) / 1000;
$battery_usage = $amp_diff / ($time_diff/(60*60));
if (!$onlywatt) echo 'Battery usage: '.$battery_usage .' A'."\n\r";
$watt1 = sprintf("%01.2f", ($current_amp * $current_voltage) / (1000*1000) );
$watt2 = sprintf("%01.2f", ($battery_usage * $current_voltage) / 1000 );
if (!$onlywatt) echo 'Remaining: '.$watt1 .' W' ."\n\r";
if (!$onlywatt) echo 'Battery usage: '.$watt2.' W' ."\n\r";
else echo $watt2;
file_put_contents('last_timestamp',$current_timestamp);
file_put_contents('last_amp',$current_amp);
file_put_contents('last_watt2',$watt2);
} else {
if ($verbose) echo 'Not enough time for new stats'."\n\r";
if (is_file('last_watt2')) {
$watt2 = file_get_contents('last_watt2');
if (!$onlywatt) echo 'Last battery usage: '.$watt2.' W' ."\n\r";
else echo $watt2."\n";
}
}
/* save infos */
if (!is_file('last_timestamp')) {
file_put_contents('last_timestamp',$current_timestamp);
file_put_contents('last_amp',$current_amp);
}
?>
Zapisujemy sobie pod nazwą najlepiej ewatcher i jest
Tworzy on sobie trzy pliki w katalogu, w którym działa więc musi być uruchamiany z uprawnieniami które mu na to pozwolą. Wykorzystanie mocy oblicza na podstawie ostatnich 60 sekund. Opcja -v wyświetla więcej informacji które pobiera z różnych plików, natomiast opcja -w ogranicza się do wyświetlenia wykorzystanej mocy – właśnie po to, by móc z taką opcją włączyć skrypt do conkyego.
Aby skrypt działał poprawnie wymagane jest oczywiście zainstalowane php w systemie, oraz dostęp z php do katalogu /proc. W skrypcie musimy skonfigurować naszą baterię, ale w większości wypadków defaultowe ustawienie BAT0 będzie poprawne.
Do conky’ego skrypt wstawiamy następująco:
${execi 60 /sciezka/ewatcher -w}
Skrypt musi mieć ustawiony atrybut uruchamialny (chmod +x)