#!/bin/sh # Network status indicator for waybar # Shows: WiFi icon (signal strength) + SSID, or Ethernet icon + interface # Tooltip: upload/download speeds INTERFACE=$(ip route | awk '/default/ {print $5; exit}') if [ -z "$INTERFACE" ]; then echo '{"text": "󰤭 Offline", "tooltip": "No network connection", "class": "disconnected"}' exit 0 fi # Measure network speed (requires 1 second delay) RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) sleep 1 RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) RX_RATE=$((RX2 - RX1)) TX_RATE=$((TX2 - TX1)) format_speed() { local bytes=$1 if [ $bytes -ge 1073741824 ]; then printf "%.2f GB/s" $(echo "scale=2; $bytes / 1073741824" | bc) elif [ $bytes -ge 1048576 ]; then printf "%.2f MB/s" $(echo "scale=2; $bytes / 1048576" | bc) elif [ $bytes -ge 1024 ]; then printf "%.2f KB/s" $(echo "scale=2; $bytes / 1024" | bc) else printf "%d B/s" $bytes fi } UP=$(format_speed $TX_RATE) DOWN=$(format_speed $RX_RATE) # Determine connection type and get appropriate icon/label if [ -d "/sys/class/net/$INTERFACE/wireless" ]; then # WiFi connection LABEL=$(iw dev "$INTERFACE" info 2>/dev/null | awk '/ssid/ {print $2}') [ -z "$LABEL" ] && LABEL="WiFi" # Get signal strength in dBm SIGNAL_DBM=$(iw dev "$INTERFACE" link 2>/dev/null | awk '/signal:/ {print $2}') # Select icon based on signal dBm if [ -z "$SIGNAL_DBM" ]; then ICON="󰤯" # No signal elif [ "$SIGNAL_DBM" -ge -50 ]; then ICON="󰤨" # Excellent elif [ "$SIGNAL_DBM" -ge -60 ]; then ICON="󰤥" # Good elif [ "$SIGNAL_DBM" -ge -70 ]; then ICON="󰤢" # Fair elif [ "$SIGNAL_DBM" -ge -80 ]; then ICON="󰤟" # Weak else ICON="󰤯" # No signal fi else # Ethernet connection ICON="󰈀" LABEL="$INTERFACE" fi TOOLTIP="Up: $UP\nDown: $DOWN" echo "{\"text\": \"$ICON $LABEL\", \"tooltip\": \"$TOOLTIP\", \"class\": \"connected\"}"