bandwidth in waybar

This commit is contained in:
Brieuc Dubois 2024-02-17 13:36:06 +01:00
parent e8ccdafcf7
commit 940c00b5af
2 changed files with 72 additions and 6 deletions

View File

@ -4,9 +4,9 @@
"height": 24, // Waybar height
// "width": 1366, // Waybar width
// Choose the order of the modules
"modules-left": ["hyprland/workspaces", "hyprland/mode", "custom/spotify"],
"modules-left": ["hyprland/workspaces"],
"modules-center": ["hyprland/window"],
"modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "tray", "clock"],
"modules-right": ["pulseaudio", "network", "custom/bandwidth", "cpu", "memory", "battery", "tray", "clock"],
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": false,
@ -23,9 +23,6 @@
"default": ""
}
},
"hyprland/mode": {
"format": "<span style=\"italic\">{}</span>"
},
"tray": {
// "icon-size": 21,
"spacing": 10
@ -52,10 +49,13 @@
},
"network": {
// "interface": "wlp2s0", // (Optional) To force the use of this interface
"format-wifi": "{essid} ({signalStrength}%) ",
"format-wifi": "{essid} ({signalStrength}) ",
"format-ethernet": "{ifname}: {ipaddr}/{cidr} ",
"format-disconnected": "Disconnected ⚠"
},
"custom/bandwidth": {
"exec": "$HOME/.config/waybar/scripts/bandwidth"
},
"pulseaudio": {
//"scroll-step": 1,
"format": "{volume}% {icon}",

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python
import subprocess
from time import sleep
def default_interface():
process = subprocess.run(
["ip", "route"], check=True, text=True, capture_output=True
)
for line in process.stdout.splitlines():
if line.startswith("default via"):
return line.split()[4]
raise RuntimeError("No default interface found")
def get_rx_tx_bytes(iface):
with open("/proc/net/dev") as f:
for line in f:
line = line.strip()
if not line.startswith(f"{iface}:"):
continue
rx_bytes = int(line.split()[1])
tx_bytes = int(line.split()[9])
return rx_bytes, tx_bytes
raise RuntimeError(f"Interface {iface} not found")
def format_size(size):
power_labels = {0: "B", 1: "K", 2: "M", 3: "G", 4: "T"}
#kilo = 2**10
#power = 0
#while size > kilo:
# size /= kilo
# power += 1
power = 1
return f"{size/1024:3.0f} {power_labels[power]}"
def main():
refresh_interval = 1
rx_icon = " "
tx_icon = " "
num_left = "<span font='NotoSansMono'>"
num_right = "</span>"
fmt_str = (
f"{rx_icon}{num_left}{{rx}}{{unit_suffix}}{num_right} "
f"{tx_icon}{num_left}{{tx}}{{unit_suffix}}{num_right}"
)
unit_suffix = ""
iface = default_interface()
rx_bytes, tx_bytes = get_rx_tx_bytes(iface)
while True:
prev_rx_bytes, prev_tx_bytes = rx_bytes, tx_bytes
rx_bytes, tx_bytes = get_rx_tx_bytes(iface)
drx = format_size((rx_bytes - prev_rx_bytes) / refresh_interval)
dtx = format_size((tx_bytes - prev_tx_bytes) / refresh_interval)
line = fmt_str.format(rx=drx, tx=dtx, unit_suffix=unit_suffix)
print(line, flush=True)
sleep(refresh_interval)
if __name__ == "__main__":
main()