收起左侧

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

3
回复
195
查看
[ 复制链接 ]

0

主题

0

回帖

0

牛值

江湖小虾

准备工作

开启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
收藏
送赞 2
分享

1

主题

56

回帖

0

牛值

初出茅庐

把代码丢给ai看看,是这样回复的:

这是一个用于飞牛NAS设备的多设备LED状态监控脚本,主要功能是通过LED灯效直观显示硬盘、电源和网络接口的工作状态。我来分析一下这个脚本的主要特点和功能:

硬盘状态指示:
待机状态:白色常亮
读取操作:蓝色闪烁
写入操作:红色闪烁
混合操作:紫色闪烁
电源状态:
开机后保持白色常亮
网络接口状态:
无流量时:白色常亮
有流量时:七彩呼吸灯效果,且流量越大呼吸速度越快

脚本特点:

使用了系统级的硬件监控接口(/sys/block和/sys/class/net)
实现了精确的流量和IOPS计算
包含完善的日志记录功能
有优雅的退出处理(trap信号捕获)
所有参数可配置,便于适配不同硬件

使用建议:

1,需要根据实际硬件修改DISKS和DISK_LEDS数组
2,确保/usr/bin/ugreen_leds_cli命令存在并有执行权限
3,可以调整CHECK_INTERVAL改变监控频率
4,建议以root权限运行以确保能访问所有硬件信息

这个脚本非常适合需要直观监控NAS工作状态的场景,通过LED颜色和闪烁模式可以快速了解系统当前负载情况。

2

主题

3

回帖

0

牛值

江湖小虾

谢谢分享

1

主题

16

回帖

0

牛值

江湖小虾

内存上的灯光能控制吗

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则