コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home Assistantでホームオートメーション】環境センサー(Omron)を接続 ー 後編(改訂)

【Home Assistant(Hass.io)】
環境センサー(WxBeacon2/Omron 2JCIE-BL01)編

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 スマートホームの核となるホームオートメーションサーバHome AssistantのサーバをRaspberryPi4にして、さらに観測データ収集用のデータベースInfluxDBのサーバも独立して作り直しました。以前設定した環境センサーのHome Assistant周りだけ今風に設定しなおしましょう。

maky-ba.hatenablog.com
maky-ba.hatenablog.com

以前にRaspberry Pi上に環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータを収集する仕組みを構築しました。

  1. 前編:収集サーバとなるRaspberry Pi Zero Wをセットアップ
  2. 中編:環境センサー(OMRON)からデータを収集
  3. 後編:Home Assistantでのセンサーセットアップ

 前編と中編は、ほぼそのまま使えますので、後編を中心にアップデートします。

この記事の前提条件
Home Assistant 0.114.0
HassOS 4.12
Server Raspberry Pi 4(2GB)

 上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)

1. 前編および中編のアップデート

1.1. 「前編:収集サーバとなるRaspberry Pi Zero Wをセットアップ」のその後

 基本的には以下の前回の記事通り。
maky-ba.hatenablog.com

 以前との違いといえば、3.1での「Raspbian Buster Lite」が「Raspberry Pi OS Lite」と名前が変わったぐらいでしょうか。3.2のWSL(Windows Subsystem for Linux)もWSL2が出てきてボチボチ使う人も増えてきた、という点ぐらいかな。

1.2. 「中編:環境センサー(OMRON)からデータを収集」のその後

 こちらも基本的には以下の通りですが、いくつか不要になっています。 maky-ba.hatenablog.com

 4.1のInfluxDBインストールは独立サーバーを立てましたので不要になりました。4.1の通りにRaspberry Pi Zero Wにインストールしても動きますので、お好きな方で。
 あとは5.1. conf.pyの設定で、独立サーバーを利用する場合には、INFLUXDB_ADDRESSに独立InfluxDBサーバーのIPを設定し、INFLUXDB_USER INFLUXDB_PASSWORDに管理用に設定したユーザ名・パスワードを記述するぐらいでしょうか。

2. 後編:Home Assistantでのセンサーセットアップ

2.1. 観測データをHome Assistantで利用する設定

 Home AssistantでUIを使うには最近ではIntegration機構を使うことが多くなってきました。しかしながらInfluxDB経由で環境センサーの観測データをHAに読み込む等する場合にはやはり「Configuration.yamlの記述」(この章の下のYAML, Basic Information, Setting up devicesあたり)、次に「エンティティのカスタマイズ」(このあたりかな)、そして「UIの設定(GUIでの設定)」という流れが欠かせません。

2.2. Configuration.yamlの記述

 まずは呪文です。この宣言文は、Home AssistantのDBとしてInfluxDBにデータを「書き込む」ためのもので、環境センサーの蓄積されているInfluxDBから「読み込む」場合には本来不要なものです。 しかしながら、どうやらInfluxdbのコンポーネントにはBugがあり、これを書いておかないと正常に作動しません。まあ他のデータを汎用InfluxDBに書き込む予定でもありますので、宣言文を設定しておきます。

(前略)

# influxdb
influxdb:
  host: !secret influxdb_host
  database: home_assistant
  username: !secret influxdb_user
  password: !secret influxdb_password

(後略)

 InfluxdbサーバのIPアドレスをconfigurationファイルから隠蔽したり、APIキーやユーザ・パスワードを隠ぺいしたりする簡単な機構(それほどセキュリティレベルがあがるわけではない…)があります。 configuration.yamlに!Secretと書いて、その実態をsecrets.yamlに記述するのです。例えば、上記の様にinfluxDBのサーバのIPをconfigファイルに直書きしない場合には、下記の様にSecrets.yamlファイルを記述します。

# Use this file to store secrets like usernames and passwords.
# Learn more at 
#       https://home-assistant.io/docs/configuration/secrets/

# influxdb
influxdb_host: 192.168.30.xx     # 汎用InfluxDBのIP
influxdb_user: <汎用InfluxDBで設定した管理ユーザ名>
influxdb_password: <汎用InfluxDBで設定したパスワード>

 次に、InfluxDBに蓄積されたデータをHome Assistantからアクセスできるように設定します。 Home Assistantから見れば「Sensor」扱いなので、Sensor: ブロックの中に追記します。 下記は、屋外に設置したWxBeacon2のデータをlast_value_outside_xxxxxとして読み込む設定です。

(前略)

#################################################
# Sensors
#################################################
sensor:
# Envsensor(OMRON 2JCIE-BL01 / WxBeacon2) data in InfluxDB
  - platform: influxdb
    host: !secret influxdb_host
    queries:
      # Envsensor - Outside
      - name: last value of outside temp
        unit_of_measurement: ℃
        value_template: '{{ value | round(1) }}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: temperature
        database: weather
      - name: last value of outside light
        unit_of_measurement: lux
        value_template: '{{ value | round(1)}}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: light
        database: weather
      - name: last value of outside pressure
        unit_of_measurement: hPa
        value_template: '{{ value | round(1)}}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: pressure
        database: weather
      - name: last value of outside humidity
        unit_of_measurement: '%'
        value_template: '{{ value | round(1)}}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: humidity
        database: weather
      - name: last value of outside noise
        unit_of_measurement: 'db'
        value_template: '{{ value | round(1)}}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: noise
        database: weather
      - name: last value of outside battery
        unit_of_measurement: V
        value_template: '{{ value | round(1)/1000}}'
        where: '"bt_address" = ''DExxxxxxxxxx'' and time > now() - 5m'
        measurement: 'wxbeacon2'
        field: battery
        database: weather

(後略)

 configuration.yamlファイルを編集したら、右の方にあるチェックマークが緑色になることを確認(これはyamlファイルの書式に間違いがないかチェックしている。左のサイドバーから「設定」→「サーバーコントロール」で「設定の検証」ボタンを押したのと同じ(だと思う))して保存する。

 右の方にあるギアアイコンから「Restart HASS」を選択して再起動する。

2.3. エンティティのカスタマイズ

このままだと表示されるのはエンティティの名前が英語名(例:last value of outside battery)のままであったり、アイコンがすべてセンサーアイコン(目のやつ)になったりするので編集が必要です。

 まずはUIでカスタマイズできるように設定します。configuration.yamlファイルの前の方にhomeassistant:の記述を入れます。

# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

homeassistant:
  customize: !include customize.yaml

(後略)

サイドバーから[設定] --> [カスタマイズ] と進み、エンティティのカスタマイズ画面を出します。 f:id:maky_Ba:20200816012929j:plain

 上記の画面での設定内容は下記のとおりです。

  • Entity: 編集したいエンティティをドロップダウンリストから選ぶ
    (ex: last value of outside battery (sensor))
  • Name: UI上の表示名。エンティティ名自体の変更では無く、多分friendly_nameの設定だと思います
    (ex: 電圧(屋内))
  • Pick an attribute to override: 他の属性(アイコンとか)を変更できます。
    (ex: attriburte = icon, value = mdi:battery)

 繰り返し、設定してゆきます。設定結果は/config/customize.yamlに設定されます。UIを使わないで、こちらに直接記述しても大丈夫です。

sensor.last_value_of_inside_pressure:
  friendly_name: 気圧(屋内)
  icon: mdi:altimeter
sensor.last_value_of_outside_pressure:
  friendly_name: 気圧(屋外)
  icon: mdi:altimeter
sensor.last_value_of_inside_temp:
  friendly_name: 気温(屋内)
  icon: mdi:thermometer
sensor.last_value_of_outside_temp:
  friendly_name: 気温(屋外)
  icon: mdi:thermometer
sensor.last_value_of_inside_humidity:
  friendly_name: 湿度(屋内)
  icon: mdi:water-percent
sensor.last_value_of_outside_humidity:
  friendly_name: 湿度(屋外)
  icon: mdi:water-percent
sensor.last_value_of_inside_light:
  friendly_name: 照度(屋内)
  icon: mdi:lightbulb
sensor.last_value_of_outside_light:
  friendly_name: 照度(屋外)
  icon: mdi:lightbulb
sensor.last_value_of_inside_battery:
  friendly_name: 電圧(屋内)
  icon: mdi:battery
sensor.last_value_of_outside_battery:
  friendly_name: 電圧(屋外)
  icon: mdi:battery
sensor.last_value_of_inside_noise:
  friendly_name: 騒音(屋内)
  icon: mdi:volume-high
sensor.last_value_of_outside_noise:
  friendly_name: 騒音(屋外)
  icon: mdi:volume-high

 念のため、左のサイドバーから「設定」を選び、「サーバーコントロール」--> 「設定の検証」の「設定を確認」ボタンを押して設定ファイルの書式のチェックをします。 書式上の問題が無ければ、同じページ「サーバーコントロール」--> 「サーバー管理」の「再起動」をクリックし、Home Assistantを再起動させます。File editorの右のギアマークから「Restart HASS」でも良いですよ。

2.4. UIの設定

 左のメニュー(サイドバー)から[状態]を選び、その中の右端のベルマークの右の縦三つ点から[Configure UI]をクリック。 一番最初にLovelaceUIで設定するときは、「今の消して始める?」とか聞かれるのでYesと。

 まず「Title of your Lovelace UI」で状態画面のタイトルを入力(下の左画面)。 次に 「View configuration」でビューの名前を設定(下の右画面)。
f:id:maky_Ba:20200816015257j:plain:w250 f:id:maky_Ba:20200816015739j:plain:w250

 下が状態画面のタイトルを「maky's Home」にビューを「Home」(こっちは小文字で入れても表示は大文字に)に設定した状態の編集画面。
f:id:maky_Ba:20200816021251j:plain:w400
 この右上にあるオレンジプラスマークから色々なカードが選べます。 f:id:maky_Ba:20200816021637j:plain  ここではカードタイプ「エンティティ」(二つありますね、右上のやつです)を選んで編集します。
 上のconfiguration.yamlで設定したlast_value_of_inside_xxxxxx (configuration.yamlでスペースだったところは、_(アンダースコア)になってます)をエンティティに登録してゆきます。選択するときは、先ほどカスタマイズで設定した「電圧(屋内)」とかの日本語で選べるので楽々です。 f:id:maky_Ba:20200816022221j:plain

 これでHome Assistantに取り込まれたデータを表示できるようになります。 右側のプレビュー画面のように、カスタマイズで設定した表示名、アイコンが反映されています。

 ちなみに編集画面の下の方にある「SHOW CODE EDITOR」をクリックすると、エディタ形式での編集画面になります。icon: やname:といった編集を追加して記述すると、表示名やアイコンをカスタマイズしたものから更に上書き設定できます。

4. 家のセンサー配置図

今ある我が家のWxBeacon2の配置は下記の様になっています。 f:id:maky_Ba:20190914000453j:plain

  • S1: 屋外用のWxBeacon2:防水とは言え雨ざらしはまずいと思うので、電気メータ―の格納箱の空きスペース*1によろい戸(?)なども百均の部材で作って百葉箱的に仕上げました。
  • S2: 屋内用WxBeacon2:ダイニングの壁に設置。
  • S3: 浴室用WxBeacon2:上の図には出ていませんが、1個センサーを増やして浴室の壁にも設置。百均で透明なジェルシールで固定するフック(簡単に剥がせます)を買ってきて、それに引掛けています。
  • R1: 環境センサーサーバ:外のセンサーとの交信が弱いので、電気メータ―に近い洗面所にサーバを置くことに。洗面台の鏡の裏側のコンセントを使ってRaspberry Pi Zero Wサーバを設置。

 屋内外のセンサーを追加するとUIは下のようになります。 f:id:maky_Ba:20200816023604j:plain

5. おわりに

 スマートホームはロボットのようなものだと思っています。

  • 第一ステップでセンサーを使って周囲の「情報を把握」して
  • 第二ステップで情報を基に「判断」する、さいごに
  • 第三ステップで何らかの手段で「外界に働きかける」

というのがロボット的ですね。
 まず第一段階の状況を把握(と言っても気温、とかですが…)ができるようになりました。 次の段階はちょっと段階を飛ばして「外界に働きかける」を準備し、最終的に「情報の把握」と「外界への働きかけ」を繋げる「判断」を導入しましょう。

 すでにセンサー、汎用赤外線リモコンあたりまでは出来てきているので、なんとか第3段階に進みたいところです。第一、第二ステップの進捗状況は下記目次から。

maky-ba.hatenablog.com

*1:もともとは、アナログの買電、売電の2つのメーターが入っていたのですが、スマートメーター化して1台にすっきりしたため、1つスペースが空きました