当サイトには広告が含まれています

Ubuntuで録画サーバーを省電力化!全自動サスペンド運用

EPGStation-sleep Ubuntu

はじめに

PCで録画サーバーを作成しましたが起動したままは電気代がもったいないです。そこで、ネットでUbuntu/EPGstationをサスペンド運用されている記事を探すとrtcwakeをよく見かけます。ただ、毎回予約時刻にあわせてrtcwakeを打つのも面倒ですので自動化してみました。当方はLinux初心者なので動作保証はできませんが、参考になれば幸いです。

この記事は、Ubuntu Serverに、Docker-Mirakurun-EPGStationの基本的なセットアップが完了している方向けです。EPGStationのサスペンド運用に興味がある方に参考となる内容です。
Ubuntu ServerのISOファイルは、Ubuntu公式サイトからダウンロードしてください。
Docker-Mirakurun-EPGStationの導入については、公式リポジトリなどをご覧ください。
当方が参考にしたサイトは、LowLinux様のこちらの記事です。

筆者の動作環境:

WD Green

※写真は現在販売されていないWD Greenです(現在はWD Blueに統合されています)。


WD Blue 3.5インチ HDD 4TBはこちら(Amazonで見る) / 8TBはこちら(Amazonで見る)/ SSDはこちら(Amazonで見る)
✓コストパフォーマンスが良く、長期間の録画サーバー使用に最適
✓信頼性が高く、データ保管に安心
✓「Acronis True Image for Western Digital」でHDDを丸ごとクローン作製可能

♦「Acronis True Image for Western Digital」は、Western Digital製のHDD/SSDユーザーであれば無料で使用できます(WD製品ソフトウェアのダウンロード)。


♦筆者も録画サーバー構築前に、元々使用していたWindows環境を丸ごとバックアップ。HDDを入れ替えればUbuntuからWindows環境にすぐ戻せます。

※公式ではサスペンド運用は推奨されていません。

コードとその解説

録画/予約状況に応じて、rtcwakeを実行するスクリプトです。時刻は全てUTCです。

#!/bin/bash

# 録画中の確認
sleep 5
recording_data=$(curl -s 'http://127.0.0.1:8888/api/recording?offset=0&limit=24&isHalfWidth=true')
total_recording=$(echo "$recording_data" | grep -o '"total":[0-9]*' | cut -d: -f2)
total_recording=${total_recording:-0}

if [ "$total_recording" -ne 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 現在録画中のため、サスペンドは行いません。"
    exit 0
fi

# 予約情報の確認
reserves_data=$(curl -s 'http://127.0.0.1:8888/api/reserves?offset=0&limit=24&isHalfWidth=true')
total_reserves=$(echo "$reserves_data" | grep -o '"total":[0-9]*' | cut -d: -f2)
total_reserves=${total_reserves:-0}

# 予約が存在しない場合
if [ "$total_reserves" -eq 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 予約も録画もないため、サスペンドし、21:15に復帰します(EPG更新のため)。"
    wake_time=$(date +%s -d '21:16')
    current_time=$(date +%s)
    if [ "$wake_time" -le "$current_time" ]; then
        wake_time=$(date +%s -d 'tomorrow 21:16')
    fi
    sudo rtcwake -m mem -t "$wake_time"
    exit 0
fi

# 最初のstartAtを抽出
start_at=$(echo "$reserves_data" | grep -o '"startAt":[0-9]*' | head -1 | cut -d: -f2)

# ミリ秒を秒に変換
start_at_seconds=$(echo "$start_at" | cut -c1-10)

# 現在時刻の取得
current_time=$(date +%s)

# 予約時間の5分前(300秒前)を計算
wake_time=$((start_at_seconds - 300))

# バッファタイムを設定(例: 60秒)
buffer=60

# wake_timeがcurrent_time + bufferより大きいかチェック
if [ "$wake_time" -le $((current_time + buffer)) ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 予約5分前に復帰中。サスペンドは行いません。"
    exit 0
fi

# wake_timeを人間が読める形式に変換
wake_time_readable=$(date -d @"$wake_time" +"%Y年%m月%d日 %H時%M分")

# サスペンドと復帰設定
echo "$(date '+%Y-%m-%d %H:%M:%S'): サスペンドし、$wake_time_readable に復帰します (予約時間の5分前)。"
sudo rtcwake -m mem -t "$wake_time"

まず録画中か確認し、該当すればサスペンドしません。
次に予約状況を確認し、なければサスペンド、21:16(UTC、日本時間6時15分)に復帰します(EPGデータ更新目的)。
予約時刻を取得し、予約5分前のwake_timeを計算します。現在時刻が予約5分前であればサスペンドしません。
上記全てパスしたら、サスペンドし、予約時刻5分前に復帰します。

epgsleep.shなど任意の名前をつけて実行権限を与えます。

chmod +x epgsleep.sh

あとはこれを、15分毎など定期実行させるだけです。

crontab -e
*/15 * * * * epgsleep.sh

これで、自動的に15分おきに予約状況を確認し、録画中&予約5分前ではなく、予約がある状況下でサスペンドし、予約時刻5分前に復帰します。

※サスペンドに入ると、タイマーが上手く動作せず予約時刻になっても録画が開始されませんので、curl -X POST “http://127.0.0.1:8888/api/recording/resettimer”を復帰後に実行する必要があります。

case "$1" in
    post)
        sleep 10
        curl -X POST "http://127.0.0.1:8888/api/recording/resettimer"
        ;;
esac

例えば上記をepgstation-resettimer.shなど任意の名前で保存し、/lib/systemd/system-sleep/以下に置いて、chmod +xで実行権限を与えれば、復帰後に自動でタイマーが再セットされます。

chmod +x /lib/systemd/system-sleep/epgstation-resettimer.sh

また、別の手法として、

#!/bin/bash
sleep 10
echo "$(date '+%Y-%m-%d %H:%M:%S'): EPGStation reset timer triggered"
curl -X POST "http://127.0.0.1:8888/api/recording/resettimer" || echo "failed to reset timer"

例えば上記を任意の名前で保存し、chmod +xで実行権限を与えてから、crontab -eで3分毎に定期実行する方法もあります(当方はハイバネーション有効化後にsystem-sleepフックが上手くいかないので、こちらで運用)。

EPG更新目的で21:16(UTC、日本時間6時16分)に起動しますが、日本時間6時30分にサスペンドするため、デフォルトの番組情報更新間隔の10分を短くしたほうがよいかもしれません(筆者はとりあえず5分にしています)。

config.ymlをnano等で開きます。

sudo nano ~/docker-mirakurun-epgstation/epgstation/config/config.yml

epgUpdateIntervalTimeの数値を変更します。

epgUpdateIntervalTime: 5

例えば上記で番組情報更新間隔を5分にします。

注意点や、実際の運用について

録画や予約がないと15分でサスペンドしてしまうので、録画番組の視聴中や、ssh接続で作業中は自動サスペンドを止める必要があります。

sudo systemctl stop cron

視聴終了後や作業終了後には自動サスペンドを有効化します。

sudo systemctl start cron

録画サーバーを有線LAN接続しておけばマジックパケットでサスペンドから復帰できるので便利です(iPhoneではSecure ShellFish – SSH Client for iOSアプリが自動でssh接続できる上にマジックパケットも送信できるので便利です)。

外出先から録画サーバーを復帰させるにはルーターが対応していれば可能です(iPhoneでは「RemoteBoot WOL」をApp Storeでアプリがポート指定できるので便利です)。マジックパケットを受け取るために、そのポートを開放する必要があります。

外出先から録画サーバーへのアクセスは8888番をポート開放すると不正アクセスの危険がありますので、sshのポートのみ開放してssh接続し、sshトンネルを開通させてアクセスするとセキュアです。

ssh -p 22 -C -c aes128-ctr -L 8080:録画サーバーのプライベートIPアドレス:8888 ユーザー名@グローバルIPアドレス

例えば上記は、22番ポートを使用して、ユーザー名@グローバルIPアドレスにssh接続します。接続元のローカルのポート8080をsshサーバー経由で、録画サーバーのポート8888に転送します。Cオプションはデータ圧縮、cオプションで暗号化を軽量化(aes128-ctr)しています。

上記を接続元で実行し(iPhoneならiSH shellなど)、http://localhost:8080/にアクセスすると、録画サーバーのEPGStationにアクセスできます。sshトンネルの詳細や、iSH shellをバックグラウンドで動作させる方法は下記をご覧ください。

Fire TV Stick NASサーバー化計画 | 至福の煌めき

まとめ

  • 録画サーバーをサスペンド運用で省電力化!
  • iPhone等のブラウザ上で、録画予約・ライブ視聴・録画視聴できるので非常に便利!
  • SSHトンネルを利用すれば安全に外出先からも上記操作が可能!

コメント

タイトルとURLをコピーしました