paint-brush
Building a Simple Battery Tracker with Python: A Step-by-Step Guideby@sriram
297 reads

Building a Simple Battery Tracker with Python: A Step-by-Step Guide

by SriramNovember 20th, 2023
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

Learn to create a battery tracker on Linux using Python, accessing system data and alerts, simplified with a desktop entry.

People Mentioned

Mention Thumbnail
featured image - Building a Simple Battery Tracker with Python: A Step-by-Step Guide
Sriram HackerNoon profile picture

Hello World!


In this blog, I would like to share my experience in creating a simple battery tracker that alerts the user when the battery level is low. For this, I have used Python and some basic Linux commands.

Where do I get data?

Our code is going to track the status of the battery, that is, how much percentage of charge the battery currently contains. So, where can I get the data on the battery status? Let’s see.


  • Open the terminal

  • Move to the directory /sys/class/power_supply/BAT1 by typing the below command

    cd /sys/class/power_supply/BAT1
    

In some devices, the directory BAT1 may have a different name, like BAT0.

  • List the files in the directory using the “ls” command. You could see some files like capacity, model_name, manufacturer, status, etc.

  • The two files that we require are capacity, which has the percentage of charge the battery currently has, and status, which tells us whether the battery is in the charging state or in the discharging state

  • We can use the cat command to print the capacity and status in the terminal.

    cat capacity cat status

This will print the current charge in percentage and status in the terminal. You can refer to the below screenshot.


A screenshot of the terminal showing the charge and status of the battery

So, now we’ve got the data source. Next, how to get this data in Python, and how to track it? Let’s see.

A Simple Battery Status Tracker for Linux using Python

The Coding part

Here, we are going to use Python for getting the data and alerting the user when the charge is low. In Python, we can read the content of the file using the functions open() and readline(). The open function will open the specified file, and the readline function will read the file contents. For example, if we want to read the status of the battery from the status file, the code will be

charge_state = open(“/sys/class/power_supply/BAT1/status”,”r”).readline().strip()

The open function has 2 parameters. The first parameter denotes the file path, and the second parameter denotes the mode. Here, in our example, we have set the mode to read(r) since we only read data from the file. The strip() function removes the trailing blank spaces from the data. As a result, the charge_state variable will hold the status of the battery. That is either of the two values, “Charging” or “Discharging”.


So now, let us get into the logic. When should we alert the user? We have to alert when the charge goes below 30% and the charger is not plugged in. The logic is:


Alert_User when capacity ≤ 30 and status==”Discharging”


Now we have found the logic; how to alert the user? The answer is the dialog box. A dialog box is nothing but a pop-up window used to interrupt the user to display some message or prompt the user to enter any additional information. For displaying info in the dialog box, we use a Python library called Tkinter. Using this library, we can create a dialog box. Below is the source code for our Battery Tracker.


#!/usr/bin/python

import Tkinter as tk
import tkMessageBox
root = tk.Tk()
root.withdraw()

def powerFunction():
current_stat=open("/sys/class/power_supply/BAT1/capacity","r").readline().strip()
return current_stat

def chargeState():
charge_state=open("/sys/class/power_supply/BAT1/status","r").readline().strip()
return charge_state
powerStat = 100
print powerStat
tkMessageBox.showinfo("Running!","Battry Status Tracker is now running on machine")
while int(powerStat)>=30:
powerStat = powerFunction()
chargeStat = chargeState()
print "Battery Tracking"
if int(powerStat)<=30 and chargeStat == "Discharging":
tkMessageBox.showwarning("Alert!","Battery Low!\nCharging Required!\nYour Battery Status:"+powerStat+"% ("+chargeStat+")")
break

We can save this code with the .py extension anywhere in the system, let’s say Desktop. I have now saved the Python file with the file name power.py on the desktop. Now we have to run this python file. How to do that? Let’s see


  • Open the terminal

  • Move to the directory to where the Python file is saved. In my case, it is the Desktop. So, I’m moving to the Desktop using the cd command.

    cd Desktop


There are two versions of Python, namely Python 2.X and Python 3.X. The above code is written in Python 2. The command to run Python 2 files is python <Filename.py>. If it is in the case of Python 3, then the command is python3 <Filename.py>. Since our code is written in Python 2, the command to execute is

python power.py

This will start executing our Python code in the terminal.

What next?

Now, the code is ready. But whenever we turn on our computer, we have to open the terminal move to the desktop, and execute the python file. The terminal will also keep on running until the charge comes down to 30%. This is quite annoying, right? To avoid these steps, we can create a ‘Desktop Entry’ that will allow us to run the Python code with just a double click.

Desktop Entry

The Desktop Entry is nothing but a desktop shortcut created for easy access to files/executables. Let us see how to create a desktop entry in Linux.


  • Open any editor (like Gedit).

  • Copy-paste the code below.

    [Desktop Entry] 
    Type=Application
    Exec=python /home/sriram/Desktop/power.py 
    Icon=/home/sriram/Desktop/Desktop_sub/battery.png 
    Name=Power Tracker 
    Terminal=false
    

Here, ‘Exec’ holds the command that we type in the terminal to execute the Python code. ‘Icon’ holds an image file path that is to be set as an icon for our desktop entry. ‘Name’ holds the name for our desktop entry, which is the name displayed on the screen. In ‘Terminal,’ we can decide on whether to show the terminal while executing. As I said earlier, it will be annoying if we show the terminal. So, I have set this to false so that the code runs in the background. Now we can save this file with the ‘.desktop’ extension.

This is how the desktop entry will look like.


Now, to make our desktop entry execute our Python code with a double click, we need to do one more thing. Right-click on our desktop entry and properties and move to the ‘Permissions’ tab. Check the Allow executing file as a program checkbox. This will make our desktop entry an executable.

Making the desktop entry executable


Now, let’s run the “Power Tracker” by just double-clicking on it. A dialog box will appear to acknowledge that the Power Tracker is running. Once the battery reaches 30% charge and is not plugged in for charging the Alert dialog box will appear with a warning message. This is how it works.

Dialog box to acknowledge to the user that the code is running

The alert dialog box when the battery level comes down to 30%


This works only with machines running the Linux operating system. You can find the full source in this GitHub repo: https://github.com/sriram23/Battery-Tracker


Looking forward to your valuable feedback and suggestions.


Thank you!


Also published here.