目次
はじめに
こんにちは、omkです。
前回はIoT Sitewiseに連携されたOPC UAのデータを元にダッシュボードとアラームの設定をしました。
AWS IoT SiteWise Monitorのダッシュボードでアラームを可視化!!(前)
AWS IoT SiteWise Monitorのダッシュボードでアラームを可視化!!(後)
今回は連携されたデータを元にLambdaを実行してみます。
シリーズ
PythonでOPC UAで通信してみた
AWS IoT SiteWiseとOPC UAサーバをセルフホストゲートウェイで連携!!
AWS IoT SiteWise Monitorのダッシュボードでアラームを可視化!!(前)
AWS IoT SiteWise Monitorのダッシュボードでアラームを可視化!!(後)
AWS IoT SiteWiseでデータの連携時にLambdaを実行!! ←今ここ
やってみた
Lambdaを実行する方法にも色々あります。
例えば連携データすべてにLambdaを噛ます場合は対象アセットのプロパティでMQTT通知を有効化することで実現出来ます。
アラームが上がったときだけ実行したいのであればアラームのアクションにLambdaを追加することで実現出来ます。
今回はこの2種類をそれぞれやってみようと思います。
前提条件
OPC UAサーバからIoT SiteWiseにデータを連携し(IoT Greengrassでエッジゲートウェイをデプロイしています)、連携されたデータをもとにLambdaを実行し、OPC UAサーバに何かしらのフィードバックする内容で検証してみます。
直接的に内容にはそれほど関係ありませんが、SiteWiseのアセットの構成としては以下になっています。
root/
└── Clients
├─ Client_A
│ ├─ CPU_USAGE
│ ├─ MEM_USAGE
│ └─ SWAP_USAGE
│
└─ Client_B
├─ CPU_USAGE
├─ MEM_USAGE
└─ SWAP_USAGE
MQTT通知の場合
アセットのプロパティから「MQTT通知ステータス」をアクティブに変更します。
これでIoT CoreのMQTTトピックに連携されるようになりました。
テストクライアントでサブスクライブしてみたところ、正常にSiteWiseに連携したデータが通知されているのがわかります。
ファーマットとしては以下のような内容になります。
詳細→アセットプロパティ通知メッセージのクエリ
{
"type": "PropertyValueUpdate",
"payload": {
"assetId": "cf73bc7f-6d06-4ba8-afde-bae6d8cad036",
"propertyId": "2dfc3f0f-f53b-48ce-8f6a-91b676e2e73f",
"values": [
{
"timestamp": {
"timeInSeconds": 1733895618,
"offsetInNanos": 23000000
},
"quality": "GOOD",
"value": {
"doubleValue": 17.8
}
}
]
}
}
valuesは連携データの頻度によっては複数の値が配列にまとめられる場合もあります。
これに対してIoT ルールを設定していきます。
今回特にユースケースを考えていないのでテキトーなルールを設定します。
Lambdaのeventにも同じフォーマットで入ってきます。
が、event内容はお構いなしに特定のトピックにパブリッシュするLambda関数を作成しました。
import json
import boto3
iot = boto3.client('iot-data')
topic = 'opcua/server'
def lambda_handler(event, context):
# TODO implement
try:
iot.publish(
topic=topic,
qos=0,
payload="test"
)
except Exception as e:
print(e)
このトピックをOPC UAサーバでサブスクライブします。
値が連携されるたびにtestの文字がパブリッシュされていることがわかりました。
アラームから実行する場合
モデルのアラームのところから「アラーム状態のアクションの追加」でアクションを追加できるのでLambdaを選択して実行するLambdaを選択します。
アラームのステータスが変更されたタイミングで実行されるようです。
ACTIVE→LATCHED→NORMALと遷移するたびにLambdaが実行されます(承認フローありの場合)。
デフォルトのペイロードで通知を実施した場合には以下のようなフォーマットでLambdaにeventが渡されます。
{
'alarmModelName': 'omk-client-model-mem-alarm_assetModel_9e2df005-08b9-401b-8bfe-426762f70fd5',
'alarmModelVersion': '2',
'alarmState': {
'stateName': 'ACTIVE',
'ruleEvaluation': {
'simpleRule': {
'inputProperty': 81.7,
'operator': 'GREATER_OR_EQUAL',
'threshold': 80.0
}
}
},
'keyValue': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036',
'stateUpdateTime': 1733817814639
}
フォーマットはカスタムすることも可能です。
先ほどのLambdaで確認し、testの文字がアラームのステータスの変更に合わせてパブリッシュされていることを確認しました。
おわりに
Lambdaを挟めば何でもできるので(暴論)最適なかたちで連携できるようにしておきたいですね。
以上、最後までお付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!