技術リファレンス

アクション内で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"

文字列関数

以下の文字列操作関数が利用できます。

関数名引数説明
LenLen(s)文字列の長さ(バイト数)を返す。sが配列やObjectの場合は要素数を返す。Len("abc012漢字") → 11
ContainsContains(s, substr)sの中にsubstrが含まれているかBoolで返すContains("abc012漢字", "漢字") → true
RuneCountRuneCount(s)sの文字列の文字数を返すRuneCount("abc012漢字") → 8
HasPrefixHasPrefix(s, prefix)sがprefixで始まるかBoolで返すHasPrefix("https://www.asteria.com/", "https://") → true
HasSuffixHasSuffix(s, suffix)sがsuffixで終わるかBoolで返す
FirstIndexFirstIndex(s, substr)sの中で最初に現れるsubstrの位置を返す。ない場合は-1FirstIndex("abc012漢字", "漢字") → 6
JoinJoin(a, sep)aの配列要素をsepを挟んで1つの文字列にする。Join(["abc","def"], "-") → "abc-def"
LastIndexLastIndex(s, substr)sの中で最後に現れるsubstrの位置を返す。ない場合は-1
RepeatRepeat(s, count)sをcount回繰り返した文字列を返すRepeat("abc012漢字", 3) → "abc012漢字abc012漢字abc012漢字"
ReplaceReplace(s, old, new[, n])sの中でold文字列をnew文字列にn回目まで置換する。nが0より小さい時は全て(デフォルトは-1)。
SplitSplit(s, sep[, n])sをsepで最大n個の要素に区切り配列で返す。nが0より小さい時は全て(デフォルトは-1)Split("a,b,c", ",") → ["a", "b", "c"]
ToLowerToLower(s)sを小文字に変換する
ToUpperToUpper(s)sを大文字に変換する
TrimTrim(s[, cutset])sの頭と最後のcutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字Trim(" abc ") → "abc"
TrimLeftTrimLeft(s[, cutset])sの頭cutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字
TrimRightTrimRight(s[, cutset])sの最後のcutsetに含まれる文字を除いた文字列を返す。cutsetはデフォルトはスペース文字
TrimPrefixTrimPrefix(s, prefix)sがprefixではじまっていたら、それを取り除いた文字列を返す。始めっていない場合はsをそのまま返すTrimPrefix("https://www.asteria.com", "https://") → "www.asteria.com"
TrimSuffixTrimSuffix(s, suffix)sがsuffixでおわっていたら、それを取り除いた文字列を返す。終わっていない場合はsをそのまま返す
LeftLeft(s, len)sの先頭からlen文字数を取り出す。lenは漢字などの文字も1文字と数える
RightRight(s, len)sの末尾からlen文字数を取り出す。lenは漢字などの文字も1文字と数える
MidMid(s, start, len)sのstart位置からlen文字数を取り出す。startは先頭の位置を1とし、漢字などの文字も1文字とみなし位置を指定します。lenは漢字などの文字も1文字と数える
SubstringSubstring(s, start[, end])sのstart位置からend位置までの文字列を取り出す。start/endは先頭の位置を0とし、漢字などの文字も1文字とみなし位置を指定する
SliceSlice(s[, start[, end]])sのstart位置からend位置までの文字列を取り出す。start/endは先頭の位置を0とし、漢字などの文字も1文字とみなし位置を指定する。start/endに負の値を指定した場合は末尾から位置指定とみなす
IFSIFS (条件1, 値1[, 条件2, 値2, ...])条件を1から順に評価し合致した値を返す。条件にtrueと指定すると必ず合致するので、最後の条件にtrueを指定すると、それ以外すべてという条件を指定できます。IFS (ToFloat(cv.Payload) >= 10, "10以上です", true, "10未満です"

Sprintfの使用方法

書式付の文字列を整形し文字列を返します。書式は%に続いて変換指定子とオプションでフラグ、幅、精度で指定できます。

変換指定子説明
%b整数2進数
%d整数10進数
%x %X16進数
%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)

正規表現

以下の正規表現関数が利用できます。

関数名引数説明
RegExpMatchRegexMatch(re, s)正規表現reとsがマッチするかBoolで返すRegexMatch("G.*o", "Gravio HubKit") → true
RegExpFindRegexFind(re, s)正規表現reとsがマッチした最初の文字列を返すRegexFind("i.", "Gravio HubKit") → "io"
RegExpFindSubmatchRegexFindSubmatch(re, s)正規表現reとsがマッチした最初の文字列と括弧で囲まれた部分式があれば配列で返すRegexFindSubmatch("(G.*o) (H.*t)", "Gravio HubKit") → ["Gravio HubKit", "Gravio", "HubKit"]
RegExpFindAllRegexFindAll(re, s[, n])正規表現reとsがマッチした全ての文字列を配列で返すRegexFindAll("i.", "Gravio HubKit") → ["io", "it"]
RegExpReplaceRegexReplace(re, s, repl)正規表現reとsがマッチしたreplに置換した文字列を返す。replでは$1のような部分式を使用できる。
UUIDUUID([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[*].authorstore内のbook配列のすべての author
$..authorすべてのauthor
$.store.*store内のbook配列とbicycle
$.store..pricestore内のすべての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の詳細は引用元の こちらを参照してください。

デバッグログ出力

コンポーネントの左上のボタンを押すことで、デバックログを出力できます。

debuglog

本来コンポーネントが独立して並行に動作しますが、デバッグログを出力しながらアクションを実行ときは、アクションエンジン内で同期処理を行っています。

デバッグログはtp/tv/ap/av/cp/cvのプロパティ、変数を順にログに出力します。

アクションプログラムは以下のような順で処理されます。

  1. Payloadを含むコンポーネント変数をキューから取得する
  2. 前のコンポーネントから渡されたPostMappingsの値がある場合は代入処理が行われる
  3. PreMappingsの式評価、値代入が行われる
  4. プロパティに応じでコンポーネントがなにか処理する
  5. コンポーネントの処理結果に応じて、新たなPayloadを含むコンポーネント変数を作成する
  6. PostMappingsが式評価のみが行われ結果の値は先の新たなPayloadを含むコンポーネント変数に保管される
  7. 次のコンポーネントのキューに新たなPayloadを含むコンポーネント変数を送る

デバッグログ機能をONにすると、上記コンポーネントの処理手順の中で、3のPreMappingsの式評価、代入が行われたあとの変数の内容が出力されます。

Gravio各種センサーについて

センサー収集方法収集頻度設定方法
クライメートセンサーイベントドリブン1時間に1度だけ送信。温度が0.5℃、湿度が6%、気圧が25Pa=0.25hPa変わったらすぐに送信外部から設定はできない
人感センサーセンサー感知範囲で動きがあった場合動きがあったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります外部から設定はできない
ドアセンサーマグネットセンサーによる開閉検知開閉があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります外部から設定はできない
振動センサー振動検知振動があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります外部から設定はできない
音センサーマイクによる音の検知1秒間に音があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります外部から設定はできない
光センサー光センサーによる明度検知1秒間に設定した閾値を超える/下回る明度変化があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります閾値の設定が可能
加速度センサー3軸加速度センサーによる検知設定した閾値を超える加速度変化があったときトリガーされます。その後、スリープモードになります。1分後、再びトリガーを検出できる状態になります閾値の設定が可能