本記事では、過去に御紹介したエッジコンピューティングデモシステムで活用している機能の一つ、クラウド及びSNSとの連携例を御紹介します
まずは全体の構成のおさらいです

EPC1台でパンチングマシンの制御と、情報を集約してAWSに伝えるエッジ処理の両方を行っています
制御にはラダー言語とST言語、データ処理ではNode-RED、データ収集でInfluxDB、データ表示でChronografを使用し、最終的にはAWS(Amazon Web Services)を介してSlackにメッセージを送る形で情報をユーザーに伝えます
画面左上:FischerTechnikパンチングマシーン
画面左下:Slackコンソール
画面右 :chronografコンソール
動作回数が100回に達した際に、Slackへのメッセージ発出を行います
全体の流れは、初回の記事(エッジコンピューティングデモ)を御参照下さい
それでは、「3.制御データからの情報抽出とユーザーへの通知」について説明します

クラウド(AWS)で情報を遠隔端末(Slack)に通知
データベース情報の読み出しと事象発生の検出
こちらが、InfluxDB(時系列データベース)に格納されている制御データ元に条件判断を行い、必要な場合にのみAWSにメッセージを送出するNode-REDフローです

このフローは、GitHubのプロジェクトを参考にして作成しています

弊社製品ページ(EPC1502/1522)のドキュメント「EPC 1502およびEPC 1522ソフトウェアマニュアル:4118_en_A.pdf」にも、Node-REDを使ったソフトウェア作成に関する記載があります


GitHubからサンプルコードをダウンロードし、Node-REDエディタに展開します
詳細な手順は、前回記事(エッジコンピューティングデモ:その2 データベース編)を御参照下さい



右側上部に各種クラウド接続用ノードがありますが、GCP(Google Cloud Platform)およびAzure用のノードは今回使用しません
サンプルプロジェクトのFunction inject to influxノードを編集し、クエリを作成します
今回は「動作回数」の最新値を対象として読み出します

influxdb inノードにセットする内容は前回と同様です

ここからの処理はサンプルプロジェクトには無い、条件判定と分岐処理を新規に追加します
influxdb inノードの次に、読み出したデータの条件判定処理を追加します
ここでは、InfluxDBから読み出した値が「100」に到達した初回のみ分岐用のトリガをセットしています

次に、switchノードを追加します
ここでは、前のノードでセットされたトリガ情報により処理を分岐します

条件が揃った場合は①のjoinノードへ、その他の場合は②に進みます

AWSへのメッセージ送信
次に、条件分岐後の処理(AWSへのメッセージ送信)について説明します
サンプルプロジェクトのjoinノードのメッセージパーツ受信数を変更します

最後に、このフローの動作を設定します
先頭のinjectノードで動作条件を定義します

Slackへのメッセージ発出
最後に、AWSからSlackにメッセージを送出する処理を実装します
ここからの作業は、AWSコンソール側で行います
AWS IoT Coreコンソールにアクセスします

ルールを作成します

ルールクエリステートメントを設定します

ここでは、先程mqtt outノードに設定したトピック名を使用します

アクションを追加します

「メッセージデータを渡すLambda関数を呼び出す」を選択し、アクションの設定を行います

ここで、Slackへのメッセージ送出を行うLambda関数を作成します

関数の名前を入力し、使用する言語を選択します。今回はPython 3.8を使用しています

関数を作成したところで、IoT Coreコンソールのアクション設定に戻ります

Lambda関数を選択します


アクションを追加し、ルールの作成を完了します


Lambdaダッシュボードにアクセスします


関数を編集します


以下が、参考用のコードです
from __future__ import print_function
import json
import boto3
import urllib.request
def lambda_handler(event, context):
eventText = json.dumps(event)
message = '動作が規定回数に達しました'
send_data = {
"username": "EPC1522",
"icon_emoji": ":loudspeaker:", #規定回数
"text": message,
}
send_text = "payload=" + json.dumps(send_data)
# URLにはご自分のWebhook URLを入力してください
request = urllib.request.Request(
"https://hooks.slack.com/services/***********/***********/****************",
data=send_text.encode('utf-8'),
method="POST"
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode('utf-8')
コード入力後にDeployします

トリガーを追加します

AWS IoTを選択

IoTタイプ、ルールを選択し、トリガーを追加します

トリガーが追加されました

これで、AWSからSlackに通知(メッセージ)が送出されます

以上です