コモノポリタン

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

【Home Assistant(Hass.io)でホームオートメーション】クリスマスツリー点灯!!

tp-link HS-105 でクリスマスツリー On!!

次は「汎用赤外線リモコン!」と宣言しておきながら、うさぎなどに寄り道した挙句、早二ヶ月も放置….
ちなみにリモコンは既に設定は終わっており、家ではダイニングやベッドルームで大活躍中です。
「ねぇぐーぐる、ベッドルームの電気を消して」
寒い冬はベッドから出ないで電気を消せるって最高!

などと、うだうだ言っているうちにクリスマスシーズン到来です。先にスマートコンセント(スマートプラグ)を使ってクリスマスツリーをスマート化しましょう!

1. まえがき

昨年末にAmazonでクーポン適用で2個3,990円だったので、tp-link HS-105 ニ個セットを使い道も考えずに買ってしまいました*1

f:id:maky_Ba:20191211012639j:plain:w200

スマートコンセントとは、コンセントのオンオフで機器をオンオフしようとするものです。つまり、機器側にスイッチが無い(コンセントに指したら即スタート!)か、機械的なスイッチがある物しか使えないのです。
例えば扇風機でも、昔みたいに(?)機械的にツマミをガチャガチャするものなら良いのですが、ボタンで「ピッ」なんてするものはアウト!なのです。 意外と適した機器が見つかりません。

家を色々と探したところ、我が家のクリスマスツリーのランプはLEDでも無いクラシックなやつなので、コンセントに挿せば光ります。と言う事で、クリスマスツリーをスマート化しちゃいました。

2. 準備

品名 型番 説明等
スマートコンセント HS-105 (tp-link 社) tp-link社は「スマートプラグ」と呼んでいます
タブレット/携帯 Android or iOS スマートコンセントの設定アプリKasaをインストールために、Home Assistantと同じネットワークにつながる端末を準備
Home Assistantサーバー ver. 0.102.1 なかなか1.0になりません。0.99から0.100になったときは「そーきたか」と思いました。

3. スマートコンセント初期設定

基本的に、tp-linkの言う通り設定すれば良いと思います。私は余計なクラウド登録を避ける人なので、Kasaアカウントは作らずにセットアップしました。Kasaアカウントを作ると、

  • 家の外からでもオンオフ出来る
  • 複数の端末からオンオフ出来る

と言うメリットありますが、そこらへんはHomeAssistantにお任せなので必要ありません。

3.1. アプリ(Kasa)のインストール

Google PlayApp Storeからtp-link社のアプリKasaをインストールしてください。

3.2. アプリの初期登録

Kasaを立ち上げると「Kasaへお帰りなさい」と言う微妙な日本語でお迎えされます。この画面の選択肢は下記の2つのみ。正解は、さてどっち?

  • アカウントの作成
  • ログイン

正解は「アカウントの作成」です。その作成画面の右上に「スキップ」がありますので、アカウントの作成&ログインをスキップします。「本当によろしいですか」なんて聞かれますが、気にせず「アカウントなしで続ける」を押しましょう。

f:id:maky_Ba:20191210233846p:plain:w180:left f:id:maky_Ba:20191210234051p:plain:w180 f:id:maky_Ba:20191210234121p:plain:w180

3.3. スマートコンセント(HS-105)登録

あとは言われるがままに。

  • 「端末を追加」→「スマートプラグを追加」
  • →「スマートプラグ「ライト」/「ミニ」」選択
  • →「遠隔操作開始同意文」同意します
  • →「スマートプラグの電源を入れてください」HS-105をコンセントに挿して「次へ」
  • →「Wi-Fiランプを確認してください。」オレンジ色と青色が交互に光っていないければ電源ボタンを5秒長押しして交互に光るようにする
  • →「位置情報を有効にする」仕方が無いので有効にするが「アプリの使用中のみ許可する」に。
  • →「ネットワークを選択する」Home Assistantから見えるネットワークを選択しパスワードを入力
  • →「スマートプラグをホームネットワークに接続中](結構長い間ぐるぐるしていて心配になるが、見守る)
  • →「端末に名前を付ける」この名前がHome Assistantのエンティティ名になるので、半角英文字で入力。今回は"ChristmasTree"とする
  • →「アイコンをカスタマイズ」全く意味はないのだが、クリスマスツリーがあるのでそれを選ぶ。

f:id:maky_Ba:20191211000901p:plain:h400 ・・・・・・ f:id:maky_Ba:20191211001330p:plain:h400
(最後だけ違う端末のスクリーンショットなのはご愛敬ということで)

これでこの端末のKasaアプリからコンセントをOn/Offできるようになりました。コンセントにクリスマスツリーを繋いでオンオフしてみましょう!はいっオン!

f:id:maky_Ba:20191211002709j:plain:h300
写真に撮ると結構貧相なツリーだな…

4. HAでHS-105を使えるようにする

いままでのデバイスは、configuration.yamlに記述する必要ありましたが、HS-105とHome Assistantサーバを同じネットワークにしておくと、自動的に組み込んでくれます。

f:id:maky_Ba:20191211004046j:plain:w600
「Integrations インテグレーションの管理とセットアップ」からでも「Devices Manage connected devices」からでもどちらからでもつながっているデバイスの管理ができます。

f:id:maky_Ba:20191211004439j:plain:w600
TP-Link Smart Home製品群は自動で設定を読み込みます。スマートプラグに関しては、デバイス名を読み込んで、エンティティ名にします。

f:id:maky_Ba:20191211004740j:plain:w600
ここで表示名を変えたり、ここからオートメーションを作ったりできます。「真夜中になったら消す」とかできますね。
またエンティティが登録済みなので、「状態」でLovelace UIを使ってスイッチを登録したりできます。

5. おわりに

Home Assistantももうすぐ1.0にならんとしています(0.99の次が0.100だったときは驚きましたが)。 デバイスの登録も結構自動化が進んでますし、オートメーションとかもGUIでの設定がドンドンできるようになってきています。素晴らしい(けど、相変わらず言葉足らず・説明不足なところが、HAっぽいところ)。

次は、本当に汎用赤外線リモコンか!乞うご期待。

Home Assistant(Hass.io)でホームオートメーション

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編
  4. スマートコンセントでクリスマスツリー点灯!《今回》
  5. 汎用赤外線リモコンを接続《次回》
  6. スマートプラグを接続
  7. UIを改善

*1:今見たら、今年もまだクーポンキャンペーンやってますね。2個で3,500円!、4個で6,000円!!お買い得!!いや、そんなにいらないか…

【Nabaztag】うさぎ復活計画(その2)

前回うさぎを一応生き返らせることが出来ました。

maky-ba.hatenablog.com

しかしながら、確かに課題も幾つかあって、

  • なんだか自由度が低い(時報太極拳だけでは…まあopenJabNabの機能を理解しきれてないだけだとも思いますが…)
  • 日本語をほとんど喋らない(独り言はなぜか日本語で話すのですが…)
  • セキュアなWiFi接続が成功しない(ちょっと古いうさぎなのです…)

なんて所は少しづつ手を入れていきたいところです。

3番目は、モバイルルーター「ちびファイ」で機能しそうなのですが稼働しっぱにする目的のルータではないので、古めの普通のWifiルータを入手して常設できるようにしようかと思います。ということで後回し。

2番目は結構重症で、既に当時の日本語音声は失われているらしいとのこと。ウサギ好きでNabaztag好きのHarukaさんが調査済みの様子。ううむ、大変そう。
rabb-it-days.tokyo

ということで、今回、その2では、1番目の「自由度が低い」というのをちょっとだけ改善してみたいと思います。やり方としては、firmwareを入れ替えてスマートホームHome Assistantから操作できるようにする、ということを考えています。

1. うさぎちゃんをサーバレス化する

前回の記事の「2.2. うさぎのfirmwareを入れて替えて何とかする方式」で紹介した下記のサイトに従って、Nabaztagをサーバいらずにプチ改造します。

github.com

1.1. (失敗編)firmware書き換え用サーバの準備

(失敗編ですので「1.2. (とりあえず編)firmware/mp3用Webサーバの準備」へ)

1度しか使いませんがWebサーバが必要となります。スマートホームサーバHome Assistant (Hass.io)が導入済みの私としては、Nabaztag/tag, the smart rabbit is back! (•ㅅ•)の言う通りにHass.ioをWebサーバにしたいところですが、sshでセキュア化済みですので断念。
( Home Assistant (Hass.io)サーバのConfigフォルダの下にwwwというフォルダを作っても、https://<your hass.io ip>/local/xxxx.htmlでしかアクセスできない。うさちゃんはhttps://で接続できないのです…)

Nabaztagと同じネットワーク(つまりはHome Assistant (Hass.io) と同じネットワーク)にあるWindows PCを使ってWebサーバを準備しましょう。以前、環境サーバを設定した時に導入したWSL (Windows Subsystem for Linux)を今回も使います。

多分pythonは3系列が入っていると思うのですが、念のためpython3のバージョン確認。

$ python3 --version
Python 3.5.2

次に、gitでandreax79さんのファイルを取得し、wwwというディレクトリを作って、そこにandreax79さんのweb/vlディレクトリを置きます。

$ git clone https://github.com/andreax79/ServerlessNabaztag nabaztag
$ mkdir www
$ cp -r nabaztag/web/vl www/

python3の標準モジュールにWebサーバ(httpサーバ)があるのでそれを起動します。

$ cd www
$ python3 -m http.server 8080

これでwwwディレクトリをトップとする簡易webサーバが立ち上がりました。http://<Windows PC's IP>:8080/でアクセスできるようになりました。
その1の「3.1.うさぎをWifiに接続する」1.~3.までに従ってNabaztagの設定画面に入ります。
Advanced configurationに移って、一番下のGeneral InfoにあるViolet Platformに「<Windows PC's IP>:8080/vl」と入力して"update and start"します。

おお!
http://<Nabaztag IP>/で操作画面が出て、耳を動かしたり、太極拳をさせてたり、おなかランプを光らせたりできる!

むむ?
Windows上のPython Webサーバーにアクセスが続いているぞ…もしかして「ServerlessNabaztag is a firmware allowing control of the Nabaztag/tag directly via the web, without an external server (a web server is needed only for downloading the firmware and the mp3s).」とは、「Webサーバが全くいらない」ではなくて「操作画面としては、Nabaztagオリジナルの様な外部のWebサーバはいらず直接うさぎに接続でき」&「firmwareとmp3をダウンロードして利用・再生するためにはWebサーバが(常時)必要」という事か!!
そうするとHome Assistant (Hass.io)にプレーンなWebサーバが無いのが残念だ。ううむ。

1.2. (とりあえず編)firmware/mp3用Webサーバの準備

仕方が無いので、余っているRaspberry Pi ZeroWH(余っているというよりはテスト用なのですが…)にWebサーバを構築しましょう。
下記で構築したRaspberry Pi Zero Wと同じものを4GB microSDカードを使って構築します。 maky-ba.hatenablog.com 下記の順ですすめます。

  1. 3.1. ディスプレイ/キーボード/有線LAN無しでRaspberry Pi Zero Wを使う準備
  2. 3.3. Raspberry Pi Zero W起動後の初期設定
  3. 3.4. ソフトの最新化・インストール
    ( 3) pipのインストールはいらないかな)

python3のWebサーバーを使うのも芸がないので、軽量*1webサーバーであるnginx(エンジンエックスって呼ぶらしい)を導入してみます。

$ sudo apt-get install -y nginx

既に自動起動サービスまで登録されてしまっています。確認は下記コマンドで。

$ systemctl status nginx         # 起動状態の確認
$ systemctl is-enabled nginx     # 自動起動登録の確認

http://<your RasPi IP>/にアクセスすると「Welcome to nginx!」という確認画面が表示されます。

コンテンツの置き場(http root)は、/etc/nginx/以下にあるconfファイルを確認するのが正しいのですが、下記コマンドで確認しておきましょう。

$ grep "root" -r /etc/nginx/ | grep "html"
/etc/nginx/sites-available/default:     root /var/www/html;

ということで、コンテンツは、/var/www/html以下ですので、そこにandreax79さんのweb/vlディレクトリを置きます。

$ cd
$ git clone https://github.com/andreax79/ServerlessNabaztag slnabaztag
$ sudo cp -r slnabaztag/web/vl  /var/www/html/

おお! (再度…) http://<Nabaztag IP>/で操作画面が出て、耳を動かしたり、太極拳をさせてたり、おなかランプを光らせたりできる!
f:id:maky_Ba:20190923145223p:plain

しかし、あまり喋りませんね。nginxのログ関係を確認します。

$ nano /var/log/nginx/access.log
$ nano /var/log/nginx/error.log

ううむ、/vl/config/clockall/ukのXX.mp3が無い(http code 404)って言っているなぁ。/vl/config/reco/uk/ComprendX.mp3も無いっていってる。後で探しておかないかと。
それからつぶやき(surprise)は英語だな。openJabNabの日本語ファイルを拾ってこれないかな…

2. サーバレスうさぎをHome Assistantからアクセスできるようにする

と言いながら、まだ完全には出来ていません…
community.home-assistant.io

基本的には、このサイトが定義してくれたPackageを使うのですが、UIやらConfigやらが大分変わって来ているので、エラー出たり、機能しなかったり。 f:id:maky_Ba:20190928110121j:plain あれやこれや手を入れて、とりあえず、上記のHome Assistantの画面から、うちのうさぎちゃんを操作できるようになりましたが、依然格闘継続中です。
ということで、一旦ここでこの記事をリリースします。一揃い落ち着いたら、Home Assistantでの設定は別の記事で上げたいと思います。

まあ、中の人は、ServerlessNabaztagなので「日本語は話さない」うさぎですが。
(時々突然、耳を動かしたり、英語でつぶやいたりするので、隣の机で大学のレポートを書く息子には不評(?)の様です)

つづく(とイイな) *2

*1:大量アクセスに対して「軽量」のような気がするので、今回の様な用途にはどうですか。ま、やったことないものに手を出す、という基本姿勢で。

*2:この記事を必要としている人が日本にどのぐらいいるのか?というのが気になる点。Nabaztag x Home Assistant ですから小数同士の掛け算…。いや、まあ、備忘録として書きましょう

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

環境センサー(WxBeacon2/Omron 2JCIE-BL01)編

(注:一度公開しましたが、UIの設定、特にカスタイマイズ(Customize)の扱いなどが古いやり方だったので、新版に差し替えました)

 前回Raspberry Pi上に環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータを収集する仕組みを構築しました。 influxDBに蓄積されたデータをHome Assistantからアクセス・表示できるようにしましょう。

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

1. 前提

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

  • ホームオートメーションサーバ(ソフト): Home Assistant 0.99.3
    (環境センサーの設定を詰めている間に0.95.xから0.99.xまでバージョンが進みました。画面デザインは少し変わりましたが同じように使えます)
  • ホームオートメーションサーバ(ハード): Raspberry Pi 3 Model B+

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

以前設定した時とは少し異なりますが、Home AssistantでUIを使うには、「Configuration.yamlの記述」(この章の下のYAML, Basic Information, Setting up devicesあたり)、次に「エンティティのカスタマイズ」(このあたりかな)、そして「UIの設定(GUIでの設定)」が必要です。

2.1.Configuration.yamlの記述

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

(前略)

# influxdb
influxdb:
  host: !secret influxdb_host

(後略)

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.xx.xx

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

(前略)

# Sensor
sensor:
  # Server (Raspberry Pi 3+) info  (以前設定したもの(CPU温度))
  - platform: command_line

(中略)

  # 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ファイルを編集したら、左のサイドバーから[設定]を選び、[Server Control] --> [Configuration Validation]の[CHECK CONFIG]ボタンを押して設定ファイルの書式のチェックをします。

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

このままだと表示されるのはエンティティの名前が英語名(例:last value of outside battery)のままであったり、アイコンがすべてセンサーアイコン(目のやつ)になったりするので編集が必要です。 サイドバーから[設定] --> [カスタマイズ] と進み、エンティティのカスタマイズ画面を出します。 f:id:maky_Ba:20190927220800j: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に設定されます。

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

念のため、左のサイドバーから[設定]を選び、[Server Control] --> [Configuration Validation]の[CHECK CONFIG]ボタンを押して設定ファイルの書式のチェックをします。 書式上の問題が無ければ、同じページ[Server Control] --> [Server Management]の[RESTART]リンクをクリックし、Home Assistantを再起動させます。

2.3. UIの設定

左のメニュー(サイドバー)から[状態]を選び、その中の右端のベルマークの右の縦三つ点から[Configure UI]をクリック。 編集画面の右下のオレンジプラスマークからCard ConfigureでカードタイプEntitiesを選んで編集します。
上のconfiguration.yamlで設定したlast_value_of_outside_xxxxxx (configuration.yamlでスペースだったところは、_(アンダースコア)になってます)をエンティティに登録してゆきます。 f:id:maky_Ba:20190927223307j:plain これでHome Assistantに取り込まれたデータを表示できるようになります。 右側のプレビュー画面のように、カスタマイズで設定した表示名、アイコンが反映されています。

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

4. 家のセンサー配置図

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

  • S1: 屋外用のWxBeacon2:防水とは言え雨ざらしはまずいと思うので、電気メータ―の格納箱の空きスペース*2によろい戸(?)なども百均の部材で作って百葉箱的に仕上げました。
  • S2: 屋内用WxBeacon2:ダイニングの壁に設置。
  • R1: 環境センサーサーバ:外のセンサーとの交信が弱いので、電気メータ―に近い洗面所にサーバを置くことに。洗面台の鏡の裏側のコンセントを使ってRaspberry Pi Zero Wサーバを設置。

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

5. おわりに

スマートホームはロボットのようなものだと思っています。 センサーを使って周囲の「情報を把握」し、情報を基に「判断」し、何らかの手段で「外界に働きかける」というのがロボット的ですね。 まず第一段階の状況を把握(と言っても気温、とかですが…)ができるようになりました。 次の段階は「外界に働きかける」を準備し、最終的に「情報の把握」と「外界への働きかけ」を繋げる「判断」を導入しましょう。 外界の働きかけの一例として、汎用赤外線リモコンでシーリングライトをオンオフしてみましょう。

Home Assistant(Hass.io)でホームオートメーション

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編《今回》
  4. 汎用赤外線リモコンを接続《次回》
  5. スマートプラグを接続
  6. UIを改善

*1:configuration.yamlのファイルは肥大化する一方です。そろそろ別ファイルに分割することを考えないといけませんね

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

【Home Assistant(Hass.io)でホームオートメーション】2. 環境センサー(Omron)を接続 ー 中編

環境センサー(WxBeacon2/Omron 2JCIE-BL01)編

1. まえがき

 前回で環境センサーからデータを取得するサーバ用のRaspberry Piの準備ができました。 maky-ba.hatenablog.com

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

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

2. 環境センサーについて

2.1. 「WxBeacon2」? それとも「2JCIE-BL01」?

ウェザーニューズ(weathernews)社が販売*1している簡易気象観測器 WxBeacon2(ウェザービーコン2)は、「温度」「湿度」「気圧」「明るさ」「騒音」「UV」の6要素*2を測定可能な優れモノです。4.6cm x 3.9 cm と非常にコンパクトな一体型環境センサーで、コイン電池で長期間稼働します。
中身はオムロン(Omron)製の2JCIE-BL01から3軸加速度センサーを除いたもの、と思っていましたが、オムロンサイトを再度確認すると、「6種類のセンサー」と記載されているので同じものなのかな??以前は違っていた気が…。でもまあ2JCIE-BL01の値段は12,000~13,000円ぐらい。一方、ウェザーニューズ社が販売しているWxBeacon2は4,798円(税・送料込み)。

https://weathernews.jp/sorashop/item_photo/430/210/1.png https://www.omron.co.jp/documents/35742/363283/evs-lineup02.png

ウェザーニーズの為だけに加速度センサーを外したりしないと思うし、万が一加速度センサーが無くても室内設置用途なので、まあいらない*3ので、価格面を考慮して今回はWxBeacon2を使います。

2.1. ORMONの資料の在り処

GitHubに上がっているOMRONの資料・ソースを利用する。
資料: omronmicrodevices.github.io ソースコードgithub.com 基本的にOMRONの資料に沿ってすすめる。

追記:日本語版のユーザーズマニュアル
形2JCIE-BL01 環境センサ ユーザーズマニュアル

2.2. 参考サイト

いろいろと先人が苦労している様子です。omron(の正式かどうかは不明ですが)のコードもpython-blueを使うようになって楽になりましたが、以前は皆様が色々なBlueZ対応ライブラリにトライされておられました。 今は、下記サイトあたりを見れば大体の感触はつかめるかと。ありがたい、です。
- RaspberryPi 3B+とWxBeacon2(OMRON 2JCIE-BL01)で環境測定 CSV出力まで | 電子計算機の操縦桿
- WxBeacon2 を使った室内環境監視 - tasuwo's notes
- OMRONの環境センサ2JCIE-BL01をRaspberry Piから使えるように設定する - シュウジマブログ
- WxBeacon2のBLEビーコンをラズベリーパイでキャッチして屋外環境をモニタリング | IoT PLUS

3.環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータ取得準備

3.1. Raspberry Pi側の確認(Bluetooth確認)

まずはBluetoothモジュールのバージョン確認して、Bluetoothモジュール(bluz)がインストールされていることを確認します。

$ apt-cache show bluetooth

(参考までに、Release Date:2019-7-10のRasbian Buster Liteにインストールされているバージョンは、Source=bluz, Version=5.50-1でした)

次に、Raspberry Pi Zero WのBluetoothがきちんと稼働しているか確認します。 下記のコマンドを打ち、"UP RUNNING"となっていたらOKです。

$ hciconfig
hci0:   Type: Primary Bus: UART
        DB Address: B8:27:EB:xx:xx:xx  ACL MTU: 1021:8 SCO MTU: 64:1
        UP RUNNING
        RX bytes:766 acl:0 sco:0 events:49 errors:0
        TX bytes:2980 acl:0 sco:0 commands:49 errors:0

もしUP RUNNINGでなければ、下記のコマンドでBluetoothインタフェースを稼働させておきます。

$ sudo hciconfig hci0 up

一応、Raspberry PiのBTのインターフェース番号とBluetoothバイスアドレスを確認する。

$ hcitool dev
Devices:
         hci0    B8:27:xx:xx:xx:xx

3.2. WxBeacon2の動作確認

まずWxBeacon2に電池を入れます。ほんの一瞬、表側のLEDが赤色→緑色と光る、が普通は裏側で電池を入れているので見えない…
スマホウェザーニュースのアプリを入れて、[メニュー]→[みんなで作る天気:WxBeacon2のデータ]を開く。下の方の[WxBeacon2の設定]から設定画面に入る。
f:id:maky_Ba:20190730225430p:plain:w250 f:id:maky_Ba:20190730230004p:plain:w250
と言ってもやれることは「WxBeacon2を受信」のトグルをオンにするだけです(左の画面)。 「デバイスアドレス」と「シリアル番号」をメモっておく。

WxBeacon2からデータを受信すると、右の画面のように「気温」「湿度」「照度」「気圧」「騒音」「紫外線指数」が表示されます。 ちなみに下の二つ「不快指数」「熱中症危険度」は、センサーデータではなく、「気温」と「湿度」からの計算値です。 (危険度の単位って「℃」なんだ…)

3.3. WxBeacon2とRaspberry Piの接続確認

まずは、WxBeacon2のBluetoothバイスアドレスのチェックします。

$ sudo hcitool lescan
LE Scan ...
70:86:XX:XX:XX:XX (unknown)
0E:0F:XX:XX:XX:XX (unknown)
...
D2:C6:78:E2:19:D5 Env
...

先ほどスマホアプリで確認したデバイスアドレスが、Envという名前でスキャンに引っかかっていることを確認する。Ctrl-cで止めます。

$ gatttool –i hci0 –b D2:C6:XX:XX:XX:XX –t random –I (←最後はアイ(大文字))
[D2:C6:78:E2:19:D5][LE]> connect
Attempting to connect to D2:C6:XX:XX:XX:XX
Connection successful
[D2:C6:78:E2:19:D5][LE]> char-read-uuid  0x2a00
handle: 0x0003   value; 45 6e 76 53 65 6e 7e 6f 72 2d 42 4c 30 31  (← Device Name “EnvSensor-BL01”)
[D2:C6:78:E2:19:D5][LE]> char-read-uuid  0x2a25
handle: 0x0012   value; 30 39 37 38 4d 59 30 31 36 35  (← Serial Number “0978MY0165”)
[D2:C6:78:E2:19:D5X][LE]> char-read-hnd  0x0019
Characteristic value/descriptor: 04 ff 09 a0 19 45 00 01 00 61 27 8b 0e 02 1d 47 09 3f 0c  (← 気象データ)
[D2:C6:78:E2:19:D5][LE]> disconnect
[D2:C6:78:E2:19:D5][LE]> quit

4. Omronサンプルコード利用の準備

4.1. InfluxDBのインストール

OMRONのサンプルスクリプトでは、データの書き出し先にファイルorデータベースが選べます。 データベースには、IoT系のデータ(時系列データ)の格納に特化したInfluxDBが利用できます。
まずはこれをインストールしておきましょう。 基本的なやり方は下記のとおりですが、このページではStrechベースですので、そこをBusterに置き換えて進めます。 www.influxdata.com

まずは InfluxDataパッケージのリポジトリを追加。

$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
$ echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

influxDBを実際にインストールする。

$ sudo apt-get update
$ sudo apt-get install telegraf influxdb chronograf

telegrafは、将来的にいろいろなデータソースから取り込む時用なので、今はインストールしなくて良い。 chronografはinfluxDBのUIなので、今回の用途ではあまり必要ないかもしれないが、UIはあった方が良いかと思いインストール。

influxDBの起動停止

[起動]
$ sudo systemctl start influxdb.service
[停止]
$ sudo systemctl stop influxdb.service

InfluxDB起動状態の確認

$ systemctl status influxdb

4.2. PythonからBLE(Bluetooth Low Energy)を利用できるように設定

OMRONのサンプルスクリプトは、PythonからBLE(bluez)にアクセスするモジュールとして、python-bluezを利用するので、まずはそれを入れておきます。

$ sudo apt-get install -y python-bluez

Omronのサンプルコード実行のためには、GET REQEUST送信用のライブラリであるRequestsモジュールも必要なので入れておきます。

$ sudo pip install requests --upgrade

ついでにinfluxdb関連のモジュールもインストールしておきます。

$ sudo pip install influxdb
$ sudo pip install --upgrade influxdb

4.3 環境センサー(WxBeacon2)をBroadcastモードに変更

WxBeacon2は購入した状態では、スマホとconnectしてからセンサーデータを取得するモードになっています。 このままではOMRONのサンプルスクリプトは使えません。 OMRONのサンプルスクリプトは、WxBeacon2から周りにまき散らしているアドバタイジングメッセージにセンサーデータも含めた状態を想定しているからです。 OMRON曰くの正式名称は、Without Data RecoedingモードのGeneral Broadcaster 2というBeacon Modeです。

さて、この切り替えはWxBeacon2にBLE(Bluetooth Low Energy)で接続して行います。 まず、スマホにBLE Scanner: Read,Write, Notify (Android, たぶんBLE Scanner 4.0と同じもの)を導入します。 ここではAndroidを使っていますが、iOSにも同様のものがあるはずです。 このアプリを立ち上げるとBLEデバイスを探しに行きます。

左の画面の一番下「Env」が今回設定を変更しようとしているWxBeacon2です。 Bluetoothのデバイスアドレスで確認した上で、「CONNECT」をタップします。
マニュアルによるとアドバタイズの設定(ADV Setting)のUUIDは、0x3042なので、「CUSTOM SERVICE - C4C3040-7700-......」をタップすると、右画面の様に「UUID: C4C3042-7700-....」展開されます。
f:id:maky_Ba:20190801200829p:plain:w250 f:id:maky_Ba:20190801200848p:plain:w250

横にある丸い「R」ボタンをタップするとADV Settingに現在書き込まれている値が表示されます(左画面)。初期値は、0x 0808 A000 0A00 3200 08 00 (スペースは読みやすさのために入れました)です。後ろから2ブロック目の「08」がBeacon Modeで、08 = Event Beaconとなっています。ここを04 = General Broadcaster 2に書き換えます。
丸い「W」ボタンを押すと書き込み画面がポップアップするので、「Byte Array」にした上で、 0808 A000 0A00 3200 04 00  (スペースは読みやすさのために入れましたので入力しないでください)を設定します(右画面)。
f:id:maky_Ba:20190801202418p:plain:w250 f:id:maky_Ba:20190801202437p:plain:w250

「Env」だったデバイスが「EP」に変わっていれば、設定変更は成功です。
f:id:maky_Ba:20190801203245p:plain:w250

4.4. OMRONサンプルスクリプト入手

本命のOMRON社(の公式かは不明ですが)のサンプルスクリプト(Python)の入手です。

$ cd ~pi
$ git clone https://github.com/OmronMicroDevices/envsensor-observer-py omron

~piディレクトにomronというディレクトリが出来ていたらOK。

展開したサンプルスクリプトディレクトに移って、中核となるPythonのコードに実行権限を付与する。

$ cd /home/pi/omron/envsensor-observer-py/
$ chmod +x envsensor_observer.py

5. Omronサンプルコードの設定と利用

5.1. conf.pyの設定(influxDBの設定)

サンプルスクリプトディレクトリにあるconf.pyが設定ファイル。

(前略)
# uploading data to the cloud (required influxDB 0.9 or higher)
INFLUXDB_OUTPUT = True
# InfluxDB
INFLUXDB_ADDRESS = "localhost"     # enter IP address of influxDB
INFLUXDB_PORT = 8086               # enter port number of influxDB
INFLUXDB_DATABASE = "weather"      # enter influxDB database name
INFLUXDB_MEASUREMENT = "wxbeacon2"   # enter measurement name
INFLUXDB_USER = "root"             # enter influxDB username
INFLUXDB_PASSWORD = "root"         # enter influxDB user password

5.2 envsensor_observer.pyの自動起動設定

/etc/systemd/systemに、自動起動の為のサービス設定ファイルenvsensor_observer.serviceを作る。

$ sudo nano /etc/systemd/system/envsensor_observer.service
[Unit]
Description = OMRON sensor observer
After = influxdb.service

[Service]
ExecStart= /home/pi/omron/envsensor-observer-py/envsensor_observer.py
Restart = always
Type = simple

[Install]
WantedBy=multi-user.target

Raspberry Pi Zeroの起動時に自動起動するように設定。

$ sudo systemctl enable envsensor_observer.service

5.3. 環境センサーデータ取得スクリプトの稼働を確認

環境センサーデータ取得スクリプト(envsensor_observer.py)の稼働を確認する。

$ influx -precision rfc3339       # rfc3339は日付がUTCで読める御呪い
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> show databases        # 環境センサー用のデータベースが出来ているか確認
name: databases
name
----
telegraf
_internal
weather          # これが環境センサー用のDB
> use weather    # weatherのデータを読めるようにする
Using database weather
> select time, bt_address, temperature, humidity from wxbeacon2 where time > ‘2019-09-09T12:00:00Z’ 
time                           bt_address   temperature  humidity
----                           ----------   ---------    --------
2019-09-09T13:03:12.819828025Z C8F66C158490 27.63        59.06
....
> quit

設置した環境センサーのBluetoothアドレス(bt_address)と気温(heat temperature)・湿度(humidity)が記録されていれば、スクリプトは順調に動いていると言えるでしょう。

6. つづく

これで環境センサーデータ収集サーバ側は完了で、センサーデータはこのサーバに蓄積されてゆきます。つぎは、このサーバとHome Assistantを繋ぎます。

Home Assistant(Hass.io)でホームオートメーション

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編《今回》
    3. 環境センサー(Omron)を接続 - 後編《次回》
  4. 汎用赤外線リモコンを接続
  5. スマートプラグを接続
  6. UIを改善

*1:ウェザーニーズ社的には、WxBeacon2は観測ポイントでの交換が主だと思う。一方で観測点も増やしたい、という目論見から販売もしている(申し訳ないが、私は何個買っても観測点増加には貢献出来ていません。そのうち売ってくれなくなるかな…)。

*2:6つの要素以外に、「温度」と「湿度」から「熱中症警戒度」「不快指数」を計算してくれて、これらもデータとして取得可能です

*3:加速度センサーは地震の測定に使う、ってオムロンのサイトに書かれていました。ううむ、それはそれで惹かれる…でも常時監視してないとダメか。

【Nabaztag】うさぎ復活計画(その1)

スマートうさぎ、入手しました! f:id:maky_Ba:20190908005422j:plain 手に入れたNabaztagは、第2世代機("The second first wireless rabbit"だそうです)Nabaztag:tagです。おへそにマイクがあるの特徴です。

スマートホームの設定も終わっていないのに、何をやっているのか…

1. まえがき

2005年にフランスで生まれ、2009年頃に日本に上陸したウサギ型コネクティッドデバイスNabaztag(ナバズタグ)。いまなら「ウサギ型スマートスピーカー」といったものでしょうか。 基本的にネットワーク越しにサーバに接続して様々なこと(天気をしゃべらせる、メッセージを読むなどなど)をさせるデバイスでした。 ピーターラビットミッフィーでウサギ好きに育った私としては、その可愛らしい姿は「是非飼い主になりたい!」と思わせるものでした。
が、しかし、ボーっと見ているうちに、

  • 2009年(日本で発売された年だったと思う)年末には、製造元のフランスViolet社が倒産、Mindscape社が買収。
  • 2011年にMindscape社は後継機Karotzを発売すると、ほどなくしてNabaztagのサポートを終了。
  • ところが同年(2011)、Mindscape社は、Aldebaran Robotics社に買収される!
  • でAldebaranは2年ほどKarotsにお付き合いするが、2014年には "nearly 10 years after its first appearance, Karotz is facing a very strong technological competition: the connected devices are now 4G, mobile and evolutionary. Karotz and its users have not only helped establish connected devices; they have paved the way. New products make a stronger match to market needs, marking the end of Karotz's great story."(意訳:まあね、うさぎちゃんは、コネクティッド・デバイスの立ち上げには大貢献したけど、今やモバイルなんだよね。もっと良いのが出てきているよね)というお言葉で、Aldebaran Robotics社はサービスの終了を宣言。
  • 以来、うさぎ(Nabaztag、Karots)は、正式にはネットから切り離され、お亡くなりになりました

という不遇な人生(兎生?)をばく進。
さすがに置物を買うのは寂しいので、さらにしばらく静観することに。

しばらくすると、当然、代替のサーバサービスを考える人や、スタンドアロンで動かせるようにする人、中身を入れ替えて改造人間ならぬ改造うさぎロボ(?)にする人など出てきました。特にRaspberry Piを使った改造は心惹かれるところ大。スマートホームと組み合わせられるのでは!?
よし、やはり頑張って入手しないと。しかしながら、中古でしか手に入らない状況なので、丹念にオークションやらフリマやらを根気よく覗いて見続けました。 そして前述のとおり、今年になって、やっと確保しました。

2. Nabaztagの復活の方法を調査

うさぎを復活させる方法は世界中のいろいろな方々がチャレンジしております。すでに挫折の末(?)消え去っているものもありますが、現存するものを調査しました。

2.1 サーバ側を何とかする方式

まずはViolet社やMindscape社のサーバが使えなくなったのなら、代わりのサーバを準備すればいいじゃん、と考えるのはいたく自然。どうやら一時的にサーバ側を含めたSourceコードが公開されてたようで、それを活用してViolet社やMindscape社が提供してたサービスを有志で提供できるようにする、という活動をしていた人々がいます。

2.2. うさぎのfirmwareを入れて替えて何とかする方式

次が、サーバが使えないなら、サーバなしでうさぎが動くようにすればいいではないか!という派閥。

  • ServerlessNabaztag
    github.com andreax79さんによるサーバ不要のNabaztag用のfirmwareです。firmwareとmp3をうさぎにアップロードするためにWebサーバは必要だが、一旦アップロードされればその後はサーバは不要になる、らしい。

  • Home Assistant Nabaztag
    community.home-assistant.io 上のServerless化したうさぎを使って、Home Assistantからうさぎを操作できるようにしたもの。これは興味深い。

2.3. 改造してしまいましょう方式

最後は、「見た目が可愛い」「耳が動くの好き」「おなかがほんのり光るのイイ」「でも別に今までのサービスにあまり思い入れが無い」という人たち。彼らは、ガワだけ使って中身(主に制御装置部分)を入れ替えて改造うさぎに手を出しています。

3. まずは動くところを見てみたい

正規のViolet社のサーバに繋いで動いているところを生で見たことがないので、とりあえず動作するうさぎを見たい。

3.1.うさぎをWifiに接続する

ここLife with a Rabbit : brief quick-star t guide - RobotShopに、接続の取説がありますが、結構このハードルが高い様子。 。
WPA対応だけどWPA2には時期的に対応していなさそうだし、家のスマートホーム用の無線ルーターではどうやってもダメ。 とりあえず、セキュリティの事は忘れて、繋いでみたい。ということで、家で余っているルーターを探しました。
ということで、家探しして、下記に記事でも触れている海外出張セットに入れてあった「ちびファイ」を掘り出しました。2012年かぁ。まあうさぎの年齢に近いので相性はよさそう。 maky-ba.hatenablog.com

セキュリティを全く考えていないap-game-xxxxというSSIDがプリセットにあったので、それを使用してみました。

  1. Make your Rabbit blue (あなたのうさぎを青くする)
    うさぎの頭を押さえながら電源を入れる(底のプラグを差し込むか、コンセント側を差し込むかする)。LED(おなかの横一列の3個と鼻の1個の計4個)がすべて青色になったらボタンから手を放す
  2. Connect to your Nabaztag:tag(ナバズタグに繋げる)
    PCの無線LAN設定を開くと「NabaztagXX」というSSIDのネットワークが見つかるので接続する
  3. Access your Rabbit’s configuration page(うさぎ設定画面に入る)
    PCのブラウザで「http://192.168.0.1」を開き、Nabaztagの設定に入る
  4. Modify your Nabaztag:tag’s connection parameters(ナバズタグの接続パラメータを変更する)
    設定画面ではドロップダウンリストからap-game-xxxxというSSIDを選び、No encryptionとする。Advanced Configurationに移ってDHCPをYesとして、「Update and Start」をクリックする。
    一旦すべてのLEDがオレンジになって、おなかの左側から順に全部緑に変われば問題なし。(お鼻のLEDはサーバ設定を変更していないので、無視)

ちなみにStep.1で電源を頻繁にオンオフすることになるので、百均でスイッチ付きコンセントを買ってきた。
f:id:maky_Ba:20190908190625j:plain:w250
片手でボタンを押しながら、もう一方の片手で底のプラグとかコンセントのプラグを挿すとかは結構難しかったので、これはとっても便利な一品。しかも安い…

3.2.うさぎをopenJabNabに繋ぐ

下記の手順で一応うさぎが動いているのを見ることができる。

  1. openJabNabサイトを開き、Sign Upする。ユーザ名とパスワードを設定すればとりあえずは大丈夫
  2. 4.1.でやったとおり再度うさぎの設定画面を開く。Advanced configurationの下の方の「Violet Platform」に「openjabnab.fr/vl」を設定する
  3. openJabNabのサイトにログインしてうさぎのシリアル#(=Wifi MACアドレス)を指定して登録
  4. plug-inを登録すれば機能が使えるようになる

ただし、「時刻」(ボタンを押すと現在時刻を日本語以外(例えば英語)で話す)、 「ムード」(小話的な会話の断片を日本語で話す)、 「太極拳」(時々、耳をぐりぐり動かして、腹のLEDをピカピカさせる)、 「呼吸のLEDの色変更」(まあそのまま、本体の下面にあってほんわか点滅しているLEDの色を変える) といったplug-inを動かしてみたが、 それ以外のplug-inの動きはイマイチわからない。

とりあえず、うさぎが動く姿を見ることができた。次は、Serverless Nabaztagに挑戦して、Home Assistantから操作してみたい。

【Home Assistant (Hass.io)でホームオートメーション】2. 環境センサー(Omron)を接続 ー 前編

環境センサー(WxBeacon2/Omron 2JCIE-BL01)編

1. まえがき

 前回スマートホームの核となるホームオートメーションサーバHome Assistantの導入はできました。 maky-ba.hatenablog.com

次は家の状況を把握するセンサーを設定します。 いろいろなセンサーがありますが、今回はOMRONの環境センサーを使います。 複数の環境センサーと接続して情報を一元的に記録したいので、センサーデータを受け取るセンサーデータ収集サーバをHome Assistantとは独立して構築します。

WxBeacon2写真

まずは収集サーバとなるRaspberry Pi Zero Wをセットアップします。既に設定済みのRaspberry Piがあるなら不要です。

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

2. 準備

種類 品名 入手先
環境センサー weathernews WxBeacon2 ウェザーニューズで購入。中身はオムロン 2JCIE-BL01から加速度センサーを除いたものと同じ?。価格半分なのでこちらを。
サーバ(ハード) Raspberry Pi Zero W サイズを重視して今回はPi Zeroを購入。私はマルツで購入しましたが、あっちこっちで買えます
サーバ(ソフト) Raspbian Buster*1 Lite https://www.raspberrypi.org/downloads/raspbian/
ACアダプタ 2.0A USB Micro-Bコネクタ出力 Raspberry Pi Zero Wは、Pi3 model B+ほど電流を必要としません。
SDカード microSD 32GB FAT32でフォーマットされている必要あり

3. センサーデータ収集サーバのセットアップ

3.1. ディスプレイ/キーボード/有線LAN無しでRaspberry Pi Zero Wを使う準備

  1. Raspbian image (Raspbian Buster Lite) をサイトからダウンロード。Home Assistantの導入でも使ったEtcherでmicroSDにRaspbian imageを書き込み。
  2. そのmicroSDをもう一度PCに刺し直して、そのルートディレクトリ(ドライブ名:boot)にsshという空ファイルを作る(Windowsならエクスプローラで右ボタンでtextファイルを作り、拡張子txtを削除。Linuxならtouchコマンドかな)。これで再起動時にsshで接続できるようになる。
  3. 無線LANを使えるように、microSDのルートディレクトリ(ドライブ名:boot)にwpa_supplicant.confを作成。
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  ssid="<接続する無線LANのSSID>"
  psk="<暗号化キー>"
}

3.2. WSL(Windows Subsystem for Linux)を設定

Windows10からssh接続をするためにWSL*2を設定する。 設定済み、もしくはterminalソフトからssh接続する場合には読み飛ばしてOK。

1) WSL機能を有効にする:

「コントロールパネル」→「プログラムと機能」→「Windowsの機能の有効化または無効化」→「Windows Subsystem for Linux」にチェックを入れ有効化する。

2) Microsoft StoreからWSLパッケージをインストール:

WSLとしてはUbuntuが情報が多くメジャーだが、他のDebian等のLinuxディストリビューションもあるので、慣れているものがあればそれを使うべし。私はUbuntuを入れました。

3) WSL初期設定:

Windows左下の検索窓からbashを検索し(以前に古いubuntuを入れているとBash on Ubuntu on Windows(デスクトップアプリ)が検索結果にでるかも)、それをクリックし起動。初回は初期設定で少し待たされる。UNIX usernameとUNIX passwordの設定を要求されるので、自分の好きなように設定する。

...
Enter new UNIX username: hass01
Enter new UNIX password: hoge
Enter new UNIX password: hoge
passwd: password updated successfully
...

3.3. Raspberry Pi Zero W起動後の初期設定

1) Raspberry Pi Zero Wの起動

  1. microSDRaspberry Pi Zero Wに挿入し電源(micro USB)をつなぐ。
  2. LEDの点滅が落ち着くのを待ってから、IPアドレスをFing(1. RaspberryPiにHome Assistant導入を参照)で確認する。

2) ssh接続

$ ssh pi@<Raspberry Pi Zero WのIPアドレス>

パスワードを聞かれたら、raspberryと入力のこと。上手くいけば下記の様にRaspberry Pi Zero Wにログインできるはず。

pi@raspberrypi:~ $

もしCredentialがうんたらかんたら言われたら、表示された説明にあるようにssh-keygenで削除しておくこと。初回接続では出ないはず。

3) Raspbian (Buster) Liteの初期設定

ログインしたらRaspbianの初期設定をしておく。

$ sudo raspi-config
1. Change User Password:
新しいパスワードを入力
2. Network Option:
"N2 Wi-fi"で、SSIDとPassPhrase(Wifiの暗号化キー)を入力
4. Localization Option:
"I1 Change Locale"で、en_US.UTF-8 と ja_JP.UTF-8 を選択(en_GB.UTF-8は外しておこうか)。選択はスペースバーで。Default localeには、jp_JP.UTF-8を指定
4 Localization Option:
"I2 Change Timezone"で Asia/Tokyoを選択。
4 Localization Option:(キーボードを繋いだ時には)
"I3 Change Keyboard Layout": Generic 105 (intel) PCを選択
5 Interfacing Options:
“P2 SSH” でonにする

raspi-configを< FINISH >で終了したら、まずは/etc/wpa_supplicant/wpa_supplicant.conf の設定を確認するために、nanoエディタを起動。 (Ctrl-O:ファイル書き込み、Ctrl-X:エディタ終了)

$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicant.confの中身は下記の通りになっているはず。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="<接続する無線LANのSSID>"
  psk="<暗号化キー>"
}

一応、無線LANインタフェースも設定しておく

$ sudo nano /etc/network/interfaces.d/wlan0

wlan0の中身は下記の通り

allow-hotplug wlan0
iface wlan0 inet manual
  wireless-power off
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

4) WiFiの自動再接続

電波の状況やルータの状況により、ルータとのWiFi接続が切れたときに、Raspberry Piがルータに再接続出来ないことがある。 (時々勝手に回線切断される症状が出たときは、これで改善された)

$ sudo nano ~pi/reconnect.sh
#! /etc/bash
router_address="<ルーターのIPアドレス>"
ping -c 1 $router_address > /dev/null 2>&1
if [ $? -ne 0 ]; then
  sudo ifconfig wlan0 down
  sudo ifconfig wlan0 up
fi

定期的(毎分)に上記スクリプトを起動して、Wifi接続状況を確認し、切断されていたら再接続するようする。cronの機能でこれを実現する。

$ sudo crontab –e

立ち上がったcrontab編集画面(初回に使用するエディタを選択する。nanoが推奨)でcronetabで定期起動を設定。『#』でコメントアウトされている行を下に見て行って、最後の空白行に、下記の一行(毎分(毎時 毎日 毎月 毎曜日)にreconnect.hを起動する設定)を追記。

* * * * * bash ~pi/reconnect.sh

5) Raspberry Piの固定IP化

1. RaspberryPiにHome Assistant導入』と同じように、Fingを使ってRaspberry Pi Zero WのIPアドレス/MACアドレスを探し、ルーターの機能で手動割当(固定IP化)する。

6) 再起動

変更を有効にするために再起動

$ sudo shutdown –r now

もしくは

$ sudo reboot

3.4. ソフトの最新化・インストール

1) Raspbianの最新化

再度Raspberry Pi Zero Wにssh接続して、忘れないうちにRaspberry Pi Zero Wに入れたRaspbianを最新のものにする。しばらく待たされるので気長に。

$ sudo apt-get update
...
$ sudo apt-get upgrade
...
(途中で確認プロンプトが出るが[y]とする)

2) Git cloneを使えるようにする

OMRONのPythonコードはGitに公開されているので、Git Hub上の公開リポジトリをダウンロードできるようにする。

$ sudo apt-get install -y git

3) pipのインストール

Pythonをメイン言語としてセットアップしてゆきたいのだが、pip(Pythonパッケージのインストーラ)がRaspbianにインストールされていない。 ちなみに下記のようにpipを確認すると、

$ python -m pip -V
/usr/bin/python: No module named pip

そんなモジュールない、って言われる。入れましょう。

$ sudo apt-get install -y python-dev
$ sudo apt-get install -y python-pip
$ sudo pip install --upgrade pip 

4. つづく

これで環境センサーデータ収集サーバの土台はできました。つぎは、OMRONのサンプルスクリプトを流用して、データ収集サーバをつくります。

Home Assistant(Hass.io)でホームオートメーション

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編《今回》
    2. 環境センサー(Omron)を接続 - 中編《次回》
    3. 環境センサー(Omron)を接続 - 後編
  4. 汎用赤外線リモコンを接続
  5. スマートプラグを接続
  6. UIを改善

*1:知らないうちにStretchがBusterに

*2:そろそろ、Full LinuxWindows Subsystem for Linux 2がリリースされそうですが。

【Home Assistant (Hass.io)でホームオートメーション】2. Home Assistant初期設定

 前回でおうちサーバであるHome AssistantをRaspberry Piに導入するところまではいきました。 基本的なところを設定して、Home Assistantがとりあえずちゃんと動くところまで設定を続けましょう。

前回の記事はこちら。 maky-ba.hatenablog.com

1. 前提

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

  • ホームオートメーションサーバ(ソフト): Home Assistant 0.95
    (0.96でも違いなし。画面デザインは少し変わりましたが)
  • ホームオートメーションサーバ(ハード): Raspberry Pi 3 Model B+

2. Add-Onの導入

いろいろな便利な機能をAdd-On(アドオン)として組み込み可能。そのなかでもOfficial Add-Onから幾つかインストールします。 左側のメニューの[Hass.io] を選び、[ADD-ON STORE]タブに進みます。下記のようなアドオン一覧がでるので、クリックして出てきた画面でインストールします。

f:id:maky_Ba:20190715172931p:plain

  • Check Home Assistant configuration
    新しいバージョンになった時に設定ファイルに互換性があるかどうかのチェック用、と言っていますが上手く動かせた事がありません。まあ、期待を込めてインストールしています。きっとそのうち使えるはず。

  • Configurator
    設定ファイル(configuration.yaml等)をHomeAssistant上/ブラウザ上で編集できる優れもの。 これがきちんと動かなかった頃は、sambaでフォルダ共有してwindowsで編集して戻すとか sshでリモート接続(Windows Subsystem for Linuxを活用)してリモートでファイル編集する、とか結構面倒でした。

  • Duck DNS
    Dynamic DNSの一つであるDuckDNSを使うためのアドオン。外からアクセスするために利用。 プロバイダ(光プロバイダ等)からグローバルIPをもらっていない場合(大半がそうだと思います)に、プロバイダから割り当てられたIPが変わっても上手いこと接続できるように名前で接続できるようにする仕組みがDynamic DNSです。

Community Hass.io Add-onsからもひとつインストールしましょう。

  • SSH & Web Terminal
    sshでセキュアに別のPCからHass.ioに接続したり、セキュアなFTPでファイルをやり取りしたりできるsshサーバ機能とweb版のTerminal画面のアドオン。Configuratorが使えるようになったので、あまり出番はありませんが、やはり基本としてリモートでHass.ioに接続できるようしておくと色々と安心です。

(1) Check Home Assistant configuration

(いまのところ、自分自身上手く使えていないので、省略)

(2) Configurator

インストールして、スタートすれば使えるようになります。[Show in sidebar]トグルをオンにすると、左側のメニュー(サイドバー)に、Configuratorという項目が追加されます。 Configuratorを起動し、ブルーのバーの左端にあるフォルダをクリックすると編集するファイルが選べます。 f:id:maky_Ba:20190715180956j:plain

(3) DuckDNS

外からHome Assistantにアクセスするためには、1) IPではなく名前でアクセスできる事(Dynamic DNS)、2) httpsでセキュアに接続できる事、が欠かせません。DuckDNSアドオンではこの両方(正確には 2)はLet's Encryptの機能ですが、このアドオンの裏側で使えるようになるので知らなくて良いハズ)が実現できます。

Home Assistantの正式の情報は下記。 www.home-assistant.io 上のとおりやればよいのですが、設定の仕方、コツをメモしておきます。

1) ルーターの外側(INTERNET側/WAN側)のIPの確認
通常のプロバイダ契約では一時的(といってもかなり長い間同じIPが割り当たりますが)に割り当てられたインターネット上のあなたのIPを知っておく必要があります。
下記のサイトにアクセスするとあなたの外向きのIPを知ることができます。

www.cman.jp

2) DuckDNSの登録
下記サイトを開いてTwitter/GitHub/reddit/Googleのいずれかのアカウントを用いてログインし、下記を設定/取得する。

www.duckdns.org

  • domain (ex. maky-home)
  • token (ex. 8f68773c-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  • ip (あなたのルーターの外側(INTERNET側/WAN側)のIP。これは後でDuckDNSにて自動的に更新される)

これで外部から<あなたのドメイン>.duckdns.orgで、あなたのルーターまでアクセスすることができるようになりました。

3) DuckDNSアドオンの設定
[Hass.io] - [Dashboard] - [ DuckDNS]と進み、アドオン画面を開き、Configの欄に先ほどのtoken、domainを設定する。

{
  "lets_encrypt": {
    "accept_terms": true,
    "certfile": "fullchain.pem",
    "keyfile": "privkey.pem"
  },
  "token": "<あなたのtoken>",
  "domains": [
    "<あなたのdomain>.duckdns.org"
  ],
  "seconds": 300
}

先ほどのConfiguratorを早速使って、configuration.yamlファイルのhttp:の項に下記を記述。

http:
  base_url: https://<あなたのdomain>.duckdns.org
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

4) ルーターの設定
外からhttps:// で呼ばれたら(細かく言うとport 443で呼ばれたら)、ルーターの内側にいるHome Assistantサーバのport 8123へと繋いであげる必要があります。 これはルーター毎に異なるので、詳しくは自分のルーターの取扱説明書を見ていただきたいのですが、私のBuffaloのAirstationでは、[ゲーム&アプリ]タブの中の[ポート変換]で設定できます。 「ポート変換の新規追加」画面で設定すればうまく動きました。

  1. グループ: 既存のグループでよいでしょう。無ければ新規追加。
  2. Internet側IPアドレス:「エアステーションのInternet側アドレス」
  3. プロトコル: TCP/UDP、「HTTPS(TCPポート443)」
  4. LAN側IPアドレス:<あなたのHome AssistantサーバのIP>
  5. LAN側ポート: 8123

5) DuckDNSアドオンのスタート
再び[Hass.io] - [Dashboard] - [ DuckDNS]と進み、アドオン画面を開きをスタートさせる。 この時、結構時間がかかるが、下の方のLOGを見ておき、Errorとか出ていないか眺めておく。 ここでじっと待つのが肝、のような気がする。ここで焦ってカチャカチャ操作するとうまくLet's Encryptとかが登録されない。 順調に行けば、Let's Encrypt とかの設定も、DuckDNSへのルータIPの設定等も行われるはず。

(4) SSH & Web Terminal

これもインストールして、Config記述すれば動きます。 Config記述するためにssh authorized keyが必要になります。 Windowsですと、WSLの中でssh-keygenコマンドを使うとか、GitをインストールしてC:\Program Files (x86)にあるssh-keygenコマンドを使うなどして、keyを生成する手があります。

3. Configuration.yamlの記述

Configuration.yamlは、Home Assistantの中核設定ファイル(まあConfigurationというだけはあります)です。 他には、複数の処理をまとめて実行するためのAutomation.yamlやScript.yamlがありますが、このあたりは段々とWeb UIで設定できるようになってきています。

が、しかしConfiguration.yamlだけはゴリゴリ書かなければなりません。 たとえエディタがWeb UI(Configurator Add-On)になったとしても、何か新しい機器をHome Assistantに追加しようと思えば、ごりごりyaml形式の記述をする必要があります。

試しに何かの情報をHome AssistantのStatus画面(状態画面)に表示できるようにしてみましょう。 測定機器類は無くても、サーバ(Raspberry Pi)はあるはずですので、そのサーバのCPUの温度を測ってみましょう。 configディレクトリの下にあるconfiguration.yamlに以下の記述を追加する。

sensor:
  - platform: command_line
    name: CPU Temperature
    command: "cat /sys/class/thermal/thermal_zone0/temp"
    unit_of_measurement: "°C"
    value_template: '{{ value | multiply(0.001) | round(1) }}'
  • sensor: センサー型のエンティティであることの宣言
  • platform: 「command_line」コマンドラインで呼び出したコマンドの返す値を使うセンサー
  • name: このエンティティの名前
  • command: このエンティティの本体。Linuxのコマンドを記述する。
  • unit_of_measurement: 表示される単位
  • value_template: 表示するときの値の整形を設定。/sys/class/thermal/thermal_zone0/temp には温度は1000倍で記録されているので、0.001で掛けて(=1000で割って)、小数点以下1桁目で丸める。

これでHome Assistantは、Raspberry PiのCPU温度を粛々と記録し続けるようになっているはずです。

4. UIの設定

UIは、以前は.yamlファイルをゴリゴリ記述しなければならなかったのですが、最近は「Lovelace UI」というのがまともに動くようになって、UIでUIを設定できるようになりました。 (ラブレス、は詩人でしょうか、どんな意味が…) 左のメニュー(サイドバー)から[状態]を選び、その中の右端のベルマークの右の縦三つ点から[Configure UI]をクリック。 編集画面の右下のオレンジプラスマークからCard Configureでカードタイプを選んで編集。 f:id:maky_Ba:20190726222101j:plain 25種類のカードタイプが選べる。 ここでは「Entities」を選んで編集している。
f:id:maky_Ba:20190726215601j:plain 設定を進めるとカード編集(Card Configuration)画面の右側(もしくは下側)にプレビューされる。

  • Title: カードの左上に表示されるタイトル
  • Theme: (正直まだよくわからない)
  • Show Header Toggle?: エンティティがトグルの時、カード全体を一括してOn/Offするトグルを表示するか否かの設定。
  • Entiies: 使えるエンティティがドロップダウンで表示されるので選んで追加してゆく。
  • TOGGLE EDITOR: Card Configurationを旧来のファイル型で編集するモード
  • キャンセル/SAVE: カード編集結果を保存するか否か。

次に先ほど設定したCPU温度も表示させよう。これはカードタイプとして「GAUGE」(ゲージ)を使ってみる。
f:id:maky_Ba:20190726221100j:plain

  • Name: 円弧型のゲージの中心部分に表示される値の名前。設定しなければデフォルト=エンティティの名前が表示される。
  • エンティティ: 表示するエンティティ。ドロップダウンリストで選ぶ
  • Unit: 単位。設定しなければ、エンティティで設定されているもの(unit_of_measurementで設定したもの)が表示される。
  • Theme: (正直まだよくわからない)
  • Minimum: 表示される最小値
  • Maximum: 表示される最大値
  • Define Severity: 緑・黄・赤で値を表現するか否かのトグル

最終的には、こんな感じに。
f:id:maky_Ba:20190726221809j:plain 前回では上の方に丸で記述されているものや、独自に設定したものをカードに表示するように出来た。 らくちん。

6. おわりに

便利なアドオンの設定と、設定ファイル(Configuration.yaml)の基本的な記述方法、それからUIの設定をやってみました。 Home Assistantはバージョンが変わると結構設定の仕方が変わるのに、説明があんまり体系的でない。 英語圏の人でも「これどうやるの?」ってコミュニティで聞きまくっているので、そこん所どうにかならんかなあ。

次はついにセンサーの情報を表示するように頑張ります!

【Home Assistant(Hass.io)でホームオートメーション】

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定 《今回》
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編《次回》
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編
  4. 汎用赤外線リモコンを接続
  5. スマートプラグを接続
  6. UIを改善