From a3a98abe232fcabfce9592259d08c47ed7614e7b Mon Sep 17 00:00:00 2001 From: John Mertz Date: Tue, 27 Jul 2021 01:11:42 -0400 Subject: [PATCH] Fetcher for Battery and Power status Features outputs as JSON, simple output for status bar and notification-ready pretty formatting. --- thinkpad/pow.pl | 159 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100755 thinkpad/pow.pl diff --git a/thinkpad/pow.pl b/thinkpad/pow.pl new file mode 100755 index 0000000..c49fd2b --- /dev/null +++ b/thinkpad/pow.pl @@ -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();