🏠

SORACOM Lagoon で自宅の間取り図上に温湿度を表示する

2021/12/22に公開

これは 株式会社ソラコム Advent Calendar 2021 の 22 日目の記事です。昨日は @kengon による BPF で SCTP の監視ツールを作ってみている話 でした。ソラコムの深淵を覗き見ることができる記事ですね。@kengon の記事にも記載がありましたが、本日 12 月 22 日 20 時から エンジニア向け会社説明会 もありますので、興味のある方はぜひお申し込みください。

さて、本格的に寒くなってきて、みなさんも自宅の温度や湿度が気になって仕方がないですよね。自宅の間取り図に各部屋の温湿度が表示されていればいいのに、などと思ったことも、一度や二度ではないでしょう。私もです。

そこで、手持ちのものを活用して、自宅の間取り図に温湿度を表示してみました。


私の自宅 (2F) の間取り

使ったものは以下の通りです。

どれもみなさんの手元にあるようなものばかりですね。早速やってみましょう。

温湿度を計測する

まずは温湿度を計測しなければ始まりません。私の部屋には SwitchBot 温湿度計があったので、これを使います。SwitchBot 温湿度計の良いところは、値段が安く、通信仕様が公開されているところです。

通信仕様は Meter BLE open API として公開されています。これをもとに、Raspberry Pi で温湿度を取得できます。というわけで、温湿度計から温湿度と残バッテリーを JSON 形式で出力するだけの CLI ツールを作りました。

https://github.com/hara/switchbot-meter

温湿度計の MAC アドレス (aa:bb:cc:dd:ee:ff の部分) を指定して実行すると、JSON 形式で標準出力に出力します。MAC アドレスは SwitchBot のスマートフォンアプリで確認できます。

$ curl -O https://github.com/hara/switchbot-meter/releases/download/v0.1.0/switchbot-meter_0.1.0_linux_armv7.tar.gz
$ tar xvzf switchbot-meter_0.1.0_linux_armv7.tar.gz
$ sudo cp switchbot-meter_0.1.0_linux_armv7/switchbot-meter /usr/local/bin
$ sudo switchbot-meter -a aa:bb:cc:dd:ee:ff
{"addr":"aa:bb:cc:dd:ee:ff","bat":100,"temp":23.8,"humi":50,"ts":1639840189947}

BLE の届く範囲内に温湿度計をたくさん設置して、一台の Raspberry Pi で温湿度を集めたかったのですが、今回はお金と時間の都合で温湿度計はひとつです。

この記事ではこのツールは主役ではないので、内容については触れません。もっと手軽に温湿度を計測したい人には GPS マルチユニット SORACOM Edition をオススメします。
https://soracom.jp/store/5235/

温湿度を SORACOM Harvest Data に送信する

次はこの温湿度を SORACOM Harvest Data に送信します。今回は SORACOM Arc を使って温湿度を送ります。SORACOM Arc を使えば SORACOM の SIM なしで SORACOM のサービスを利用可能です。

最初に、Raspberry Pi に SORACOM Arc をセットアップする必要がありますが、こちら に手順がありますので説明は省略します。これで SORACOM Arc のバーチャル SIM が作られます。

次に、SORACOM Arc のバーチャル SIM で SORACOM Harvest Data を有効化します。SIM グループを作成し、SORACOM Harvest Data 設定を ON にしてバーチャル SIM をグループに所属させます。詳しい手順は こちら にあります。

最後に、温湿度を SORACOM Harvest Data に送信します。SORACOM Harvest Data のエンドポイントまたは Unified Endpoint に JSON を POST するだけです。今回は Unified Endpoint を使用しています。

このとき、SORACOM Lagoon で使いやすいように JSON を jq で加工してから送信しています。元の JSON は以下のような形式です。

{
    "addr":"aa:bb:cc:dd:ee:ff",
    "bat":100,
    "temp":23.8,
    "humi":50,
    "ts":1639840189947
}

これを以下のような形式に加工しています。

{
    "aa:bb:cc:dd:ee:ff": {
        "bat":100,
        "temp":23.8,
        "humi":50,
        "ts":1639840189947
    }
}

aa:bb:cc:dd:ee:ff は温湿度計の MAC アドレスで、温湿度計を識別するために使っています。なぜこのような変換をしているかについては、この後説明します。

また、SORACOM Harvest は x-soracom-timestamp ヘッダの値 (UNIX タイムスタンプミリ秒) をデータの作成日時として取り扱ってくれるため、これも設定しています。

あとはこのシェルスクリプトを cron や systemd で定期的に実行するだけです。今回は systemd の timer を使いました。systemd の設定ファイルのサンプルを置いておきます。

上記のファイルを /etc/systemd/system に配置します。temperature-humidity-monitor.service の YOUR_METER_MAC_ADDRESS は自分の温湿度計の MAC アドレスに変更します。以下のコマンドを実行すると、15 分おきにコマンドが実行されるようになります。

$ sudo systemctl enable temperature-humidity-monitor.timer
$ sudo systemctl start temperature-humidity-monitor.timer

しばらく待つと SORACOM Harvest Data の画面でデータが確認できました。

SORACOM Lagoon で間取り図に温湿度を表示する

最後に本題の間取り図表示です。SORACOM Lagoon を使います。

Soracom Dynamic Image

SORACOM Lagoon には様々な種類の可視化 が用意されていますが、間取り図を表示するために Soracom Dynamic Image を使います。

Soracom Dynamic Image を使うと、Harvest Data に格納されたデータから画像の URL を生成し、表示できます。例えば、温度 20℃、湿度 40% の場合、https://example.com/20-40 の画像を表示するといったことが可能です。ということは、URL で温湿度を受け取って、間取り図に合成して画像を返却する API を用意すれば良いということですね。

Query で温度と湿度を取り出す

では SORACOM Lagoon を設定していきます。Dashboard に Panel を追加し、Query を以下の図のように設定します。

switchbot-meter は SORACOM Arc のバーチャル SIM です。上記によって、Query A はバーチャル SIM に蓄積されたデータから dc:7b:xx:xx:xx:xx.temp を選択します。これは、上記で加工した JSON の temp 属性を指しています。

{
    "dc:7b:xx:xx:xx:xx": { 
        "bat":100,
        "temp":23.8, // ネストした属性はドットで連結されるため、dc:7b:xx:xx:xx:xx.temp はこの属性を指しています
        "humi":50,
        "ts":1639840189947
    }
}

JSON を加工して送信したことにより、Query A は特定の温湿度計の温度を取り出すことができます。加工せずに送信していたら、全ての温湿度計の温度を取り出すことしかできませんでした。同様に、Query B に湿度 (dc:7b:xx:xx:xx:xx.humi) を指定します。

間取り図生成用の API を用意する

以下のような URL で温湿度を受け取り、間取り図上に温湿度を描画した画像を生成する API を用意します。

https://example.com/render/{部屋1の温度}-{部屋1の湿度}

本来は以下のように複数の部屋に対応したいわけですが、今回は一部屋のみです。

https://example.com/render/{部屋1の温度}-{部屋1の湿度}-{部屋2の温度}-{部屋2の温度}...

API は AWS Lambda と Amazon API Gateway で作りました。詳細な説明は省きますが、用意した間取り図の画像に、温度と湿度のテキストを合成しているだけです。AWS SAM テンプレートも用意していますので、ご自身の AWS アカウントにデプロイいただけます。
https://github.com/hara/soracom-lagoon-room-heatmap-sample

上記には私の家の間取り図 (floormap.png) が含まれていますが、ご自身の間取り図に差し替えて、温湿度の描画位置を調整すれば、みなさんの自宅も表示できるでしょう。このあたり を変えると、温湿度の描画位置が変わります。

間取り図画像の作成には、ブラウザで利用できる無料のドローツール diagrams.net を使いました。とても便利ですね。

API を Soracom Dynamic Image に設定する

さて、API をデプロイして、以下のエンドポイントが発行されたとします。

https://my-comfortable-home.execute-api.ap-northeast-1.amazonaws.com

この API を Soracom Dynamic Image に指定します。Panel の Visualization に Soracom Dynamic Image を選択し、Settings を以下のようにします。

  • Background
    • プレフィックスは https://my-comfortable-home.execute-api.ap-northeast-1.amazonaws.com/render/
    • サフィックスは空
  • Keep Aspect Ratio
    • 縦横比が崩れると家の形が変わってしまいますので、 オンにしておくと良いでしょう。
  • Use Basic Authentication
    • 今回は設定していませんが、本格的に使う場合はオンにして、家に鍵をかけておきましょう。

最後に、URL に含めるする変数部分の設定です。変数は温度と湿度の 2 つです。

Variable 0 には Query A (温度) を指定します。温度をそのまま URL に含めたいので、Round value はオフにします。同様にして、Variable 1 には Query B (湿度) を指定します。

うまく設定できていれば、これで冒頭のような間取り図が表示されるでしょう。おめでとうございます。他にも、色んなパネルを追加したり、アラームを設定したりすると楽しいですよ。

まとめ

SORACOM Lagoon を使って間取り図に温湿度を描画してみました。温湿度計を買い足して、SORACOM Dynamic Image の変数を増やしていけば、全部屋の温湿度を描画できそうです。また、単純に数字を描画するだけでなく、温度によって色を変えればヒートマップも作れそうですね。

クリスマスセールで SwitchBot 温湿度計も安くなっていますので、冬休みの自由研究にいかがでしょうか。それでは皆さん、良いお年を。

Discussion