Fetcher for Battery and Power status
Features outputs as JSON, simple output for status bar and notification-ready pretty formatting.
This commit is contained in:
parent
e3b98b7aac
commit
a3a98abe23
|
@ -0,0 +1,159 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
my $output;
|
||||
my ($bar, $pretty) = (0, 0);
|
||||
|
||||
if ( defined($ARGV[0]) && $ARGV[0] ne '-b' && $ARGV[0] ne '--bar' && $ARGV[0] ne '-p' && $ARGV[0] ne '--pretty' ) {
|
||||
print'
|
||||
pow.pl - Power Status Script
|
||||
|
||||
Usage: pow.pl
|
||||
|
||||
Prints information about all power devices as JSON.
|
||||
|
||||
-p --pretty Display as human-readable
|
||||
-b --bar Waybar simplified output
|
||||
-h --help Display help. This is the only option.
|
||||
|
||||
';
|
||||
exit();
|
||||
} elsif ($ARGV[0] eq '-b' || $ARGV[0] eq '--bar') {
|
||||
$bar = 1;
|
||||
} elsif ($ARGV[0] eq '-p' || $ARGV[0] eq '--pretty') {
|
||||
$pretty = 1;
|
||||
}
|
||||
|
||||
my %battery_total = (
|
||||
'current' => 0,
|
||||
'max' => 0,
|
||||
'percentage' => 0
|
||||
);
|
||||
|
||||
my @devices = <"/sys/class/power_supply/*">;
|
||||
$output .= "{";
|
||||
foreach (@devices) {
|
||||
my $path = $_;
|
||||
my $name = $_;
|
||||
$name =~ s/.*\///;
|
||||
$output .= '"' . $name . '":{';
|
||||
open(my $t,'<',"$_/type");
|
||||
my $type = <$t>;
|
||||
chomp $type;
|
||||
close $t;
|
||||
$output .= '"Type":"' . $type . '"';
|
||||
if ($name =~ /BAT[0-9]+/) {
|
||||
open(my $s,'<',"$_/status");
|
||||
my $status = <$s>;
|
||||
chomp $status;
|
||||
$output .= ',"Status":"' . $status . '"';
|
||||
} else {
|
||||
open(my $s,'<',"$_/online");
|
||||
my $status = <$s>;
|
||||
chomp $status;
|
||||
if ($status) {
|
||||
$status = "Plugged-In";
|
||||
} else {
|
||||
$status = "Unplugged";
|
||||
}
|
||||
$output .= ',"Status":"' . $status . '"';
|
||||
}
|
||||
close $s;
|
||||
if ($name =~ /BAT[0-9]+/) {
|
||||
open(my $m,'<',"$_/energy_full");
|
||||
my $max = <$m>;
|
||||
close $m;
|
||||
chomp $max;
|
||||
$battery_total{'max'} += $max;
|
||||
open(my $c,'<',"$_/energy_now");
|
||||
my $current = <$c>;
|
||||
chomp $current;
|
||||
#$current =~ s/\n//;
|
||||
$battery_total{'current'} += $current;
|
||||
close $c;
|
||||
$output .= ',"Current":"'
|
||||
. $current
|
||||
. '","Max":"'
|
||||
. $max
|
||||
. '","Percentage":"'
|
||||
. int($current/$max*100)
|
||||
. '"';
|
||||
}
|
||||
$output .= "},";
|
||||
}
|
||||
|
||||
$battery_total{'percentage'} = sprintf("%0d",
|
||||
$battery_total{'current'} / $battery_total{'max'} * 100
|
||||
);
|
||||
$output .= '"Total":{"Current":"'
|
||||
. $battery_total{'current'}
|
||||
. '","Max":"'
|
||||
. $battery_total{'max'}
|
||||
. '","Percentage":"'
|
||||
. $battery_total{'percentage'}
|
||||
. '"}}';
|
||||
|
||||
if ($bar) {
|
||||
use JSON::XS;
|
||||
my $json = JSON::XS->new();
|
||||
my $powref = $json->decode($output);
|
||||
my $icon;
|
||||
my $class = 'discharging';
|
||||
$output = '{"text": "' . $powref->{Total}->{Percentage} . '% ';
|
||||
if ($powref->{AC}->{Status} eq "Plugged-In") {
|
||||
$class = 'charging';
|
||||
$output .= "";
|
||||
} elsif ($powref->{Total}->{Percentage} le 10) {
|
||||
$class = 'critical';
|
||||
$output .= "";
|
||||
} elsif ($powref->{Total}->{Percentage} le 35) {
|
||||
$class = 'low';
|
||||
$output .= "";
|
||||
} elsif ($powref->{Total}->{Percentage} le 60) {
|
||||
$output .= "";
|
||||
} elsif ($powref->{Total}->{Percentage} le 85) {
|
||||
$output .= "";
|
||||
} else {
|
||||
$output .= "";
|
||||
}
|
||||
$output .= '", "tooltip": "' . $class . '", "class": "' . $class . '"}';
|
||||
} elsif ($pretty) {
|
||||
use JSON::XS;
|
||||
my $json = JSON::XS->new();
|
||||
my $powref = $json->decode($output);
|
||||
my $total = '';
|
||||
$output = "Device Status Percentage\n";
|
||||
foreach my $device (keys %{$powref}) {
|
||||
my $status;
|
||||
if ($powref->{$device}->{Status} eq "Plugged-In") {
|
||||
$status = "";
|
||||
} elsif (!defined($powref->{$device}->{Percentage}) || $powref->{$device}->{Percentage} == 0) {
|
||||
$status = " ";
|
||||
} elsif ($powref->{$device}->{Percentage} <= 10) {
|
||||
$status = " " . $powref->{$device}->{'Percentage'} . "%";
|
||||
} elsif ($powref->{$device}->{Percentage} <= 35) {
|
||||
$status = " " . $powref->{$device}->{'Percentage'} . "%";
|
||||
} elsif ($powref->{$device}->{Percentage} <= 60) {
|
||||
$status = " " . $powref->{$device}->{'Percentage'} . "%";
|
||||
} elsif ($powref->{$device}->{Percentage} <= 85) {
|
||||
$status = " " . $powref->{$device}->{'Percentage'} . "%";
|
||||
} else {
|
||||
$status = " " . $powref->{$device}->{'Percentage'} . "%";
|
||||
}
|
||||
if ($device eq 'Total') {
|
||||
$total .= sprintf("%-24s %-12s", $device, $status);
|
||||
} else {
|
||||
#$output .= sprintf("%".length($powref->{$device->{'Type'}})."s (%".length($powref->{$device->{'Type'}})."s): %3d\%\n", $device, $device->{'Type'}, $device->{'Percentage'});
|
||||
my $name = ' ('.$powref->{$device}->{'Type'}.')';
|
||||
if ((length($device)+length($name)) >= 24) {
|
||||
$name = substr($device, 0, (21-length($name))) . '...' . $name;
|
||||
} else {
|
||||
$name = substr(($device.$name), 0, 24);
|
||||
}
|
||||
$output .= sprintf("%-24s %-12s %-12s\n", $name, $powref->{$device}->{Status}, $status);
|
||||
}
|
||||
}
|
||||
$output .= $total;
|
||||
}
|
||||
print $output . "\n";
|
||||
|
||||
exit();
|
Loading…
Reference in New Issue