Gravio 4でボタン一つで温度・湿度・気圧・CO2をLINE通知とPollyで音声アナウンスする


仕事をしていると寒いなぁとか換気必要かなとかいろいろ思うことがある。CO2のライトもいいけど、ボタン一つでいろいろ教えてくれると便利と思ってやってみた。

使用環境

今回はAmazon Pollyを使うので、安定して動くWindows版のHubKitを動かす。

  • Windows 10 20H2 (19042.844)
  • Gravio HubKit v4.1.4049.0
  • Gravio Studio v4.1.5432.0
  • Gravio クライメートセンサー (Gravio Basic以上の契約が必要)
  • Gracio CO2センサー (Gravio Standard以上の契約が必要)
  • LINENotify/LINE
  • Amazon Web Services/Amazon Polly

事前準備

  • AWSでAmazon Pollyが使えるようなアカウントのアクセスキーとシークレットキー
  • LINE通知を行うためのアカウントと、通知するためのLINENotifyのトークン
  • 上記ふたつを基本プロパティセットとして登録しておきます

手順

センサーとボタンの登録


温度、湿度、気圧、CO2の各レイヤーを作成し、それぞれセンサーをバインドします。温度、湿度、気圧はすべてGravio クライメートセンサーから取得できますので、それぞれのレイヤーに同じセンサーをバインドすればOKです。
また、通知をするためのボタンもペアリング、レイヤー作成し、バインドしておきます。

アクションの作成

センサーデータの取得

このような形のアクションを作成します。

まず、Sensor Data DBコンポーネントで直近の値を1つだけ拾ってきます。ここでは温度を指定しています。
取ってきた値をPost Mappingsでアクション変数を作って代入しておきます。cvn.はこのコンポーネントの出力ペイロードです。Post Mappingsでのみ使えます。

av.温度
cvn.Payload.Data

これを他のデータでも実施します。同様に、湿度、気圧、CO2に対して同じようにコンポーネントを設定します。

メッセージの作成

センサーデータが揃ったので、今度は Templateコンポーネントを使ってメッセージを作成します。
Pre Mapppings等の式で生成してもいいのですが、ここでは Templateコンポーネントを使います。記述がわかりやすいのと、このあと LINE Notifyコンポーネントと Amazon Polly Speechコンポーネントで同じメッセージを使うためです。
変数の参照は{{}}でくくるのと、avなどの前に.を付けるのを忘れずに。マッピングとは異なる記法です。
作ったメッセージは今回もアクション変数に代入しておきます。Templateコンポーネントの出力は合成文字列そのものなのでそのまま代入します。

テンプレートプロパティ
現在の温度 {{.av.温度}} 度、湿度 {{.av.湿度}} % 、気圧 {{.av.気圧}} hPa 、CO2 {{.av.CO2}} ppmです。

LINE通知

LINE Notifyコンポーネントのメッセージに作成しておいたアクション変数を渡します。基本プロパティセットには準備しておいたトークンを設定したものを選択します。

Pollyで音声アナウンス

Amazon Polly Speechコンポーネントのテキストに同じく作成しておいたアクション変数を渡します。基本プロパティセットにはこちらも準備しておいたキーを設定したものを選択します。音声は日本語を再生するので、TakumiMizukiを指定しておきましょう。

実行

アクションを実行するとLINEに通知され、音声で読み上げられました。頑張って記事を書いてたのでCO2が上がってしまったようですw

トリガーの設定


いつものようにボタンの Single pressに対してアクションを紐付けておきます。
有効にすると、ボタンを押したタイミングで実行されるようになりました。

ポイント

  • データの取得はSensor Data DBコンポーネントを使って、1レコードだけ取得する
  • データはアクション変数に格納しておくと便利。ただし、後述のように注意すべき点も。
  • メッセージの合成はTemplateコンポーネントが使える。記述がマッピングの式とは異なるので注意!

Sensor Data DBの使用上の注意

今回、Sensor Data DBは1レコード限定で取得しました。通常利用する場合は、複数レコード取得することがあります。その場合、以降のコンポーネントは各レコード単位で動きます。つまりループのような動きをするので注意が必要です。
そういう意味では、今回は連続するSensor Data DBで1>1>1>1のループが発生しているとなります。仮にどこかのデータが全く取得できていない場合は、例えば1>1>1>0となり後続の処理が実行されないので注意しましょう。

アクション変数の使用上の注意

アクション変数はアクションスコープの変数ですが、前述のようにSensor Data DBのようなループの中で実行してしまうと、各レコードに対する処理は並列で実行される可能性があるので、同時にアクション変数にアクセスする可能性があり、参照のタイミングで期待する値が入っていないことが考えられます。なので、今回は1レコード限定なのでいいですが、利用には十分気をつける必要があります。
マルチスレッド処理で同時に同じグローバル変数にアクセスしているようなものと考えると、わりとイメージが近いと思います。

参考