この記事はおうちハック 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. 動作確認
- 「2.」と同じ方法で、「20℃」に設定する。
- タスクバーのアイコンを右クリックして「更新」をクリックする。
- イベントビューアーで、イベント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
そして、エアコンのリモコン信号を取得します。
- IRKitに向けて、エアコンの電源ボタンを押します。
- 次のコマンドを実行します。
> 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を操作して、クーラーをつけることができました。
これらを組み合わせると、簡単にエアコンを動かすことができることが分かりました。
寒くなってきたこの時期では、毎朝の起きる前に暖房を入れるなんてこともできますね。