Webhook設定詳細

設定項目フィールド一覧

Webhook 新規登録画面に表示されている各項目については以下の通りです。

項目必須説明
トリガ名必須トリガの名称です。
Webhook URL必須Webhook通知の受信先となるサーバーのURLです。
指標設定必須しきい値判定情報を設定します。最大5つまで増やせます。
 指標必須判定対象の指標を指定します。
 条件必須指標としきい値の判定条件です。
 しきい値必須検証を行う指標のしきい値を設定します。
 加重平均係数必須指標に対する加重平均を設定します。
値の範囲: 0.0-1.0
判定式必須複数指標で判定する際の式を設定します。
指標設定が1つの場合 x[0] を入力してください。
最小通知間隔必須Webhookの通知間隔を秒設定します。
値の範囲: 60-86400

Webhook 更新画面ではWebhook 新規作成画面の項目に加えて、下記の項目が追加されています。

項目説明
アプリIDアプリID。
アプリSecretアプリSecret。
検証押下することで、現在入力されているWebhook URLに対してWebhookイベントオブジェクトを含むHTTP POSTリクエストが送られます。
レスポンスのステータスコードが200の場合に検証が成功判定とされるため、レスポンスのステータスコードは200を返してください。

設定可能な指標

データ定義 15秒間隔データAPIのアイテムが指定できます。

条件としきい値

計算された今回加重平均値に対してしきい値判定を実施します。しきい値判定は以下の5種類が可能です。条件の判定はJavaScriptで実施されます。

  • under: 今回加重平均値 <= しきい値
  • over: 今回加重平均値 >= しきい値
  • inner: abs(今回加重平均値) <= しきい値
  • outer: abs(今回加重平均値) >= しきい値
  • equal: 今回加重平均値 == しきい値

用途に応じたデータのフィルタリング

Webhook APIの演算では標準で isl == false のフィルタ(isl: メガネに動きがある時にfalseになるフラグ)がかかっており、もしそれ以外でも除外したいシーンがある場合は自分で条件を追加します。以下がフィルタに関するサンプルです。

サンプル指標加重平均値しきい値条件
ノイズ時間が3秒以内の時nis_time03under
歩行が10歩以上の時stp010over
下向き平均角が45°より浅い時tl_yav045under

加重平均係数

Webhook API では JINS MEME アプリから送られてきたデータに加重平均処理をかけてトリガー判定を実施します。加重判定処理は以下のように算出します。

  • 前回加重平均値: IndexWA(m-1)
  • 今回生値: Index(m)
  • 加重平均係数(前回値重み): coeff
  • 今回加重平均値(使用される値): IndexWA(m) = IndexWA(m-1) * coeff + Index(m-1) * (1 - coeff)

加重平均係数 coeff = 0 の場合は加重平均がかからずに今回値がそのまま判定されます。加重平均係数 coeff が1に近づくと直近の値の影響を受けづらくなります。

IndexWA(m-1)Index(m)coeffIndexWA(m)
60800.570
6080080
60800.864

判定式

  • 設定された条件に対し、最終判定の式を記述します
  • AND(&&)OR(||)とカッコのみが許可されています ||, &&の論理演算子は5つまで設定できます。
  • 不正な式を記載した場合、結果がfalseになり続けWebhookは発行されないのでご注意ください
  • 例: x[0] || x[1], (x[0] || x[1]) && x[2]

署名検証方法

リクエストがJINS MEMEから送られたことを確認するために、サーバーでリクエストヘッダーのX-JINSMEME-SIGNATUREに含まれる署名を検証することが可能です。

  1. アプリシークレットを秘密鍵として、HMAC-SHA256アルゴリズムを使用してリクエストボディのダイジェスト値を取得します。
  2. ダイジェスト値をBase64エンコードした値と、リクエストヘッダーのX-JINSMEME-SIGNATUREに含まれる署名が一致することを確認します。

JavaScriptで署名の検証を実装する例は以下のようになります。

const crypto = require('crypto');

const secret = '...' // Webhook 更新画面で確認したアプリシークレット
const body = '...' // リクエストbody

const hmac = crypto.createHmac('sha256', secret);
hmac.update(JSON.stringify(body));
const signature = hmac.digest('base64');

サンプル

姿勢通知(うつむき過ぎ)

  • 条件1: (tl_yav >= 20, 加重平均係数 = 0)
  • 評価式: x[0]
  • 最小通知間隔: 60

姿勢通知(うつむき過ぎでもなく、上向き過ぎでもない)

  • 条件1: (tl_yav >= -20, 加重平均係数 = 0)
  • 条件2: (tl_yav <= 20, 加重平均係数 = 0)
  • 評価式: x[0] && x[1]
  • 最小通知間隔: 60

姿勢通知(うつむき過ぎでもなく、上向き過ぎでもなく、毎分120(30x4)歩の速めのペースで歩いている)

  • 条件1: (tl_yav >= -20, 加重平均係数 = 0)
  • 条件2: (tl_yav <= 20, 加重平均係数 = 0)
  • 条件3: (stp >= 30, 加重平均係数 = 0)
  • 評価式: x[0] && x[1] && x[2]
  • 最小通知間隔: 60

長時間の姿勢通知(うつむき過ぎでもなく、上向き過ぎでもないのを間隔長めに判断する)

  • 条件1: (tl_yav >= -20, 加重平均係数 = 0.9)
  • 条件2: (tl_yav <= 20, 加重平均係数 = 0.9)
  • 評価式: x[0] && x[1]
  • 最小通知間隔: 600