Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 1 | #!/usr/bin/env perl |
| 2 | # |
| 3 | # Copyright 2014 Pierre Mavro <deimos@deimos.fr> |
| 4 | # Copyright 2014 Vivien Didelot <vivien@didelot.org> |
| 5 | # |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 6 | # Original version: |
| 7 | # https://github.com/vivien/i3blocks-contrib/blob/9d66d81da8d521941a349da26457f4965fd6fcbd/battery/battery |
| 8 | # Modified by Adrià Vilanova, mainly to use upower |
| 9 | # instead of acpi and adapt it to my style. |
| 10 | # |
| 11 | # I modified it because I found the battery numbers returned by acpi were not |
| 12 | # stable and sometimes my battery switched numbers, so the percentage of |
| 13 | # another "phantom" battery was shown. It seems like using upower fixes this. |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 14 | # |
| 15 | # Licensed under the terms of the GNU GPL v3, or any later version. |
| 16 | # |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 17 | # This script is meant to use with i3blocks. It parses the output of the |
| 18 | # "upower" command to read the status of the battery, and eventually its |
| 19 | # remaining time (to full charge or discharge). |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 20 | # |
| 21 | # The color will gradually change for a percentage below 85%, and the urgency |
| 22 | # (exit code 33) is set if there is less that 5% remaining. |
| 23 | |
| 24 | use strict; |
| 25 | use warnings; |
| 26 | use utf8; |
| 27 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 28 | my $upower_result; |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 29 | my $status; |
| 30 | my $percent; |
| 31 | my $ac_adapt; |
| 32 | my $full_text; |
| 33 | my $short_text; |
| 34 | my $bat_number = $ENV{BAT_NUMBER} || 0; |
| 35 | my $label = $ENV{LABEL} || ""; |
| 36 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 37 | $upower_result = `upower --show-info "/org/freedesktop/UPower/devices/battery_BAT$bat_number"`; |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 38 | |
| 39 | # fail on unexpected output |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 40 | if (not defined($upower_result)) { |
| 41 | # don't print anything to stderr if there is no battery |
| 42 | exit(0); |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 43 | } |
| 44 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 45 | if ($upower_result !~ /^\s*state:\s*([\w\s]+)$/m) { |
| 46 | die("Can't read state") |
| 47 | } |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 48 | $status = $1; |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 49 | |
| 50 | if ($upower_result !~ /^\s*percentage:\s*(\d+)%$/m) { |
| 51 | die("Can't read percentage") |
| 52 | } |
| 53 | $percent = $1; |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 54 | $full_text = "$label"; |
| 55 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 56 | if ($status eq 'discharging') { |
| 57 | $full_text .= '⚡'; |
| 58 | } elsif ($status eq 'charging') { |
| 59 | $full_text .= '🔌'; |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | $full_text .= "$percent%"; |
| 63 | |
| 64 | $short_text = $full_text; |
| 65 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 66 | # retrieve time |
| 67 | if ($upower_result =~ /^\s*time to (?:empty|full):\s*(.+)$/m) { |
| 68 | $full_text .= " ($1)"; |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | # print text |
| 72 | print "$full_text\n"; |
| 73 | print "$short_text\n"; |
| 74 | |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 75 | if ($status eq 'Discharging') { |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 76 | if ($percent < 20) { |
| 77 | print "#FF0000\n"; |
| 78 | } elsif ($percent < 40) { |
| 79 | print "#FFAE00\n"; |
| 80 | } elsif ($percent < 60) { |
| 81 | print "#FFF600\n"; |
| 82 | } elsif ($percent < 85) { |
| 83 | print "#A8FF00\n"; |
| 84 | } |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 85 | |
Adrià Vilanova Martínez | db10c10 | 2024-12-27 20:06:39 +0100 | [diff] [blame] | 86 | # set the urgent flag (red background) |
| 87 | if ($percent < 5) { |
| 88 | exit(33); |
| 89 | } |
Copybara bot | ca5ce64 | 2024-11-08 17:38:08 +0100 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | exit(0); |