#!/usr/bin/env bash # This file is part of I38. # I38 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, # either version 3 of the License, or (at your option) any later version. # I38 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with I38. If not, see . # Parse command line arguments detailedMode=0 if [[ "$1" == "-d" ]] || [[ "$1" == "--detailed" ]]; then detailedMode=1 fi get_battery_details() { local batteryPath="$1" local batteryName="${batteryPath##*/}" local modelName="" local manufacturer="" local capacity="" local status="" local health="" local cycleCount="" local technology="" local voltage="" local current="" local power="" local output="" # Get model name if available if [[ -f "${batteryPath}/model_name" ]]; then modelName="$(cat "${batteryPath}/model_name" 2>/dev/null | tr -d '\n')" fi # Get manufacturer if available if [[ -f "${batteryPath}/manufacturer" ]]; then manufacturer="$(cat "${batteryPath}/manufacturer" 2>/dev/null | tr -d '\n')" fi # Get capacity (charge percentage) if [[ -f "${batteryPath}/capacity" ]]; then capacity="$(cat "${batteryPath}/capacity" 2>/dev/null | tr -d '\n')" fi # Get status (Charging, Discharging, Full, etc.) if [[ -f "${batteryPath}/status" ]]; then status="$(cat "${batteryPath}/status" 2>/dev/null | tr -d '\n')" fi # Get health/capacity level if available if [[ -f "${batteryPath}/capacity_level" ]]; then health="$(cat "${batteryPath}/capacity_level" 2>/dev/null | tr -d '\n')" fi # Get cycle count if available if [[ -f "${batteryPath}/cycle_count" ]]; then cycleCount="$(cat "${batteryPath}/cycle_count" 2>/dev/null | tr -d '\n')" fi # Get technology (Li-ion, Li-poly, etc.) if [[ -f "${batteryPath}/technology" ]]; then technology="$(cat "${batteryPath}/technology" 2>/dev/null | tr -d '\n')" fi # Get voltage (in microvolts, convert to volts) if [[ -f "${batteryPath}/voltage_now" ]]; then local voltageUv voltageUv="$(cat "${batteryPath}/voltage_now" 2>/dev/null | tr -d '\n')" if [[ -n "$voltageUv" ]] && [[ "$voltageUv" =~ ^[0-9]+$ ]]; then voltage="$(awk "BEGIN {printf \"%.2f\", $voltageUv/1000000}")" fi fi # Get current (in microamps, convert to amps) if [[ -f "${batteryPath}/current_now" ]]; then local currentUa currentUa="$(cat "${batteryPath}/current_now" 2>/dev/null | tr -d '\n')" if [[ -n "$currentUa" ]] && [[ "$currentUa" =~ ^[0-9]+$ ]]; then current="$(awk "BEGIN {printf \"%.2f\", $currentUa/1000000}")" fi fi # Get power (in microwatts, convert to watts) if [[ -f "${batteryPath}/power_now" ]]; then local powerUw powerUw="$(cat "${batteryPath}/power_now" 2>/dev/null | tr -d '\n')" if [[ -n "$powerUw" ]] && [[ "$powerUw" =~ ^[0-9]+$ ]]; then power="$(awk "BEGIN {printf \"%.2f\", $powerUw/1000000}")" fi fi # Build readable device name local deviceName="$batteryName" if [[ -n "$manufacturer" ]] && [[ -n "$modelName" ]]; then deviceName="$manufacturer $modelName" elif [[ -n "$modelName" ]]; then deviceName="$modelName" elif [[ -n "$manufacturer" ]]; then deviceName="$manufacturer Battery" else # Try to make the battery name more readable deviceName="${batteryName//BAT/Battery }" deviceName="${deviceName//hid-/}" deviceName="${deviceName//_/ }" fi # Build the output string output="$deviceName" if [[ -n "$capacity" ]]; then output="$output, ${capacity}%" fi if [[ -n "$status" ]]; then output="$output, ${status,,}" fi if [[ -n "$health" ]]; then output="$output, health: ${health,,}" fi if [[ -n "$technology" ]]; then output="$output, type: $technology" fi if [[ -n "$voltage" ]]; then output="$output, voltage: ${voltage}V" fi if [[ -n "$current" ]]; then output="$output, current: ${current}A" fi if [[ -n "$power" ]]; then output="$output, power: ${power}W" fi if [[ -n "$cycleCount" ]]; then output="$output, cycles: $cycleCount" fi echo "$output" } # Simple battery status (default mode) get_battery_simple() { local batteryPath="$1" local bat="${batteryPath##*/}" bat="${bat//BAT/Battery }" bat="${bat}: $( { cat "${batteryPath}/status";echo -n ", "; cat "${batteryPath}/capacity"; } | tr -d \\n) percent." echo "$bat" } # Main script if [[ $detailedMode -eq 1 ]]; then # Detailed mode if command -v acpi &> /dev/null; then # Try acpi first for more detailed info batteryInfo="" while IFS= read -r line; do if [[ -n "$batteryInfo" ]]; then batteryInfo="${batteryInfo}. " fi batteryInfo="${batteryInfo}${line}" done < <(acpi -V 2>/dev/null | grep -i battery) if [[ -n "$batteryInfo" ]]; then spd-say -P important -Cw "$batteryInfo" exit 0 fi fi # Fallback to /sys/class/power_supply for detailed info batteryCount=0 batteryOutput="" while IFS= read -r batteryPath; do if [[ -e "${batteryPath}/capacity" ]] || [[ -e "${batteryPath}/status" ]]; then batteryDetails="$(get_battery_details "$batteryPath")" if [[ -n "$batteryDetails" ]]; then ((batteryCount++)) if [[ -n "$batteryOutput" ]]; then batteryOutput="${batteryOutput}. " fi batteryOutput="${batteryOutput}${batteryDetails}" fi fi done < <(find /sys/class/power_supply -type l 2>/dev/null) if [[ $batteryCount -eq 0 ]]; then spd-say -P important -Cw "No battery information available" else spd-say -P important -Cw "$batteryOutput" fi else # Simple mode (default) if command -v acpi &> /dev/null; then bat="$(acpi -b)" spd-say -P important -Cw "$bat" else find /sys/class/power_supply -type l -exec bash -c ' for i ; do if [[ -e "$i/capacity" ]]; then bat="${i##*/}" bat="${bat//BAT/Battery }" bat="${bat}: $( { cat "${i}/status";echo -n ", "; cat "${i}/capacity"; } | tr -d \\n) percent." spd-say -P important -Cw "$bat" fi done ' _ {} \; fi fi