アクション内でObject型の変数の値を参照する方法
アクション内で利用できるObject型の変数の値を参照する場合、変数にドットで繋いだセレクターや角括弧で要素にアクセスします。
Object型の変数の例として、IVARの顔認証機能を使用するとトリガーマネージャーでアクションを実行した場合に以下のようなJSONデータがアクションに届きます。(一部のデータのみ抜粋しています。)
このデータはアクションの実行時に tv.Data
としてどのコンポーネントからも参照することもできます。または最初のコンポーネントのPayloadにもなっているため、最初のコンポーネントでは cv.Payload
としても参照可能です。
{
"id":"XXXXXX",
"source":{
"channel":4,
"bacId" : "YYYYYY",
"taskId" : "ZZZZZZ",
"ivarId" : "000000"
},
"common":{
"description":"Face Recognition",
"presentImageTime":"2019-06-17T07:53:22.986Z",
"time":"2019-06-17T07:53:22.986Z",
"type":"FR"
},
"iod":{
"age":"MIDDLE",
"ageRange":[38, 53],
"faceAvailable":true,
"frSuitable":"NA",
"gender":"MALE",
"glasses":"REGULAR",
"groupId":0,
"liveness":"NO_RESULT",
"livenessProbability":"0.0000",
"mask":"NA",
"objectId":649,
"objectType":"FACE",
"occlusion":"NA",
"race":"NA"
},
"fr":{
"candidates":[{
"customId":"00001",
"displayName":"Person B",
"id":"6",
"indentityGroup":"Company A",
"similiarityScore":"0.7272"
}],
"fdrVersion":"60032084",
"indentityGroup":"Set2",
"mmsReturn":"OK"
}
}
例えば fr → candidates → displayName を参照する場合には
tv.Data.fr.candidates[0].displayName
と記述します。
IVARのJSONは単純なキー名ですのでドットで繋いだセレクターで参照できますが、スペースやハイフンなどがキー名に使われている場合には以下のような参照も可能です(display Nameとスペースが入っていた場合)。frやcandidatesはそのままドットで繋いで混ぜて使ってもかまいません。
tv.Data["fr"]["candidates"][0]["display Name"]
tv.Data.fr.candidates[0]["display Name"]
上記は値の参照、取得だけですが、Filterコンポーネントの条件式を入れるところでも同様に使うことが可能です。
cv.Payload.fr.candidates[0].displayName == "Person B"
これらの機能はアクション以外にもトリガー条件や式を書けるところで使えます。
トリガーのIVARの条件でも式を入力することができ、男性のみアクションを起動する場合には以下の式を記述します。
tv.Data.iod.gender == "MALE"
文字列関数
以下の文字列操作関数が利用できます。
関数名 | 引数 | 説明 | 例 |
---|---|---|---|
Len | Len(s) | 文字列の長さ(バイト数)を返す。sが配列やObjectの場合は要素数を返す。 | Len("abc012漢字") → 11 |
Contains | Contains(s, substr) | sの中にsubstrが含まれているかBoolで返す | Contains("abc012漢字", "漢字") → true |
RuneCount | RuneCount(s) | sの文字列の文字数を返す | RuneCount("abc012漢字") → 8 |
HasPrefix | HasPrefix(s, prefix) | sがprefixで始まるかBoolで返す | HasPrefix("https://www.asteria.com/", "https://") → true |
HasSuffix | HasSuffix(s, suffix) | sがsuffixで終わるかBoolで返す | |
FirstIndex | FirstIndex(s, substr) | sの中で最初に現れるsubstrの位置を返す。ない場合は-1 | FirstIndex("abc012漢字", "漢字") → 6 |
Join | Join(a, sep) | aの配列要素をsepを挟んで1つの文字列にする。 | Join(["abc","def"], "-") → "abc-def" |
LastIndex | LastIndex(s, substr) | sの中で最後に現れるsubstrの位置を返す。ない場合は-1 | |
Repeat | Repeat(s, count) | sをcount回繰り返した文字列を返す | Repeat("abc012漢字", 3) → "abc012漢字abc012漢字abc012漢字" |
Replace | Replace(s, old, new[, n]) | sの中でold文字列をnew文字列にn回目まで置換する。nが0より小さい時は全て(デフォルトは-1)。 | |
Split | Split(s, sep[, n]) | sをsepで最大n個の要素に区切り配列で返す。nが0より小さい時は全て(デフォルトは-1) | Split("a,b,c", ",") → ["a", "b", "c"] |
ToLower | ToLower(s) | sを小文字に変換する | |
ToUpper | ToUpper(s) | sを大文字に変換する | |
Trim | Trim(s[, cutset]) | sの頭と最後のcutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字 | Trim(" abc ") → "abc" |
TrimLeft | TrimLeft(s[, cutset]) | sの頭cutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字 | |
TrimRight | TrimRight(s[, cutset]) | sの最後のcutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字 | |
TrimPrefix | TrimPrefix(s, prefix) | sがprefixではじまっていたら、それを取り除いた文字列を返す。始めっていない場合はsをそのまま返す | TrimPrefix("https://www.asteria.com", "https://") → "www.asteria.com" |
TrimSuffix | TrimSuffix(s, suffix) | sがsuffixでおわっていたら、それを取り除いた文字列を返す。終わっていない場合はsをそのまま返す | |
Left | Left(s, len) | sの先頭からlen文字数を取り出す。lenは漢字などの文字も1文字と数える | |
Right | Right(s, len) | sの末尾からlen文字数を取り出す。lenは漢字などの文字も1文字と数える | |
Mid | Mid(s, start, len) | sのstart位置からlen文字数を取り出す。startは先頭の位置を1とし、漢字などの文字も1文字とみなし位置を指定します。lenは漢字などの文字も1文字と数える | |
Substring | Substring(s, start[, end]) | sのstart位置からend位置までの文字列を取り出す。start/endは先頭の位置を0とし、漢字などの文字も1文字とみなし位置を指定する | |
Slice | Slice(s[, start[, end]]) | sのstart位置からend位置までの文字列を取り出す。start/endは先頭の位置を0とし、漢字などの文字も1文字とみなし位置を指定する。start/endに負の値を指定した場合は末尾から位置指定とみなす | |
IFS | IFS (条件1, 値1[, 条件2, 値2, ...]) | 条件を1から順に評価し合致した値を返す。条件にtrueと指定すると必ず合致するので、最後の条件にtrueを指定すると、それ以外すべてという条件を指定できます。 | IFS (ToFloat(cv.Payload) >= 10, "10以上です", true, "10未満です" |
Sprintfの使用方法
書式付の文字列を整形し文字列を返します。書式は%に続いて変換指定子とオプションでフラグ、幅、精度で指定できます。
変換指定子 | 説明 |
---|---|
%b | 整数2進数 |
%d | 整数10進数 |
%x %X | 16進数 |
%e %E | 浮動小数、科学的表記法 |
%f %F | 浮動小数、指数のない表記 |
%g %G | 浮動小数、指数が大きい場合は%e、それ以外が%f |
%s | 文字列 |
%% | %そのものの文字 |
フラグ | 説明 |
---|---|
+ | 符号つき |
- | 左寄せ |
0 | 幅未満のときはスペースではなく0を埋める |
幅、精度 | 説明 |
---|---|
%f | デフォルトの幅と精度 |
%9f | 幅9 |
%.2f | 精度2 |
%9.2f | 幅9、精度2 |
例
Sprintf("メッセージ件数: %d", ToInt(cv.Payload))
Sprintf("浮動小数の小数点第二位まで: %.2f", cv.Payload)
正規表現
以下の正規表現関数が利用できます。
関数名 | 引数 | 説明 | 例 |
---|---|---|---|
RegExpMatch | RegexMatch(re, s) | 正規表現reとsがマッチするかBoolで返す | RegexMatch("G.*o", "Gravio HubKit") → true |
RegExpFind | RegexFind(re, s) | 正規表現reとsがマッチした最初の文字列を返す | RegexFind("i.", "Gravio HubKit") → "io" |
RegExpFindSubmatch | RegexFindSubmatch(re, s) | 正規表現reとsがマッチした最初の文字列と括弧で囲まれた部分式があれば配列で返す | RegexFindSubmatch("(G.*o) (H.*t)", "Gravio HubKit") → ["Gravio HubKit", "Gravio", "HubKit"] |
RegExpFindAll | RegexFindAll(re, s[, n]) | 正規表現reとsがマッチした全ての文字列を配列で返す | RegexFindAll("i.", "Gravio HubKit") → ["io", "it"] |
RegExpReplace | RegexReplace(re, s, repl) | 正規表現reとsがマッチしたreplに置換した文字列を返す。replでは$1のような部分式を使用できる。 | |
UUID | UUID([sep]) | UUID文字列を返す。sepはセパレータ(デフォルトは空文字列) |
JSONPath()の使用例
JSONPath()の使用例を解説します。
センサーデータ(cv.Payload
)やトリガー条件で実行するアクションの引数(tv.Data
)がJSON形式の場合にJSONPath()を使用して値を参照することができます。
サンプルデータ
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
例えば store → bicycle → color を参照する場合には
cv.Payload.store.bicycle.color
と記述することができますがJSONPath()を使用した場合には
JSONPath("$.store.bicycle.color", cv.Payload)
と記述することもできます。
JSONPathの第一引数 path
path 説明
$ ルート オブジェクト/エレメント
@ カレント オブジェクト/エレメント
. or [] 子オペレーター
.. 再帰下降
* ワイルドカード
[] 添え字演算子 (ネイティブの配列演算子)
[,] ユニオン演算子(代替名または配列インデックスをセットとして使用できます)
[start:end:step] 配列スライス演算子
?() フィルタ(スクリプト)式
() 基盤となるスクリプトエンジンを使用したスクリプト式
JSONPathの第一引数 path の例
例 説明
$.store.book[*].author store内のbook配列のすべての author
$..author すべてのauthor
$.store.* store内のbook配列とbicycle
$.store..price store内のすべてのprice
$..book[2] 3番目のbook
$..book[(@.length-1)]
$..book[-1:] 最後のbook
$..book[0,1]
$..book[:2] book配列の最初の2つのbook
$..book[?(@.isbn)] book配列のすべてのisbn
$..book[?(@.price<10)] book配列のpriceが10より小さいもの
$..* すべてのノード/エレメント
JSONPathの詳細は引用元の こちらを参照してください。
デバッグログ出力
コンポーネントの左上のボタンを押すことで、デバックログを出力できます。
本来コンポーネントが独立して並行に動作しますが、デバッグログを出力しながらアクションを実行ときは、アクションエンジン内で同期処理を行っています。
デバッグログはtp/tv/ap/av/cp/cvのプロパティ、変数を順にログに出力します。
アクションプログラムは以下のような順で処理されます。
- Payloadを含むコンポーネント変数をキューから取得する
- 前のコンポーネントから渡されたPostMappingsの値がある場合は代入処理が行われる
- PreMappingsの式評価、値代入が行われる
- プロパティに応じでコンポーネントがなにか処理する
- コンポーネントの処理結果に応じて、新たなPayloadを含むコンポーネント変数を作成する
- PostMappingsが式評価のみが行われ結果の値は先の新たなPayloadを含むコンポーネント変数に保管される
- 次のコンポーネントのキューに新たなPayloadを含むコンポーネント変数を送る
デバッグログ機能をONにすると、上記コンポーネントの処理手順の中で、3のPreMappingsの式評価、代入が行われたあとの変数の内容が出力されます。
Gravio各種センサーについて
センサー | 収集方法 | 収集頻度 | 設定方法 |
---|---|---|---|
クライメートセンサー | イベントドリブン | 1時間に1度だけ送信。温度が0.5℃、湿度が6%、気圧が25Pa=0.25hPa変わったらすぐに送信 | 外部から設定はできない |
人感センサー | センサー感知範囲で動きがあった場合 | 動きがあったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 外部から設定はできない |
ドアセンサー | マグネットセンサーによる開閉検知 | 開閉があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 外部から設定はできない |
振動センサー | 振動検知 | 振動があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 外部から設定はできない |
音センサー | マイクによる音の検知 | 1秒間に音があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 外部から設定はできない |
光センサー | 光センサーによる明度検知 | 1秒間に設定した閾値を超える/下回る明度変化があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 閾値の設定が可能 |
加速度センサー | 3軸加速度センサーによる検知 | 設定した閾値を超える加速度変化があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります | 閾値の設定が可能 |