fnOS 控制绿联设备的 Led 灯控代码

准备工作
开启SSH
SSH登陆FnOS切换root sudo -i

下载 ugreen_leds_cli 工
切换到 root

1:sudo -i

下载 ugreen_leds_cli 工具

2:cd /usr/bin

3:wget https://github.com/miskcoo/ugreen_leds_controller/releases/download/v0.1-debian12/ugreen_leds_cli

4:chmod +x ugreen_leds_cli

检查功能能不能用

5 :./ugreen_leds_cli all -off

如果报以下错误
Err: fail to open the I2C device.
Please check that (1) you have the root permission;
and (2) the i2c-dev module is loaded.
就执行下面的代码
6:sudo modprobe i2c-dev

完整监控脚本(包含电源和网口 LED 控制)

!/bin/bash

飞牛NAS多设备LED监控脚本

功能:

– 硬盘:待机时白色常亮,读写时根据操作类型闪烁

– 电源:开机后保持白色常亮

– 网口:无流量时白色常亮,有流量时七彩呼吸灯(流量越大呼吸越快)

配置参数(请根据实际设备修改)

DISKS=(“sda” “sdb” “sdc” “sdd”) # 硬盘设备名
DISK_LEDS=(“disk1” “disk2” “disk3” “disk4”) # 硬盘对应的LED名称
POWER_LED=”power” # 电源LED名称
NETDEV_LED=”netdev” # 网口LED名称
CHECK_INTERVAL=0.2 # 检查间隔(秒)
DISK_BLINK_RATE=200 # 硬盘活动时闪烁速率(毫秒)
IDLE_BRIGHTNESS=180 # 待机时亮度(0-255)
MAX_BRIGHTNESS=255 # 最大亮度(0-255)
NETDEV_BASE_SPEED=2000 # 网口无流量时的呼吸速度(毫秒)
NETDEV_MAX_SPEED=500 # 网口最大流量时的呼吸速度(毫秒)

颜色定义

IDLE_COLOR=”255 255 255″ # 待机时白色 (RGB)
DISK_READ_COLOR=”0 0 255″ # 硬盘读取时蓝色 (RGB)
DISK_WRITE_COLOR=”255 0 0″ # 硬盘写入时红色 (RGB)
DISK_MIXED_COLOR=”255 0 255″ # 硬盘混合操作时紫色 (RGB)

七彩灯颜色序列(用于网口流量显示)

RAINBOW_COLORS=(
“255 0 0” # 红
“255 127 0” # 橙
“255 255 0” # 黄
“0 255 0” # 绿
“0 0 255” # 蓝
“75 0 130” # 靛
“148 0 211” # 紫
)

定义命令路径

LED_CLI=”/usr/bin/ugreen_leds_cli”

日志函数

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | logger -t “disk-led”
}

获取硬盘I/O计数

get_disk_io() {
local disk=$1
cat /sys/block/$disk/stat 2>/dev/null | awk ‘{print $1, $5}’ || echo “0 0”
}

获取网络接口流量(单位:KB/s)

get_netdev_traffic() {
local iface=”eth0″ # 默认网卡,可修改为实际网卡名称
local rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null || echo 0)
local tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null || echo 0)
local total_bytes=$((rx_bytes + tx_bytes))

# 计算流量变化率
local traffic_diff=$((total_bytes - ${prev_net_bytes:-0}))
prev_net_bytes=$total_bytes

# 转换为KB/s
echo $((traffic_diff / 1024 / CHECK_INTERVAL))

}

设置网口LED为七彩呼吸灯

set_netdev_rainbow() {
local traffic=$1
local speed=$((NETDEV_BASE_SPEED – (traffic > 100 ? 100 : traffic) * (NETDEV_BASE_SPEED – NETDEV_MAX_SPEED) / 100))

# 根据流量计算呼吸速度(流量越大,速度越快)
local color_index=$(( $(date +%s%N) / 100000000 % ${#RAINBOW_COLORS[@]} ))
local color=${RAINBOW_COLORS[$color_index]}

$LED_CLI $NETDEV_LED -color $color -breath $speed $speed

}

log “启动飞牛NAS多设备LED监控服务…”

初始化LED状态

log “初始化电源LED为白色常亮”
$LED_CLI $POWER_LED -color $IDLE_COLOR -brightness $MAX_BRIGHTNESS -on

log “初始化网口LED为白色常亮”
$LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on

初始化硬盘LED为白色常亮

for ((i=0; i<${#DISKS[@]}; i++)); do
log “初始化硬盘LED ${DISK_LEDS[$i]} 为白色常亮”
$LED_CLI ${DISK_LEDS[$i]} -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
disk_counts[$i]=$(get_disk_io ${DISKS[$i]})
done

初始化网络流量

prev_net_bytes=$(get_netdev_traffic)

trap “cleanup; exit” SIGINT SIGTERM

cleanup() {
log “停止监控服务,关闭所有LED”
$LED_CLI $POWER_LED -off
$LED_CLI $NETDEV_LED -off

for ((i=0; i<${#DISKS[@]}; i++)); do
    $LED_CLI ${DISK_LEDS[$i]} -off
done

}

log “开始监控所有设备状态…”

while true; do
# 检查硬盘状态
for ((i=0; i<${#DISKS[@]}; i++)); do
disk=${DISKS[$i]}
led=${DISK_LEDS[$i]}

    # 检查硬盘是否存在
    if [ ! -e "/sys/block/$disk" ]; then
        $LED_CLI $led -off
        continue
    fi

    # 获取当前I/O计数
    curr_counts=$(get_disk_io $disk)
    prev_counts=${disk_counts[$i]}

    # 计算差值
    read_diff=$(( $(echo $curr_counts | awk '{print $1}') - $(echo $prev_counts | awk '{print $1}') ))
    write_diff=$(( $(echo $curr_counts | awk '{print $2}') - $(echo $prev_counts | awk '{print $2}') ))

    # 根据硬盘状态控制LED
    if [ $read_diff -gt 0 ] && [ $write_diff -eq 0 ]; then
        # 读取活动:蓝色闪烁
        $LED_CLI $led -color $DISK_READ_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
    elif [ $write_diff -gt 0 ] && [ $read_diff -eq 0 ]; then
        # 写入活动:红色闪烁
        $LED_CLI $led -color $DISK_WRITE_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
    elif [ $read_diff -gt 0 ] && [ $write_diff -gt 0 ]; then
        # 混合活动:紫色闪烁
        $LED_CLI $led -color $DISK_MIXED_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
    else
        # 待机状态:白色常亮
        $LED_CLI $led -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
    fi

    # 更新计数
    disk_counts[$i]=$curr_counts
done

# 检查网络流量
traffic=$(get_netdev_traffic)

if [ $traffic -le 1 ]; then
    # 无流量:白色常亮
    $LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
else
    # 有流量:七彩呼吸灯(流量越大,呼吸越快)
    set_netdev_rainbow $traffic
fi

# 等待下一次检查
sleep $CHECK_INTERVAL

done

部署步骤
创建脚本文件:

nano /usr/local/sbin/feiniu_full_led_monitor.sh

粘贴上述代码,保存并设置权限:

chmod +x /usr/local/sbin/feiniu_full_led_monitor.sh

配置 systemd 服务:

nano /etc/systemd/system/feiniu-led-monitor.service

添加以下内容:

[Unit]
Description=FeiniuNAS Full LED Monitor
After=network.target local-fs.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/sbin/feiniu_full_led_monitor.sh
Restart=always
RestartSec=5
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KillMode=process
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

启动服务并设置开机自启:

systemctl daemon-reload
systemctl enable feiniu-led-monitor
systemctl start feiniu-led-monitor

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注