From 88f7edf1a61e61dab8b602f221f2bea831088fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20B=C3=BCchler?= Date: Thu, 14 Aug 2025 22:49:29 +0200 Subject: [PATCH] feat(waybar): add custom Logitech battery status module and script --- .config/waybar/config-desktop | 10 +++++++ .config/waybar/config-laptop | 10 +++++++ .config/waybar/style.css | 3 +- .local/bin/logitech_battery.sh | 52 ++++++++++++++++++++++++++++++++++ README.md | 4 +++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100755 .local/bin/logitech_battery.sh diff --git a/.config/waybar/config-desktop b/.config/waybar/config-desktop index f0e631c..b20c403 100644 --- a/.config/waybar/config-desktop +++ b/.config/waybar/config-desktop @@ -16,6 +16,7 @@ "temperature", "pulseaudio", "network", + "custom/logitech-battery", "tray", "custom/wlogout" ], @@ -103,6 +104,15 @@ "tray": { "icon-size": 20 }, + "custom/logitech-battery": { + "exec": "~/.local/bin/logitech_battery.sh", + "interval": 60, + "return-type": "json", + "format": "{text}", + "tooltip": "{tooltip}", + "class": "logitech-battery", + "on-click": "solaar gui" + }, "custom/wlogout": { "format": "⏻", "tooltip": "Logout/Shutdown", diff --git a/.config/waybar/config-laptop b/.config/waybar/config-laptop index c98a507..1758e23 100644 --- a/.config/waybar/config-laptop +++ b/.config/waybar/config-laptop @@ -18,6 +18,7 @@ "pulseaudio", "network", "battery", + "custom/logitech-battery", "tray", "custom/wlogout" ], @@ -136,6 +137,15 @@ "tray": { "icon-size": 20 }, + "custom/logitech-battery": { + "exec": "~/.local/bin/logitech_battery.sh", + "interval": 60, + "return-type": "json", + "format": "{text}", + "tooltip": "{tooltip}", + "class": "logitech-battery", + "on-click": "solaar gui" + }, "custom/wlogout": { "format": "⏻", "tooltip": "Logout/Shutdown", diff --git a/.config/waybar/style.css b/.config/waybar/style.css index ce0713d..8adc5ce 100644 --- a/.config/waybar/style.css +++ b/.config/waybar/style.css @@ -36,7 +36,7 @@ window#waybar { color: #1e1e2e; } -#clock, #cpu, #memory, #temperature, #pulseaudio, #network, #battery, #tray, #backlight, #disk, #idle_inhibitor { +#clock, #cpu, #memory, #temperature, #pulseaudio, #network, #battery, #tray, #backlight, #disk, #idle_inhibitor, #custom-logitech-battery { padding: 0 10px; margin: 0 2px; border-radius: 6px; @@ -69,3 +69,4 @@ window#waybar { color: #1e1e2e; box-shadow: 0 2px 8px rgba(0,0,0,0.18); } + diff --git a/.local/bin/logitech_battery.sh b/.local/bin/logitech_battery.sh new file mode 100755 index 0000000..a025ca3 --- /dev/null +++ b/.local/bin/logitech_battery.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Helper: map percent to icon and color +get_icon() { + local percent=$1 + if ! [[ "$percent" =~ ^[0-9]+$ ]]; then percent=0; fi + if [ "$percent" -ge 90 ]; then echo ""; elif [ "$percent" -ge 60 ]; then echo ""; elif [ "$percent" -ge 40 ]; then echo ""; elif [ "$percent" -ge 20 ]; then echo ""; else echo ""; fi +} +get_color() { + local percent=$1 + if ! [[ "$percent" =~ ^[0-9]+$ ]]; then percent=0; fi + if [ "$percent" -ge 90 ]; then echo "#00ff00"; elif [ "$percent" -ge 60 ]; then echo "#aaff00"; elif [ "$percent" -ge 40 ]; then echo "#ffff00"; elif [ "$percent" -ge 20 ]; then echo "#ff8800"; else echo "#ff0000"; fi +} + +KEYBOARD_NAME="G915" +MOUSE_NAME="G903" + +# Use actual Unicode icons +KEYBOARD_ICON="" +MOUSE_ICON="🖱️" + +# Parse keyboard info +kb_line=$(solaar show 2>/dev/null | awk '/G915/ {dev=1} /Battery:/ && dev==1 {print; dev=0}') +kb_percent=$(echo "$kb_line" | awk '{print $2}' | tr -d '%' | grep -E '^[0-9]+$' || echo "N/A") +kb_voltage=$(echo "$kb_line" | grep -o '[0-9]*mV' | grep -o '[0-9]*' || echo "N/A") +kb_status=$(echo "$kb_line" | awk '{print $3}' || echo "N/A") + +# Parse mouse info, handle offline/unknown +mouse_line=$(solaar show 2>/dev/null | awk '/G903/ {dev=1} /Battery:/ && dev==1 {print; dev=0}') +if echo "$mouse_line" | grep -qi "unknown"; then + mouse_percent="N/A" + mouse_voltage="N/A" + mouse_status="offline" +else + mouse_percent=$(echo "$mouse_line" | awk '{print $2}' | tr -d '%' | grep -E '^[0-9]+$' || echo "N/A") + mouse_voltage=$(echo "$mouse_line" | grep -o '[0-9]*mV' | grep -o '[0-9]*' || echo "N/A") + mouse_status=$(echo "$mouse_line" | awk '{print $3}' || echo "N/A") +fi + +kb_icon=$(get_icon "$kb_percent") +kb_color=$(get_color "$kb_percent") +kb_tooltip="${KEYBOARD_NAME}: ${kb_percent:-N/A}% @ ${kb_voltage:-N/A}mV (${kb_status:-N/A})" + +mouse_icon=$(get_icon "$mouse_percent") +mouse_tooltip="${MOUSE_NAME}: ${mouse_percent:-N/A}% @ ${mouse_voltage:-N/A}mV (${mouse_status:-N/A})" + +# Escape newlines for JSON +tooltip=$(echo -e "$kb_tooltip\n$mouse_tooltip" | sed ':a;N;$!ba;s/\n/\\n/g') + +cat <