battery (2169B)
1 #!/usr/bin/perl
2 #
3 # Copyright 2014 Pierre Mavro <deimos@deimos.fr>
4 # Copyright 2014 Vivien Didelot <vivien@didelot.org>
5 #
6 # Licensed under the terms of the GNU GPL v3, or any later version.
7 #
8 # This script is meant to use with i3blocks. It parses the output of the "acpi"
9 # command (often provided by a package of the same name) to read the status of
10 # the battery, and eventually its remaining time (to full charge or discharge).
11 #
12 # The color will gradually change for a percentage below 85%, and the urgency
13 # (exit code 33) is set if there is less that 5% remaining.
14
15 use strict;
16 use warnings;
17 use utf8;
18
19 my $acpi;
20 my $status;
21 my $percent;
22 my $ac_adapt;
23 my $full_text;
24 my $short_text;
25 my $bat_number = $ENV{BAT_NUMBER} || 0;
26 my $label = $ENV{LABEL} || "";
27
28 # read the first line of the "acpi" command output
29 open (ACPI, "acpi -b 2>/dev/null| grep 'Battery $bat_number' |") or die;
30 $acpi = <ACPI>;
31 close(ACPI);
32
33 # fail on unexpected output
34 if (not defined($acpi)) {
35 # don't print anything to stderr if there is no battery
36 exit(0);
37 }
38 elsif ($acpi !~ /: ([\w\s]+), (\d+)%/) {
39 die "$acpi\n";
40 }
41
42 $status = $1;
43 $percent = $2;
44 $full_text = "$label$percent%";
45
46 if ($status eq 'Discharging') {
47 $full_text .= ' DIS';
48 } elsif ($status eq 'Charging') {
49 $full_text .= ' CHR';
50 } elsif ($status eq 'Unknown') {
51 open (AC_ADAPTER, "acpi -a |") or die;
52 $ac_adapt = <AC_ADAPTER>;
53 close(AC_ADAPTER);
54
55 if ($ac_adapt =~ /: ([\w-]+)/) {
56 $ac_adapt = $1;
57
58 if ($ac_adapt eq 'on-line') {
59 $full_text .= ' CHR';
60 } elsif ($ac_adapt eq 'off-line') {
61 $full_text .= ' DIS';
62 }
63 }
64 }
65
66 $short_text = $full_text;
67
68 if ($acpi =~ /(\d\d:\d\d):/) {
69 $full_text .= " ($1)";
70 }
71
72 # print text
73 print "$full_text\n";
74 print "$short_text\n";
75
76 # consider color and urgent flag only on discharge
77 if ($status eq 'Discharging') {
78
79 if ($percent < 20) {
80 print "#FF0000\n";
81 } elsif ($percent < 40) {
82 print "#FFAE00\n";
83 } elsif ($percent < 60) {
84 print "#FFF600\n";
85 } elsif ($percent < 85) {
86 print "#A8FF00\n";
87 }
88
89 if ($percent < 5) {
90 exit(33);
91 }
92 }
93
94 exit(0);