Homeassistant on Gentooのコンフィグ

だいぶ時間が経ちましたが、Homebridgeのコンフィグを紹介します。
私のHomebridgeはGentoo Linux上で動いているためhass.ioではありません。
(hass.ioのほうが、アドオンのインストールが簡単なのですが、Linux用がなさそうで・・・)

インストール時にhomebridgeというユーザーを作成し、chroot環境でpythonが動くようにしましたが、configはrootで読み書き可能ですので、suやchrootは不要です。

コンフィグのありかは、
/home/ユーザ名/.homeassistant/にある、"configuration.yaml"です。
うちの場合は、/home/homeassistant/.homeassistant/configuration.yamlです。
初めて見ました、yaml

では、うちの場合のconfiguration.yamlを紹介します。

homeassistant:
  # Name of the location where Home Assistant is running
  name: Sample_home
  # Location required to calculate the time the sun rises and sets
  latitude: 42.0000
  longitude: 141.0000
  # Impacts weather/sunrise data (altitude above sea level in meters)
  elevation: 20
  # metric for Metric, imperial for Imperial
  unit_system: metric
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: Asia/Tokyo
  # Customization file
  customize: !include customize.yaml

まず、"homeassistant:"のセクションです。(各セクションは"section:"で始まります。)
最初にname:でhomeassistantに名称をつけましょう。
latitude:は緯度、longitude:経度、elevation:は高さですので、自宅の位置を調べて世界測地系で入力します。
unit_system:は単位です。メートルなのでmetricを。
time_zoneはその通りタイムゾーンですので、日本ならAsia/Tokyoを。
customize:で、このファイル以外に設定ファイルを読み込みます。ここではデフォルトのまま!include customize.yamlにしていますが、そもそもcustomize.yamlは空のフィアルです。

# Show links to resources in log and frontend
introduction:

# Enables the frontend
frontend:

# Enables configuration UI
config:

この3セクションはなにもいじっていません。

http:
  # Secrets are defined in the file secrets.yaml
  # api_password: !secret http_password
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  # base_url: example.duckdns.org:8123
  api_password: angou
  ssl_certificate: /etc/ssl/csr/rapidssl.crt
  ssl_key: /home/homeassistant/.homeassistant/private.key

http:では、homeassistantのwebページについて定義します。
とはいえ、base_urlを定義していません。
api_password:に、webアクセスの際のパスワードを設定します。生値なのがちょっと気になります。
ssl_certificate:にSSLの中間証明書を、ssl_key:にSSLのサーバー用秘密鍵を指定します。
が、通常、秘密鍵はrootしか読めないようにしなければなりません。しかし、このプロセスはrootではなくhomeassistantユーザーで起動します。なので、秘密鍵をhomeassistantで読めるようにします。
ちょっとセキュリティが下がるような気がします。
/etcにある秘密鍵をユーザーhomeassistantが読めるようにchmodするか、コピーしてchownするかのどちらかです。

これで、https://192.168.0.x:8123で、ブラウザ上にhomeassistantが表示されるようになります。
ルーターでIPポートフォワードを設定していれば、https://yourhostname:8123でインターネット上からもアクセスが可能になります。

# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
updater:
  # Optional, allows Home Assistant developers to focus on popular components.
  # include_used_components: true

# Discover some devices automatically
discovery:

# Allows you to issue voice commands from the frontend in enabled browsers
conversation:

# Enables support for tracking state changes over time
#history:

# View all events in a logbook
#logbook:

# Enables a map showing the location of tracked devices
map:

# Track the sun
sun:

# Weather prediction
sensor:
  - platform: yr

このあたりもデフォルトのままです。
updater:はhomeassistantにアップデートがあれば、画面上で知らせてくれます。
discovery:はhomeassistantが見つけることが可能なデバイスを見つけます。私の家ではDLNAオーディオデバイスを見つけてくれています。
conversation:は使っていませんが、対応ブラウザからのボイスコマンドを受け付けるかどうからしいのですが、不明です。
map:はその名の通り地図のサポートです。このため、最初の緯度経度の設定が必要なんです。と、言ってもほぼ使いませんが・・・。
sun:は今の地域が日中かどうかを表示してくれます。日の出日の入りもわかります。
sensor: - platform: yr は天気予報を表示してくれます。ノルウェー気象局の情報なので、アテになるかどうか・・・。

ここからは、実際のデバイスの定義をしていきます。
まずはセンサー系

#sensor:
  - platform: rest
    resource: http://192.168.0.xxx/json?tasknr=1
    name: Outside Temp
    value_template: '{{value_json.temperature}}'
    unit_of_measurement: "C"

  - platform: rest
    resource: http://192.168.0.xxx/json?tasknr=1
    name: Outside Hum
    value_template: '{{value_json.humidity}}'
    unit_of_measurement: "%"

これは、sonoffを改造して作った温度湿度センサーの情報を取得します。
gentoolinux.hatenablog.com
このとき作ったセンサーですね。
EspEasy化されたsonoffはhttpサーバーでjson形式の情報を提供しているので、httpの情報を読み取るAPIプラットフォームであるRESTを使うので、- platform: restを指定します。
resource:はjsonを提供するURLを指定。
name:はそのままセンサーの名称を。
value_template:はjson形式であることを指定し、jsonの左辺を指定します。シングルコーテーションや{{}}が特殊ですが、気にせずそのまま指定しましょう。他の形式はよくわかりません。
unit_of_measurement:は、数字の後に付く単位を指定しましょう。
これで、homeassistantの上部にセンサーの情報が表示されるようになります。
f:id:naoyukinagano:20180616212904p:plain

では、重要な電灯スイッチ系です。
以前Raspberry Pi ZeroにWebioPiをインストールしていました。
gentoolinux.hatenablog.com
gentoolinux.hatenablog.com
ですので、linuxのコマンドを駆使してスイッチのON/OFFや状態把握をします。

switch:
  - platform: command_line
    switches:
      snowball:
       command_on: "/usr/bin/curl -X POST http://192.168.0.xxx:8000/GPIO/26/value/0"
       command_off: "/usr/bin/curl -X POST http://192.168.0.xxx:8000/GPIO/26/value/1"
       command_state: "/usr/bin/curl -X GET http://192.168.0.xxx:8000/GPIO/26/value"
       value_template: '{{ value == "0" }}'
       friendly_name: Living SnowBall

まずスイッチ系はswitch:というセクションでまとめます。

  • platform: command_lineで、linuxのコマンドを使うことを指定します。

snowball:は自分で決めたひとつのスイッチのセクションです。他の名前でもかまいません。私は類スポールセンのスノーボールという照明をコントロールしたくて、このようなセクション名にしています。
command_on:は、スイッチをONにするコマンドです。
WebioPiに対してhttpのGetメソッドを使って、GPIOの状態を変更しますので、コマンドとしてはcurlを使います。(wgetの方が使い慣れているならwgetでもOK)
curlのオプション-Xはメソッドの指定です。WebioPiはPOSTでGPIOの状態を変更するので、-XでPOSTを指定します。
その後、URLを指定しますが、GPIO26番を0(Low)にする。という意味です。
同様に、command_off:のコマンドをcurlを使って記述します。
command_state:は、現在のON/OFF状態を取得するコマンドを記述します。WebioPiはGETで状態を取得するので、GPIO26番の状態をGETメソッドで取得します。
WebioPiはjsonではなく、単純にhttpで0か1だけでGPIOのLow/Hiの状態を返します。
うちのリレーはGPIOがLOW(valueが0)でONなので、value_template: '{{ value == "0" }}'を指定します。
もしHiでリレーオンなら、1を指定しましょう。
friendly_name: は表示する名称です。スイッチの場所と名称を記載するとわかりやすいでしょう。

次に、sonoffで作ったスイッチを設定します。うちでは寝室の電灯スイッチがこれです。
gentoolinux.hatenablog.com
gentoolinux.hatenablog.com

      bedroom:
       command_on: "/usr/bin/curl -X GET http://192.168.0.xxx/control?cmd=event,PowerOn"
       command_off: "/usr/bin/curl -X GET http://192.168.0.xxx/control?cmd=event,PowerOff"
       command_state: "/usr/bin/curl -X GET http://192.168.0.xxx/control?cmd=status,gpio,12"
       value_template: '{{ value_json.state == 1 }}'
       friendly_name: Bedroom Light

これは- platform: command_lineのswitchs:セクションの続きです。
EspEasy化されたsonoffもhttpでリレーを制御しますので、そのままcommand_lineプラットフォームを使います。
寝室にあるのでbedroom:セクションですがここは他とかぶらないければ何でもOKです。
command_on:はWebioPiと同様にcurlで指定しますが、EspEasyのrulesで指定している、PowerOnイベントを指定します。
command_off:も同様。
command_state: の中のvalue_template:はONの状態のjsonを定義するので、value_template: '{{ value_json.state == 1 }}'とします。
JSONで左辺がstateとなっているものを読み、1の場合がONということです。

続いて、command_lineではないプラットフォームの例です。
broadlink製のWiFi赤外線リモコンがありますので、その指定です。
同様にスイッチなので、switch:の続きとして指定していきます。

  - platform: broadlink
    host: 192.168.0.xxx
    mac: '34:AA:34:AA:00:AA'
    timeout: 10
    switches:
      roomba:
        friendly_name: "Roomba"
        command_on: 'JgBaAGIgIWEfYR9hXyEgYSBhHwACqWEhIGEgYR9hXyEgYSBhHwACqGIhIGEfYh9hXyEgYR9hIAACqGEiIGEfYSBhXyEgYR9hIAACsGIgIF8iXyFfYSEgYSBgIAANBQAAAAAAAAAAAAAAAAAA'
        command_off: 'JgBaAGIgIWAgYSBgIGFgICFgYAACcGIgIWAgYSBgIGFgICFgYAACaGIgIWAgYSBgIGFfICFhXwACaWIgIWAgYR9hIGFfICFhXwACaWIgIGEgYR9hIGBgICFgYAANBQAAAAAAAAAAAAAAAAAA'

switch:セクションの続きに- platform: broadlinkを指定します。
host:でIPアドレスを指定します。
mac:でシングルコーテーションでMACアドレスを指定します。
timeout:でコマンドを受け付けられなくてあきらめるタイムアウト秒数を指定します。
switches:でスイッチ群の指定が始まることを定義します。
friendly_name:で表示される名称を指定します。
command_on:でONの赤外線データをシングルコーテーションで指定します。中はbase64エンコードで記述します。

これで、各スイッチが表示されるようになります。
f:id:naoyukinagano:20180616222334p:plain