{
  "asyncapi": "3.1.0",
  "info": {
    "title": "Tensor Energy蓄電池最適化API",
    "version": "2.9.0",
    "description": "Tensor Cloud蓄電池最適化サービスとEMSがMQTTで通信するためのAsyncAPI仕様。ウィンドウ集計したエネルギー、およびaggregationが 'average' の電力または系統周波数では、'measurement_ts' に対象期間の開始時刻を設定します。終了時刻や中間時刻は設定しません。瞬時値では測定時刻を設定します。出力抑制スケジュールでは、TSOが発行した作成時刻を使用し、TSOが作成時刻を提供しない場合はEMSがスケジュールを受信した時刻を使用します。",
    "termsOfService": "https://docs.tensorenergy.jp/legal/terms-of-use/current",
    "externalDocs": {
      "description": "Tensor Cloud蓄電池最適化ドキュメンテーション",
      "url": "https://docs.tensorenergy.jp/guides/ems-integration/integrator-guide"
    },
    "contact": {
      "name": "Tensor Energy",
      "url": "https://www.tensorenergy.jp"
    }
  },
  "servers": {
    "テスト環境": {
      "host": "mqtt.staging.tensorenergy.jp",
      "protocol": "mqtt",
      "protocolVersion": "3.1.1",
      "description": "テスト用Tensor Cloud MQTTブローカー（AWS IoT Core）",
      "security": [
        {
          "$ref": "#/components/securitySchemes/awsIotCore"
        }
      ]
    },
    "本番環境": {
      "host": "mqtt.tensorenergy.jp",
      "protocol": "mqtt",
      "protocolVersion": "3.1.1",
      "description": "Tensor Cloud本番MQTTブローカー（AWS IoT Core）",
      "security": [
        {
          "$ref": "#/components/securitySchemes/awsIotCore"
        }
      ]
    }
  },
  "defaultContentType": "application/json",
  "channels": {
    "lifetimeTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/{metric}/lifetime",
      "title": "累積エネルギーテレメトリ",
      "summary": "このトピックに累積エネルギー（kWh）を送信します。Tensor Cloudでは累積値またはウィンドウ集計値のいずれかが必須で、両方の送信を推奨します。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        },
        "metric": {
          "$ref": "#/components/parameters/lifetimeMetric"
        }
      },
      "messages": {
        "energyLifetime": {
          "$ref": "#/components/messages/EnergyLifetime"
        }
      }
    },
    "energyTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/{metric}/energy/{window}",
      "title": "ウィンドウエネルギーテレメトリ",
      "summary": "このトピックに時間ウィンドウあたりの集計エネルギー（kWh）を送信します。Tensor Cloudではウィンドウ集計値または累積値のいずれかが必須で、両方の送信を推奨します。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        },
        "metric": {
          "$ref": "#/components/parameters/energyMetric"
        },
        "window": {
          "$ref": "#/components/parameters/window"
        }
      },
      "messages": {
        "energyWindowed": {
          "$ref": "#/components/messages/EnergyWindowed"
        }
      }
    },
    "powerTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/{metric}/power",
      "title": "瞬時電力テレメトリ",
      "description": "この形式のトピックに瞬時電力（kW）を送信します。この測定値は蓄電池最適化の必須項目ではありませんが、10分以下の間隔で送信すると精度が向上します。オフライン監視の一次調整力リソースでは、このトピックで一次調整力アセスメントⅡに使用する1秒ごとの供出電力も送信します。一次調整力の約定コマ中は、受電点参入の場合はmeter_export_acとmeter_import_acを、機器点参入の場合はbattery_discharge_acとbattery_charge_acを1 Hzで送信します。詳しくは連携ガイドの「アセスメントⅡ報告」を参照してください。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        },
        "metric": {
          "$ref": "#/components/parameters/powerMetric"
        }
      },
      "messages": {
        "powerInstant": {
          "$ref": "#/components/messages/PowerInstant"
        }
      }
    },
    "stateTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/{metric}/state",
      "title": "装置状態テレメトリ",
      "summary": "このトピックに装置の現在の動作状態を送信します。蓄電池最適化には蓄電池のSoEと残存容量が必要です。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        },
        "metric": {
          "$ref": "#/components/parameters/batteryStateMetric"
        }
      },
      "messages": {
        "batteryState": {
          "$ref": "#/components/messages/BatteryStateValue"
        }
      }
    },
    "curtailment": {
      "address": "dt/{siteId}/{gatewayId}/curtailment",
      "title": "出力抑制スケジュール",
      "description": "このトピックに出力抑制スケジュールを送信します。系統用蓄電池システムを含むすべての構成で必須です。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "curtailment": {
          "$ref": "#/components/messages/Curtailment"
        }
      }
    },
    "irradiationTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/irradiation",
      "title": "日射量テレメトリ",
      "description": "このトピックに発電所の日射量センサーの測定値を送信します。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "irradiation": {
          "$ref": "#/components/messages/Irradiation"
        }
      }
    },
    "solarDcTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/solar",
      "title": "太陽光DC電気テレメトリ",
      "description": "DCリンクの太陽光発電＋蓄電池システムでは、太陽光アレイのDC電圧と電流を同一時刻にサンプリングした一組として、このトピックに送信します。このトピックはDCリンクのサイトにのみ適用されます。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "solarDcElectrical": {
          "$ref": "#/components/messages/SolarDcElectrical"
        }
      }
    },
    "gridFrequencyTelemetry": {
      "address": "dt/{siteId}/{gatewayId}/frequency",
      "title": "系統周波数テレメトリ",
      "description": "このトピックに系統周波数（Hz）を送信します。EMSは一次調整力の各約定コマの全期間にわたり、1秒間の平均値を1秒に1回送信しなければなりません（MUST）。周波数は受電点の実際のAC電圧波形から測定し、0.01 Hz以上の分解能で報告します。公称値、スケジュール値、その他の導出値は送信しないでください。一次調整力アセスメントⅡで使用する1 Hzの供出電力テレメトリと時刻を揃えます。詳しくは連携ガイドの「アセスメントⅡ報告」を参照してください。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "gridFrequency": {
          "$ref": "#/components/messages/GridFrequency"
        }
      }
    },
    "powerTelemetryBatch": {
      "address": "dt/{siteId}/{gatewayId}/{metric}/power/batch",
      "title": "瞬時電力テレメトリ（バッチ）",
      "description": "瞬時電力トピックの任意のバッチ形式で、1 Hzの高頻度送信や通信断後のバックログ復旧に使用します。1つのメッセージに単一メトリックの複数の測定値を格納します。各測定値は固有のmessage_idとmeasurement_tsを持ち、unit、aggregation、aggregation_window、pre_qualificationはバッチ全体に適用されます。Tensor Cloudはバッチ全体を受理または拒否します。バッチ送信はTensor Cloudがサイトごとに有効化し、既定ではバックフィルにのみ使用します。VPP構成の低圧蓄電池など、ライブテレメトリを毎秒送信する必要があるサイトでは、ライブ測定値を個別のメッセージで送信し、バッチはバックフィルにのみ使用します。詳しくは連携ガイドの「バッチテレメトリ」を参照してください。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        },
        "metric": {
          "$ref": "#/components/parameters/powerMetric"
        }
      },
      "messages": {
        "powerInstantBatch": {
          "$ref": "#/components/messages/PowerInstantBatch"
        }
      }
    },
    "gridFrequencyTelemetryBatch": {
      "address": "dt/{siteId}/{gatewayId}/frequency/batch",
      "title": "系統周波数テレメトリ（バッチ）",
      "description": "系統周波数トピックの任意のバッチ形式です。バッチ電力トピックと同じ規則に従い、1つのメッセージに複数の測定値を格納します。各測定値は固有のmessage_idとmeasurement_tsを持ち、unit、aggregation、aggregation_window、pre_qualificationはバッチ全体に適用されます。Tensor Cloudはバッチ全体を受理または拒否します。バッチ送信はTensor Cloudがサイトごとに有効化し、既定ではバックフィルにのみ使用します。詳しくは連携ガイドの「バッチテレメトリ」を参照してください。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "gridFrequencyBatch": {
          "$ref": "#/components/messages/GridFrequencyBatch"
        }
      }
    },
    "batteryPowerCommand": {
      "address": "cmd/{siteId}/battery/power",
      "title": "蓄電池電力設定値コマンドスケジュール",
      "description": "蓄電池の実電力設定値スケジュールのトピックです。一次調整力モードでは、このコマンドが一次調整力参加時の基準出力も設定します。基準出力は各区間のreference_pointを引き継ぎ、設定値の計測地点を明示します。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        }
      },
      "messages": {
        "batteryPowerCommand": {
          "$ref": "#/components/messages/BatteryPowerCommand"
        }
      }
    },
    "batteryFcrCommand": {
      "address": "cmd/{siteId}/battery/fcr",
      "title": "一次需給調整市場（オフライン）のコマンドスケジュール",
      "description": "一次需給調整市場（オフライン）のコマンドスケジュールのトピック",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        }
      },
      "messages": {
        "batteryFcrCommand": {
          "$ref": "#/components/messages/BatteryFcrCommand"
        }
      }
    },
    "commandResponse": {
      "address": "ack-cmd/{siteId}",
      "title": "コマンドレスポンス",
      "description": "EMSからTensor Cloudへのコマンド実行結果。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        }
      },
      "messages": {
        "commandResponse": {
          "$ref": "#/components/messages/CommandResponse"
        }
      }
    },
    "alertEvent": {
      "address": "dt/{siteId}/{gatewayId}/alert",
      "title": "アラートイベント",
      "summary": "サイトアラートの状態変更イベント。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "alertEvent": {
          "$ref": "#/components/messages/AlertEvent"
        }
      }
    },
    "alertState": {
      "address": "dt/{siteId}/{gatewayId}/alert/active",
      "title": "アラートスナップショット",
      "summary": "現在アクティブなすべてのアラートの定期スナップショット。",
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "alertState": {
          "$ref": "#/components/messages/AlertState"
        }
      }
    },
    "telemetryFeedback": {
      "address": "ack-dt/{siteId}/{gatewayId}",
      "title": "テレメトリフィードバック",
      "description": "各テレメトリに対する`error`/`ok`の明示ACK。開発用途。テスト環境のみ（本番では無視）。",
      "servers": [
        {
          "$ref": "#/servers/テスト環境"
        }
      ],
      "parameters": {
        "siteId": {
          "$ref": "#/components/parameters/siteId"
        },
        "gatewayId": {
          "$ref": "#/components/parameters/gatewayId"
        }
      },
      "messages": {
        "telemetryFeedback": {
          "$ref": "#/components/messages/TelemetryFeedback"
        }
      }
    }
  },
  "operations": {
    "sendLifetimeTelemetry": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/lifetimeTelemetry"
      },
      "summary": "累積エネルギー（kWh）を送信。累積かウィンドウ集計のいずれか必須（可能なら両方）。",
      "messages": [
        {
          "$ref": "#/channels/lifetimeTelemetry/messages/energyLifetime"
        }
      ]
    },
    "sendEnergyTelemetry": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/energyTelemetry"
      },
      "summary": "ウィンドウエネルギーを送信",
      "messages": [
        {
          "$ref": "#/channels/energyTelemetry/messages/energyWindowed"
        }
      ]
    },
    "sendPowerTelemetry": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/powerTelemetry"
      },
      "summary": "瞬時電力を送信",
      "messages": [
        {
          "$ref": "#/channels/powerTelemetry/messages/powerInstant"
        }
      ]
    },
    "sendBatteryState": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/stateTelemetry"
      },
      "summary": "単一の蓄電池状態測定値を送信",
      "description": "送信する値はチャンネルのmetric（battery_soe / battery_energy_remaining）で決まる。",
      "messages": [
        {
          "$ref": "#/channels/stateTelemetry/messages/batteryState"
        }
      ]
    },
    "sendCurtailment": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/curtailment"
      },
      "summary": "出力抑制スケジュールを送信",
      "description": "EMSが出力抑制スケジュールを送信。",
      "messages": [
        {
          "$ref": "#/channels/curtailment/messages/curtailment"
        }
      ]
    },
    "sendIrradiation": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/irradiationTelemetry"
      },
      "summary": "日射量テレメトリを送信",
      "description": "EMSが発電所に設置された日射量センサーの測定値を送信。",
      "messages": [
        {
          "$ref": "#/channels/irradiationTelemetry/messages/irradiation"
        }
      ]
    },
    "sendSolarDc": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/solarDcTelemetry"
      },
      "summary": "太陽光DC電気テレメトリを送信",
      "description": "EMSがDCリンクサイトの太陽光アレイのDC電圧および電流をTensor Cloudへ送信。",
      "messages": [
        {
          "$ref": "#/channels/solarDcTelemetry/messages/solarDcElectrical"
        }
      ]
    },
    "sendGridFrequency": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/gridFrequencyTelemetry"
      },
      "summary": "系統周波数テレメトリを送信",
      "description": "EMSが系統接続ポイントで測定した系統周波数をTensor Cloudに送信。すべての一次調整力約定コマの全期間にわたり1 Hzで必須。",
      "messages": [
        {
          "$ref": "#/channels/gridFrequencyTelemetry/messages/gridFrequency"
        }
      ]
    },
    "sendPowerTelemetryBatch": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/powerTelemetryBatch"
      },
      "summary": "瞬時電力テレメトリをバッチ送信する",
      "description": "EMSが単一メトリックの多数の瞬時電力計測値を1つのメッセージで送信します。任意機能であり、Tensor Cloudがサイトごとに有効化します。当該サイトにライブのバッチ送信が許可されていない限り、バックフィルのみが対象です。",
      "messages": [
        {
          "$ref": "#/channels/powerTelemetryBatch/messages/powerInstantBatch"
        }
      ]
    },
    "sendGridFrequencyBatch": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/gridFrequencyTelemetryBatch"
      },
      "summary": "系統周波数テレメトリをバッチ送信する",
      "description": "EMSが多数の系統周波数計測値を1つのメッセージで送信します。任意機能であり、Tensor Cloudがサイトごとに有効化します。当該サイトにライブのバッチ送信が許可されていない限り、バックフィルのみが対象です。",
      "messages": [
        {
          "$ref": "#/channels/gridFrequencyTelemetryBatch/messages/gridFrequencyBatch"
        }
      ]
    },
    "receivePowerCommand": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/batteryPowerCommand"
      },
      "summary": "充放電コマンドを受信",
      "description": "EMSゲートウェイがTensor Cloudから蓄電池の充放電スケジュールを受信。",
      "messages": [
        {
          "$ref": "#/channels/batteryPowerCommand/messages/batteryPowerCommand"
        }
      ]
    },
    "receiveFcrCommand": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/batteryFcrCommand"
      },
      "summary": "一次需給調整市場（オフライン）のコマンドを受信",
      "description": "EMSゲートウェイがTensor Cloudから一次需給調整市場（オフライン）の落札スケジュールを受信。",
      "messages": [
        {
          "$ref": "#/channels/batteryFcrCommand/messages/batteryFcrCommand"
        }
      ]
    },
    "sendCommandResponse": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/commandResponse"
      },
      "summary": "コマンドレスポンスを送信",
      "description": "レスポンストピックはack-cmd/{siteId}/名前空間内。デフォルトはack-cmd/{siteId}。外れるとブローカーに拒否される。",
      "messages": [
        {
          "$ref": "#/channels/commandResponse/messages/commandResponse"
        }
      ]
    },
    "sendAlertEvent": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/alertEvent"
      },
      "summary": "アラート状態変更イベントを送信",
      "messages": [
        {
          "$ref": "#/channels/alertEvent/messages/alertEvent"
        }
      ]
    },
    "sendAlertState": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/alertState"
      },
      "summary": "現在のアクティブアラートスナップショットを送信",
      "messages": [
        {
          "$ref": "#/channels/alertState/messages/alertState"
        }
      ]
    },
    "receiveTelemetryFeedback": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/telemetryFeedback"
      },
      "summary": "テレメトリフィードバックを受信",
      "description": "テスト環境では、Tensor CloudがEMSから受信した各テレメトリメッセージに対し、このチャンネルで明示的な`error`または`ok`のACKを返します。この開発者向けフィードバックは本番環境では無視されます。応答トピックは`ack-dt/{siteId}/{gatewayId}`に限定されます。",
      "messages": [
        {
          "$ref": "#/channels/telemetryFeedback/messages/telemetryFeedback"
        }
      ]
    }
  },
  "components": {
    "parameters": {
      "siteId": {
        "description": "Tensor Cloudが最適化する系統接続ポイントを一意に識別するサイトID。\nフォーマット: 'si_' + 小文字英数字6桁\n例: si_qcf9gn\nオンボーディング時にTensor Energyが付与。"
      },
      "gatewayId": {
        "description": "Tensor Cloud接続EMS端末を一意に識別するゲートウェイID。\nフォーマット: 'gw_' + 小文字英数字6桁\n例: gw_0uv3tf\nオンボーディング時にTensor Energyが付与。"
      },
      "powerMetric": {
        "description": "瞬時電力（kW）のメトリック名。必須のメトリックはユースケースによって異なります。有効な組み合わせは連携ガイドを参照してください。",
        "enum": [
          "meter_export_ac",
          "meter_import_ac",
          "grid_to_load_ac",
          "load_demand_ac",
          "solar_net_generation_ac",
          "battery_charge_ac",
          "battery_discharge_ac",
          "solar_to_grid_ac",
          "solar_to_battery_ac",
          "solar_to_load_ac",
          "battery_to_grid_ac",
          "battery_to_load_ac",
          "grid_to_battery_ac",
          "solar_generation_dc",
          "battery_charge_dc",
          "battery_to_inverter_dc",
          "inverter_net_output_ac",
          "solar_to_battery_dc",
          "solar_to_inverter_dc",
          "inverter_to_battery_dc",
          "inverter_to_load_ac",
          "inverter_to_grid_ac",
          "grid_to_inverter_ac"
        ]
      },
      "energyMetric": {
        "description": "集計エネルギー（kWh）のメトリック名。必須のメトリックはユースケースによって異なります。詳しくは連携ガイドを参照してください。",
        "enum": [
          "meter_export_ac",
          "meter_import_ac",
          "grid_to_load_ac",
          "load_demand_ac",
          "solar_net_generation_ac",
          "battery_charge_ac",
          "battery_discharge_ac",
          "solar_to_grid_ac",
          "solar_to_battery_ac",
          "solar_to_load_ac",
          "battery_to_grid_ac",
          "battery_to_load_ac",
          "grid_to_battery_ac",
          "solar_generation_dc",
          "battery_charge_dc",
          "battery_to_inverter_dc",
          "inverter_net_output_ac",
          "solar_to_battery_dc",
          "solar_to_inverter_dc",
          "inverter_to_battery_dc",
          "inverter_to_load_ac",
          "inverter_to_grid_ac",
          "grid_to_inverter_ac"
        ]
      },
      "lifetimeMetric": {
        "description": "累積エネルギー（kWh）のメトリック名。増加カウンターを使用してください。Tensor Cloudはカウンターのリセットを処理できます。",
        "enum": [
          "meter_export_ac",
          "meter_import_ac",
          "grid_to_load_ac",
          "load_demand_ac",
          "solar_net_generation_ac",
          "battery_charge_ac",
          "battery_discharge_ac",
          "solar_to_grid_ac",
          "solar_to_battery_ac",
          "solar_to_load_ac",
          "battery_to_grid_ac",
          "battery_to_load_ac",
          "grid_to_battery_ac",
          "solar_generation_dc",
          "battery_charge_dc",
          "battery_to_inverter_dc",
          "inverter_net_output_ac",
          "solar_to_battery_dc",
          "solar_to_inverter_dc",
          "inverter_to_battery_dc",
          "inverter_to_load_ac",
          "inverter_to_grid_ac",
          "grid_to_inverter_ac"
        ]
      },
      "window": {
        "description": "集計ウィンドウ長（ISO 8601期間）",
        "enum": ["PT1M", "PT5M", "PT10M", "PT15M", "PT30M", "PT1H"]
      },
      "batteryStateMetric": {
        "description": "蓄電池状態のメトリックです。少なくとも蓄電池の状態エネルギー（SoE）と残存容量が必要です。残存容量は、劣化の影響を含む、定格温度での蓄電池容量（kWh）です。\n\n- battery_soe: 現在蓄電池に蓄積されているエネルギー（State of ChargeのkWh相当）。高頻度で更新してください。有効範囲：0 ≤ battery_soe ≤ battery_energy_remaining。\n- battery_energy_remaining: 劣化および故障セルを考慮した、定格温度（約25°C）での最大利用可能容量。通常は1日1回など、低頻度で更新してください。",
        "enum": ["battery_soe", "battery_energy_remaining"]
      }
    },
    "messages": {
      "EnergyLifetime": {
        "name": "EnergyLifetime",
        "title": "累積エネルギー読み取りテレメトリ",
        "summary": "kWh単位の累積エネルギー。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。EMSによってテレメトリが測定された時刻。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "description": "累積エネルギー（kWh）の測定値",
              "type": "object",
              "properties": {
                "value": {
                  "description": "運用開始以降の累積エネルギー。電力メーターと同様に、増加のみするカウンターを使用してください。Tensor Cloudはカウンターのリセットを処理できます。",
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "description": "測定単位",
                  "type": "string",
                  "enum": ["kWh"]
                }
              },
              "required": ["value", "unit"],
              "additionalProperties": false
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        }
      },
      "EnergyWindowed": {
        "name": "EnergyWindowed",
        "title": "ウィンドウエネルギー読み取りテレメトリ",
        "summary": "時間ウィンドウ集計エネルギー。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "EMSが設定するISO-8601準拠のタイムスタンプ。このウィンドウ測定ではmeasurement_value.start_tsと一致させ、ウィンドウの開始時刻を設定します。終了時刻や中間時刻は設定しません。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:00:00.000+09:00"]
            },
            "measurement_value": {
              "description": "ウィンドウ内で測定したエネルギー。区間にはstart_tsを含み、end_tsは含みません。たとえばend_tsが10:30の場合、10:29:59.999...までの測定値を含み、10:30の測定値は含みません。",
              "type": "object",
              "properties": {
                "start_ts": {
                  "description": "ISO-8601準拠のタイムスタンプ。ウィンドウの開始時刻（含む）",
                  "type": "string",
                  "format": "date-time",
                  "examples": ["2024-01-04T03:00:00.000+09:00"]
                },
                "end_ts": {
                  "description": "ISO-8601準拠のタイムスタンプ。ウィンドウの終了時刻（含まれない）",
                  "type": "string",
                  "format": "date-time",
                  "examples": ["2024-01-04T03:30:00.000+09:00"]
                },
                "value": {
                  "description": "ウィンドウ内の総エネルギー測定",
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "description": "測定単位",
                  "type": "string",
                  "enum": ["kWh"]
                }
              },
              "required": ["start_ts", "end_ts", "value", "unit"],
              "additionalProperties": false
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        }
      },
      "PowerInstant": {
        "name": "PowerInstant",
        "title": "瞬時電力読み取りテレメトリ",
        "summary": "瞬時電力（kW）。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "EMSが設定するISO-8601準拠のタイムスタンプ。'instant'ではサンプリング時刻を設定します。ウィンドウ測定（'average'）ではaggregation_windowの開始時刻を設定し、終了時刻や中間時刻は設定しません。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "pre_qualification": {
              "description": "任意。EMSが一次調整力事前審査（プレクオリフィケーション）モードで送信するテレメトリにtrueを設定する。このモードはTensor CloudではなくEMS運用者が有効化する。瞬時電力および系統周波数のテレメトリにのみ適用される。通常運用時は省略する（またはfalse）。Tensor Cloudはこのフラグを用いて、該当期間を最適化および一次調整力アセスメントⅡの提出対象から除外する。",
              "type": "boolean",
              "default": false
            },
            "measurement_value": {
              "description": "瞬時電力値",
              "type": "object",
              "properties": {
                "value": {
                  "description": "電力値。aggregationが 'instant' のときはmeasurement_tsにおける瞬時値、'average' のときはmeasurement_tsから始まるaggregation_windowにわたる平均値。",
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "description": "測定単位",
                  "type": "string",
                  "enum": ["kW"]
                },
                "aggregation": {
                  "description": "'value' がmeasurement_tsにおける瞬時点サンプル（'instant'、デフォルト）か、measurement_tsから始まる区間の平均（'average'）かを示す。オフラインの一次調整力アセスメントⅡでは 'average' を1秒ウィンドウで公開する。",
                  "type": "string",
                  "enum": ["instant", "average"],
                  "default": "instant"
                },
                "aggregation_window": {
                  "description": "'average' 値を算出した区間のISO-8601期間（例: 'PT1S'）。aggregationが 'average' のとき必須、'instant' のときは省略する。",
                  "type": "string",
                  "examples": ["PT1S"]
                }
              },
              "required": ["value", "unit"],
              "additionalProperties": false,
              "if": {
                "properties": { "aggregation": { "const": "average" } },
                "required": ["aggregation"]
              },
              "then": {
                "required": ["aggregation_window"]
              }
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        },
        "examples": [
          {
            "name": "一次調整力アセスメントⅡの1秒平均電力サンプル",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "measurement_ts": "2024-01-04T03:00:00.000+09:00",
              "measurement_value": {
                "value": 1480.5,
                "unit": "kW",
                "aggregation": "average",
                "aggregation_window": "PT1S"
              }
            }
          },
          {
            "name": "事前審査の電力サンプル",
            "summary": "実際の一次調整力コマと同じ1 Hz電力テレメトリだが、EMS運用者がサイトを事前審査モードにしている間はpre_qualification: trueを付与する。",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_b91ee208-58fb-45db-9a77-51e8c5e99388",
              "measurement_ts": "2024-01-04T03:00:00.000+09:00",
              "pre_qualification": true,
              "measurement_value": {
                "value": 1480.5,
                "unit": "kW",
                "aggregation": "average",
                "aggregation_window": "PT1S"
              }
            }
          }
        ]
      },
      "Curtailment": {
        "name": "出力抑制",
        "title": "出力抑制スケジュールテレメトリ",
        "summary": "出力抑制スケジュールのテレメトリメッセージ。系統用蓄電池システムを含むすべての構成で必須です。太陽光を併設しないサイトであってもTSOの出力抑制の対象となる場合があります。詳細は連携ガイドの「すべての構成に共通」のテレメトリ表を参照してください。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "出力抑制スケジュールのISO-8601準拠のタイムスタンプ。TSOが発行したスケジュール作成時刻を使用し、作成時刻が提供されない場合はEMSがTSOからスケジュールを受信した時刻を使用します。これはウィンドウ測定ではありません。対象期間はmeasurement_value[].start_tsとmeasurement_value[].end_tsで定義します。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "description": "出力抑制スケジュール",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "start_ts": {
                    "description": "ISO-8601準拠のタイムスタンプ。出力抑制イベントの開始時刻を示します。左側は含まれます。`end_ts`より前であり、かつ30分スロットの境界（JSTで分が `00` または `30`、秒は0）に一致する必要があります。",
                    "type": "string",
                    "format": "date-time",
                    "examples": ["2024-01-04T14:00:00.000+09:00"]
                  },
                  "end_ts": {
                    "description": "ISO-8601準拠のタイムスタンプ。出力抑制イベントの終了時刻を示します。右側は含まれません。`start_ts`より後であり、同じ30分スロットの境界に一致し、かつ `start_ts` のちょうど30分後である必要があります。より長い期間にわたる出力抑制は、1つの長い区間ではなく連続する30分区間としてパブリッシュしてください。境界に一致しない区間、または長さがちょうど30分でない区間は `TIME_WINDOW_INVALID` として拒否されます。",
                    "type": "string",
                    "format": "date-time",
                    "examples": ["2024-01-04T14:30:00.000+09:00"]
                  },
                  "limit_percent": {
                    "description": "TSOが許可する最大サイト出力の割合。0は全量抑制を示し、サイトからの出力は許可されません。有効範囲：[0,100]。",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                  }
                },
                "required": ["start_ts", "end_ts", "limit_percent"]
              }
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        }
      },
      "Irradiation": {
        "name": "Irradiation",
        "title": "日射量テレメトリ",
        "summary": "発電所に設置された日射量センサーの測定値（kW/m2）",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。EMSによってテレメトリが測定された時刻。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "description": "発電所に設置された日射量センサーの測定値",
              "type": "object",
              "properties": {
                "value": {
                  "description": "瞬時日射量",
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "description": "測定単位",
                  "type": "string",
                  "enum": ["kW/m2"]
                }
              },
              "required": ["value", "unit"],
              "additionalProperties": false
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        },
        "examples": [
          {
            "name": "日射量測定例",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "measurement_ts": "2024-01-04T12:30:00.000+09:00",
              "measurement_value": {
                "value": 0.845,
                "unit": "kW/m2"
              }
            }
          }
        ]
      },
      "SolarDcElectrical": {
        "name": "SolarDcElectrical",
        "title": "太陽光DC電気テレメトリ",
        "summary": "太陽光アレイ全体のDC電圧（V）および電流（A）のテレメトリメッセージ。DCリンクの太陽光発電＋蓄電池サイト向けに、一組の測定値として報告します。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。EMSによってテレメトリが測定された時刻。このメッセージの電圧と電流は、この同一時刻にサンプリングする必要があります。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "description": "DCリンクにおいて、インバータより上流で測定した太陽光アレイのDC電圧および電流。アレイ全体を集約した単一の値です。電圧と電流は同一時刻にサンプリングし、一組の測定値を構成します。",
              "type": "object",
              "properties": {
                "voltage": {
                  "description": "DCリンクにおける太陽光アレイの瞬時DC電圧（アレイ全体の集約値）",
                  "type": "object",
                  "properties": {
                    "value": {
                      "description": "DC電圧（ボルト）",
                      "type": "number",
                      "minimum": 0
                    },
                    "unit": {
                      "description": "測定単位",
                      "type": "string",
                      "enum": ["V"]
                    }
                  },
                  "required": ["value", "unit"],
                  "additionalProperties": false
                },
                "current": {
                  "description": "DCリンクにおける太陽光アレイの瞬時DC電流（アレイ全体の集約値、電圧と同一時刻にサンプリング）",
                  "type": "object",
                  "properties": {
                    "value": {
                      "description": "DC電流（アンペア）",
                      "type": "number",
                      "minimum": 0
                    },
                    "unit": {
                      "description": "測定単位",
                      "type": "string",
                      "enum": ["A"]
                    }
                  },
                  "required": ["value", "unit"],
                  "additionalProperties": false
                }
              },
              "required": ["voltage", "current"],
              "additionalProperties": false
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        },
        "examples": [
          {
            "name": "太陽光DC電気測定例",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "measurement_ts": "2024-01-04T12:30:00.000+09:00",
              "measurement_value": {
                "voltage": {
                  "value": 812.4,
                  "unit": "V"
                },
                "current": {
                  "value": 143.2,
                  "unit": "A"
                }
              }
            }
          }
        ]
      },
      "GridFrequency": {
        "name": "GridFrequency",
        "title": "系統周波数テレメトリ",
        "summary": "系統接続ポイントで測定した系統周波数（Hz）のテレメトリメッセージ。すべての一次調整力約定コマの期間中、1 Hzで必須。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "EMSが設定するISO-8601準拠のタイムスタンプ。'instant'ではサンプリング時刻を設定します。ウィンドウ測定（'average'）ではaggregation_windowの開始時刻を設定し、終了時刻や中間時刻は設定しません。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "pre_qualification": {
              "description": "任意。EMSが一次調整力事前審査（プレクオリフィケーション）モードで送信するテレメトリにtrueを設定する。このモードはTensor CloudではなくEMS運用者が有効化する。瞬時電力および系統周波数のテレメトリにのみ適用される。通常運用時は省略する（またはfalse）。Tensor Cloudはこのフラグを用いて、該当期間を最適化および一次調整力アセスメントⅡの提出対象から除外する。",
              "type": "boolean",
              "default": false
            },
            "measurement_value": {
              "description": "系統周波数の測定値",
              "type": "object",
              "properties": {
                "value": {
                  "description": "系統周波数（Hz）。系統接続ポイントで実際のAC電圧波形から測定する。0.01 Hz以上の分解能で報告し、公称値・スケジュール値・その他の導出値を公開しないこと。aggregationが 'instant' のときはmeasurement_tsにおける瞬時値、'average' のときはmeasurement_tsから始まるaggregation_windowにわたる平均値。一次調整力約定コマでは 'average' を1秒ウィンドウで1 Hzで公開する。",
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "description": "測定単位",
                  "type": "string",
                  "enum": ["Hz"]
                },
                "aggregation": {
                  "description": "'value' がmeasurement_tsにおける瞬時点サンプル（'instant'、デフォルト）か、measurement_tsから始まる区間の平均（'average'）かを示す。一次調整力約定コマでは 'average' を1秒ウィンドウで公開する。",
                  "type": "string",
                  "enum": ["instant", "average"],
                  "default": "instant"
                },
                "aggregation_window": {
                  "description": "'average' 値を算出した区間のISO-8601期間（例: 'PT1S'）。aggregationが 'average' のとき必須、'instant' のときは省略する。",
                  "type": "string",
                  "examples": ["PT1S"]
                }
              },
              "required": ["value", "unit"],
              "additionalProperties": false,
              "if": {
                "properties": { "aggregation": { "const": "average" } },
                "required": ["aggregation"]
              },
              "then": {
                "required": ["aggregation_window"]
              }
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        },
        "examples": [
          {
            "name": "系統周波数測定例（一次調整力約定コマ）",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "measurement_ts": "2024-01-04T12:30:00.000+09:00",
              "measurement_value": {
                "value": 50.0123,
                "unit": "Hz",
                "aggregation": "average",
                "aggregation_window": "PT1S"
              }
            }
          },
          {
            "name": "事前審査の系統周波数サンプル",
            "summary": "事前審査中の周波数は、EMSが蓄電池を動作させる模擬信号であり、同じ方法で発行するがpre_qualification: trueを付与する。",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_b91ee208-58fb-45db-9a77-51e8c5e99388",
              "measurement_ts": "2024-01-04T12:30:00.000+09:00",
              "pre_qualification": true,
              "measurement_value": {
                "value": 49.812,
                "unit": "Hz",
                "aggregation": "average",
                "aggregation_window": "PT1S"
              }
            }
          }
        ]
      },
      "PowerInstantBatch": {
        "name": "PowerInstantBatch",
        "title": "瞬時電力テレメトリ（バッチ）",
        "summary": "単一メトリックの多数の瞬時電力計測値を1つのメッセージにまとめたもの",
        "correlationId": {
          "description": "トレース用のmessage_idによる相関付け",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "このバッチメッセージのID（プレフィックス付きUUID形式）。測定値ではなく送信試行を識別します。再送時には、同じ測定値を異なるサイズのバッチに組み直すことができます。Tensor Cloudは各測定値のmessage_idを使って重複を排除します。",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "unit": {
              "description": "計測単位。'measurements' のすべての要素に適用されます",
              "type": "string",
              "enum": ["kW"]
            },
            "aggregation": {
              "description": "各 'value' が、その 'measurement_ts' 時点の瞬時サンプル（'instant'、既定値）か、その時刻から始まる区間の平均値（'average'）かを示します。'measurements' のすべての要素に適用されるため、値が変わる場合はバッチを分割してください。オフラインの一次調整力アセスメントⅡでは 'average' を1秒ウィンドウで公開します。",
              "type": "string",
              "enum": ["instant", "average"],
              "default": "instant"
            },
            "aggregation_window": {
              "description": "各 'average' 値を算出した期間をISO-8601のdurationで表したもの（例: 'PT1S'）。aggregationが 'average' の場合は必須、'instant' の場合は省略します。'measurements' のすべての要素に適用されるため、値が変わる場合はバッチを分割してください。",
              "type": "string",
              "examples": ["PT1S"]
            },
            "pre_qualification": {
              "description": "任意。EMSが一次調整力事前審査（プレクオリフィケーション）モードの間はtrueを設定します。このモードはEMS運用者が有効化します。値は'measurements'の全要素に適用されるため、運用者がモードを開始または終了する時点でバッチを分割してください。通常運用時は省略するかfalseを設定します。",
              "type": "boolean",
              "default": false
            },
            "measurements": {
              "description": "測定値を'measurement_ts'の昇順に厳密に並べ、同じタイムスタンプやmessage_idを重複させないでください。信頼できる測定値がない秒は省略し、代わりに0やnullを送信しないでください。Tensor Cloudはバッチ全体を受理または拒否します。",
              "type": "array",
              "minItems": 1,
              "maxItems": 900,
              "items": {
                "type": "object",
                "properties": {
                  "message_id": {
                    "description": "この個別計測値のID（プレフィックス付きUUID形式）。これが重複排除のキーです。同一の計測値を再送する場合は、バッチ形式・単一メッセージ形式のいずれであっても元の値を再利用してください。",
                    "type": "string",
                    "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
                    "examples": ["msg_b91ee208-58fb-45db-9a77-51e8c5e99388"]
                  },
                  "measurement_ts": {
                    "description": "EMSが設定するISO-8601準拠のタイムスタンプ。'instant'ではサンプリング時刻を設定します。'average'ではaggregation_windowの開始時刻を設定し、終了時刻や中間時刻は設定しません。",
                    "type": "string",
                    "format": "date-time",
                    "examples": ["2024-01-04T03:00:00.000+09:00"]
                  },
                  "value": {
                    "description": "バッチの 'unit' による電力値。aggregationが 'instant' の場合は 'measurement_ts' 時点の瞬時値、'average' の場合はその時刻から始まる区間の平均値です。",
                    "type": "number",
                    "minimum": 0
                  }
                },
                "required": ["message_id", "measurement_ts", "value"],
                "additionalProperties": false
              }
            }
          },
          "additionalProperties": true,
          "required": ["schema_version", "message_id", "unit", "measurements"],
          "if": {
            "properties": {
              "aggregation": {
                "const": "average"
              }
            },
            "required": ["aggregation"]
          },
          "then": {
            "required": ["aggregation_window"]
          }
        },
        "examples": [
          {
            "name": "一次調整力アセスメントⅡの1秒平均電力（1分ぶん）",
            "summary": "60個の1秒平均値を1つのメッセージにまとめた例。03:00:02の秒は信頼できる値が得られなかったため存在しません",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "unit": "kW",
              "aggregation": "average",
              "aggregation_window": "PT1S",
              "measurements": [
                {
                  "message_id": "msg_b91ee208-58fb-45db-9a77-51e8c5e99388",
                  "measurement_ts": "2024-01-04T03:00:00.000+09:00",
                  "value": 1480.5
                },
                {
                  "message_id": "msg_c02ff319-69ac-46ec-ab88-62f9d6faa499",
                  "measurement_ts": "2024-01-04T03:00:01.000+09:00",
                  "value": 1481.2
                },
                {
                  "message_id": "msg_d13aa420-7abd-4711-bc99-73fae7fbb500",
                  "measurement_ts": "2024-01-04T03:00:03.000+09:00",
                  "value": 1479.8
                }
              ]
            }
          }
        ]
      },
      "GridFrequencyBatch": {
        "name": "GridFrequencyBatch",
        "title": "系統周波数テレメトリ（バッチ）",
        "summary": "多数の系統周波数計測値を1つのメッセージにまとめたもの",
        "correlationId": {
          "description": "トレース用のmessage_idによる相関付け",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "このバッチメッセージのID（プレフィックス付きUUID形式）。測定値ではなく送信試行を識別します。再送時には、同じ測定値を異なるサイズのバッチに組み直すことができます。Tensor Cloudは各測定値のmessage_idを使って重複を排除します。",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "unit": {
              "description": "計測単位。'measurements' のすべての要素に適用されます",
              "type": "string",
              "enum": ["Hz"]
            },
            "aggregation": {
              "description": "各 'value' が、その 'measurement_ts' 時点の瞬時サンプル（'instant'、既定値）か、その時刻から始まる区間の平均値（'average'）かを示します。'measurements' のすべての要素に適用されるため、値が変わる場合はバッチを分割してください。一次調整力約定コマでは 'average' を1秒ウィンドウで公開します。",
              "type": "string",
              "enum": ["instant", "average"],
              "default": "instant"
            },
            "aggregation_window": {
              "description": "各 'average' 値を算出した期間をISO-8601のdurationで表したもの（例: 'PT1S'）。aggregationが 'average' の場合は必須、'instant' の場合は省略します。'measurements' のすべての要素に適用されるため、値が変わる場合はバッチを分割してください。",
              "type": "string",
              "examples": ["PT1S"]
            },
            "pre_qualification": {
              "description": "任意。EMSが一次調整力事前審査（プレクオリフィケーション）モードの間はtrueを設定します。このモードはEMS運用者が有効化します。値は'measurements'の全要素に適用されるため、運用者がモードを開始または終了する時点でバッチを分割してください。通常運用時は省略するかfalseを設定します。",
              "type": "boolean",
              "default": false
            },
            "measurements": {
              "description": "測定値を'measurement_ts'の昇順に厳密に並べ、同じタイムスタンプやmessage_idを重複させないでください。信頼できる測定値がない秒は省略し、代わりに0やnullを送信しないでください。Tensor Cloudはバッチ全体を受理または拒否します。",
              "type": "array",
              "minItems": 1,
              "maxItems": 900,
              "items": {
                "type": "object",
                "properties": {
                  "message_id": {
                    "description": "この個別計測値のID（プレフィックス付きUUID形式）。これが重複排除のキーです。同一の計測値を再送する場合は、バッチ形式・単一メッセージ形式のいずれであっても元の値を再利用してください。",
                    "type": "string",
                    "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
                    "examples": ["msg_c02ff319-69ac-46ec-ab88-62f9d6faa499"]
                  },
                  "measurement_ts": {
                    "description": "EMSが設定するISO-8601準拠のタイムスタンプ。'instant'ではサンプリング時刻を設定します。'average'ではaggregation_windowの開始時刻を設定し、終了時刻や中間時刻は設定しません。",
                    "type": "string",
                    "format": "date-time",
                    "examples": ["2024-01-04T03:00:00.000+09:00"]
                  },
                  "value": {
                    "description": "系統周波数（Hz）。系統連系点で実際のAC電圧波形から計測し、少なくとも0.01 Hzの分解能で報告してください。定格値、計画値、その他の導出値を送ってはいけません。",
                    "type": "number",
                    "minimum": 0
                  }
                },
                "required": ["message_id", "measurement_ts", "value"],
                "additionalProperties": false
              }
            }
          },
          "additionalProperties": true,
          "required": ["schema_version", "message_id", "unit", "measurements"],
          "if": {
            "properties": {
              "aggregation": {
                "const": "average"
              }
            },
            "required": ["aggregation"]
          },
          "then": {
            "required": ["aggregation_window"]
          }
        },
        "examples": [
          {
            "name": "1秒平均の系統周波数（バッチ）",
            "summary": "同じ秒の電力サンプルと時刻を揃えた周波数サンプル",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_e24bb531-8bce-4822-adaa-840bc8fcc611",
              "unit": "Hz",
              "aggregation": "average",
              "aggregation_window": "PT1S",
              "measurements": [
                {
                  "message_id": "msg_f45cc642-90de-4933-bfbb-951ca7edd722",
                  "measurement_ts": "2024-01-04T03:00:00.000+09:00",
                  "value": 49.812
                },
                {
                  "message_id": "msg_0561dd53-a1ef-4a44-cadd-a62bd9fdd833",
                  "measurement_ts": "2024-01-04T03:00:01.000+09:00",
                  "value": 49.987
                }
              ]
            }
          }
        ]
      },
      "BatteryStateValue": {
        "name": "BatteryStateValue",
        "title": "蓄電池状態テレメトリ",
        "summary": "単一の蓄電池状態測定値",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。EMSによってテレメトリが測定された時刻。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "number",
                  "minimum": 0
                },
                "unit": {
                  "type": "string",
                  "enum": ["kWh"]
                }
              },
              "additionalProperties": false,
              "required": ["value", "unit"]
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"]
        }
      },
      "BatteryPowerCommand": {
        "name": "BatteryPowerCommand",
        "title": "蓄電池電力設定値コマンド",
        "summary": "Tensor Cloudから任意の時間区間のスケジュールを送り、蓄電池の充放電を制御するコマンドです。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "issue_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。Tensor Cloudがコマンドを発行した時刻を示します。EMSが優先順位ポリシーを実行するために使用します。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-05T00:00:00.000+09:00"]
            },
            "res_topic": {
              "description": "EMSがコマンド結果を送信するレスポンストピック。ack-cmd/{siteId}名前空間内である必要があります。res_topicがこの名前空間外の場合、MQTTブローカーによって拒否されます。",
              "type": "string",
              "pattern": "^ack-cmd/si_[a-z0-9]{6}$",
              "examples": ["ack-cmd/si_qcf9gn"]
            },
            "control": {
              "description": "蓄電池電力設定値スケジュールのペイロード",
              "type": "object",
              "properties": {
                "priority": {
                  "description": "制御コマンドの優先度。値が大きいほど優先度が高くなります。たとえば、50は10より優先されます。",
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "schedule": {
                  "description": "充放電スケジュール",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "properties": {
                      "start_ts": {
                        "description": "ISO-8601準拠のタイムスタンプ。スケジュールされた充放電イベントの開始時刻を示します。左側は含まれます。",
                        "type": "string",
                        "format": "date-time",
                        "examples": ["2024-01-05T00:00:00.000+09:00"]
                      },
                      "end_ts": {
                        "description": "ISO-8601準拠のタイムスタンプ。スケジュールされた充放電イベントの終了時刻を示します。右側は含まれません。",
                        "type": "string",
                        "format": "date-time",
                        "examples": ["2024-01-05T00:30:00.000+09:00"]
                      },
                      "power_kw": {
                        "description": "充放電電力（kW）。正の値は充電、負の値は放電、0は待機を示します。この値の計測地点は同じ区間の'reference_point'で定義し、サイト構成からは決まりません。",
                        "type": "number",
                        "examples": [10.123, -5.5, 0]
                      },
                      "reference_point": {
                        "description": "この区間の'power_kw'をどの地点で計測するかを定義します。省略時の既定値は'battery'です。'battery'では、EMSが蓄電池そのものを目標値に追従させ、併設の発電には影響を与えません。0は蓄電池の待機を示します。'grid'では、'meter_export_ac'と'meter_import_ac'の計測地点である受電点を目標とし、蓄電池で発電量との差分を調整します。構内需要があるサイトでは、受電点とインバータのAC出力地点は異なります。0は受電点での正味潮流ゼロを示します。蓄電池と太陽光がインバータを共有するDCリンクのシステムでは、実測した太陽光出力に応じてEMSがAC設定値を補正し、'battery'の値を実現します。Tensor Cloudはすべてのコマンドでこのフィールドを明示し、EMSがschema_version 2.7.0以降を報告するサイトにのみ'grid'を送信します。'battery'でのインバータ制限や'grid'での蓄電量制限により要求値へ到達できない場合、EMSは物理的に到達可能な値にクランプして運転を継続し、SETPOINT_UNREACHABLEを発報します。",
                        "type": "string",
                        "enum": ["battery", "grid"],
                        "default": "battery"
                      }
                    },
                    "additionalProperties": false,
                    "required": ["start_ts", "end_ts", "power_kw"]
                  }
                }
              },
              "additionalProperties": false,
              "required": ["schedule", "priority"]
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "issue_ts", "res_topic", "control", "schema_version"]
        },
        "examples": [
          {
            "name": "蓄電池出力指令コマンド例",
            "summary": "2つの基準点を使用するスケジュール。最初の2区間では蓄電池を充電した後に待機させ、併設の発電はそのまま送電します。3区間目では、出力制限時間中の受電点をゼロに保つため、蓄電池が発電電力を吸収します。",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_7c1f0f4a-2f1a-4c3e-9a2b-6d5e4f3a2b1c",
              "issue_ts": "2024-01-04T23:45:00.000+09:00",
              "res_topic": "ack-cmd/si_qcf9gn",
              "control": {
                "priority": 2,
                "schedule": [
                  {
                    "start_ts": "2024-01-05T09:00:00.000+09:00",
                    "end_ts": "2024-01-05T09:30:00.000+09:00",
                    "power_kw": 800.0,
                    "reference_point": "battery"
                  },
                  {
                    "start_ts": "2024-01-05T09:30:00.000+09:00",
                    "end_ts": "2024-01-05T10:00:00.000+09:00",
                    "power_kw": 0,
                    "reference_point": "battery"
                  },
                  {
                    "start_ts": "2024-01-05T10:00:00.000+09:00",
                    "end_ts": "2024-01-05T10:30:00.000+09:00",
                    "power_kw": 0,
                    "reference_point": "grid"
                  }
                ]
              }
            }
          },
          {
            "name": "reference_pointを含まない蓄電池出力指令コマンド例",
            "summary": "両区間でreference_pointを省略しているため、既定値の'battery'が適用されます。バージョン2.7.0より前に送信されたコマンドの意味も維持されます。",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_1b2c3d4e-5f60-4718-8293-a4b5c6d7e8f9",
              "issue_ts": "2024-01-04T23:45:00.000+09:00",
              "res_topic": "ack-cmd/si_qcf9gn",
              "control": {
                "priority": 2,
                "schedule": [
                  {
                    "start_ts": "2024-01-05T18:00:00.000+09:00",
                    "end_ts": "2024-01-05T18:30:00.000+09:00",
                    "power_kw": -1500.0
                  },
                  {
                    "start_ts": "2024-01-05T18:30:00.000+09:00",
                    "end_ts": "2024-01-05T19:00:00.000+09:00",
                    "power_kw": 0
                  }
                ]
              }
            }
          }
        ]
      },
      "BatteryFcrCommand": {
        "name": "BatteryFcrCommand",
        "title": "一次需給調整市場（オフライン）のスケジュール",
        "summary": "Tensor CloudからEMSへ送信される一次需給調整市場（オフライン）の落札スケジュールが含まれるメッセージ",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "issue_ts": {
              "description": "ISO-8601準拠のタイムスタンプ。Tensor Cloudがコマンドを発行した時刻を示します。EMSが優先順位ポリシーを実行するために使用します。",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-05T00:00:00.000+09:00"]
            },
            "res_topic": {
              "description": "EMSがコマンド結果を送信するレスポンストピック。ack-cmd/{siteId}名前空間内である必要があります。res_topicがこの名前空間外の場合、MQTTブローカーによって拒否されます。",
              "type": "string",
              "pattern": "^ack-cmd/si_[a-z0-9]{6}$",
              "examples": ["ack-cmd/si_qcf9gn"]
            },
            "control": {
              "description": "一次需給調整市場（オフライン）スケジュールのペイロード",
              "type": "object",
              "properties": {
                "priority": {
                  "description": "制御コマンドの優先度。値が大きいほど優先度が高くなります。例: 値が50の場合は10よりも高い優先度を持ちます。",
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "action": {
                  "description": "実行するアクション。'execute'（デフォルト）は一次需給調整市場（オフライン）の落札スケジュールを実行します。'cancel'は指定された時間範囲内に以前に送信されたコマンドをキャンセルし、優先度ルールを尊重します（同等または低い優先度のコマンドのみをキャンセルします）。",
                  "type": "string",
                  "enum": ["execute", "cancel"],
                  "default": "execute"
                },
                "schedule": {
                  "description": "一次需給調整市場（オフライン）の制御スケジュール。action='execute'の場合、実行する落札が含まれます。action='cancel'の場合、キャンセルする時間範囲を指定します（capacity_kwは不要）。",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "properties": {
                      "start_ts": {
                        "description": "ISO-8601準拠のタイムスタンプ。一次需給調整市場（オフライン）の落札開始時刻を示します。左側は含まれます。",
                        "type": "string",
                        "format": "date-time",
                        "examples": ["2024-01-05T00:00:00.000+09:00"]
                      },
                      "end_ts": {
                        "description": "ISO-8601準拠のタイムスタンプ。一次需給調整市場（オフライン）の落札終了時刻を示します。右側は含まれません。",
                        "type": "string",
                        "format": "date-time",
                        "examples": ["2024-01-05T00:30:00.000+09:00"]
                      },
                      "capacity_kw": {
                        "description": "落札量（kW）。action='execute'の場合は必須、action='cancel'の場合は省略されます。",
                        "type": "number",
                        "minimum": 0,
                        "examples": [10.5, 25.0, 50.0]
                      }
                    },
                    "additionalProperties": false,
                    "required": ["start_ts", "end_ts"]
                  }
                }
              },
              "additionalProperties": false,
              "required": ["schedule", "priority"],
              "if": {
                "properties": {
                  "action": {
                    "const": "cancel"
                  }
                },
                "required": ["action"]
              },
              "then": {
                "properties": {
                  "schedule": {
                    "items": {
                      "not": {
                        "required": ["capacity_kw"]
                      }
                    }
                  }
                }
              },
              "else": {
                "properties": {
                  "schedule": {
                    "items": {
                      "required": ["capacity_kw"]
                    }
                  }
                }
              }
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "issue_ts", "res_topic", "control", "schema_version"]
        },
        "examples": [
          {
            "name": "一次需給調整市場（オフライン）コマンド例",
            "summary": "複数の30分コマの落札スケジュールを実行",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "issue_ts": "2024-01-04T23:55:00.000+09:00",
              "res_topic": "ack-cmd/si_qcf9gn",
              "control": {
                "priority": 50,
                "action": "execute",
                "schedule": [
                  {
                    "start_ts": "2024-01-05T06:00:00.000+09:00",
                    "end_ts": "2024-01-05T06:30:00.000+09:00",
                    "capacity_kw": 1200.0
                  },
                  {
                    "start_ts": "2024-01-05T06:30:00.000+09:00",
                    "end_ts": "2024-01-05T07:00:00.000+09:00",
                    "capacity_kw": 1500.0
                  }
                ]
              }
            }
          },
          {
            "name": "一次需給調整市場（オフライン）キャンセルコマンド例",
            "summary": "翌日のすべての落札をキャンセル",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_c4ce10c4-1234-1234-1234-123456789012",
              "issue_ts": "2024-01-05T12:00:00.000+09:00",
              "res_topic": "ack-cmd/si_qcf9gn",
              "control": {
                "priority": 100,
                "action": "cancel",
                "schedule": [
                  {
                    "start_ts": "2024-01-06T00:00:00.000+09:00",
                    "end_ts": "2024-01-07T00:00:00.000+09:00"
                  }
                ]
              }
            }
          },
          {
            "name": "一次需給調整市場（オフライン）部分キャンセル例",
            "summary": "特定の30分コマの落札をキャンセル",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_aabbccdd-3456-7890-abcd-ef1234567890",
              "issue_ts": "2024-01-05T10:30:00.000+09:00",
              "res_topic": "ack-cmd/si_qcf9gn",
              "control": {
                "priority": 75,
                "action": "cancel",
                "schedule": [
                  {
                    "start_ts": "2024-01-05T12:00:00.000+09:00",
                    "end_ts": "2024-01-05T12:30:00.000+09:00"
                  },
                  {
                    "start_ts": "2024-01-05T12:30:00.000+09:00",
                    "end_ts": "2024-01-05T13:00:00.000+09:00"
                  }
                ]
              }
            }
          }
        ]
      },
      "CommandResponse": {
        "name": "CommandResponse",
        "title": "コマンドレスポンス",
        "summary": "コマンド実行結果。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "このレスポンスの一意識別子",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "status": {
              "description": "実行結果ではなく、受信時点での検証と受理の結果です。EMSはコマンドを受信、パース、コミットした直後にACKを送信します。`ok`は、コマンドの形式が正しく受理されたことを示します。`error`は、検証に失敗したか、受信時の処理で受理またはコミットできなかったことを示します。詳しくは`errors`を参照してください。このACKでは、実行時に発生したエラーは報告できません。検証は全件一括です。EMSはコマンド全体を受理するか、すべてを適用しません。`control.schedule`に不正な項目が1件でもある場合、EMSは`error`を返し、直前まで有効だったスケジュールの実行を継続します。",
              "type": "string",
              "enum": ["ok", "error"]
            },
            "command_id": {
              "description": "応答対象のコマンドメッセージのmessage_id。受信したコマンドを解析できず（MESSAGE_MALFORMED）、そのmessage_idを復元できない場合は、センチネル文字列 \"unknown\" を設定します。message_idが一部復元できる場合は、復元した値を設定します。このセンチネルのため、command_idはmsg_ UUIDパターンには意図的に制約されていません。",
              "type": "string",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277", "unknown"]
            },
            "errors": {
              "description": "対応するコマンドで検出されたエラー。status = 'error'の場合は1件以上を含むこの配列を設定し、それ以外の場合は省略します。EMSは、最初のエラーで処理を止めず、不正なスケジュール項目ごとに1件を含む、検出したすべてのエラーを報告しなければなりません。検証は全件一括のため、各エラーはコマンド全体が拒否された理由を示します。EMSが有効な項目だけを個別に適用することはありません。",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "$ref": "#/components/schemas/ErrorCode"
                  },
                  "detail": {
                    "description": "状況を説明する詳細なエラーメッセージ",
                    "type": "string",
                    "examples": [
                      "電力値がバッテリーの最大容量を超えています",
                      "バッテリーへの接続が失われました"
                    ]
                  },
                  "field_path": {
                    "description": "エラーを引き起こしたフィールドへのパス。すべてのエラーがコマンドスケジュールの内容に直接起因するわけではないため任意。",
                    "type": "string",
                    "examples": ["control.schedule[0].power_kw"]
                  }
                },
                "required": ["code", "detail"],
                "additionalProperties": false
              }
            }
          },
          "additionalProperties": true,
          "required": ["message_id", "command_id", "status", "schema_version"],
          "if": {
            "properties": {
              "status": {
                "const": "error"
              }
            }
          },
          "then": {
            "required": ["errors"]
          },
          "else": {
            "not": {
              "required": ["errors"]
            }
          }
        },
        "examples": [
          {
            "name": "コマンドレスポンス正常例",
            "summary": "EMSがコマンドを正常に受け入れました",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd191-47fa-44ca-3243-40d7b4d88277",
              "status": "ok",
              "command_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277"
            }
          },
          {
            "name": "コマンドレスポンスエラー例",
            "summary": "Tensor Cloudがバッテリーの最大出力容量を超える放電電力値を送信しました",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_a80dd191-47fa-44ca-3243-40d7b4d88277",
              "status": "error",
              "command_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "errors": [
                {
                  "code": "FIELD_OUT_OF_RANGE",
                  "detail": "Power value exceeds battery maximum capacity",
                  "field_path": "control.schedule[0].power_kw"
                }
              ]
            }
          },
          {
            "name": "コマンドレスポンス複数エラー例",
            "summary": "EMSがスケジュール内のいくつかの検証失敗によりコマンドを拒否しました。ここに挙げられていないスロットは妥当でしたが、検証は全件一括であるため、このコマンドのスロットはいずれも適用されず、直前まで有効だったスケジュールの実行が継続されます",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_44444444-5555-6666-7777-888888888888",
              "status": "error",
              "command_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "errors": [
                {
                  "code": "FIELD_OUT_OF_RANGE",
                  "detail": "Power value exceeds battery maximum capacity",
                  "field_path": "control.schedule[0].power_kw"
                },
                {
                  "code": "TIME_WINDOW_INVALID",
                  "detail": "End timestamp must be after start timestamp",
                  "field_path": "control.schedule[1].end_ts"
                },
                {
                  "code": "MISSING_FIELD",
                  "detail": "Priority field is required",
                  "field_path": "control.priority"
                }
              ]
            }
          },
          {
            "name": "コマンドレスポンス不正形式例",
            "summary": "コマンドをJSONとして解析できずmessage_idを復元できないため、command_idはセンチネル値 \"unknown\" にフォールバックします",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_55555555-6666-7777-8888-999999999999",
              "status": "error",
              "command_id": "unknown",
              "errors": [
                {
                  "code": "MESSAGE_MALFORMED",
                  "detail": "Command payload is not valid JSON"
                }
              ]
            }
          }
        ]
      },
      "AlertEvent": {
        "name": "AlertEvent",
        "title": "アラートイベント",
        "summary": "アラートの状態変更イベント。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "measurement_ts": {
              "description": "EMSがアラート状態の変化を測定した時点のISO-8601タイムスタンプ",
              "type": "string",
              "format": "date-time",
              "examples": ["2024-01-04T03:26:10.000+09:00"]
            },
            "measurement_value": {
              "type": "object",
              "properties": {
                "code": {
                  "$ref": "#/components/schemas/AlertCode",
                  "description": "アラートタイプの識別子。"
                },
                "status": {
                  "description": "アラートが進行中（active）か、解決済み（cleared）か。",
                  "type": "string",
                  "enum": ["active", "cleared"]
                }
              },
              "required": ["code", "status"],
              "additionalProperties": false
            }
          },
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"],
          "additionalProperties": true
        }
      },
      "AlertState": {
        "name": "AlertState",
        "title": "アラートスナップショット",
        "summary": "現在アクティブなアラートのスナップショット。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "メッセージのID（プレフィックス付きUUID形式）",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_99999999-8888-7777-6666-555555555555"]
            },
            "measurement_ts": {
              "description": "EMSがスナップショットを取得した時点のISO-8601準拠タイムスタンプ",
              "type": "string",
              "format": "date-time",
              "examples": ["2025-09-10T11:20:00+09:00"]
            },
            "measurement_value": {
              "description": "アラートと現在の状態の一覧。アクティブなアラートがない場合も、所定の周期で空配列のスナップショットを送信してください。Tensor Cloudが正常なサイトと無応答のサイトを区別できるよう、空のスナップショットを省略しないでください。",
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "$ref": "#/components/schemas/AlertCode",
                    "description": "アラートタイプの識別子"
                  },
                  "first_seen_ts": {
                    "type": "string",
                    "format": "date-time",
                    "description": "このアラートが最初にアクティブとして確認された時点のISO-8601準拠タイムスタンプ。"
                  },
                  "last_seen_ts": {
                    "type": "string",
                    "format": "date-time",
                    "description": "このアラートが最後にアクティブとして確認された時点のISO-8601準拠タイムスタンプ。"
                  }
                },
                "required": ["code", "first_seen_ts", "last_seen_ts"],
                "additionalProperties": false
              },
              "minItems": 0
            }
          },
          "required": ["message_id", "measurement_ts", "measurement_value", "schema_version"],
          "additionalProperties": true
        },
        "examples": [
          {
            "name": "FirstActiveAlert",
            "summary": "EMSが初めて低SOCアラートを発生",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_11111111-2222-3333-4444-555555555555",
              "measurement_ts": "2025-09-15T10:00:00+09:00",
              "measurement_value": [
                {
                  "code": "BATT_SOC_LOW",
                  "first_seen_ts": "2025-09-15T10:00:00+09:00",
                  "last_seen_ts": "2025-09-15T10:00:00+09:00"
                }
              ]
            }
          },
          {
            "name": "OngoingActiveAlert",
            "summary": "アラートが継続中のスナップショット",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_22222222-3333-4444-5555-666666666666",
              "measurement_ts": "2025-09-15T10:05:00+09:00",
              "measurement_value": [
                {
                  "code": "BATT_SOC_LOW",
                  "first_seen_ts": "2025-09-15T10:00:00+09:00",
                  "last_seen_ts": "2025-09-15T10:05:00+09:00"
                }
              ]
            }
          },
          {
            "name": "MultipleAlerts",
            "summary": "2つのアラートが同時にアクティブなスナップショット",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_44444444-5555-6666-7777-888888888888",
              "measurement_ts": "2025-09-15T10:15:00+09:00",
              "measurement_value": [
                {
                  "code": "BATT_SOC_LOW",
                  "first_seen_ts": "2025-09-15T10:00:00+09:00",
                  "last_seen_ts": "2025-09-15T10:15:00+09:00"
                },
                {
                  "code": "PV_COMM_FAIL",
                  "first_seen_ts": "2025-09-15T10:12:00+09:00",
                  "last_seen_ts": "2025-09-15T10:15:00+09:00"
                }
              ]
            }
          }
        ]
      },
      "TelemetryFeedback": {
        "name": "TelemetryFeedback",
        "title": "テレメトリフィードバック",
        "summary": "テレメッセージに対する開発者向けフィードバック。テスト環境のみで使用され、本番環境では無視されます。",
        "correlationId": {
          "description": "message_idに基づくトレース",
          "location": "$message.payload#/message_id"
        },
        "contentType": "application/json",
        "payload": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "description": "安全な進化と後方互換性のためのスキーマのバージョン",
              "type": "string",
              "default": "2.9.0",
              "pattern": "^\\d+\\.\\d+\\.\\d+$",
              "examples": ["2.9.0"]
            },
            "message_id": {
              "description": "このレスポンスメッセージの一意なメッセージ識別子",
              "type": "string",
              "pattern": "^msg_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277"]
            },
            "correlation_id": {
              "description": "このフィードバックをトリガーしたテレメトリメッセージの`message_id`。受信したテレメトリを一切解析できず（MESSAGE_MALFORMED）、そのmessage_idを復元できない場合は、センチネル文字列 \"unknown\" を設定します。message_idが一部復元できる場合は、復元した値を設定します。このセンチネルを許容するため、correlation_idには意図的にmsg_ UUIDパターンの制約を課していません。",
              "type": "string",
              "examples": ["msg_a80dd197-47fa-44ca-8966-40d7b4d88277", "unknown"]
            },
            "status": {
              "description": "検証ステータス",
              "type": "string",
              "enum": ["ok", "error"]
            },
            "code": {
              "description": "statusがerrorの場合のエラーコード",
              "$ref": "#/components/schemas/ErrorCode"
            },
            "field_path": {
              "description": "該当する場合、エラーを引き起こしたフィールドへのパス",
              "type": "string",
              "examples": ["measurement_value.value"]
            },
            "topic": {
              "description": "拒否されたテレメトリメッセージの送信先トピック。任意項目で、statusがerrorの場合にのみ設定します。correlation_idがセンチネル\"unknown\"の場合、このトピックだけがEMSで拒否されたメッセージを特定できる情報となるため、設定を強く推奨します。",
              "type": "string",
              "examples": ["dt/site-123/gw-1/battery/state"]
            },
            "detail": {
              "description": "詳細なエラーメッセージ",
              "type": "string",
              "examples": ["soe_kwh must be positive"]
            }
          },
          "required": ["message_id", "correlation_id", "status", "schema_version"],
          "additionalProperties": true,
          "if": {
            "properties": {
              "status": {
                "const": "error"
              }
            }
          },
          "then": {
            "required": ["code", "detail"]
          },
          "else": {
            "not": {
              "anyOf": [
                {
                  "required": ["code"]
                },
                {
                  "required": ["detail"]
                },
                {
                  "required": ["topic"]
                }
              ]
            }
          }
        },
        "examples": [
          {
            "name": "テレメッセージが検証を通過",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_11111111-2222-3333-4444-555555555555",
              "correlation_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "status": "ok"
            }
          },
          {
            "name": "テレメッセージが検証を通過しなかった",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_22222222-3333-4444-5555-666666666666",
              "correlation_id": "msg_a80dd197-47fa-44ca-8966-40d7b4d88277",
              "status": "error",
              "code": "FIELD_OUT_OF_RANGE",
              "field_path": "measurement_value.value",
              "topic": "dt/site-123/gw-1/battery/state",
              "detail": "soe_kwh must be positive"
            }
          },
          {
            "name": "テレメトリメッセージが不正な形式",
            "summary": "テレメトリをJSONとして解析できずmessage_idを復元できないため、correlation_idはセンチネル \"unknown\" となり、topicが送信元チャネルを示します",
            "payload": {
              "schema_version": "2.9.0",
              "message_id": "msg_33333333-4444-5555-6666-777777777777",
              "correlation_id": "unknown",
              "status": "error",
              "code": "MESSAGE_MALFORMED",
              "topic": "dt/site-123/gw-1/battery/state",
              "detail": "Telemetry payload is not valid JSON"
            }
          }
        ]
      }
    },
    "schemas": {
      "AlertCode": {
        "title": "アラートコード",
        "description": "標準化されたアラートコードです。しきい値とマッピングの指針は、連携ガイドの「アラートコードリファレンス」を参照してください。1つのサイト障害で複数のコードが発報される場合があります。DCリンクのシステムでは、ハイブリッドインバータ、共通のパワーコンディショニング設備、共通の制御・集約装置など、太陽光アレイと蓄電池が共有するハードウェアの障害を`PV_OTHER`と`BATT_OTHER`の両方で報告します。EMSが1台の集約装置を介して蓄電池と太陽光に接続し、BMSとPVPCSそれぞれの通信状態を取得できない場合、その集約装置との通信途絶で`BATT_COMM_FAIL`と`PV_COMM_FAIL`の両方を発報できます。",
        "type": "string",
        "enum": [
          "BATT_SOC_LOW",
          "BATT_SOH_DEGRADED",
          "BATT_OVERTEMP",
          "BATT_COMM_FAIL",
          "BATT_OTHER",
          "PV_COMM_FAIL",
          "PV_OTHER",
          "CURT_COMM_FAIL",
          "GRID_OTHER",
          "SETPOINT_UNREACHABLE",
          "UNKNOWN_FAULT"
        ]
      },
      "ErrorCode": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "エラーコード",
        "description": "標準化されたエラーコード。詳しくはプロトコル仕様の「エラーコード」を参照してください。`INTERNAL_ERROR`には、形式が正しいコマンドをACK送信前の受信処理で受理またはコミットできなかった場合も含まれます。たとえば、スケジュール変更のコミット中に発生した内部エラーが該当します。",
        "type": "string",
        "enum": [
          "MESSAGE_MALFORMED",
          "MISSING_FIELD",
          "TYPE_MISMATCH",
          "FIELD_OUT_OF_RANGE",
          "TIME_WINDOW_INVALID",
          "DUPLICATE",
          "EXPIRED",
          "RESOURCE_UNAVAILABLE",
          "INTERNAL_ERROR"
        ]
      }
    },
    "securitySchemes": {
      "awsIotCore": {
        "type": "X509",
        "description": "AWS IoT CoreのX.509証明書認証。証明書はTensor Energyが発行。"
      }
    }
  }
}
