You are not logged in.
Pages: 1
I have put this into `/etc/udev/rules.d/99-lowbat.rules`
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[16-100]", RUN+="dunstify --urgency=normal 'Battery discharging'"
`sudo udevadm monitor --property` shows:
UDEV [17599.502111] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT1 (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT1
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=BAT1
POWER_SUPPLY_TYPE=Battery
POWER_SUPPLY_STATUS=Discharging
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11550000
POWER_SUPPLY_VOLTAGE_NOW=11429000
POWER_SUPPLY_CURRENT_NOW=2149000
POWER_SUPPLY_CHARGE_FULL_DESIGN=4590000
POWER_SUPPLY_CHARGE_FULL=4026000
POWER_SUPPLY_CHARGE_NOW=2435000
POWER_SUPPLY_CAPACITY=60
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=AP20CBL
POWER_SUPPLY_MANUFACTURER=COSMX
POWER_SUPPLY_SERIAL_NUMBER=3807
SEQNUM=6606
USEC_INITIALIZED=17599501914
But still I don't get any notification for the change in battery level?
Offline
You need to add quite a bit to that udev rule. I doubt you want to run your graphical notification tool as root, you'll need it to run as your user. You'll also need to ensure the relevant environment variables (e.g., DISPLAY and XAUTHORITY) for the dunstify process.
Start here:
https://wiki.archlinux.org/title/Udev#T … _udev_rule
EDIT: actually that section of the wiki is a bit odd. It provides two different ways of acheiving the goal but seems to imply both should be used which is most definitely not the case. You can export variables and su from the udev rule, or from a wrapper script.
Last edited by Trilby (2023-01-27 17:48:19)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
A udev rule runs as root, for a notification from a root process to reach your user session you minimally need to have DBUS_SESSION_BUS_ADDRESS of your user session ("unix:path=/run/user/1000/bus" by default or whatever your uid is if it isn't 1000) exported and maybe DISPLAY=:0 as well e.g.
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[16-100]", ENV{DBUS_SESSION_BUS_ADDRESS }="unix:path=/run/user/1000/bus", ENV{DISPLAY}=":0", RUN+="dunstify --urgency=normal 'Battery discharging'"
Offline
Thanks.
I changed it like so but it still isn't working:
❯ cat 99-lowbat.rules
# Suspend the system when battery level drops to 5% or lower
# taken from: https://wiki.archlinux.org/title/Laptop#Hibernate_on_low_battery_level
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[16-100]", ENV{DBUS_SESSION_BUS_ADDRESS}="unix:path=/run/user/1000/bus", ENV{DISPLAY}=":0", RUN+="dunstify --urgency=normal 'Battery discharging'"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[0-5]", RUN+="/usr/bin/systemctl poweroff -i"
Offline
There's still no XAUTHORITY there, but rather than guessing, check the output. I'm not sure if udev actions are logged to the journal, you could check there, or if it were me I'd just add logging to the command - e.g., call a shell to invoke dunstify and redirect stdout/stderr to a file. It can be easiest to do this with a wrapper script to avoid getting tangled up with the nested quoting that'd be required.
Also, according to the man page, your RUN parameter needs to use the full path to dunstify (as it is not in /usr/lib/udev/).
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Change the RUN bit to
RUN+="/usr/bin/su $user -c '/usr/bin/dunstify --urgency=normal 'Battery discharging''"
Replace $user with the actual user name. Not sure about those nested quotes though. Might be best to run dunstify in a script and call the script as your user with su.
EDIT: added full path to dunstify as well.
Last edited by Head_on_a_Stick (2023-01-27 20:14:51)
Para todos todo, para nosotros nada
Offline
In HoaS's version, the full path to dunstify should not be needed as the full path to su is provided, and su itself invokes a shell (when the -c flag is used). For testing purposes, just get rid of the space so quoting issues can be ruled out for the moment:
RUN+="/usr/bin/su YOURUSERHERE -c 'dunstify --urgency=normal BatteryDischarging > ~/udev_rule.log 2>&1'"
Then check for the udev_rule.log file after the rule should have run.
Last edited by Trilby (2023-01-27 20:18:39)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
So this rule is triggered:
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", RUN+="/usr/bin/touch /home/USERNAME/Documents/battery.triggered'"
But this rule isn't:
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[0-100]", RUN+="/usr/bin/touch /home/USERNAME/Documents/battery.triggered'"
I don't think those square brackets are a valid syntax?
Offline
Ah, I didn't even look at that. No, there is no such syntax there - the rule only runs if the attribute string matches what you put in quotes.
You may just want a wrapper script to be called whenever the AC is plugged/unplugged, and the script can then check the battery level and act appropriately based on the level.
Last edited by Trilby (2023-01-28 02:12:21)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Yes, I thought that "[0-5]" means "numbers between 0 and 5". Instead it's a regex.
I will update the wiki when I find time.
Offline
Excuse me for a bit of necroposting, but just in case somebody stumbles upon this, udev manpage explicitly states what bracket syntax means:
"[]"
Matches any single character specified within the brackets.
For example, the pattern string "tty[SR]" would match either
"ttyS" or "ttyR". Ranges are also supported via the "-"
character. For example, to match on the range of all digits,
the pattern "[0-9]" could be used. If the first character
following the "[" is a "!", any characters not enclosed are
matched.
Offline
Pages: 1