本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定規 AWS IoT SiteWise 則動作
AWS IoT SiteWise 規則動作會將啟動規則的MQTT郵件中的資料傳送至中的資產屬性 AWS IoT SiteWise。您可以同時將多個資料項目上傳到不同的資產屬性,以便在一則訊息中傳送裝置所有感應器的更新。您也可以針對每個資料項目一次上傳多個資料點。
注意
當您 AWS IoT SiteWise 使用規則動作將資料傳送至時,您的資料必須符合BatchPutAssetPropertyValue
作業的所有需求。例如,您的數據不能早於當前 Unix 紀元時間 7 天的時間戳。如需詳細資訊,請參閱使用 AWS IoT SiteWise
API.
針對規則動作中的每個資料項目,您需要識別資產屬性並指定時間戳記、品質,以及該資產屬性的每個資料點的值。規則動作預期會接受所有參數的字串。
若要識別項目中的資產屬性,請指定下列其中一個項目:
-
您要傳送資料到其中的資產屬性的 Asset ID (資產 ID) (
assetId
) 和 Property ID (屬性 ID) (propertyId
)。您可以使用尋找資產 ID 和屬性 ID AWS IoT SiteWise 主控台。如果您知道資產 ID,則可以使用呼叫 AWS CLI DescribeAsset來尋找屬性 ID。 -
Property alias (屬性別名) (
propertyAlias
),這是資料串流別名 (例如/company/windfarm/3/turbine/7/temperature
)。若要使用這個選項,您必須先設定您的資產屬性別名。若要了解如何設定屬性別名,請參閱將工業資料流對映至資產屬性。
對於每個條目中的時間戳記,請使用設備報告的時間戳記或提供的時間戳記 AWS IoT Core。時間戳記有兩個參數:
-
以秒為單位的時間(
timeInSeconds
)— Unix 紀元時間,以秒為單位,傳感器或設備報告數據。 -
偏移量 (以 nanos 為單位
offsetInNanos
) — (選擇性) 相對於時間的納秒偏移量 (以秒為單位)。
重要
如果您的時間戳記是字串、有小數部分或不是以秒為單位,則 AWS IoT SiteWise 會拒絕要求。您必須將時間戳轉換為秒和納秒偏移量。使用 AWS IoT 規則引擎的功能轉換時間戳記。如需詳細資訊,請參閱下列內容:
您可以針對動作中的數個參數使用替代範本,以執行計算、叫用函數,以及從訊息承載中提取值。如需詳細資訊,請參閱AWS IoT 開發人員指南中的替代範本。
注意
因為替代範本中的運算式與 SELECT
陳述式是分開計算的,所以您不能使用替代範本來參考使用 AS
子句所建立的別名。除了支援的函數與運算子以外,您可以僅參照原始承載中出現的資訊。
獲取未報告準確時間的設備的時間戳
如果您的傳感器或設備沒有報告準確的時間數據,請使用 timestamp()從 AWS IoT 規則引擎獲取當前的 Unix 紀元時間。此函數以毫秒為單位輸出時間,因此您必須將值轉換為以秒為單位的時間,並以納秒為單位的偏移量。若要這麼做,請使用下列轉換:
-
針對 Time in seconds (以秒為單位的時間) (
timeInSeconds
),使用${floor(timestamp() / 1E3)}
將時間從毫秒轉換為秒。 -
針對 Offset in nanos (以奈米為單位的位移) (
offsetInNanos
),使用${(timestamp() % 1E3) * 1E6}
計算時間戳記的奈米秒位移。
轉換字符串格式的時間戳
如果您的傳感器或設備以字符串格式報告時間數據(例如,2020-03-03T14:57:14.699Z
),請使用 time_to_epoch(字符串,字符串)。該函數輸入時間戳和格式模式作為參數,並以毫秒為單位輸出時間。然後,您必須將時間轉換為以秒為單位的時間,並以納秒為單位的偏移量。若要這麼做,請使用下列轉換:
-
對於以秒為單位的時間 (
timeInSeconds
),用${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)}
於將時間戳記字串轉換為毫秒,然後轉換為秒。 -
對於 nanos (
offsetInNanos
) 中的偏移量,用於計算${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6}
時間戳記字符串的納秒偏移量。
注意
此time_to_epoch
函數支援高達毫秒精確度的時間戳記字串。要轉換具有微秒或納秒精度的字符串,請配置規則調用的 AWS Lambda 函數以將時間戳轉換為數值。如需詳細資訊,請參閱轉換納秒精度時間戳字符串。
轉換納秒精度時間戳字符串
如果您的裝置以納秒精確度的字串格式傳送時間戳記資訊 (例如,2020-03-03T14:57:14.699728491Z
),請使用下列程序來設定規則動作。您可以創建一個 AWS Lambda 函數,將時間戳從字符串轉換為以秒為單位的時間(timeInSeconds
)和偏移量 nanos(offsetInNanos
)。然後,在規則動作參數中使用 aws_lambda (functionArn,inputJson) 來叫用該 Lambda 函數,並在規則中使用輸出。
注意
本節包含進階說明,會假設您已熟悉如何建立以下資源:
-
Lambda 函數。如需詳細資訊,請參閱AWS Lambda 開發人員指南中的建立您的第一個 Lambda 函數。
-
AWS IoT 具有規則動作的規 AWS IoT SiteWise 則。如需詳細資訊,請參閱使用規則擷取資料 AWS IoT Core。
若要建立剖析時間戳記字串的 AWS IoT SiteWise 規則動作
-
建立具有下列屬性的 Lambda 函數:
-
函數名稱 — 使用描述性函數名稱 (例如
ConvertNanosecondTimestampFromString
)。 -
執行階段 — 使用 Python 3 執行階段,例如 Python 3.11 (
python3.11
)。 -
權限 — 建立具有基本 Lambda 權限的角色 (AWS LambdaBasicExecutionRole)。
-
層 — 新增要使用的 Lambda 函數的 AWS SDKPandas-Python311 圖層。
numpy
-
函數代碼 — 使用下列函數程式碼,它會使用名為的字串引數,
timestamp
timeInSeconds
並輸出該時間戳記的offsetInNanos
值。import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }
這個 Lambda 函數輸入使用日期時
間 64 從 ISO8601 格式的時間戳字符串。 NumPy 注意
如果您的時間戳記字串不是 ISO 8601 格式,您可以實作定義時間戳記格式pandas的解決方案。如需詳細資訊,請參閱熊貓
。
-
-
當您設定規則的 AWS IoT SiteWise 動作時,請使用下列替代範本,以秒為單位 (
timeInSeconds
) 和位移 (以 nanos 為單位offsetInNanos
)。這些替代範本會假設您的訊息承載包含timestamp
中的時間戳記字串。該aws_lambda
函數消耗其第二個參數的JSON結構,因此您可以根據需要修改以下替換模板。-
針對 Time in seconds (以秒為單位的時間) (
timeInSeconds
),使用以下替代範本。${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).timeInSeconds} -
針對 Offset in nanos (以奈米為單位的位移) (
offsetInNanos
),使用以下替代範本。${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).offsetInNanos}
對於每個參數,請替換
region
以及account-id
使用您的地區和 AWS 帳戶 ID。如果您為 Lambda 函數使用了不同的名稱,請同時進行變更。 -
-
授予 AWS IoT 權限以使用
lambda:InvokeFunction
權限調用您的函數。如需詳細資訊,請參閱 aws_lambda (functionArn,inputJson)。 -
測試您的規則(例如,使用 AWS IoT MQTT測試用戶端),並確認是否 AWS IoT SiteWise 接收到您傳送的資料。
如果規則無法正常運作,請參閱 疑難排解 AWS IoT SiteWise 規則動作。
注意
此解決方案會針對每個時間戳記字串叫用 Lambda 函數兩次。如果您的規則處理每個承載中具有相同時間戳記的多個資料點,則可以建立另一個規則來減少 Lambda 函數叫用的次數。
若要這麼做,請使用重新發佈動作建立規則,該動作會叫用 Lambda,並發佈原始承載,並將時間戳記字串轉換為timeInSeconds
和。offsetInNanos
然後,建立具有規則動作的 AWS IoT SiteWise 規則,以使用轉換的承載。使用這種方法,您可以減少規則呼叫 Lambda 的次數,但會增加 AWS IoT 規則動作的執行次數。如果您要將此解決方案套用到您的使用案例,請考慮定價。
規則組態範例
本節包含使用 AWS IoT SiteWise 動作建立規則的規則組態範例。
範例 使用屬性別名做為訊息主題的範例規則動作
下列範例會建立具有使用主題 (透過 topic ()) 做為屬性別名的 AWS IoT SiteWise 動作的規則,以識別資產性質。使用此範例可定義將雙重類型資料擷取至所有風力發電場中的所有風力發電機的規則。此範例要求您在所有渦輪資產的性質上定義性質別名。您需要定義第二個類似的規則來擷取整數類型資料。
aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json
sitewise-rule-payload.json
中的範例裝載包含以下內容。
{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::
account-id
:role/MySiteWiseActionRole
" } } ] }
使用此規則動作,將以下訊息傳送至風力發電機性質別名 (例如,/company/windfarm/3/turbine/7/temperature
),做為擷取資料的主題。
{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
範例 使用 timestamp() 定義時間的範例規則動作
下列範例會建立規則,其中包含可透過識別資產屬性的 AWS IoT SiteWise 動作,IDs並使用 timestamp () 判斷目前時間。
aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json
sitewise-rule-payload.json
中的範例裝載包含以下內容。
{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::
account-id
:role/MySiteWiseActionRole
" } } ] }
使用此規則動作,將下列訊息傳送至以擷取資料。my/asset/property/topic
{ "type": "double", "value": "38.3" }
針對 規則動作進行故障診斷
若要疑難排解中的 AWS IoT SiteWise 規則動作 AWS IoT Core,請設定 CloudWatch 記錄檔或為規則設定重新發佈錯誤動作。如需詳細資訊,請參閱疑難排解 AWS IoT SiteWise 規則動作。