Soracom

Users

ドキュメント
Home ドキュメント SORACOM Harvest SORACOM Harvest Data のそのほかの使いかた

「送信データに含めた時刻」をタイムスタンプとして利用する

通常、Harvest Data におけるデータのタイムスタンプは「SORACOM がデータを保存した時刻」です。このタイムスタンプを「送信データに含めた時刻」に変更できます。

「2024-09-02 12:34:56.789 (UTC) に送信したデータ」として Harvest Data に保存する例:

{
  "temperature": 12.3,
  "humidity": 45.6,
  "time": "2024-09-02T12:34:56.789Z"
}
日時が複数のプロパティに分割されている場合はタイムスタンプとして利用できません

以下のように日時が 2 つのプロパティに分割されている場合は、タイムスタンプとして利用できません。

{
  "temperature": 12.3,
  "humidity": 45.6,
  "date": "2024-09-02",
  "time": "12:34:56.789"
}

ユーザーコンソールで機能を有効化する

あらかじめユーザーコンソールで、デバイスから Harvest Data に送信するデータに含めた時刻をタイムスタンプとして利用できるように設定します。

  1. SIM グループ画面、LoRaWAN グループ画面、Sigfox グループ画面、またはデバイスグループ画面で [SORACOM Harvest Data 設定] をクリックします。

  2. スイッチをクリックして「on」にします。

  3. [送信データの時刻をタイムスタンプに利用する] のスイッチをクリックして有効化します。

  4. 以下の項目を設定します。

    項目説明
    [送信データ形式]Harvest Data に送信するデータ形式です。「JSON」を選択します。
    [時刻への JSON Pointer]

    時刻データを保持するプロパティを JSON Pointer (RFC 6901) で設定します。

    たとえば、デバイスが以下のような JSON を送信するときは、「/time」を入力します。

    {
      "temperature": 12.3,
      "humidity": 45.6,
      "time": "2024-09-02T12:34:56.789Z"
    }
    
    [一括書き込み] が有効化されているときは配列内の各データをルートとした、相対的な JSON Pointer を設定します

    たとえば、デバイスが以下のような JSON を送信する場合は、[データ配列への JSON Pointer] に「/data」を入力し、[時刻への JSON Pointer] に「/time」を入力します。

    {
      "data": [
        {"time": "2025-03-17T09:00:00+09:00", "temperature": 10.5},
        {"time": "2025-03-18T09:00:00+09:00", "temperature": 9.4}
      ]
    }
    

    一括書き込みについて詳しくは、1 回のデータ送信で複数のデータを書き込む (一括書き込み) を参照してください。

    [送信データの値の形式]

    データに含める時刻の形式です。以下のいずれかを選択します。詳しくは、データを Harvest Data に送信する を参照してください。

    • ISO 8601 形式
    • UNIX 時間 (秒)
    • UNIX 時間 (ミリ秒)
  5. [保存][OK] の順にクリックします。

  6. IoT SIM、LoRaWAN デバイス、Sigfox デバイスが所属するグループを切り替えます。

    IoT SIM、LoRaWAN デバイス、Sigfox デバイスから送信したデータが Harvest Data に保存できるようになります。

SORACOM CLI / SORACOM API で設定する

SORACOM CLI または SORACOM API を利用しても、送信データの時刻をタイムスタンプとして利用するように指定できます。

  • SORACOM CLI を利用する場合は、soracom groups put-config を使用します。
  • SORACOM API を利用する場合は、Group:putConfigurationParameters API を使用します。

SORACOM CLI / SORACOM API のリクエストボディで指定するプロパティについて

以下の keyvalue のペアを配列で指定します。

keyvalue の型value
customTimestampObject

以下のプロパティを含む JSON オブジェクトを設定します。

プロパティ説明
typeStringHarvest Data に送信するデータ形式です。 jsonpointer を設定します。
valueString時刻データを保持するプロパティを JSON Pointer (RFC 6901) で設定します。詳しくは、ユーザーコンソールで設定する[時刻への JSON Pointer] を参照してください。
formatString

データに含める時刻の形式です。以下のいずれかを選択します。詳しくは、データを Harvest Data に送信する を参照してください。

  • iso-8601: ISO 8601 形式。
  • unix-sec: UNIX 時間 (秒)。
  • unix-msec: UNIX 時間 (ミリ秒)。

想定していない値を指定した場合の動作は、定義されていません。SORACOM CLI / SORACOM API で設定を変更したあとで、SORACOM ユーザーコンソールで意図通りに設定されていることを確認してください。

データを Harvest Data に送信する

「設定を行ったグループに所属する IoT SIM を利用するデバイス」などから Harvest Data にデータを送信します。[送信データの値の形式] で選択した項目によって、解釈できる時刻の形式が異なります。

項目説明
ISO 8601 形式

文字列型で指定します。

例:

  • "time": "2024-09-02T12:34:56.789Z"
  • "time": "2024-09-02T12:34:56Z" (*1)
  • "time": "2024-09-02T03:34:56.789+09:00" (*2)
  • "time": "2024-09-02T03:34:56+09:00" (*1)
  • (*1) ミリ秒を省略した場合、ミリ秒は 000 として扱われます。この例の場合、タイムスタンプは 2024-09-02T12:34:56.000Z です。
  • (*2) UTC を示すタイムゾーン識別子 Z の代わりに、UTC 以外のタイムゾーンを示す +09:00-07:00 を使用できます。
UNIX 時間 (秒)

数値型、または文字列型で指定します。ミリ秒は 000 として扱われます。この例の場合、タイムスタンプは 2024-09-02T12:34:56.000Z です。

例:

  • "time": 1725280496 (*1)
  • "time": "1725280496" (*1)
UNIX 時間 (ミリ秒)

数値型、または文字列型で指定します。

例:

  • "time": 1725280496789
  • "time": "1725280496789"
  1. [送信データの時刻をタイムスタンプに利用する] を以下のように設定します。

    設定について詳しくは、ユーザーコンソールで設定する を参照してください。

    • [送信データ形式]: 「JSON」
    • [時刻への JSON Pointer]: /time
    • [送信データの値の形式]: 「ISO 8601 形式」
  2. デバイスで Unified Endpoint にデータを送信します。

    $ curl -v http://uni.soracom.io \
    -H 'content-type: application/json' \
    -d '{
      "temperature": 12.3,
      "humidity": 45.6,
      "time": "2024-09-02T12:34:56.789+09:00"
    }'
    

    Harvest Data にデータが保存されます。

    image image

リソース ID とデータの保存日時 (ミリ秒) が一致した場合の処理について

データは、リソース ID (*1) ごとに、データの保存日時 (ミリ秒) をキーとして保存されます。そのため同一のリソース ID から、既存のデータと同一のタイムスタンプを指定してデータを送信した場合、先に送信したデータは以下のルールで上書きされます。

(*1) たとえば、IoT SIM を利用した場合は SIM ID のこと。

データ形式が JSON の場合は、プロパティごとに上書きされます。つまり、すでに保存されているプロパティは、同一プロパティで上書きされないかぎり維持されます。

先に送信したデータあとから送信したデータ保存されるデータ
例 1{"temperature": 20}{"humidity": 30}

{"temperature": 20, "humidity": 30}

(*) humidity が追加されます。

例 2{"temperature": 20}{"temperature": 25, "humidity": 30}

{"temperature": 25, "humidity": 30}

(*) temperature が上書きされ、humidity が追加されます。

タイムスタンプとして正しく解釈できない場合はデータは保存されません

「送信データに含めた時刻」をタイムスタンプとして正しく解釈できない場合は、データは Harvest Data に保存されません。

[送信データの値の形式] で「ISO 8601 形式」を選択して、送信する時刻の文字列にタイムゾーン識別子 (Z+09:00 など) が抜けている場合:

$ curl http://uni.soracom.io \
-H 'content-type: application/json' \
-d '{
    "temperature": 12.3,
    "humidity": 45.6,
    "time": "2024-09-02T12:34:56.789"
}'
{"message":"Invalid custom timestamp value in request"}

[送信データの値の形式] で「ISO 8601 形式」を選択して UNIX 時間 (ミリ秒) の形式で送信した場合:

$ curl http://uni.soracom.io \
-H 'content-type: application/json' \
-d '{
    "temperature": 12.3,
    "humidity": 45.6,
    "time": "1725280496789"
}'
{"message":"Invalid custom timestamp value in request"}
有効範囲外の日時を指定した場合はデータは保存されません

「上記の方法で指定した時刻」が「Harvest Data がデータを処理する時刻」と比較して「40 日 (3456000 秒) 以上過去」または「1 日 (86400 秒) 以上未来」のときは、Harvest Data へのデータの保存に失敗します。データ送信時にエラーレスポンスを受け取った場合は、対象のデータを更新したうえで再送してください。

x-soracom-timestamp ヘッダーで指定した時刻が優先されます

HTTP で Harvest Data にデータを保存するときに、x-soracom-timestamp ヘッダーで UNIX 時間 (ミリ秒) を指定すると、任意の時刻のデータとして Harvest Data に保存できます。

このとき、送信データの時刻をタイムスタンプとして利用する設定をして、さらに x-soracom-timestamp ヘッダーを付与してデータを送ると、データのタイムスタンプは x-soracom-timestamp の時刻が利用されます。

[送信データの時刻をタイムスタンプに利用する] を有効化した場合は常に JSON 形式のデータとして処理されます

[送信データの時刻をタイムスタンプに利用する] を有効化した場合は、TCP や UDP で送信しても JSON 形式のデータ として処理されます。そのため payload 変換が行われません。payload 変換について詳しくは、payload 変換について を参照してください。

たとえば、以下のデータを TCP で送信した場合、[送信データの時刻をタイムスタンプに利用する] の設定によって、データの取り扱いが変わります。

{"data": [{"time": "2025-03-17T09:00:00+09:00", "temperature": 10.5}, {"time": "2025-03-18T09:00:00+09:00", "temperature": 9.4}]}
  • [送信データの時刻をタイムスタンプに利用する] を無効化した場合は、バイナリデータとして処理されるため payload 変換 が行われます。

    その結果、データを送信した時刻のデータとして、以下の内容が保存されます。

    {"payload":"eyJkYXRhIjogW3sidGltZSI6ICIyMDI1LTAzLTE3VDA5OjAwOjAwKzA5OjAwIiwgInRlbXBlcmF0dXJlIjogMTAuNX0sIHsidGltZSI6ICIyMDI1LTAzLTE4VDA5OjAwOjAwKzA5OjAwIiwgInRlbXBlcmF0dXJlIjogOS40fV19DQo="}
    

    ただし、バイナリパーサー定義済みフォーマット@json を設定した場合は、バイナリデータとして送信された JSON 形式のデータがそのまま扱われます。そのため、payload 変換は行われずに、以下のデータが保存されます。

    {"data":[{"time":"2025-03-17T09:00:00+09:00","temperature":10.5},{"time":"2025-03-18T09:00:00+09:00","temperature":9.4}]}
    
  • [送信データの時刻をタイムスタンプに利用する] を有効化した場合は、JSON 形式のデータとして処理されるため payload 変換 が行われません。

    その結果、以下のデータが保存されます。

    2025-03-17T09:00:00+09:00 のデータ:

    {"time": "2025-03-17T09:00:00+09:00", "temperature": 10.5}
    

    2025-03-18T09:00:00+09:00 のデータ:

    {"time": "2025-03-18T09:00:00+09:00", "temperature": 9.4}
    

    なお、バイナリパーサー定義済みフォーマット@json を指定した場合も、動作は変わりません。

Unified Endpoint のレスポンスは、他のサービスの有効・無効によって異なります

Unified Endpoint からのレスポンスは、他のサービスの有効・無効によって異なります。詳しくは レスポンスの形式を設定する を参照してください。