konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

サーモセンサーと KPSで可視化

ラズパイでサーモセンサーからデータがとれたので
ラズパイとサーモセンサーで遊ぶ - konchangakita
いつものようにラズパイと KPS との連携をしてみます
なるべく KPS の特性を活かすべくラズパイ側ではセンサーデータを送信するだけにして、KPS 上の Function / Kubernetes Apps で可視化させます
(この方がたくさんのセンサーとつないだときに、なんらか処理を追加するのも一括でアップデートできるしね)

<やることイメージ図>
f:id:konchangakita:20201213161908p:plain

=環境=======
Raspberry Pi 4 Model B Rev 1.2
Raspbian kernel 5.4
python 3.7.3
KPS v2.1.0
=========

ラズパイの設定

AMG8833サーモセンサラズパイカメラを接続したラズパイ上に Python プログラムを設置して、MQTT で Pub/Sub します
f:id:konchangakita:20201213160208j:plain

Python 環境の準備

Python のモジュールのインストール
 ・AMG8833サーモセンサ用: adafruit-blinka, adafruit-circuitpython-amg88xx
 ・MQTT用: paho-mqtt

MQTT の証明書を、KPS の Data Sources の登録の際に入手して設置します(後述)

├── mqtt-cert
│ ├── CACertificate.crt
│ ├── certificate.crt
│ └── privateKey.key
└── thermosensor.py

KPS へ送信する情報

ラズパイから MQTT で送信するデータは、大きく2つでサーモセンサーの温度データとラズパイカメラの画像データになります
・サーモセンサー
sensordata:8 x 8 の温度マップデータ
sensordata_t1d:Node-RED の ヒートマップ用に 1次元に変換
max_temp:一番高い温度、体温として表示する

・ラズパイカメラ
画像データ(320x240)を base64エンコードして送信

ラズパイ上の Python プログラム全体

温度データを転置して1次元に変換しているところがちょっと特殊です
MQTT トピック名は、
 ・サーモセンサーデータを 「data/thermo
 ・ラズパイカメラ画像を「data/image」
1秒ごとに MQTT で Publish


KPS データプイプライン設定

f:id:konchangakita:20201213185033p:plain

KPS へ Data Source 登録

まずはラズパイを KPS の Data Source として登録します
f:id:konchangakita:20201213184628p:plain

サーモセンサ トピック名: data/thermo
ラズパイカメラ トピック名: data/image
カテゴリ: Data Type: Thermo

データパイプラインの作成

今回は、Function は一旦無しでスルーで Node-RED へまたMQTTへとばしちゃう
f:id:konchangakita:20201213190258p:plain


KPS Kuberenetes Apps の Node-RED に接続

いつもの KPS 上に展開している Node-RED に接続し、ノードを組み合わせていきます

「MQTT受信」ノードで KPS Service Domain の IPアドレス:1883 を指定
MQTT 用の証明書もラズパイと同様に TLS設定に設置しておきます
f:id:konchangakita:20201213191302p:plain

サーモセンサ可視化

サーモセンサーから送信されてくる温度情報をヒートマップで可視化して、温度も表示します
f:id:konchangakita:20201213200942p:plain

温度表示に 「Functtion」ノードで max_temp を適切な数値調整して表示
f:id:konchangakita:20201213200657p:plain

ヒートマップの表示には、1次元の配列である必要であるため(heat mapノードの仕様) payload.sensordata_t1d「Change」ノードで payload へ代入し、「heat map」ノードへ送る
f:id:konchangakita:20201213201044p:plain

これでばっちしサーモセンサからヒートマップ可視化ができました
f:id:konchangakita:20201213202750p:plain

ラズパイカメラの画像を表示

Base64エンコードされたラズパイカメラの画像をただ表示するだけなので簡単です
f:id:konchangakita:20201213202845p:plain

ラズパイカメラの 「MQTT受信」ノード
f:id:konchangakita:20201213203359p:plain

「template」ノードで、base64デコードして画像として表示させる
f:id:konchangakita:20201213204105p:plain


これで可視化ほぼ完成
f:id:konchangakita:20201213204722p:plain

サーモセンサとラズパイカメラの位置関係はこんな感じ
サーモセンサーと手は5センチくらい?
f:id:konchangakita:20201213205651p:plain

距離センサーと組み合わせて、「特定の距離で温度が測定できたら表示する」とかにすれば、最近よく巷で見かける非接触体温測定機ができちゃいそうです
今まで作ってきたKPSアプリと組み合わせたら、アイデア次第で入退室管理+マスク検知+密検知して、全部エッジ環境に保存とか今まで作ったもので「何か」出来そう
どっかKPSのライセンス料払って置かせてくれないかな(笑)

Node-RED のフロー全体

f:id:konchangakita:20201213190909p:plain

[{"id":"fecb278d.e7c9e8","type":"template","z":"c12ca503.8449e8","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<center>\n    <img src=\"data:image/jpg;base64,{{{payload}}}\">\n    <br><b1><i>raspi camera</i></b1>\n</center>","output":"str","x":438.5,"y":478,"wires":[["78f1b96c.9cb0d8"]]}]



最後に

実際やったこと自体は、MQTT で ラズパイと Node-RED と繋いだだけですが、Function で AI 推論を噛ましてオブジェクト認識やら解析したりなど、やりたいことを後から管理下にある IoT エッジシステム全体に簡単に追加していくことができます
AI/IoT は数とアイデア勝負なので、どんどん新しいアイデアが出てカタチにするときに既存の環境を簡単に一斉にアップデートできる環境って結構重要ってことですね