[SOLVED] Setting up an alarm
from eugenia@lemmy.ml to linux@lemmy.ml on 01 Oct 2024 08:15
https://lemmy.ml/post/20903038

I have installed Linux Mint 22 in a DELL laptop with a buggy ACPI implementation (the kernel complains about it during boot). The laptop hangs if it goes to sleep (I tried various Linux distros/kernel-versions, the result is the same).

Because of that, I have disabled SLEEP in the firmware (latest version for that laptop btw). So basically, when you close the lid, nothing happens (it just locks the screen).

However, sometimes you might be in a hurry and you close the lid to do something else, and then you forget about it. The result would be for the battery to run dry, which eventually destroys the battery.

My question is: what would be the best way to setup an audible alarm if the battery reaches 20%?

#linux

threaded - newest

Willem@kutsuya.dev on 01 Oct 2024 08:32 next collapse

Systemd timer to poll upower when running on battery power, when battery is at 20%, use either system beep or set system volume and play a sound?

eugenia@lemmy.ml on 01 Oct 2024 08:36 collapse

I’m sure is possible, but I’m actually asking for the exact steps/script, not the general idea. :)

nous@programming.dev on 01 Oct 2024 09:40 collapse

Remove the loop and sleep from the script you created so it just runs and exits.

Then create a file at /etc/systemd/system/battery-alarm.service with the following:

[Unit]
Description="Sound alarm when battery is low"

[Service]
ExecStart=/usr/local/bin/battery-alarm.sh # point this to your script

Then create a file at /etc/systemd/system/battery-alarm.timer with the following:

[Unit]
Description="Run battery-alarm.service every 2 mins"

[Timer]
OnUnitActiveSec=2m
Unit=battery-alarm.service

[Install]
WantedBy=multi-user.target

Then sudo systemctl enable --now helloworld.timer to start and enable the timer on boot.

This will be a little more robust then your current script. It works without the user needing to log in. And there is nothing to get killed so will always trigger. The current script will just silently stop working if it ever gets killed or crashes.

eugenia@lemmy.ml on 01 Oct 2024 09:42 collapse

thanks, I’ll try that!

christos@lemmy.world on 01 Oct 2024 11:27 collapse

A cron job would not be a bad idea.

Xiisadaddy@lemmygrad.ml on 01 Oct 2024 08:42 next collapse

I would first attempt to fix the problem by flashing the bios with the newest version. What you are describing sounds a lot like a common issue with how deep sleep works. Its on the manufacturer to fix it which Dell is typically pretty good about.

If that doesnt work for some reason you can get an applet that will shut down your pc when the battery gets too low for you. Theres a few that work just right click the panel and search for battery applets.

Xiisadaddy@lemmygrad.ml on 01 Oct 2024 08:44 next collapse

dell.com/…/steps-for-fixing-windows-computers-tha…

this link may help solve the issue even tho ur not on windows try these fixes

eugenia@lemmy.ml on 01 Oct 2024 09:18 collapse

It has the latest firmware, I wrote about it in the description of the post…

Xiisadaddy@lemmygrad.ml on 01 Oct 2024 10:26 collapse

ah sorry missed that

eugenia@lemmy.ml on 01 Oct 2024 09:17 next collapse

Ok, I managed it by myself after a bit of tinkering. This is the bash script:

#!/bin/bash
while true
    do 
        battery_level=`cat /sys/class/power_supply/BAT0/capacity`
        battery_status=`cat /sys/class/power_supply/BAT0/status`
        if [ $battery_status = "Discharging" ] && [ $battery_level -lt 21 ];
        then
            /usr/bin/aplay  /home/eugenia/Music/alarm.wav
        fi
       sleep 120
    done

Obviously change the path the .wav audio file to suit yours (I downloaded mine from the internet). Then, save the file (in my case, I named it battery.sh), make the script file executable ( chmod +x battery.sh via the terminal, or via the file manager).

Then add it to the Startup Applications settings panel on your distro (usually gnome and cinnamon have one). The alarm will sound if the battery reaches below 21%.

nous@programming.dev on 01 Oct 2024 09:22 next collapse

Worth running shell scripts though www.shellcheck.net (has a cli as well). Finds lots of common issues that can blow up scripts when input is not what you expect. With links to why they make the suggestions they do.

Line 4:
        battery_level=`cat /sys/class/power_supply/BAT0/capacity`
                      ^-- SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean: (apply this, apply all SC2006)
        battery_level=$(cat /sys/class/power_supply/BAT0/capacity)
 
Line 5:
        battery_status=`cat /sys/class/power_supply/BAT0/status`
                       ^-- SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean: (apply this, apply all SC2006)
        battery_status=$(cat /sys/class/power_supply/BAT0/status)
 
Line 6:
        if [ $battery_status = "Discharging" ] && [ $battery_level -lt 21 ];
             ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
                                                    ^-- SC2086 (info): Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
        if [ "$battery_status" = "Discharging" ] && [ "$battery_level" -lt 21 ];
eugenia@lemmy.ml on 01 Oct 2024 09:25 next collapse

It works fine, so I’m ok.

nous@programming.dev on 01 Oct 2024 09:43 collapse

The problem with bash scripts is they tend to explode in unexpected ways when thing don’t go as intended. This could be one of the command you run returning some expected or not output which might work now but might not in the future. Best to program bash defensively.

kurwa@lemmy.world on 01 Oct 2024 11:40 collapse

That’s a neat tool!

Deckweiss@lemmy.world on 01 Oct 2024 09:50 collapse

Since you say

change the path the .wav audio file

fyi, the sys BAT paths are also different per laptop. Just in case it doesn’t work for somebody else or for you on a different laptop.

fish@feddit.uk on 01 Oct 2024 11:16 next collapse

You could look into using scripts with tools like acpi or upower. A simple shell script checking battery levels every few minutes could work: if it’s below 20%, play a sound. Schedule it with a cron job or a systemd service for consistency. I’m no script guru, but there’s lots of good examples online!

Badabinski@kbin.earth on 01 Oct 2024 13:11 next collapse

The arch wiki has a udev rule that can automatically do something if the battery crosses a certain threshold: https://wiki.archlinux.org/title/Laptop#Hibernate_on_low_battery_level

No polling which is great. I always try to do stuff on an event driven basis where possible for efficiency reasons.
Gotta test this out though, since your battery might not send events for every percent change.

IanTwenty@lemmy.world on 01 Oct 2024 13:28 next collapse

I seem to get pop-up notifications for free in GNOME/Fedora by setting these levels in /etc/UPower/UPower.conf:

UsePercentageForPolicy=true
PercentageLow=50
PercentageCritical=20
PercentageAction=10

I think you can also configure the system to take action when it reaches the lowest level with e.g.

# The action to take when "TimeAction" or "PercentageAction" above has been
# reached for the batteries (UPS or laptop batteries) supplying the computer
CriticalPowerAction=PowerOff

However I don’t know how to get these GNOME “Power” notifications to play an audible sound (without turning on notification sounds for ALL notifications). The best I could find is this: David Bazile / gaudible · GitLab

There’s talk of better control of sound notifications in GNOME 47+, but looks like nothing much has landed yet: Notifications in 46 and beyond – GNOME Shell & Mutter

possiblylinux127@lemmy.zip on 01 Oct 2024 13:51 collapse

I would instead look into the firmware settings. Dell has good Linux support.