コモノポリタン

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

【Home Assistant(Hass.io)でホームオートメーション】OKぐーぐる、クリスマスツリーを点けて

IFTTTでGoogle AssistantとHome Assistantの連携!

ああ、いつまでたっても「汎用赤外線リモコン」に到達しない…
しかしながら、クリスマスまでにツリーを音声コマンドで操作できるように設定したい、のです。この手続きは「汎用赤外線リモコン」でも活用しますし(言い訳)。

1. まえがき

Home AssistantのWebページ(やAndroid/iOSアプリ)からクリスマスツリーを点灯・消灯できるようになりました(この記事)。しかし折角Google Home/Home mini/Nest Hubがあるのですから、「OK、ぐーぐる」で点灯できると家人へのインパクトも大!でしょう。まるで魔法のよう!

2. サービス間連携IFTTT

「OK、ぐーぐる」とHome Assistantの間を繋ぐのに、サービス間連携の仕組みIFTTT(IF This Then That)を使うことにします。

ifttt.com

連携の流れは、下記のような感じです。

「OK、ぐーぐる …」 ⇒ Google Assistant(のサービス) ⇒ IFTTT ⇒ Home Assistant(のサービス) ⇒ tp-link HS-105 (に繋がっているクリスマスツリー)

つまり

  • IF Thisパート: もし私が「OK、ぐーぐる、クリスマスツリーを点けて」と言ったら(とGoogle Assistantが検知したら)
  • Then Thatパート:Home Assistantの外部サービスを呼び出して、ip-link HS-105をオンにする。

と言った具合です。

3. Home Assistant側での準備

下記のHome AssistantのIFTTT関連のマニュアルの「Sending events from IFTTT to Home Assistant(IFTTTからのイベントをHome Assistantで受け止める)」の部分を設定する。 www.home-assistant.io

3.1. Configuration.yaml設定・設定確認

Home Assistantを外から呼べるようにするためには、下記条件が必要です。

  1. httpsでHome Assistantに接続できるようになっていること(下記設定ファイルでssl_ほにゃほにゃが設定されていること)
  2. DNSでサイト名引けるようになっていること(下記設定ファイルにbase_urlが設定できていること)

まあ、DuckDNSの設定をAdd-onでしていれば、このあたりはクリアしているはず。

(前省略)
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
http:
  base_url: !secret my_url
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem
(後省略)

つぎに、外からHome Assistantの機能を呼び出すサービス(webhook)をAutomationを使って設定する (ほぼおまじないと思って設定する)。

(前省略)
#****************************************************************
# automation for IFTTT
#****************************************************************
automation old:
  trigger:
    platform: event
    event_type: ifttt_webhook_received
    event_data:
      action: call_service
  action:
    service_template: '{{ trigger.event.data.service }}'
    data_template:
      entity_id: '{{ trigger.event.data.entity_id }}'

(後省略)

3.2. Webhook IDの取得

外からHomeAssistantのサービスを起動するためのインターフェースというか何というかがWebhook(Webサービスをひっかけるとっかかり、という感じかな)という機構なのですが、それを使えるようにする手順です。まずは左のパネルの「設定」を選んで、右画面の「Integrations」を選び、右下のオレンジの+で新しいIntegrationを追加します。リストから「IFTTT」を選択すると、「Set up the IFTTT Webhook Applet(IFTTTのWebhookアプレットを設定するかい?)」って聞かれるので「送信」を選択。
f:id:maky_Ba:20191221021338j:plain:w350 f:id:maky_Ba:20191221021352j:plain:w200

すると「Success!」という子画面が表示されます。この画面とっても重要です。4.2で設定する内容がここで生成され表示されるのですが、なんとこの画面「一度」しか表示されないのです!!
f:id:maky_Ba:20191221021438j:plain:w350
一旦「完了」を押してしまうと「Integrations」の中の「IFTTT」を押しても下記の様に冷たいメッセージしか表示されません。ということで、先ほどの画面が出たら少なくともURLパートはコピペしてどこかにメモっておきましょう。絶対ですよ。
f:id:maky_Ba:20191221021459j:plain:w400
.../api/webhook/<長い長い文字列>の長い長い文字列が私のHome AssistantのWebhookのIDなのです。 残念なことに、このIFTTT連携用のWebhook IDは一個しか作ってくれません。つまり忘れちゃったら「作り直すしかない」のです。作り直したら以前作ったIDは無効に!!!ということは…
(この記事を書くために2回ほど作り直して、その都度既に作ってあったIFTTTのほぼすべてのAppletのURLを設定しなおすことに…)

4. IFTTTのアプレットを定義する

まずIFTTT(https://ifttt.com/)のサイトに行き、Google Assistant(Google Home/Home mini/Nest Hub)で使っているGoogleのアカウントでログインします。こうしておくとGoogle Assistant連携がスムーズに行く(と思う)。

画面右上のユーザアイコンの中で「Create」を選択するとIFTTTのアプレット生成画面がスタートします。 f:id:maky_Ba:20191221000443j:plain:w500

4.1. IF Thisパートの設定。

上の画面のどこを押して進めたら良いか、イマイチ分かりづらいデザイン…
「+This」の部分が正解。
100種類以上のIF Thisに使えるサービスがタイルで列挙される(下図左)ので、ちょっと探し辛い。今回はGoogle Assistantを使いたいので、まずはGoogleと入れて絞り込むのが楽です。UI(タイル)で選択しやすいようにしているつもりで、結局テキスト入力が不可避、皮肉ですね。
f:id:maky_Ba:20191221000910j:plain:w275:left f:id:maky_Ba:20191221000923j:plain:w275

「もし」の部分=起動条件(トリガーTrigger)を設定します。Google Assistantのサービスのトリガーは4つ。今回は、一番シンプルな「Say a simple phrase(単純な文を言う)」を使います。「単純な」というのは、数字やキーワードなど変数的なものを含まない固定的な(?)文章の事を指します。 下記の様に設定しました。

  • What do you want to say?(何て言う?): クリスマスツリーの電気をつけて
  • What's another way to say it? (それ、他の言い方では?):クリスマスツリーをつけて
  • And another way?(他の言い方、もう一丁):(なし)
  • What do you want the Assistant to say in response?(Google Assistantに何て応えさせる?):クリスマスツリーの電気をつけます
  • Language: Japanese

f:id:maky_Ba:20191221002007j:plain:w275:left f:id:maky_Ba:20191221002033j:plain:w275

ちなみに、気が付く人は気が付いているかもしれませんが、「Google Assistantに何て応えさせる」は後段の成功失敗にかかわらず「応え」てくれます。たとえHome Assistantのサービス呼び出しに失敗しても気にしません。
だって「IF This」パートの設定画面にあるんですよ、したがって、まあ「条件うけたまわり!」ぐらいの感じの応答にするのが良いでしょう。「電気をつけました」ではなく「電気をつけます」とか。

「Create Trigger」すると次のパートに進めます
f:id:maky_Ba:20191221004327j:plain:w500

4.2. Then Thatパートの設定

IFTTTの流儀が見えてきましたか?「+That」を押すと実行パートのサービス設定ができます。
Home Assistantの外部からの呼び出しサービスを利用するのにWebhooksという機構を使いたいのですが、またしても山の様なThen Thatに使えるサービスが列挙されてうんざり…さっさとあきらめて検索窓に「Web」と入れて絞り込みます。
f:id:maky_Ba:20191221004958j:plain:w275:left f:id:maky_Ba:20191221005024j:plain:w275

このサービスには「Make a web request」しかありませんのでそれを選択して、「Complete action fields(アクションの設定項目を埋める)」に従って下記の様に埋めていきます。

  • URL: https://xxxxx.duckdns.org/api/webhook/長い長いwebhook_id
    (これが3.2で取得したURLです。ちゃんとメモってありますよね)
  • Method: POST
  • Content-Type: application/json
  • Body: { "action": "call_service", "service": "switch.turn_on", "entity_id":"switch.christmastree"} で、「Create action」を押すと、「Review & Finish(確認と終了)」が出ますが確認しようがないのでここは「Finish」で終了!
    f:id:maky_Ba:20191221024747j:plain:w250 f:id:maky_Ba:20191221024829j:plain:w250

おお、これでやっと終わりです。
f:id:maky_Ba:20191221024851j:plain:w350

これでGoogle Home/Home mini/Nest Hubに向かって「ねぇ、ぐーぐる、クリスマスツリーをつけて」と言えば、バチンというHS-150のリレー音が響き渡ってクリスマスツリーのライトが点灯します。ふう、結構長かったねぇ、設定。でもこれでWebhookは使い放題なので、次からは楽になるはずです。

5. おわりに

よおし、クリスマスに間に合った…
さてと、次は、本当の本当にほんとうに(?)汎用赤外線リモコンか!?乞うご期待。

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

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編
  4. スマートコンセントでクリスマスツリー点灯!
  5. スマートディスプレイ
  6. OK、ぐーぐる、クリスマスツリーを点けて(IFTTT連携)《今回》
  7. 汎用赤外線リモコンを接続《次回》
  8. UIを改善

【Home Assistant(Hass.io)でホームオートメーション】スマートディスプレイ

スマートディスプレイGoogle Nest Hub)

すみません!!
スマートコンセントでクリスマスツリーを無事点灯させたので、ついに汎用赤外線リモコンか!と思わせて、さらに寄り道…

1. まえがき

コストコに行ったら*1Googleスマートディスプレイ(Google Nest Hub)が1万円を切る値段になっていましたので、ついつい手が出てしまいました。

f:id:maky_Ba:20191214010546j:plain:w340

これで我が家には、Google系のスマートディスプレイが1個、スマートスピーカーが4個(Home x2、Mini x2)となりました。(他にAmazon系(Alexa)で、スマートディスプレイ化したタブレット1個、スマートスピーカー1個ありますが、存在感薄いです)

しかしながら、ただのスマートディスプレイとして使う気をさらさらありません。
実は、せっかくHome Assistantで「今の」「我が家の外の」気温がわかるようになっているのに、「ねぇ、ぐーぐる」すると教えてくれる外気温は「私の住んでいる市の」気温なのです。そこのところ敗北感…
Home Assistantの回答をGoogleスマートスピーカーに「しゃべらせる」様にするという手はありそう(Actions on Googleあたりでしょうか)ですが、まずは簡単にスマートディスプレイにHome Assistantの画面を出して、「今の」「我が家の外の」気温を表示できるようすることを目標にしましょう!*2

2. 準備

必要なものは下記のとおり。

品名 型番 説明
スマートディスプレイ Google Nest Hub コストコで9,980円でした。新型出るのかな。
PCかタブレット Google ChromeもしくはMicrosoft Edgeブラウザが動くもの 後述するHome Assistant Cast launcherを一度起動して設定するために使います
Home Assistantサーバー Ver. 0.103.0 ちょっとサブバージョンが上がりました…

3. Home Assistant Cast

3.1. Google Nest Hubの初期設定

特に変わったことをする必要はありません。電源入れて、言われたとおりに設定を進めれば良いと思います。

あ、一点、WiFiルータでMACアドレス制御をかけている場合は、接続しようとしている携帯アプリでMACアドレスを確認する必要があります。Nest Hubの画面側でどうやって確認するのかしばらく試行錯誤してしまいました。
下手に画面があるので惑わされますが(私だけ?)、Google Homeとか同じで「Wi-Fiネットワークの設定」画面の右上の設定ボタン(縦3つの点)をクリックするとMACアドレスが表示されます。ここだったか…

3.2. Nest Hub用UI作成

まずはGoogle Nest Hubに表示するためのHome AssistantのViewをつくらなければなりません。
Home Assistantで、[状態]→[設定ボタン(たて点三つ)]→[Configure UI]でConfigure UI画面(UI設定画面)を開きます。さらに[(画面の上の方にある+印) Add View]で、View Configuration画面(View設定画面)を立ち上げます。下記画面のように設定しました。

f:id:maky_Ba:20191216212119j:plain:w340

次に、そのViewの中で表示する情報を設定します。
今回は、カードのお試しを兼ねてVertical-Stack CardとHorizontal-Stack Cardを組み合わせて使ってみます。Configure UI画面の右下のオレンジの+印をクリックし、Vertical-Stack Cardを選択します。Vertical-Stack CardやHorizontal-Stack Cardは、「No visual editor available for: vertical-stack」だったりするので、ここではガシガシとテキスト入力していかなければなりません。
さてVertical-Stackとは上下にパネルを設置するカードなのですが、その上のパネルをHorizontal-Stack Card(左右にパネルを設置するやつ)にしてパネルを入れ子にしてみます。下記画面のように記述してみました。

f:id:maky_Ba:20191216212540j:plain:w340

結果は、下記のような感じです。
f:id:maky_Ba:20191216213525j:plain:w340

3.3. UIをNest Hubにキャスト(Home Assistant Cast)

Google Chromeブラウザ(もしくはMicrosoft Edgeブラウザ)でthe Home Assistant Cast launcher websiteにアクセスして、「Home Assistant URL」に外からhttpsでアクセスできるURLを設定し、「Authorize]ボタンを押します。
f:id:maky_Ba:20191216221437j:plain:w340

でログイン。
f:id:maky_Ba:20191216221806j:plain:w340

Stay log onとか聞かれたら、とりあえずYesとでも答えておきます。下の方にある「START CASTING」ボタンをクリックすると、Castする先の選択画面になります。
f:id:maky_Ba:20191216221858j:plain:w340

今回は、Nest Hubをダイニングのテーブルの上に置いたので、接続先として「ダイニング ルーム ハブ」(芸の無い名前ですみません)を選択します。
f:id:maky_Ba:20191216223213j:plain:w250

View選択画面(Pick a view画面)が出るので、先ほど作ったCast用のView「GoogleCast」を選択します。
f:id:maky_Ba:20191216222639j:plain:w340
一旦、Castしたら、ブラウザを閉じても大丈夫。

Google Nest HubのHome画面で「右から左へスワイプ」すると「Home Assistant」パネルが出てきます。それをクリックすると下の様なHome Assistantの画面(先ほど指定したView)が表示されます。
f:id:maky_Ba:20191211213347j:plain:w340

4. おわりに

さあこれで、温かいダイニングで、冬の寒い朝の「寒さ感」をじっくり味わうことが、Home Assistant+Google Nest Hubで出来るようになりました。 さてと、次は、本当の本当に汎用赤外線リモコンか!乞うご期待。

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:という言い訳で、Google Nest Hubを買う…ボーナス出たし…ちょびっと。お疲れ様>自分。

【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サーバを同じネットワークにしておくと、自動的に組み込んでくれます。

【追記】
もし追加されていなければ、手動で読み込ませます。まずは左のパネルの「設定」を選んで、右画面の「Integrations」を選び、右下のオレンジの+で新しいIntegrationを追加します。ポップアップしたリストから「TP-Link Smart Home」を選択すると自動でHS-105を探してくれます。

4.1. HS-105の設定確認

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を使ってスイッチを登録したりできます。

4.2. オートメーション登録

試しに、時間が来たらクリスマスツリーを消灯する自動化スクリプトを設定してみましょう。消し忘れに効果があります。
先ほど見たデバイス情報の下の方に「When something is triggerd...」という欄があります。そこの「Turn off クリスマスツリー」を選択します。

f:id:maky_Ba:20191215233855j:plain:w500

オートメーションの名前に「クリスマスツリー消灯」と設定します。

  • トリガー:「トリガーの種類」=「時刻」、「At」=「00:00:00」
  • 条件:「条件の種類」=「状態」、「エンティティ」=「switch.christmastree」、「状態」=「on」
    (あ、下の画面では「On」になっている、間違えた「on」です。大文字小文字の区別有)
  • アクション:「アクションの種類」=「Device」、「Device」=「Christmastree」、「Action」=「Turn off クリスマスツリー」(この項は、設定済みだと思いますが)

これで、0:00になった時に(トリガー)、クリスマスツリーが点いていたら(条件)、クリスマスツリーを消す(アクション)という自動化スクリプト(オートメーション)が設定できたはず。

f:id:maky_Ba:20191215234050p:plain:w450

出来上がったオートメーションの確認・変更は、左のパネルから「設定」→「オートメーション」と進んで「オートメーションエディタ」から行えます。

f:id:maky_Ba:20191215235151j:plain:w500

バイスの登録も結構自動化が進んでますし、オートメーションとかもGUIでの設定がドンドンできるようになってきています。バージョンが上がるたびにファイルを直接いじらなくともGUIで設定できる範囲が広がってゆく。コミュニティは活発な様子。それはうれしいのですが、それにHome Automationの解説が追い付いてない感じ。残念…結局トライアンドエラーで頑張る必要あり、なのです。
(まあ、けど、相変わらず言葉足らず・説明不足なところが、HAっぽいところ、かもしれませんが)

5. おわりに

さあこれで、クリスマスシーズンもHome Assistant大活躍。IFTTTとかと連携すれば「クリスマスツリーの電気をつけて」と帰宅した暗闇で輝くクリスマスツリーに出会えるかも。

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

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

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編
    3. 環境センサー(Omron)を接続 - 後編
  4. スマートコンセントでクリスマスツリー点灯!《今回》
  5. 汎用赤外線リモコンを接続《次回》
  6. 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)の扱いなどが古いやり方だったので、新版に差し替えました)

さらにInfluxDBを独立させたり、最新のUIで設定したりと、改訂版が下記。 maky-ba.hatenablog.com

 前回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を改善

maky-ba.hatenablog.com

*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://components.omron.com/sites/default/files/2021-10/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から使えるように設定する - Shujima Blog
- 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を改善

maky-ba.hatenablog.com

*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から操作してみたい。