今朝「スッキリ」で話題にちょっとあがった黙食サインをGravioでやってみた

今朝「スッキリ」を見てたら、みちょぱが「大声で会食するのがダメなら、CO2じゃなくてデシベルみたいなのを表示したらいいじゃん」的なことを言ってたので早速Gravioでやってみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/29d4b449-13c3-55e4-3920-0476c3118290.png)

# TL;DR
* OMRONの2JCIE-BU01で騒音を取得
* Gravio LEDマトリックスを使って「黙」サインを表示
* 騒音レベルに応じて「黙」サインの明るさを制御

# 使用環境
* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.2 LTS
* Gravio HubKit v4.3.0-6722
* Gravio Studio v4.3.4162.0
* OMRON 2JCIE-BU01
* Gravio LEDマトリックス


# 事前準備
今回はOMRONの2JCIE-BU01を使うので、要入手。USB型で常時給電でき、有線接続なのでBLEより安定してデータを取れるのがメリットです。
あと、黙サイン用にアイコンビットマップを作っておきましょう。16x16ドットのBMP形式のファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/5b43ca1b-2e7f-75f1-9c43-ef53fb45205a.png)

# 手順
## センサーの設定
LEDマトリックスはいつものようにZigbeeでペアリングしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/9338daec-d773-9049-a680-4c2b44dd1376.png)

OMRON 2JCIE-BU01は接続すれば認識されます。ただし、今回、ラズパイのLinux版なので、一度HubKitを再起動させなければなりません。センサーをUSBポートに接続し、Update Managerにアクセスし、再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/93a6dc3f-f4d9-5557-8129-c86e0724407b.png)

再起動後、Studioからアクセスするとデバイス一覧でこのように認識されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/93087ee4-7e07-5db0-d72e-136e84d970e2.png)

いつものようにエリアとレイヤーを作成します。家ですが、雰囲気できるように「居酒屋Gravio」で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/4fc047f9-2575-3c98-73ae-9627acd560b2.png)

データビューアを見ると騒音レベルがデータとして取得できているのが見えますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/05739b8f-898e-48ab-36a0-3d0002d41dcb.png)

## アクションの作成
次にアクションを作ります。センサーレベルそのままでもいいんですが、騒音って結構タイミングによってパーンと上がったりするので、数分間のデータの平均を取ってサインを表示したいと思います。

まずはSensor Data DBコンポーネントで過去1分のデータをとってきます。時間は適当に調整してください。あまり長くすると、静かにしたのにいつまでもサインが点いてるってことになるので要注意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/012f4d01-ee83-fb01-fbc0-4adf92bd1067.png)

次にStatisticsです。Sensor Data DBのデータを使うので、`cv.Payload.Data`を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a0b0bfdf-bb9c-14bd-20b3-55013cd22fc8.png)

最後にGravio Matrixコンポーネントです。今回はここがキモです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/418116fb-fe3d-dc27-9a24-b072b4a7a2f4.png)

「基本プロパティセット」は設定してもしなくてもいいです。今回はたまたま作っておいたのでこれを使いました。これを指定せず、物理デバイスIDも指定しなければ、つながってるLEDマトリックス全てにサインが送られます。

「入力」は「16x16 BMPファイル」を指定し、コンテンツに作成してあったビットマップファイルのパスを指定します。アップロードはアクションデータフォルダダイアログを使ってくださいね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/9265ef60-a7a3-0d02-8760-2b1c101fdffc.png)
あとは「オン」をチェックするのを忘れずに。
そして、今回、騒音レベルによって明るさを変えてみますのでPre Mappingsで少し計算をしてみます。

```cp.Brightness
cp.Brightness = ToInt((cv.Statistics.Average - 35) * 1.5)
```

`cv.Statistics.Average`は取得データの平均値ですね。明るさの指定範囲は0～100なのでこの範囲に代替入ってくるのように計算します。
騒音レベルなので、静かな環境でもだいたい35dBくらいは超えきますので、0に近づけるために35を引いています。で、`ToInt()`で整数化し、`1.5`を掛けてるのは、100dBくらいのときにだいたい100に近くなるようにです。めちゃめちゃざっくりとした計算なので、本格的にやりたい方はちゃんと計算してください。これだとまぁ、マイナスにも100を超えることもあるので、それだとエラーになります。まぁそれでもそのうち範囲内に戻るかなと。

## トリガーの設定
最後はトリガーですね。タイマーでもいいんですが、まぁ、データが来たときだけ動くようにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/5f9fddea-f1e6-f557-36f9-5ccf4b2c0372.png)
エリア、レイヤーを指定して、任意の値で動くように。アクションは先程作ったアクションを指定します。

# 試してみる
静かな状態が左。騒音が大きくなってくると右のように明るくなりました。う～ん、正直微妙。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3b33b74a-739c-0b63-6a12-168ff0b40ce5.png)

# 改良版
なので、音が小さいときは消すことに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/579efec3-ad85-b2c2-e355-2241d6e5378c.png)

cp.Onを騒音レベルに合わせてオン・オフするようにしてみました。これなら、ある程度以下はバシッと消えます。

```cp.On
cp.On = cp.Brightness > 20
```

この方がメリハリがあっていいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/92b9a47b-ec22-34eb-6e00-640a0615c6d6.png)

# 考察
さてさて、まぁ、やってはみたものの、正直あまり使えるものではないかなぁと。

* 飲み屋の環境ではそもそもざわついている
* どこの席での会話か拾いづらい
* そもそも普通の会話でもそこそこ騒音レベルは上がるので閾値が難しい

さらに、CO2と組み合わせるとどうなのかなぁとも思いましたが、そもそもCO2レベルと騒音レベルの相関というか、CO2が低くても騒いでいたら感染対策にはならないよねとか、CO2が高ければ静かでも換気したほうがいいよねとかいろいろあるので。。。
というわけで、これ、本来ざわついちゃいけない式場とかそういうときになんとなく静かにしてねって促すのに使うのがいいんではなかろうかと思った次第です。ゴルフのグリーンのところで「お静かに」って看板出すみたいな、ああいうのね。

# 参考
* [Gravio][]
* [Sensor Data DBコンポーネント][Gravio-SensorDataDB]
* [Statisticsコンポーネント][Gravio-Statistics]
* [Gravio Matrixコンポーネント][Gravio-Matrix]

[Gravio]:https://www.gravio.com/jp
[Gravio-Matrix]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/gravio-matrix
[Gravio-SensorDataDB]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/sensordb-recent
[Gravio-Statistics]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/statistics