[AWS IoT SiteWise]
1 はじめに
CX事業本部製造ビジネステクノロジー部の平内(SIN)です。
AWS IoT SiteWise のドキュメントの「データ取り込みを設定」では、disassociated-data-storageについて記述があるのでが、ちょっと上手く理解できなかったので、 少し試してみました。
2 disassociatedDataStorage
AWS IoT SiteWise ストレージの現在のdisassociatedDataStorage の設定値については、describe-storage-configurationで確認できます。
% aws iotsitewise describe-storage-configuration
{
"storageType": "SITEWISE_DEFAULT_STORAGE",
"disassociatedDataStorage": "ENABLED",
"configurationStatus": {
"state": "ACTIVE"
}
}
disassociatedDataStorageの設定値には、DISABLED及び、ENABLEDがありますが、それぞれの動作は以下のとおりです。
disassociatedDataStorage | モード名 | 動作 | 備考 |
---|---|---|---|
DISABLED | associated mode | アセットプロパティに関連付けられたデータストリームのみデータストアに受けいれる | |
ENABLED | disassociated mode | アセットプロパティに関連付けに関係なくすべてのデータストリームをデータストアに受けいれる | デフォルト値 |
2種類の設定値があるのですが、2021/11/24以降、デフォルト値がENABLEDになっていて、DISABLEDには変更できないようです。
% aws iotsitewise put-storage-configuration \
--storage-type SITEWISE_DEFAULT_STORAGE \
--disassociated-data-storage DISABLED
An error occurred (InvalidRequestException) when calling the PutStorageConfiguration operation: The only accepted value for DisassociatedDataStorage field is ENABLED
また、ドキュメントに記載されている、[設定]の階層下の[データ取り込み]は、そのメニューが表示されていませんでした。
3 disassociated mode
disassociatedDataStorageが、ENABLEDとなっている場合、 アセットプロパティに紐づかないデータも、すべてSiteWiseの時系列データベースに保存されるということなので、その状況を確認してみました。
下記は、batch_put_asset_property_valueを使用して、エリアス指定でSiteWiseにデータを送信しているプログラムです。
batch_put_asset_property_valueでは、アセットIDとプロパティIDを指定して、アセットに紐づいたデータを送信することもできますが、ここでは、エリアスだけを指定しています。
1秒毎に3回だけランダムな数値を送信しています。
import boto3
from uuid import uuid4
import random
import time
from datetime import datetime
def put_asset(client, property_alias, value):
client.batch_put_asset_property_value(
entries=[
{
"entryId": str(uuid4()),
"propertyAlias": property_alias,
"propertyValues": [
{
"value": {"doubleValue": value},
"timestamp": {
"timeInSeconds": int(datetime.now().timestamp()),
"offsetInNanos": 0,
},
"quality": "GOOD",
}
],
}
]
)
def main():
client = boto3.client("iotsitewise")
counter = 3
wait_sec = 1
for _ in range(counter):
put_asset(client, "Sample_1", random.uniform(0, 100))
put_asset(client, "Sample_2", random.uniform(0, 100))
time.sleep(wait_sec)
if __name__ == "__main__":
main()
上記プログラムを実行したあと、コンソールのデータストリームでは、このデータの最終更新日を確認できます。
また、list_time_seriesでは、timeSeriesTypeが、DISASSOCIATEDとなったデータとして列挙され、get_asset_property_value_historyで、時系列のデータを取得できます。
import boto3
import datetime
client = boto3.client("iotsitewise")
def list_time_series(timeSeriesType):
max_results = 250
summaries = []
key = "TimeSeriesSummaries"
response = client.list_time_series(
maxResults=max_results, timeSeriesType=timeSeriesType
)
if key in response:
summaries = summaries + response[key]
while True:
if not "nextToken" in response:
break
response = client.list_time_series(
nextToken=response["nextToken"],
maxResults=max_results,
timeSeriesType=timeSeriesType,
)
if key in response:
summaries = summaries + response[key]
return summaries
def get_asset_property_value_history(alias):
history = []
max_results = 1000
key = "assetPropertyValueHistory"
response = client.get_asset_property_value_history(
maxResults=max_results, propertyAlias=alias
)
if key in response:
history = history + response[key]
while True:
if not "nextToken" in response:
break
response = client.get_asset_property_value_history(
nextToken=response["nextToken"], maxResults=max_results, propertyAlias=alias
)
if key in response:
history = history + response[key]
return history
def main():
summaries = list_time_series("DISASSOCIATED")
for summarie in summaries:
if "alias" in summarie:
if summarie["alias"].startswith("Sample_"):
alias = summarie["alias"]
print("alias: {}".format(alias))
history = get_asset_property_value_history(alias)
for data in history:
timeInSeconds = data["timestamp"]["timeInSeconds"]
timestamp = datetime.datetime.fromtimestamp(timeInSeconds)
value = data["value"]
print("{} {}".format(timestamp, value))
if __name__ == "__main__":
main()
% python3 index.py
alias: Sample_1
2024-01-23 01:25:41 {'doubleValue': 74.37977791887853}
2024-01-23 01:25:43 {'doubleValue': 55.1891373855083}
2024-01-23 01:25:44 {'doubleValue': 54.78059871389871}
alias: Sample_2
2024-01-23 01:25:42 {'doubleValue': 82.5442431812442}
2024-01-23 01:25:43 {'doubleValue': 17.590713341138}
2024-01-23 01:25:44 {'doubleValue': 29.010846096747088}
4 最後に
AWS IoT SiteWise のランニングコストしては、データ量が比較的大きく影響すると思うのですが、アセットのプロパティに紐づかないデータは、SiteWise Monitorでも表示できないため、ある意味無駄なデータとなってしまいます。
ゲートウエイを使用して、OPC-UAサーバから簡単にデータ取得することが可能ですが、特にフィルタしない場合、OPC-UAサーバで管理されるオブジェクトツリーのすべてのデータが、alias でSiteWiseの時系列データベースに保存されてしまうので、ちょっと注意が必要そうです。