# コマンド送信

コマンドは、接続された単一のデバイスにリアルタイムで送信されるリクエストです。デバイスはアクションを実行し、レスポンスを返します。Fleetsは実行結果を記録し、コマンドが成功したか、失敗したか、タイムアウトしたかを確認できます。

## 前提条件

- 対象デバイスはThingとして登録されている必要があります。
- デバイスはオンラインで、コマンド用トピックをサブスクライブしている必要があります。オフラインのデバイスに送信されたコマンドはタイムアウトします。

## コンソールからコマンドを送信する

1. Fleetsのデプロイメントで、**Commands & Jobs** に移動します。
2. **+ Send Command** をクリックします。
3. 以下の項目を入力します：
   - **Thing**：対象のデバイスを選択します。
   - **Action**：Thing Typeスキーマで定義されたアクション名を入力します（例：`setTemperature`、`unlock`、`reboot`）。スキーマにコマンドが定義されていなくても任意のアクション名を送信可能です。
   - **Parameters**：（任意）アクションの入力パラメータを含むJSONオブジェクト。
   - **TTL**：（任意）Fleetsがデバイスのレスポンスを待つ秒数。これを超えると実行は `TIMED_OUT` とマークされます。
4. **Send** をクリックします。

Fleetsはデバイスにコマンドをパブリッシュし、実行レコードを作成します。実行状況は **Commands & Jobs** ページの **Commands** タブに表示されます。

## コマンド実行の流れ

1. Fleetsは以下のトピックにパブリッシュします：`$emqx/commands/things/{thingName}/executions/{executionId}/request`
   ```json
   {
     "commandId": "...",
     "action": "setTemperature",
     "params": { "value": 24 },
     "timestamp": 1748390400,
     "ttl": 30
   }
   ```
2. デバイスはリクエストを受信し、アクションを実行後、以下のトピックにレスポンスをパブリッシュします：`$emqx/commands/things/{thingName}/executions/{executionId}/response`
   ```json
   {
     "status": "SUCCEEDED",
     "result": { "currentTemperature": 24 }
   }
   ```
3. EMQXはレスポンスをFleetsにルーティングし、Fleetsは実行ステータスを更新します。

## コマンド実行結果の確認

1. **Commands & Jobs** > **Commands** タブに移動します。
2. テーブルには各実行の **Execution ID**、**Things**、**Action**、**Status**、**Created At** のタイムスタンプが表示されます。
3. 実行IDをクリックすると、パラメータやレスポンスペイロードを含む詳細な実行内容を確認できます。

![commands_list](./_assets/commands_list.png)

## コマンド一覧のフィルタリング

Commandsタブ上部のフィルター機能を使って一覧を絞り込みます：

- **Thing IDでフィルター**：特定のデバイスのコマンドを表示
- **Actionでフィルター**：特定のアクション名のコマンドを表示
- **Status**：実行ステータスでフィルター（`SENT`、`SUCCEEDED`、`FAILED`、`REJECTED`、`TIMED_OUT`、`CANCELED`）

## API経由でコマンドを送信する

```text
POST /api/v1/commands
```

リクエストボディ例：
```json
{
  "thingId": "thermostat-001",
  "action": "setTemperature",
  "params": { "value": 24 },
  "ttl": 30
}
```

- `params`：任意。デバイスに渡す入力パラメータのJSONオブジェクト。
- `ttl`：任意。タイムアウト秒数。指定時間内にデバイスが応答しない場合、実行ステータスは `TIMED_OUT` になります。

レスポンスにはステータス確認に使う `executionId` が含まれます：
```text
GET /api/v1/commands/{executionId}
```

## 次のステップ

- [Commands and Jobs Overview](./commands_and_jobs_overview.md)
- [Manage Jobs](./manage_jobs.md)
- [Integrate Commands on the Device Side](../device_integration/mqtt_integration.md#commands)
