You dont have javascript enabled! Please enable it!
RaspberryPi

コンテキスト・コンシューマ型の FIWARE 対応 IoT デバイス (Rapsberry Pi)

本記事では、温度の情報を 液晶ディスプレイ (LCD) に表示する、コンテキスト・コンシューマ型の FIWARE 対応 IoT デバイス を作成します。温度は、Orion Context Broker に保持されている WeatherObserved 型エンティティの temperature 属性から取得します。その方法は、定期的に値を取得するポーリングのような同期方式ではなく、温度のコンテキスト情報の更新をサブスクライブすることで、温度に変化があった場合に通知を受ける、非同期方式です。

WeatherObserved 型のエンティティの情報を提供するデバイスは、以前の記事で作成したコンテキスト・プロデューサ型の FIWARE 対応 IoT デバイスを利用します。

Context Consumer (CC) とは

Context Consumer(CC)、つまり、コンテキストの消費者は、コンテキスト情報を利用する、コンテキスト・ベースのアプリケーションです。CC は、Context Broker (CB) にリクエストを送信し、コンテキスト情報を取得したり、特定のインタフェースを介して Context Producer (CP) を直接呼び出すことができます。CC が情報を取得するもう1つの方法は、特定の条件に一致するコンテキスト情報の更新をサブスクライブすることです。例えば、特定のエンティティのセットに関連する情報をサブスクリプションすることです。CC は、目的のためにサブスクリプションにコールバック操作を登録するので、CB は、このコールバック機能を呼び出すことによって、コンテキストに関連する更新について、CB から CC に通知します。

前提条件

次の環境が必要となります。

  • FIWARE Orion が稼働する Linux サーバ環境
  • Raspberry Pi (i2c, spi を有効化)
  • 環境センサ Enviro for Raspberry Pi (Pimoroni)
  • git, curl, jq コマンド

FIWARE Orion, WireCloud が稼働する環境の構築方法は、「WireCloud のセットアップ」の記事を参照ください。Raspberry Pi の種類は、Raspberry Pi Zero WH, 3, 4 等です。Raspberry Pi 4 を使用すると、FIWARE Orion と 環境情報を収集するプログラムを1台で稼働できます。環境センサの Enviro は、発売元の Pimoroni から購入するか、国内では秋月電子通商、スイッチサイエンス等から購入できるようです。

ソースコード

使用するソースコードは、Github の https://github.com/lets-fiware/lets-fiware.tutorials から入手できます。git コマンドで、リポジトリをクローンして、”raspberrypi/03.context-consumer” ディレクトリに移動してください。

git clone https://github.com/lets-fiware/lets-fiware.tutorials.git
cd ./lets-fiware.tutorials/raspberrypi/03.context-consumer

システム構成

Raspberry Pi で動作する、コンテキスト・コンシューマおよび、コンテキスト。プロデューサと、サーバで動作する Orion Context Broker です。

サーバ環境の作成

docker-compose ファイル

Orion, WireCloud は、Docker コンテナを利用して、サーバ上にデプロイします。クローンしたリポジトリには、x86_64 (amd64) 用 と Raspberry Pi (aarch64) 用の dokcer-compose.yml ファイルがあります。環境に応じて、以下の設定を行います。

x86_64 (amd64)

ln -s docker-compose-arm64.yml docker-compose.yml

Raspberry Pi (aarch64)

ln -s docker-compose-aarch64.yml docker-compose.yml

Docker コンテナの起動

Linux サーバで、次のコマンドを使用して Docker コンテナを起動します。これで、Orion に関連する一連のコンテナが実行されます。

docker-compose up -d

環境変数の設定

Raspberry Pi で Orion にアクセスするための環境変数を設定します。コンテナが稼働するサーバの IP アドレスを 192.168.1.1 として説明しています。環境に合わせて、値を変更してください。

export ORION_URL=http://192.168.1.1:1026

正常性の確認

Raspberry Pi から Orion のバージョンを取得するクエリを実行して、正しくデプロイされたことを確認してください。

GET /version

次のコマンドを実行して、レスポンスが返ってくることを確認してください。

./00.version.sh

コンテキスト・コンシューマ型の IoT デバイスの作成

先ほど説明した、サブスクリプションとノーティフィケーション (通知)を受信の仕組みを コンテキスト・コンシューマに実装することで、デバイスは、温度に変化があったときに、温度値を含む通知を受け取り、LCD に 温度値を表示できます。

プログラム全体

Pythonで記述されたプログラムで、サブスクリプションを作成する処理と、Orion からノーティフィケーションを受け取るエンドポイントを提供する Http サーバの処理から構成されています。

温度情報のサブスクライブ

プログラムでは、コンテキスト・コンシューマが温度の変化の通知を受けるために、Orion にサブスクライブのリクエストを行っています。

POST /v2/subscriptions

Orion へのサブスクライブのリクエスト

例えば、次のようなサブスクリプションを設定すると、WeatherObserved 型のエンティティである、urn:ngsi-ld:WeatherObserved:sensor001 の temperature 属性値が変化したときに、Orion が http://192.168.1.2/ に通知を行います。

コンテキスト・コンシューマの実行

Docker コンテナ内での実行

Docker コンテナ・イメージの取得

コンテキスト・コンシューマ用コンテナ・イメージを Docker Hubから取得します。次のコマンドで、fisuda/context-consumer01 という名前のコンテナ・イメージを取得できます。

./pull.sh

Docker コンテナのビルド

コンテキスト・コンシューマ用コンテナ・イメージをビルドする場合、次のコマンドを実行します。fisuda/context-consumer01 という名前のコンテナ・イメージが作成されます。

./build.sh

コンソールの出力

次のコマンドでコンソールの出力を確認できます。

./logs.sh

コンテナの停止

以下のコマンドで、コンテナを停止できます。

./stop.sh

Linux OS 上で直接実行

Raspberry Pi OS 上で直接実行したい場合や Raspberry Pi Zero WH で実行する場合、次のコマンドを実行します。

sudo apt -y install python3 python3-pip zlib1g-dev libjpeg-dev
pip3 install numpy RPI.GPIO ST7735 pillow paho-mqtt requests fonts font-roboto
python3 context-consumer.py

温度を LCD に表示

コンテキスト・プロデューサの起動

WeatherObserved 型のエンティティ “urn:ngsi-ld:WeatherObserved:sensor001” の温湿度、気圧の属性値を定期更新するため、Raspberry Pi でコンテキスト・プロデューサを起動します。起動方法は、「Raspberry Pi を使った FIWARE 対応 IoT デバイス の作成 – コンテキスト・プロデューサ」の記事を参考にしてください。

コンテキスト・コンシューマの起動

Raspberry Pi でコンテキスト・コンシューマのプログラムを実行するため、Docker コンテナを起動します。コンテキスト・ブローカーの Orion の IP アドレスが 192.168.1.1、コンテキスト・コンシューマのコンテナが稼働している Raspberry Pi の IP アドレスが、192.168.1.2 の場合、次の環境変数を設定します。

export ORION_URL=http://192.168.1.1:1026
export CONTEXT_PROVIDER_URL=http://192.168.1.2:8080

そして、run.sh  コマンドでコンテナを起動します。

./run.sh

コンソール出力の確認

起動直後のコンソール出力

./log.h でコンソール出力を確認すると、次のような結果が表示されます。サブスクリプションを作成して、ノーティフィケーションを受け取る Context Consumer が起動したことが確認できます。また、Location 中の “5ed090e0b10dc3f8b36b3c98” が作成したサブスクリプションの ID です。サブスクリプションの情報取得や削除時に使用します。

Orion からのノーティフィケーション

Orion からのノーティフィケーションを受けると、次のような情報が出力されます。これでノーティフィケーションを正常に受け取っていることを確認できます。

LCD の表示

LCD には、次のように温度が表示されます。

環境設定のクリーンアップ

サブスクリプションの一覧

Orion に対して、次のリクエストを実行すると、サブスクリプションの一覧が取得できます。サブスクリプションの実行状況も確認できます。

GET /v2/subscriptions

01.list-subscriptions.sh

実行結果

実行すると、次のようなレスポンスが返り、温度のサブスクリプションを確認できます。

サブスクリプションの削除

サブスクリプションの一覧で確認した、サブスクリプション ID を指定して、サブスクリプションを削除することができます。

DELETE /v2/subscriptions/{id}

上記の場合、サブスクリプション ID は、”5ed090e0b10dc3f8b36b3c98″ なので、この値を指定すると削除できます。サブスクリプションを削除すると、Orion からコンテキスト・コンシューマへの通知は行われず、LCD の温度値も更新されなくなります。

02.delete-subscription.sh

export SUB_ID=5ed090e0b10dc3f8b36b3c98
./02.delete-subscription.sh

結果

“204 No Content” のステータスが返却されると、サブスクリプションを正常に削除できています。

コンテキスト・コンシューマの停止

次のコマンドを実行することで、コンテキスト・コンシューマのコンテナを停止できます。コンテキスト・プロデューサも同じコマンドで停止できます。

./stop.sh

Let’s FIWARE Tutorialsセットアップ WireCloud のセットアップ オープンデータの可視化 避難場所のオープンデータを可視化 ...