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

この記事は[おうちハック Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ouch-hack)の2日目の記事です。

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


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

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

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

### インストール
[公式サイト](https://crystalmark.info/ja/software/crystaldiskinfo/)からダウンロードして、インストールしてください。

### 温度上昇時にイベント記録されるよう設定
#### 1. イベント記録設定
メイン画面を開き、下記3つの項目を選択します。

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/f180c3f9-e8bf-3d19-c810-9022d0f217bb.png" width="50%">

#### 2. クーラー起動温度の設定
タスクバーのアイコンを右クリックし、監視対象HDDを選び、
「警報設定 - 温度」から、クーラーを入れる温度を設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20639/9df30a6c-c88b-05bc-c6e1-b430660b58c2.png)


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


<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/523f80c2-e513-46e1-9e17-9e32bc2c386f.png" width="70%">

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


# PowerShellでIRKitを操作
[IRKit](http://getirkit.com/)はHTTPリクエストを送ると、リモコンの赤外線信号を送ることができる製品です。（現在は、後継の「[Nature Remo](https://nature.global/remo-jp/)」という製品があるそうです。）

### エアコンのリモコン信号を取得
通信するために、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にしました。

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

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/180442fd-620b-265f-851e-ad274662a3f3.png" width="50%">

#### 2. イベント記録時に実行されるよう設定
「特定イベントのログへの記録時」を選択し、「次へ」ボタンをクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/9a91fad6-d485-d39d-f68e-0e7ef7235e76.png" width="50%">

#### 3. イベントの種類を選択
下記のように選択して、「次へ」ボタンをクリックします。

 - ログ：Application
 - ソース：CrystalDiskInfo
 - イベントID：606

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/8b80d94e-5f38-df58-5ccf-043a21fdb20a.png" width="50%">

#### 4. 実行する操作の選択
「プログラムの開始」を選択し、「次へ」ボタンをクリックします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/cc059807-f58c-bf09-806f-4eff649e8b39.png" width="50%">

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

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/79cff46b-8ef9-1ded-7bfa-95f79a263ddd.png" width="50%">



 - 参考：[WindowsのタスクスケジューラーでPowerShellのスクリプトを実行する際には「パス」に注意：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/1412/03/news125.html)

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

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/20639/2ad96acb-126c-9963-cf30-ae0c4c203b5b.png" width="80%">

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

 - [WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)

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

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