おうちのサーバールーム温度調節を自動化する


この記事はおうちハック Advent Calendar 2018の2日目の記事です。

昨日の記事は、@s51517765さんの「エアコン(のリモコン)をフィジカルハックしてラズパイとSlackでスマートリモコン化する」でした。Raspberry Piから物理的にリモコンを操作されていて、私には高度すぎました...。

さて、自宅でテレビ録画兼ファイルサーバーを常時起動しているのですが、夏場になるとHDDの温度が50℃を超えてしまうことがありました。
そこで、気温が高くなったら自動でクーラーを入れて、時間が経ったら消すようにシステム化したので、その方法を書いてみたいと思います。
(時季外れなのと、若干のネタかぶりなのはご容赦ください<(_ _)>)

tl;dr

  • CrystalDiskInfoでHDDの温度上昇を検知し、
  • PowerShellでIRKitを操作してクーラーをONにすると、
  • 気温が下がる

CrystalDiskInfoで温度検知

CrystalDiskInfoでは、HDDの温度上昇時にWindowsイベントを記録できます。
これをトリガーに、クーラーを入れるよう設定したいと思います。

インストール

公式サイトからダウンロードして、インストールしてください。

温度上昇時にイベント記録されるよう設定

1. イベント記録設定

メイン画面を開き、下記3つの項目を選択します。

  • 機能->常駐
  • 機能->スタートアップ
  • 機能->通知機能->イベントログ

2. クーラー起動温度の設定

タスクバーのアイコンを右クリックし、監視対象HDDを選び、
「警報設定 - 温度」から、クーラーを入れる温度を設定する。

3. 動作確認

  1. 「2.」と同じ方法で、「20℃」に設定する。
  2. タスクバーのアイコンを右クリックして「更新」をクリックする。
  3. イベントビューアーで、イベントID:606が記録されていることを確認する。

動作確認した後は、設定温度を元に戻しておいてください。

PowerShellでIRKitを操作

IRKitはHTTPリクエストを送ると、リモコンの赤外線信号を送ることができる製品です。(現在は、後継の「Nature Remo」という製品があるそうです。)

エアコンのリモコン信号を取得

通信するために、IRKitのIPアドレスを取得しましょう。

// IRKitの名前を取得
> dns-sd -B _irkit._tcp
Timestamp     A/R Flags if Domain                    Service Type              Instance Name
23:35:14.829  Add     2  7 local.                    _irkit._tcp.              iRKitXXXX  // "iRKitXXXX"がIRKitの名前

// IPアドレスを取得
> dns-sd -G v4 <IRKitの名前>.local
Timestamp     A/R Flags if Hostname                  Address                                      TTL
23:37:53.350  Add     2  7 irkitc68a.local.          192.168.0.2                                  10

そして、エアコンのリモコン信号を取得します。

  1. IRKitに向けて、エアコンの電源ボタンを押します。
  2. 次のコマンドを実行します。
> Invoke-WebRequest -Uri "http://<IRKitのIPアドレス>/messages" -Method "Get" -Headers @{"X-Requested-With"="curl"} | Select -Property Content | Format-Table -AutoSize -Wrap

Content
-------
{"format":"raw","freq":38,"data":[9999, ...

「{"format"」からはじまる文字列はリモコン信号の値ですので、どこかにコピーしておきます。
また、タイマーボタンも押して、同じように信号の値をコピーしておきます。

※一度リクエストを送ると、IRKit上から信号が消去されます。コマンドの実行を誤った際などは、リモコンのボタン操作からやり直してください。

PowerShellスクリプトの作成

エアコン信号を取得できましたので、IRKitからリモコン信号を送信するプログラムを書きます。
単にHTTPリクエストを送るだけなので、PowerShellにしました。

次のようなスクリプトを適当なファイル名で保存します。

$uri="http://<IRKitのIPアドレス>/messages"

# 電源ON
Invoke-RestMethod -Uri $uri -Method Post -Headers @{"X-Requested-With"="curl"} -Body '{"format":"raw","freq":38,"data":[9999, ....'

# タイマー(n時間)
Invoke-RestMethod -Uri $uri -Method Post -Headers @{"X-Requested-With"="curl"} -Body '{"format":"raw","freq":38,"data":[8888, ....'

温度上昇時に実行されるよう設定

最後に、温度上昇のイベントが記録されたら、リモコン信号を送信するプログラムを実行するように設定します。

1. タスクの名前と説明を入力

タスクスケジューラを開き、右ペインの「基本タスクの作成」をクリックします。
「基本タスクの作成ウィザード」が開いたら、「名前」と「説明」を適当に入力して、「次へ」ボタンをクリックします。

2. イベント記録時に実行されるよう設定

「特定イベントのログへの記録時」を選択し、「次へ」ボタンをクリックします。

3. イベントの種類を選択

下記のように選択して、「次へ」ボタンをクリックします。

  • ログ:Application
  • ソース:CrystalDiskInfo
  • イベントID:606

4. 実行する操作の選択

「プログラムの開始」を選択し、「次へ」ボタンをクリックします。

5. 実行するプログラムの指定

先ほどのプログラムを実行するよう指定しますが、設定方法が若干特殊です。注意してください。

  • プログラム/スクリプト:%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
  • 引数の追加:-Command "<作成したPowerShellファイルのフルパス>"
  • 開始:(空白)

「次へ」ボタンをクリックし、次の画面で「完了」ボタンをクリックすれば、作業完了です。

6. 動作確認

設定したタスクを右クリックし「実行する」をクリックします。
エラーなく実行され、クーラーが電源ONになり、タイマーが設定されることを確認できれば完了です!

※PowerShellスクリプトの実行が無効化されている場合は、下記のページを参考に実行ポリシーを「RemoteSigned」に設定してください。

まとめ

HDDの温度をCrystalDiskInfoで監視し、PowerShellを使ってIRKitを操作して、クーラーをつけることができました。
これらを組み合わせると、簡単にエアコンを動かすことができることが分かりました。

寒くなってきたこの時期では、毎朝の起きる前に暖房を入れるなんてこともできますね。