エッジコンピューティングデモ:その3 クラウド&SNS連携編

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

まずは全体の構成のおさらいです

EPC1台でパンチングマシンの制御と、情報を集約してAWSに伝えるエッジ処理の両方を行っています
制御にはラダー言語とST言語、データ処理ではNode-RED、データ収集でInfluxDB、データ表示でChronografを使用し、最終的にはAWS(Amazon Web Services)を介してSlackにメッセージを送る形で情報をユーザーに伝えます

画面左上:FischerTechnikパンチングマシーン

画面左下:Slackコンソール

画面右 :chronografコンソール

動作回数が100回に達した際に、Slackへのメッセージ発出を行います

全体の流れは、初回の記事(エッジコンピューティングデモ)を御参照下さい

それでは、「3.制御データからの情報抽出とユーザーへの通知」について説明します

Node-REDでデータベースに格納されたデータを元に情報抽出し、クラウド(AWS)に送信
クラウド(AWS)で情報を遠隔端末(Slack)に通知

データベース情報の読み出しと事象発生の検出

こちらが、InfluxDB(時系列データベース)に格納されている制御データ元に条件判断を行い、必要な場合にのみAWSにメッセージを送出するNode-REDフローです

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

GitHub PLCnext/EdgeDevices

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

STEP
プロジェクトの準備

GitHubからサンプルコードをダウンロードし、Node-REDエディタに展開します

詳細な手順は、前回記事(エッジコンピューティングデモ:その2 データベース編)を御参照下さい

右側上部に各種クラウド接続用ノードがありますが、GCP(Google Cloud Platform)およびAzure用のノードは今回使用しません

STEP
InfluxDBからのデータ読み出し

サンプルプロジェクトのFunction inject to influxノードを編集し、クエリを作成します

今回は「動作回数」の最新値を対象として読み出します

node.send({“query”:”SELECT * from OPCUA_RUNCount GROUP BY * ORDER BY DESC LIMIT 1″,”topic”:”OPCUA_RUNCount”});

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

STEP
データ判定処理

ここからの処理はサンプルプロジェクトには無い、条件判定と分岐処理を新規に追加します

influxdb inノードの次に、読み出したデータの条件判定処理を追加します

ここでは、InfluxDBから読み出した値が「100」に到達した初回のみ分岐用のトリガをセットしています

次に、switchノードを追加します

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

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

AWSへのメッセージ送信

次に、条件分岐後の処理(AWSへのメッセージ送信)について説明します

STEP
joinノードの編集

サンプルプロジェクトのjoinノードのメッセージパーツ受信数を変更します

STEP
AWSへの送信

mqtt outノードを編集します

AWSとの接続に必要な作業は、別記事「EPC 1522をNode-REDでAWSに接続 その1 / その2」で紹介していますのでそちらを参照して下さい

STEP
動作周期の設定

最後に、このフローの動作を設定します

先頭のinjectノードで動作条件を定義します

Slackへのメッセージ発出

最後に、AWSからSlackにメッセージを送出する処理を実装します

ここからの作業は、AWSコンソール側で行います

STEP
ルールの作成

AWS IoT Coreコンソールにアクセスします

ルールを作成します

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

SELECT * FROM ‘/reach’

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

アクションを追加します

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

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

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

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

Lambda関数を選択します

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

STEP
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に通知(メッセージ)が送出されます

以上です

  • URLをコピーしました!