подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.
С помощью нейронки Claude Sonnet написал скрипт, который выключает вечером светодиоды у роутера, а утром включает их обратно. Важно - тестировалось и работает на Cudy WR3000p под управлением openWRT 25.12.4. С обязательным пакетом mdio-tools. Если что, отказываюсь сразу от ответственности - у меня на тесте все работало, но именно в такой связке - Cudy wr3000p + openwrt 25.12.4 + mdio-tools - это важно, у разных роутеров по разному записана конфигурация светодиодов.
Сам скрипт
#!/bin/sh
# Управление светодиодами Cudy WR3000P (OpenWrt)
# Использование: led_control.sh {on|off|status}
SAVE_DIR="/tmp/led_state"
MDIO_DEFAULTS="/etc/led_mdio_defaults"
log() {
logger -t led_control "$*"
echo "[$(date '+%H:%M:%S')] $*"
}
# ─────────────────────────────────────────
# Чтение и сохранение исходных mdio значений
# (вызывается один раз при первом отключении)
# ─────────────────────────────────────────
save_mdio_defaults() {
[ -f "$MDIO_DEFAULTS" ] && return 0
LAN_VAL=$(mdio mt7530-0 0:0x1f raw 0x21 2>/dev/null | awk '{print $NF}')
WAN_VAL=$(mdio mdio-bus 6:0x1f 0xd044 2>/dev/null | awk '{print $NF}')
printf "LAN_DEFAULT=%s\nWAN_DEFAULT=%s\n" "$LAN_VAL" "$WAN_VAL" > "$MDIO_DEFAULTS"
log "Сохранены mdio-дефолты: LAN=$LAN_VAL WAN=$WAN_VAL"
}
get_default() {
[ -f "$MDIO_DEFAULTS" ] || return 1
grep "^${1}=" "$MDIO_DEFAULTS" | cut -d= -f2
}
# ─────────────────────────────────────────
# Сохранение состояния sysfs-светодиодов
# ─────────────────────────────────────────
save_sysfs_leds() {
mkdir -p "$SAVE_DIR"
for led_path in /sys/class/leds/*/; do
[ -d "$led_path" ] || continue
name=$(basename "$led_path")
# Извлекаем активный триггер из скобок: "none [netdev] timer" → "netdev"
raw=$(cat "${led_path}trigger" 2>/dev/null)
if echo "$raw" | grep -q '\['; then
trigger=$(echo "$raw" | sed 's/.*\[\([^]]*\)\].*/\1/')
else
trigger="none"
fi
echo "$trigger" > "$SAVE_DIR/${name}.trigger"
cat "${led_path}brightness" 2>/dev/null > "$SAVE_DIR/${name}.brightness"
done
}
# ─────────────────────────────────────────
# ВЫКЛЮЧЕНИЕ всех светодиодов
# ─────────────────────────────────────────
leds_off() {
save_mdio_defaults
# Сохранить sysfs-состояние только при первом вызове за сессию
[ -d "$SAVE_DIR" ] || save_sysfs_leds
# Отключить sysfs-светодиоды (WiFi, питание и т.д.)
for led_path in /sys/class/leds/*/; do
[ -d "$led_path" ] || continue
echo none > "${led_path}trigger" 2>/dev/null
echo 0 > "${led_path}brightness" 2>/dev/null
done
# Отключить LAN-светодиоды (коммутатор mt7530)
mdio mt7530-0 0:0x1f raw 0x21 0x0008 2>/dev/null \
&& log "LAN LED: выключены" || log "LAN LED: ошибка mdio"
# Отключить WAN-светодиод (внешний PHY)
mdio mdio-bus 6:0x1f 0xd044 0x4089 2>/dev/null \
&& log "WAN LED: выключен" || log "WAN LED: ошибка mdio"
log "Все светодиоды ВЫКЛЮЧЕНЫ"
}
# ─────────────────────────────────────────
# ВКЛЮЧЕНИЕ всех светодиодов
# ─────────────────────────────────────────
leds_on() {
# ── LAN: восстановить сохранённое значение (или дефолт 0x0000) ──
LAN_SAVED=$(get_default LAN_DEFAULT)
# Если сохранённое — уже "выключено" (0x0008), используем 0x0000
case "$LAN_SAVED" in
0x0008|"") LAN_RESTORE="0x0000" ;;
*) LAN_RESTORE="$LAN_SAVED" ;;
esac
mdio mt7530-0 0:0x1f raw 0x21 "$LAN_RESTORE" 2>/dev/null \
&& log "LAN LED: включены (val=$LAN_RESTORE)" || log "LAN LED: ошибка mdio"
# ── WAN: восстановить сохранённое значение ──
WAN_SAVED=$(get_default WAN_DEFAULT)
case "$WAN_SAVED" in
0x4089|"") WAN_RESTORE="0x0021" ;; # типовой дефолт link+activity
*) WAN_RESTORE="$WAN_SAVED" ;;
esac
mdio mdio-bus 6:0x1f 0xd044 "$WAN_RESTORE" 2>/dev/null \
&& log "WAN LED: включён (val=$WAN_RESTORE)" || log "WAN LED: ошибка mdio"
# ── sysfs-светодиоды: восстановить сохранённые триггеры ──
if [ -d "$SAVE_DIR" ]; then
for led_path in /sys/class/leds/*/; do
[ -d "$led_path" ] || continue
name=$(basename "$led_path")
tf="$SAVE_DIR/${name}.trigger"
bf="$SAVE_DIR/${name}.brightness"
[ -f "$tf" ] && echo "$(cat "$tf")" > "${led_path}trigger" 2>/dev/null
[ -f "$bf" ] && echo "$(cat "$bf")" > "${led_path}brightness" 2>/dev/null
done
else
# Нет сохранённого состояния — просто зажигаем
for led_path in /sys/class/leds/*/; do
[ -d "$led_path" ] || continue
echo 1 > "${led_path}brightness" 2>/dev/null
done
fi
log "Все светодиоды ВКЛЮЧЕНЫ"
}
# ─────────────────────────────────────────
# СТАТУС
# ─────────────────────────────────────────
status() {
echo "╔══════════════════════════════════════════════════╗"
echo "║ Статус светодиодов WR3000P ║"
echo "╚══════════════════════════════════════════════════╝"
echo ""
echo "── sysfs-светодиоды ──────────────────────────────"
for led_path in /sys/class/leds/*/; do
[ -d "$led_path" ] || continue
name=$(basename "$led_path")
raw=$(cat "${led_path}trigger" 2>/dev/null)
if echo "$raw" | grep -q '\['; then
trigger=$(echo "$raw" | sed 's/.*\[\([^]]*\)\].*/\1/')
else
trigger="none"
fi
brightness=$(cat "${led_path}brightness" 2>/dev/null)
state="OFF"
[ "$brightness" -gt 0 ] 2>/dev/null && state="ON "
printf " [%s] %-38s trigger=%s\n" "$state" "$name" "$trigger"
done
echo ""
echo "── mdio-регистры ─────────────────────────────────"
printf " LAN mt7530-0 reg 0x21: "
mdio mt7530-0 0:0x1f raw 0x21 2>/dev/null || echo "ошибка чтения"
printf " WAN mdio-bus reg 0xd044: "
mdio mdio-bus 6:0x1f 0xd044 2>/dev/null || echo "ошибка чтения"
if [ -f "$MDIO_DEFAULTS" ]; then
echo ""
echo "── Сохранённые дефолты ($MDIO_DEFAULTS) ──────"
cat "$MDIO_DEFAULTS"
fi
if [ -d "$SAVE_DIR" ]; then
echo ""
echo "── Сохранённые sysfs-состояния ($SAVE_DIR) ───"
ls "$SAVE_DIR/" | head -20
fi
}
# ─────────────────────────────────────────
case "$1" in
on) leds_on ;;
off) leds_off ;;
status) status ;;
*)
echo "Использование: $(basename "$0") {on|off|status}"
echo ""
echo " on — включить все светодиоды"
echo " off — выключить все светодиоды"
echo " status — показать текущее состояние"
exit 1
;;
esac
Его через WinSCP положил в папку /root/led-night.sh
выдал права chmod +x /root/led-night.sh
Вначале считываем текущий статус, обязательно!!!
led_control.sh status
проверяем
led_control.sh off
led_control.sh on
и, если все нормально, далее в cron /etc/crontabs/root
0 23 * * * /root/led-night.sh off
0 8 * * * /root/led-night.sh on
Сам скрипт написан с помощью нейросети Claude Sonnet 4.5
а, сам cron нужно не забыть активировать и запустить
/etc/init.d/cron enable
/etc/init.d/cron start