2024/12/16

LS410D改 Debian Bookworm 化|温度閾値による LED の点灯/消灯

過去の投稿に誤りがあったので、改めて LED 点灯/消灯のコードを考えてみました。ある設定温度以上になったら赤色 LED やオレンジ色 LED を「点滅」させることを目指したのですが、複雑になってしまいます。「点滅」ではなく「点灯」にすることで、シェルスクリプトでの作成が容易になりました。

下記の動作(機能)になります。

■60秒間隔で、温度、ファン状態、ファン速度、ターゲットファン速度を測定

■温度が60℃以上になったとき

  • オレンジ色LED点灯をさせてその状態を維持
  • 一回だけメッセージ「Warning temperature reached」を出力
  • メッセージとともに、日時、ファン状態、ファン速度、ターゲットファン速度、温度、ミリ温度をログに記録
  • それ以降、60℃以上に温度が上昇してもログへの記録はしない

■温度が70℃以上になったとき

  • オレンジ色LEDを消灯し、赤色LEDを点灯させその状態を維持
  • 一回だけメッセージ「Danger temperature reached」を出力
  • メッセージとともに、日時、ファン状態、ファン速度、ターゲットファン速度、温度、ミリ温度をログに記録
  • それ以降、70℃以上に温度が上昇してもログへの記録はしない

■エラー発生時

  • 温度測定時のメッセージは「Failed to read temperature」
  • ファン状態検知のメッセージは「Failed to read current fan state」
  • ファン速度検知のメッセージは「Failed to read fan speed」
  • ターゲットファン速度検知のメッセージは「Failed to read fan target」
  • 上記エラー発生時の日時、ファン状態、ファン速度、ターゲットファン速度、温度、ミリ温度、メッセージをログに記録
  • 30秒後に再度計測
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash# Define temperature thresholds (milli degC)WARNING_TEMP=60000 # Warning temperature (60 degC)DANGER_TEMP=70000 # Danger temperature (70 degC)# Define interval and waiting time parametersMONITOR_INTERVAL=60 # Normal monitoring interval (seconds)ERROR_WAIT=30 # Error waiting time (seconds)# Define log filelog_file="led-status.log"# Log file header outputecho "Timestamp,Fan State,Fan Speed,Target Speed,Temp(degC),Temp(mdegC),Message" > "$log_file"# LED control parametersLED_PATH_ORANGE="/sys/class/leds/led:power:orange/brightness"LED_PATH_RED="/sys/class/leds/led:power:red/brightness"# Sensor pathsTEMP_SENSED="/sys/class/thermal/thermal_zone0/temp"FAN_STATE="/sys/class/thermal/cooling_device0/cur_state"FAN_SPEED="/sys/class/hwmon/hwmon1/fan1_input"FAN_TARGET="/sys/class/hwmon/hwmon1/fan1_target"# Logging-related variableslast_temp_status="normal"# Logging functionlog_status() {local message="$1"local timestamp=$(date +"%Y.%m.%d %H:%M:%S")echo "$timestamp, $current_state, $fan_speed, $target_speed, $temp, $mtemp, $message" >> "$log_file"}# Error logging functionlog_error() {local message="$1"local timestamp=$(date +"%Y.%m.%d %H:%M:%S")echo "$timestamp, $current_state, $fan_speed, $target_speed, $temp, $mtemp, ERROR - $message" >> "$log_file"}# Function to control LED based on temperaturecontrol_leds() {local mtemp=$1if [ "$mtemp" -ge "$DANGER_TEMP" ]; then# Danger temperature, turn on red LEDecho 1 > "$LED_PATH_RED"echo 0 > "$LED_PATH_ORANGE"elif [ "$mtemp" -ge "$WARNING_TEMP" ]; then# Warning temperature, turn on orange LEDecho 1 > "$LED_PATH_ORANGE"echo 0 > "$LED_PATH_RED"else# Temperature is normal, turn off both LEDsecho 0 > "$LED_PATH_ORANGE"echo 0 > "$LED_PATH_RED"fi}# Main monitoring loopwhile true; do# Read temperatureif ! mtemp=$(cat "/sys/class/thermal/thermal_zone0/temp" 2>/dev/null); thenlog_error "Failed to read temperature"sleep "$ERROR_WAIT"continuefitemp=$(awk -v t="$mtemp" 'BEGIN{printf("%.2f", t/1000)}')# Read fan stateif ! current_state=$(cat "/sys/class/thermal/cooling_device0/cur_state" 2>/dev/null); thenlog_error "Failed to read current fan state"sleep "$ERROR_WAIT"continuefi# Read fan speedif ! fan_speed=$(cat "$FAN_SPEED" 2>/dev/null); thenlog_error "Failed to read fan speed"sleep "$ERROR_WAIT"continuefi# Read target fan speedif ! target_speed=$(cat "$FAN_TARGET" 2>/dev/null); thenlog_error "Failed to read fan target"sleep "$ERROR_WAIT"continuefi# Determine the current temperature statusif [ "$mtemp" -ge "$DANGER_TEMP" ]; thencurrent_temp_status="danger"elif [ "$mtemp" -ge "$WARNING_TEMP" ]; thencurrent_temp_status="warning"elsecurrent_temp_status="normal"fi# Only log the status if it has changedif [ "$current_temp_status" != "$last_temp_status" ]; thencontrol_leds "$mtemp"case "$current_temp_status" in"danger")log_status "Danger temperature reached";;"warning")log_status "Warning temperature reached";;"normal")log_status "Temperature is normal";;esaclast_temp_status="$current_temp_status"fi# Wait before next checksleep "$MONITOR_INTERVAL"done

スクリプトの概略

■44~60行:LED の制御(control_leds 関数)

  • 温度が危険閾値(DANGER_TEMP)以上の場合、赤色LEDを点灯させ、オレンジ色LEDを消灯
  • 温度が警告閾値(WARNING_TEMP)以上の場合、オレンジ色LEDを点灯させ、赤色LEDを消灯
  • 温度が両閾値未満の場合、両方のLEDを消灯

■62~121行:温度監視のメインループ

  • 60秒ごとに、温度センサーや各ファンの情報を取得
  • 取得した温度の値に基づいて、現在の温度状態(current_temp_status)を判断
  • 前回の状態(last_temp_status)と比較し、変化があった場合にのみ以下の処理を行う
  • control_leds 関数を呼び出して、LEDの状態を更新
  • 温度状態に応じたログメッセージを log_status 関数で記録
  • 最後に、次の監視までの60秒間、スクリプトを停止

警告温度を43℃、危険温度を46℃にしてテストしたときのログ(スクリーンショット)を添付します。

機能しています。

以上

ワンクリックの応援が励みになります
にほんブログ村 IT技術ブログ IT技術情報へ
|すべての 投稿リスト

上記の記載内容は独自の理解や個人的な見解に基づいています。
間違いがないことを保証するものではないことをご了承下さい。

コメント

非公開コメント

  翻译: