メモ：Home Assistant + Raspberry Pi + センサー でホームオートメーションしたい #1

# Home Assistantとは

https://home-assistant.io/

Pythonで作られた、オープンソースのホームオートメーションプラットホーム。この分野では、[OpenHAB](http://www.openhab.org/)というものもあるようだ。

「コンポーネント」と呼ばれる機能を自由に組み合わせて、各コンポーネントが対応するデバイスの制御や自動化を行うことができる。また、Webページに状態を表示し、そこから制御することもできる。

[対応するコンポーネント](https://home-assistant.io/components/)には、電動シャッターなど国内では入手できなさそうなIoT機器もあるが、

- IFTTT
- Twitter
- PushBullet
- Philips Hue
- Raspberry PiのGPIO入出力
- [Firmata](https://github.com/firmata)(汎用入出力制御プロトコル)ファームウェアを搭載したArduino
- MQTTを介した入出力
- HTTPを介した入出力
- iTunesやGoogle Cast、MPDといったネットワークメディアプレイヤーのデバイス発見と、再生・停止等
- Slack

などをサポートしている、とある。
またコマンドライン標準出力からのデータ取得(Command line sensor等)や、コマンドラインからの制御(Command line switch等)、もしくはPythonを使ったカスタムコンポーネントの作成をサポートしているそうなので、この手のものに慣れた人達なら困らないだろう。

# インストール

https://home-assistant.io/getting-started/

Raspberry PiはRaspbian Jessieであることが条件。PyPIからのインストールで完了する。
https://home-assistant.io/getting-started/installation-raspberry-pi/

初回起動時に、コンポーネントが要求するPythonのモジュールを自動的に取得したり、IPアドレスから現在地を取得(Sun(日の出/日の入り)コンポーネントなどで使用される)したりする。

自動起動させたい場合は、[Launch Home Assistant on Boot](https://home-assistant.io/getting-started/autostart/)を参考にする。Raspbian Jessieの場合はSystemdの方法で設定する。

デモモードで起動したい場合は、

```
$ hass --demo-mode
```

で起動する。
起動後、http://(IPアドレス):8123にアクセスすると、制御用Webページにアクセスできる。また、起動時に`--open-gui`オプションを付けると、起動後に自動的にブラウザを開いてくれる。
Androidのマテリアルデザインのような感じで、実際スマホのブラウザ画面からも操作できる。

![homeassistant_demo_mode.png](https://qiita-image-store.s3.amazonaws.com/0/82738/df28a7d6-18e0-a657-1cdb-ecf5321aa755.png)

デモ画面、ちょっと盛り過ぎのような気もするんですけど。

# 設定

https://home-assistant.io/getting-started/configuration/

起動したユーザーのホームディレクトリに`.homeassistant`ディレクトリが作成され、中に`configuration.yaml`ファイルが作成される。
設定はYAMLで記述する。初回起動時にIPアドレスから取得された現在地情報からタイムゾーンなどが設定済みだが、変更もできる。
詳細については上記Configurationのページ、および各コンポーネントの詳細ページを確認のこと。

設定を変更したら、http://(IPアドレス):8123にアクセスしサイドパネルの"Configuration"をクリック。[Configuration.yaml]-[CHECK CONFIG]ボタンを押し、設定記述の確認処理を行う。
問題が出なければ、[RELOAD CORE]をクリックすることで設定が反映される。

## 初期設定項目

```
homeassistant:
  # Name of the location where Home Assistant is running
  name: Home
  # C for Celcius, F for Fahrenheit
  temperature_unit: C
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: Asia/Tokyo
  # 緯度
  latitude: [省略]
  # 経度
  longitude: [省略]

# ログインパスワード
http:
  api_password: [省略]

# Track the sun
sun:
```

## デバイスの登録

手持ちのBME280 (温湿度気圧センサ)と、CPU温度を[Command line sensor](https://home-assistant.io/components/sensor.command_line/)として登録する。
また、CPUクロックを[CPU speed sensor](https://home-assistant.io/components/sensor.cpuspeed/)で取得する。
BME280からの取得については、[スイッチサイエンスが公開しているPythonスクリプト](https://github.com/SWITCHSCIENCE/BME280)を若干修正し、Force modeで動作させ、コマンドラインオプションで指定された温度、湿度、気圧の数値のみを表示するように修正して使用した。

```
sensor:
  - platform: command_line
    name: "BME280 temperature"
    command: "/home/pi/sbin/bme280_sample.py -T"
    unit_of_measurement: "°C"
  - platform: command_line
    name: "BME280 pressure"
    command: "/home/pi/sbin/bme280_sample.py -P"
    unit_of_measurement: "hPa"
  - platform: command_line
    name: "BME280 humidity"
    command: "/home/pi/sbin/bme280_sample.py -H"
    unit_of_measurement: "% RH"
  - platform: cpuspeed
    name: 'CPU speed'
  - platform: command_line
    name: "CPU Temperature"
    command: "cat /sys/class/thermal/thermal_zone0/temp"
    unit_of_measurement: "°C"
    value_template: "{{ value | multiply(0.001) }}"
```

## グループの設定

単独でコンポーネントを登録した場合は、制御用Webページ上部に丸いアイコン状の「バッジ」形式で表示される。
関連するコンポーネントをまとめてグループ設定をすることにより、制御用Webページに「カード」形式で表示できるほか、スイッチ等はまとめて制御することができるようになる…らしい。
タブグループ化させる設定もある。(view: yes)
グループにするコンポーネントは、各コンポーネントのサービス名 (entity_id)をリストで記述していく。

```
group:
  Weather:
    - sun.sun

  In the room:
    - sensor.bme280_temperature
    - sensor.bme280_pressure
    - sensor.bme280_humidity

  Raspberry Pi 2:
    - sensor.cpu_speed
    - sensor.cpu_temperature
```

で、表示はこんな感じに。

![homeassistant.png](https://qiita-image-store.s3.amazonaws.com/0/82738/775a0886-bae2-c580-0d0a-6ee250eee239.png)

設定したコンポーネントをクリックすると、グラフなどの詳細が表示される。

![homeassistant_humidity.png](https://qiita-image-store.s3.amazonaws.com/0/82738/0ccc02ef-e184-24cf-c226-b39d8caeb328.png)

# 今後の目標

- その他のコンポーネントのお試し
- 取得したデータを用いたオートメーションの設定
- IFTTTを経由した各種Webサービスとの連携
- カスタムコンポーネントの作成
- 遠隔センサからのデータ取得