5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

おうちハックAdvent Calendar 2018

Day 2

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

Last updated at Posted at 2018-12-01

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

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

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

tl;dr

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

CrystalDiskInfoで温度検知

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

インストール

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

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

1. イベント記録設定

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

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

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

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

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を操作して、クーラーをつけることができました。
これらを組み合わせると、簡単にエアコンを動かすことができることが分かりました。

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?