# PowerChecker-KM003C

[English setup and usage](README.en.md)

画面右上の「日本語 / English」で言語を切り替えられます。初回はブラウザーの言語に合わせ、選択後は同じサイトのトップページと共通で保存します。切り替えても機器接続・PDO選択・確認チェック・掃引の待機は維持します。PNG・Markdown・HTMLレポートも選んだ言語で出力します。入力した名前・メモ、元の通信ログ、JSONバックアップ、CLI互換CSVの列名は保持します。

KM003Cにブラウザーから直接接続する充電器チェック画面です。標準モードにはCLI、Python、ローカルサーバーのインストールは不要です。公開されたHTTPSページを対応ブラウザーで開き、KM003Cを選択すると測定・制御・レポート出力を利用できます。

## 接続方式の自動選択

通常は「KM003Cに接続・PDOと番号を取得」を押します。USBからPDパケットと電圧・電流を取得し、実際のSource CapabilitiesからObject番号を取り込みます。EPRの予約枠（Object 6/7）が空でも、後続のObject 8〜11を詰めません。Serialの表示行から番号を推測することはありません。

通常のPDO取得は、USBを選択した後「続ける」を押して同じKM003CのSerialポートも選択します。初回の2つの機器選択には、それぞれボタンクリックが必要です。接続済みの場合は再取得ボタンだけで実行できます。USB記録を開始してからSerialでPDM・PDを初期化し、PDO一覧が連続2回一致することを確認します。USBで実際に取得した一覧と一致する場合に限り、Object番号を反映します。外部負荷はOFFまたは低電流にして行ってください。

Serial応答はready直後の断片や受信窓末尾のデータも待ちます。ready / PDO一覧のタイムアウト時はreset → pdm closeを確認して1回再試行します。機器の拒否、停止、切断、終了処理の異常では再試行しません。PDO取得の終了時はreset → pdm closeを行います。USBから番号を取得できない場合もSerialのPDOは表示し、番号は推測しません。PD通信が取得できない状態では生データ・通信ログを確認してください。

電圧要求・掃引は接続済みのSerialを再利用し、USBで取得した番号と選択を維持します。要求前には同じSerial接続でPD初期化・PDOの提示値確認を行います。USBとSerialでは同じKM003Cを選択してください。測定は接続済みの測定経路を再利用し、未接続ならHIDを優先します。ブラウザーの機器選択・許可は必要です。従来の手動接続ボタンは詳細設定にあります。

Serialだけで取得する従来の手順は「SerialでPDOを取得する」の詳細設定に残しています。USBの番号を照合できなかったSerial応答だけの結果は、番号を手動入力する従来の扱いです。CLIモードも同じ従来の取得処理を利用します。

## PD記録とCSV保存

「PDプロトコル＋電圧・電流を記録」でUSBのPD通信と同じデバイス時刻の電圧・電流を記録します。「記録・測定」欄の終了条件で、「時間で停止」（既定10秒）か「停止ボタンを押すまで継続」を選びます。2つは排他で、継続を選ぶと秒数入力は無効になります。PD記録・電圧電流測定の両方に適用し、PDO取得・掃引には影響しません。停止・失敗した部分記録も保存できます。記録はPDイベントまたは測定値が20万件に達すると停止します。

PDプロトコル欄に時刻（µs）、SOP、Message、Role、Dataを表示します。表示は末尾200件、CSVは全件です。「GoodCRCを非表示（CSVには保存）」は画面表示だけに作用します。PD CSV・生データにはGoodCRCも保存します。GoodCRCしかない記録でもCSVを保存できます。

- PD CSV（`.csv`）：`km003c_cli.py capture` と同じ15列・Utility互換表記。SOP / SOP_PRIME / SOP_DPRIME、Revのv1/v2/v3、ヘッダー・オブジェクト・拡張メッセージのDataを保持します。歴史的な `Vbus(V)` 見出しの値は整数mVです。
- 同じ記録の電圧・電流CSV（`.scope.csv`）：CLIの19列。デバイス時刻、校正済み電圧・電流、CC1/CC2、電力とKM003CのRaw値を保存します。µVのRaw値をCY4500のADCカウントに変換しません。
- レポート欄の電圧・電流CSV：現在のADC測定・掃引の測定点を同じScope列で保存します。ホスト時刻の測定ではTimestamp Rawを空欄にし、Timestamp(us)は測定開始からの相対ホスト時刻です。

KM003Cが提供しないOk（CRC/EOP判定）、Duration、Deltaは空欄です。Start TimeとEnd Timeは単一の観測時刻で、物理信号の継続時間ではありません。未知のイベントや接続状態をPDパケットに変換せず、生データに残します。PNG/Markdown/HTML/JSONのレポート保存は従来どおり使えます。

USB接続済みで「掃引中のPD通信も記録」がONなら、PD初期化・要求と並行してUSBから記録します。掃引の最終点、失敗、停止時にはUSB記録を終了してからreset → PDM終了を行い、バックグラウンド測定を継続しません。終了処理中はその状態を画面に表示します。USBのPD取得とADC読み取りは同時に送信せず順に処理します。PD記録のScope CSVはデバイス時刻、掃引のADC CSVはホスト時刻なので、同じ時計のデータとして混ぜません。PD CSVと対になるデバイスScopeはPDプロトコル欄から保存してください。USBが未接続の場合はPD記録を行わず、HIDによる測定・掃引は従来どおり使えます。外部電子負荷の電流は制御しません。

## CLI不要の直接接続

1. KM003CのPC接続用USB端子をデータ対応のケーブルでPCにつなぎます。
2. Chrome / Edgeなど、使用するWebHID・WebUSB・Web Serialに対応したブラウザーでHTTPSページを開きます。APIの対応状況は画面に表示します。
3. 「KM003Cに接続・PDOと番号を取得」で機器を選び、案内された「続ける」で同じKM003CのSerialも選択してPDOを取得します。その後は測定・給電ログ・PD制御のボタンを選ぶと必要な接続を案内します。従来の3つの接続ボタンは詳細設定にあります。
4. ログの解析とPNG/Markdown/HTML/JSON生成はブラウザー内で処理します。直接接続モードは `/api/` やCLIブリッジへ通信しません。

WindowsのUSBパケット取得は、vendor interface 0をWinUSBで利用できるドライバー設定が必要になる場合があります。WebHID測定とWeb Serial制御は、機器のHID・COMインターフェースを利用します。USBとSerialを同時に選ぶ場合は同じKM003Cを選択してください。Web Serial経由のバイナリADCはCLIと同じポーリング方式です。ファームウェアによって対応が異なる可能性があります。

すべてのブラウザー・スマートフォンでの動作を保証するものではありません。対応APIがない環境でも、デモ・ファイル読み込み・レポート作成は使えます。計測中はページを開いたままにしてください。別アプリが同じインターフェースを使用している場合は閉じてから接続してください。

## 公開するファイル

`km003c/index.html`、`styles.css`、`engine.js`、`device.js`、`export.js`、`transitions.js`、`app.js` を同じフォルダーでHTTPS配信すると直接接続モードを使えます。バックエンドは不要です。リポジトリのトップページは `km003c/` に移動します。

## 任意のローカルCLIモード

CLIモードには次の2つが必要です。CLI本体だけではPowerCheckerの画面は起動しません。

1. [KM003C-CLI本体（GitHub）](https://github.com/inuchanbt/KM003C-CLI)：リポジトリ全体を取得します。`km003c_cli.py`、`km003c_modules/`、`requirements.txt`を一緒に保存し、CLI側のREADMEに従ってPython・依存ライブラリを準備します。
2. [PowerCheckerローカル接続セット（ZIP）](https://pd240lab.com/downloads/PowerChecker-KM003C.zip)：展開するとWeb画面・`bridge.py`・`cli_runner.py`・`control_session.py`が揃います。PowerCheckerのリポジトリ全体を取得する方法でも構いません。CLI本体はこのZIPに含みません。

展開したPowerChecker-KM003Cフォルダーで実行します。`--cli`は実際に保存したCLI本体の場所に合わせてください。

```powershell
cd .\PowerChecker-KM003C
python km003c/bridge.py --cli D:\KM003C\km003c_cli.py
```

ブラウザーで http://127.0.0.1:8765/km003c/ を開きます。既定では `D:\KM003C\km003c_cli.py` と、そのフォルダーの `.venv\Scripts\python.exe` を使います。

画面の「接続方法」を「ローカルCLI」に切り替えると、このブリッジを使います。これは標準の直接接続モードとは別の任意機能です。

別の場所にあるCLIやPythonを利用する場合：

```powershell
python km003c/bridge.py --cli C:\tools\KM003C\km003c_cli.py --python C:\tools\KM003C\.venv\Scripts\python.exe --port 8765
```

CLIの依存ライブラリ・接続ドライバーはKM003C側のREADMEに従って用意してください。ブリッジ自体はPython標準ライブラリだけを使います。ブリッジは127.0.0.1にだけ接続を待ち受け、インターネットには公開しません。

8765が使用中の場合は `python km003c/bridge.py --port 8766` で起動し、http://127.0.0.1:8766/km003c/ を開いてください。

## ローカルCLIでの使い方

PDOだけなら、接続方法を「ローカルCLI」にしてCDCポート（例：`COM14`）を指定し、「PDOだけ取得（Serial）」を押します。更新されたCLIの `python .\km003c_cli.py pdo --port COM14` を使う方式です。ブリッジは `pdo --quiet --response-file ...` を実行し、最終応答を表とレポートへ反映します。COMを開き直しながら `pdm open` / `entry pd` / `pd --pdo` を別プロセスで順に呼び出す取得手順は使いません。

標準の取得プロファイルはCLIと同じPD 3.1 / EPRです。PD 3.0 / PPSを選ぶと `--type 1 --em 1 --no-epr` を指定します。外部負荷はOFFまたは低電流にしてください。これはPD初期化を伴う取得操作で、PD制御欄のdry-runとは別です。終了時はCLIの既定どおり `reset` → `pdm close` を実行し、`--keep-trigger` は付けません。CLI起動には `bridge.py` と同じフォルダーの `cli_runner.py`、`control_session.py` も必要です。停止要求をCLIへ通知し、待ち時間・終了処理に最大25秒待ってから、応答しない場合だけ強制終了します。

ブラウザー直接モードの通常ボタンはUSBから番号付きPDOを取得します。詳細設定の「SerialでPDOだけ取得」を選ぶと、従来のSerial取得を利用できます。改行なしの送信、PDMのbusy時の終了・再起動、起動待ち、ready待ち、EPR PDOの追加待ち、最後のreset/closeを一つのSerial接続で行います。PDの電圧要求やADC測定は送りません。これは機器が応答した提示能力で、パケットの観測や実出力試験とは区別します。

最終応答にあるFixed / PPS / SPR AVS / EPR AVSを表とレポートに取り込みます。Object番号やRaw PDOはテキストの表示順から推測しません。その場合は「—」と表示し、要求時は実機の表示やUSBログで確認したObject番号を明示入力してください。番号付きの制御用PDOはUSBログから取得できます。元の応答バイトは「通信ログ / 元データ」から保存でき、JSONバックアップにも取得結果を残します。

1. 「機器を確認」でUSB/HID/CDCの一覧を確認します。CDCの制御には仮想COMを使い、PDキャプチャにはUSBを使います。複数台ある場合はシリアル番号で選択します。
2. 充電器名、**単ポート**表記出力、ケーブル・負荷・他ポートの状態を入力します。
3. 「PDO・給電ログを取得」を押し、必要に応じて取得中に充電器を再接続します。接続済みで交渉が起きないと、PDOが取得できない場合があります。機器のSink能力を自動で切り替えるスキャンはこの版では実装していません。
4. まず単ポートの状態を取得し、「現在の状態を保存」を押します。次に他ポートへ**実際に負荷を接続**して再取得・保存すると、提示能力を比較できます。複数ポートの負荷をソフトウェアだけで模倣する機能ではありません。
5. PNG画像、Markdown、HTML、JSONを保存できます。JSONには元のイベント・測定値、テスト条件、比較状態を含み、再読み込みできます。元のCLI出力も「CLIログ / 元データ」から保存できます。

測定データは `captures/powerchecker/<session id>/` に保存します。停止時はCLIを終了し、すでに書き込まれた部分データを表示します。停止はトリガーの出力電圧をリセットする操作ではありません。必要なら「トリガー初期化」またはPDM終了を別途実行してください。

## 制御

PD制御は既定で **dry-run** です。CLIが送るコマンドを表示し、機器には送信しません。実際に制御する場合はdry-runを外し、接続機器・負荷が要求電圧に対応するテスト用接続を確認します。

「PDOだけ取得」の結果も「要求するPDO」へ反映します。Serial応答にはObject番号がないため、その場合だけ実機やUSBログで確認したObject番号を入力します（SPRは1〜7、EPRは8〜13）。表示行順から推測しません。USBログから取得した番号付きPDOでは番号の入力は不要です。インポートしたデータは制御に使いません。

電圧要求・掃引の開始時には、ブラウザーもCLIも同じCOM接続で初期化・PDO再取得・提示値の一致確認を行ってから要求します。提示能力が変われば中止し、再取得が必要です。Serialだけでは指定したObject番号自体の正しさは照合できないため、番号は利用者が確認してください。単発の電圧要求に成功した場合は要求状態を維持します。終了時はトリガー初期化・PDM終了後に電圧を確認してください。要求失敗・掃引の完了や停止時にはreset → PDM終了を行います。

制御欄は「接続・モード」と「電圧・電流を要求」に分けています。ポート名の初期値は `C1` です。直接モードではこの接続、CLIモードではこのブリッジで正常取得した最新のSource CapabilitiesからFixed / PPS / SPR AVSを選択できます。ログ読み込みだけでは制御用PDOは設定しません。PPSは20mV/50mA、AVSは100mV/50mA刻みで要求します。SPR AVSは15V以下・15V超の電流上限を別々にチェックします。

EPR Fixed / AVSは、この接続で取得したPDOがあり、「EPR領域を使用する」にチェックが入っていれば候補に表示します。「送信せずコマンドを確認」がONでもEPRを選んで確認できます。EPRチェックの切り替えは送信モードを変更せず、機器へも送信しません。接続・負荷の確認チェックは解除します。USBで番号付きEPR PDOを取得済みなら、要求時に自動初期化・再確認します。Serial応答だけを利用する実際のEPR送信前には、EPRプロファイルの取得か「EPR用に設定」を完了してください。両方とも同じPD 3.1初期化・PDO取得・終了処理を行うため、成功を設定済み状態へ反映します。SPRしか取得できなかった場合は「設定済み・EPR PDO未取得」と表示します。設定手順はpdm open → pdm set type=2,em=2,sink=1 → entry pd → pd pdo → reset → pdm closeです。実際の要求時にも再初期化・PDO再確認を行います。

同じSerial接続のPDM開始・PDへ移行・EPRプロファイルでのPDO再取得や、HID / USB接続の追加では設定済み状態を維持します。取得したPDO自体は設定・取得の更新ごとに差し替えます。SPRプロファイルへの切り替え、設定・再取得・移行の失敗、Serialの接続変更・切断、リセット、明示的なPDM終了、掃引の終了ではEPRを無効にします。要求実行時にも同じ接続で初期化・PDOの一致確認を行います。設定はケーブルの性能・負荷の耐圧を検証する機能ではないため、実際のEPR対応ケーブルと負荷を使ってください。

PPS / AVS掃引では、選択したAPDO、確認済みObject番号、開始・終了mV、刻みmV、要求電流mA、待ち時間、往復を指定します。全点の電圧・電流上限と要求刻みを事前に検証します。開始と終了は刻みで割り切れる範囲にし、往復を含め最大500点、待ち時間0.1〜10秒です。PPSは20mV、AVSは100mV刻みです。外部電子負荷の電流は制御しません。

「開始電圧を要求して、負荷の準備ができるまで待つ」は初期値ONです。CLIの `--pause-before-sweep` と同じく、初期化・PDO再確認 → 開始電圧の要求・保持 → 負荷の準備待ち → 「負荷の準備ができたので掃引を続ける」→ 開始電圧から掃引、の順に動きます。待機中も要求状態を維持するため、実際のVBUSを確認して外部電子負荷を設定してください。準備用の要求は掃引CSVの測定点に含めません。PD記録を有効にしていれば、ブラウザーでは準備中もUSBの記録を続けます。

ブラウザー直接接続・ローカルCLIの両方で画面から続行できます。CLIは上記フラグを渡し、画面の続行をEnter相当として伝えます。準備待ち時間はCLIの実行タイムアウトに含めません。待機中の「掃引を停止」もreset → PDM終了の処理を行います。チェックを外すと待機せず掃引します。「送信せずコマンドを確認」では開始電圧の準備用コマンドも表示し、実送信や待機は行いません。ローカルCLI方式では更新した `bridge.py` を再起動してください。

「各電圧で電圧・電流も測定」を選ぶと、ブラウザーでは別のHID / USB接続、CLIでは選択したHID / USB測定接続からADCを取得します。測定点はグラフとレポートに反映し、要求値・実測値・応答・エラーはCSVで保存できます。測定なしのCSVは電圧要求ログであり、出力確認ではありません。「取得を停止」で中断すると、終了処理後に部分データを保存できます。CSVはログ読み込みにも対応します。

EPR AVSの要求電流は、その電圧でPDPを超えない値と5Aの小さい方を50mA単位で切り下げた上限でチェックします。EPR Source CapabilitiesのObject 6/7の空き枠は番号をずらさず扱います。設定変更や接続解除・リセット後のPDOは制御に再利用できません。新しいSPRメッセージしか取れていない場合に、以前のEPR能力を補って要求することもありません。

要求電流は電子負荷を流す設定ではありません。送信成功は交渉成立や所定出力の確認ではないため、応答ログと電圧・電流の測定を合わせて確認してください。ケーブルやポート・負荷状態を変更したら再キャプチャしてください。機器・ファームウェアのEPR/SPR AVS制御対応は実機で確認が必要です。

EPRチェック解除は候補を隠す操作で、出力電圧を戻す操作ではありません。終了時はPDM終了やトリガー初期化後に電圧を確認してください。

ローカルブリッジを起動済みの場合、新しい `export.js` の配信を読み込むため更新後に再起動してください。公開HTTPSページにはブリッジの再起動は不要です。

## オフライン読み込み

- `capture` の `.records.jsonl`：PDイベントと測定値。単独で選択します。
- 同じ取得のPD `.csv` と `.scope.csv`：一緒に選択できます。
- 単独 `scope` / `live-status` / `adc` のCSV、ADCのJSONL：測定値の解析に対応します。ホスト時刻のため、別取得のPDと対応付けしません。
- PowerCheckerのJSONバックアップ：単独で選択します。

1回の選択は合計25MBまで。別の測定を時系列に混ぜないため、測定値のあるファイルは1つずつ読み込みます。同じセッションの組み合わせかは利用者が確認してください。`.records.bin`、`.ccgx3` は先にCLIで変換してください。

## 判定の意味

- 「PDOの提示能力」は充電器が広告した能力です。測定したピーク出力や連続負荷出力を保証する値ではありません。
- 表記との比較では丸め許容0.5Wを使います。これは規格適合基準ではありません。PPS Power LimitedフラグがあるPDOは、電圧×電流を実現できるとは限らないので提示能力の最大値算出から除外します。
- ReportのPDO表は取得全体で観測した一覧です。比較の保存には、最後に取得したSource Capabilitiesの構成を使います。
- PPS電流が固定PDOより低いことだけでは、規格違反や特定機器との相性問題と判定しません。
- VBUS低下は連続した測定点での観測です。表示する時間は低下を観測してから復帰観測までの**サンプル区間**であり、物理的な瞬断時間ではありません。大きなデータ欠落は連続として扱いません。
- 高周波リップル、Type-C未接続時のVBUS、安全性、特定製品との相性、USB-PD規格適合は未判定です。KM003Cの離散ログだけから断定しません。
- PDO表とレポートにはObject番号とSPR/EPR区分を表示します。SPR AVSは9–15Vと15–20Vの電流を別々にデコードし、20V側の電流が0なら9–15Vとして表示します。最初のFixed PDOのEPR_CAPフラグも表示します。EPR AVSはPDPと最大電圧時の換算電流を表示し、その電流を全電圧での保証値とは扱いません。
- EPRの拡張Source Capabilitiesは完全なデータを再構成できた場合だけ解析します。未対応形式はrawを保持します。

個別の取得は最大120秒、同時CLI実行は1操作までです。ブラウザーから任意のCLIコマンドやファイルパスを指定できない構成です。ファイルや測定ログを外部へ自動送信する機能はありません。

## 検証

2026-10-08の準備待ち追加では、模擬Serial/HID/USBで開始電圧だけを要求して待機すること、続行後の往復掃引・ADC・CSV、待機中のPD記録、停止時のreset/PDM終了、待機OFF、dry-runを確認しました。CLI側は模擬プロセスで続行・停止・入力切断・タイムアウトからの待機時間除外・続行APIの接続元とtoken検証を行い、実際のCLIではdry-runを確認しました。新しい実機の電圧変更・負荷試験は行っていません。

```powershell
node km003c/tests/engine.test.js
node km003c/tests/device.test.js
python -m unittest discover -s km003c/tests -p "test_*.py" -v
```

2026-10-07にPDO解析・CSV単位・EPRチャンク再構成・測定の欠落・APIの制御範囲と接続元チェックを検証しました。既存のKM003Cキャプチャ3件、PNG/Markdown/HTML/JSON出力、JSONの再読み込み、390px幅の画面、CLIのdry-runもブラウザーで確認しました。その時点で接続機器は見つからず、新しい実機取得・電圧変更・充電器の負荷試験は未検証です。

同日に直接接続モードも追加し、ブラウザー用ネイティブデコーダーを既存3ログの11,675フレーム・2,054イベントでCLI結果と照合しました。模擬WebHID/WebUSB/Web Serialで測定・停止・PDO取得・明示的なコマンド送信・切断・PNG生成を確認し、直接モードからCLI APIへのアクセスが0件であること、未対応ブラウザーでもデモを利用できることを確認しました。ブラウザーAPIと実機・OSドライバーの組み合わせはまだ実機未検証です。

SPR AVSの追加検証では、提供されたRaw PDO `0xe004b1cc`（9–15V/3A、15–20V/4.6A）と `0xe004b1f4`（20V側5A）を使い、SPR/EPR区分、Object番号、EPR_CAP、92W/240Wの提示能力を確認しました。20V側0Aの場合、EPRデータ中の空きObject、同一Raw PDOの異なるObject番号も検証しています。画面表示、PNG/Markdown/HTML出力、CLIリンク、390px幅の表示をブラウザーで確認しました。この検証用データに新しい実測値は含まれていません。

制御の追加検証では、SPR AVSの15V境界、EPRの有効化必須条件、48V Fixed/AVS要求、PDP上限、設定変更後のPDO再取得、C1の初期値を確認しました。模擬WebUSB/Web SerialではEPR設定と48V/5A要求の送信内容、初期非表示、チェック解除時の候補切り替えを確認しました。実機へのEPR・AVS電圧変更は行っていません。

PDO専用取得の追加検証では、既存 `avs07.csv.metadata.json` の最終PDO応答と同じ形式で9件・240Wを解析し、番号を推測しないこと、表・レポート・JSON比較状態の復元を確認しました。模擬Serialで同一接続の初期化・busy復帰・SPRからEPRの待機・reset/closeを検証しました。CLI側はCOM14指定のコマンド生成、模擬CLIプロセスの応答取り込み、停止通知後のfinally実行を検証し、更新された実際のCLIでもdry-runの呼び出しを確認しました。新しい実機PDO取得は行っていません。

制御・掃引の改善では、Serial取得から制御候補への反映、Object番号の明示入力、当初はEPRチェックだけ・dry-runだけでは候補を表示しない構成でしたが、下記の候補表示の修正で変更しました。模擬Serial / HIDでSPR AVSの15V境界をまたぐ往復掃引、ADC、CSV保存・再読み込み、停止時のreset / PDM終了を確認しています。CLI側では同一接続の初期化・提示能力変更時の中止・失敗と中断時の終了処理・上限検証と、実際のCLIによる掃引のdry-runを検証しています。実機での電圧変更・負荷試験は未検証です。

EPR候補表示の修正では、模擬USBとSerial取得のEPR Object 11をコマンド確認中でも選べること、EPRチェックで送信モードを変更しないこと、チェック操作とdry-runでSerial送信が発生しないことを検証しました。接続ボタン3つは同じ水色に統一しています。EPRプロファイルの実際のPDO取得成功を初期化済み状態へ反映し、CLIでもdry-runは設定前に確認できます。実送信時の設定・接続確認、最新PDO照合、電圧・電流上限の検証は維持しています。新しい実機の電圧要求は行っていません。

USB中心の接続・記録更新では、CLIの実記録とEPR分割メッセージを含む138フレームのCSV列・値を照合しました。模擬ブラウザーで番号付きPDOの保持、Serialの追加、USB/Serial提示能力の不一致時の番号拒否、掃引中のPD/ADC読み取り、継続・停止・CSVダウンロードを検証しました。実機への電圧要求は行っていません。

PDO取得の安定化では、通常ボタンによるSerial初期化と並行USB記録、初回の機器選択2段階、選択キャンセル、readyタイムアウト後の終了・1回再試行、応答断片の待機、PDO一覧の連続照合、USBにPDOがない場合の番号なし結果を模擬機器で検証しました。実機での新しいPDO取得・電圧要求は行っていません。取得後は通信ログ（TXT）を保存できます。

掃引終了の修正では、模擬USBの読み取りがreset前に停止し、終了後もPD件数・要求数が増えないことを確認しました。GoodCRCを非表示にしてもPD CSVの内容が変わらず、GoodCRCのみの記録も保存できることを確認しています。

現在の接続は、通常の接続欄にUSB・HID・Serialの名前と用途を表示します。USB＋SerialでPDO・番号取得とPD制御、HIDで電圧・電流測定を行います。初回の2段階は同じPC用USBケーブルで異なる接続経路を許可する手順です。接続済み表示は測定・記録が実行中であることを示しません。

PDO再取得・記録測定は別の欄です。「接続情報を表示」は接続欄で機器情報を表示する操作で、記録時間には影響しません。CLIモードも記録の終了条件に対応します。電圧・電流測定にはCLIのscope出力を使い、継続時はユーザー停止までの時間制限を付けません。ローカルCLIモードで利用するには更新したbridge.pyでブリッジを再起動してください。

操作欄は「接続・記録」「PD制御」「測定条件」で切り替えます。画面上部の状態バーには接続方式・実行状態・最新の電圧電流と停止ボタンがあり、スクロール中も表示します。操作メッセージは状態バーから展開できます。デスクトップでは操作欄を独立してスクロールでき、記録・測定の終了条件は排他選択です。継続記録の秒数は無効になり、ブラウザーとCLIの両方で停止まで記録します。


## スクロールとPPS / AVS遷移解析

左右の帯はブラウザーのページスクロールに統一しています。上部の状態・接続・最新電圧電流・停止ボタンはスクロール中も表示します。長いPD一覧・解析表・通信ログだけは、表示枠とスクロールバーのある領域内でスクロールします。

「電圧遷移解析」欄の「記録終了後にPPS / AVSの電圧遷移を解析」を有効にすると、USB PD＋電圧電流記録やPD記録付き掃引の終了・停止後に解析します。記録欄・掃引欄から設定と結果へ移動できます。既存ログはPD CSVと同じ取得のscope CSVをまとめて読み込み、「この記録を解析」を押します。自動解析の初期値はCLIと同じOFFです。SPR PPS / SPR AVS / EPR AVSの遷移を解析できます。SPRは要求に対応する直前のSource Capabilities（EPRの拡張・分割メッセージ内のSPR PDOも含む）から種類を特定します。記録開始前のPDO、後から取得したPDO、操作欄の選択からは推測しません。PDOが未記録・不明な要求は理由を表示して解析しません。

PD制御の接続機器・負荷の確認は、電圧要求・掃引それぞれの実行ボタン直前でも行えます。上部の共通確認と同じ状態を共有し、PDO・電圧・電流・掃引設定・接続が変わるとすべて解除します。解除の理由は実行箇所に表示し、その場で確認し直せます。実行中・負荷の準備待ち中は確認を変更できません。

`km003c_cli.py capture --scope --analyze-transitions` と同じ既定の波形解析条件を使い、SPRのREQUEST・EPRのEPR_REQUEST → ACCEPT → PS_RDYを次の要求・リセット・拒否応答まで対応付け、動き始め、要求電圧±1%の80 ms収束、観測到達値±0.5%の80 ms収束、到達電圧、平均変化速度を解析します。400 ms・最低6点の安定領域、最大100 msの測定間隔を使用します。Fixed / Battery / Variableは対象外です。SPR PPS / SPR AVSはWeb版の拡張で、CLI本体の解析対象は変更しません。SOP'/SOP''は応答に対応付けません。デバイス時計の測定のみ使用し、ホスト時計へのオフセット推定・補間はしません。

詳細CSV/テキストと要約CSV/テキストは、それぞれ `.transitions.csv`, `.transitions.txt`, `.transition_summary.csv`, `.transition_summary.txt` として保存できます。既存のCLI列の並びを保持し、種別・PDO番号・Raw PDO（詳細には解析区間終端も）を末尾に追加します。テキストはWeb向けの全項目表示です。欠落・短い保持区間は未判定とし、途中停止や取得失敗はflagsに残します。解析値は離散測定に基づく推定値です。

ローカルCLI方式では更新した `bridge.py` を再起動してください。解析チェックをCLIの `--analyze-transitions` に渡し、CLIが生成した4ファイルも通信ログ欄から取得できます。

解析表の上で遷移を選ぶと、実測電圧・目標±1%帯・観測到達値±0.5%帯に、要求・ACCEPT・動き始め・PS_RDY・目標収束・到達値収束を重ねます。「遷移付近」と全解析区間を切り替えられ、表示範囲は解析結果に影響しません。「遷移グラフ PNG」は選択中の遷移と表示範囲を画像として保存します。100 msを超える欠測区間は線で接続しません。短い保持・小さい電圧差で動き始めや安定値が不明な場合は、数値を生成せず未判定を保持します。

ブラウザー記録、PD＋scope CSVの読み込み、ローカルCLI記録からWeb上で同じ拡張解析・グラフ生成を行えます。掃引のADC CSV単独はホスト時刻なので遷移解析には使用できません。USBのPD記録と同時取得したデバイス時刻の測定が必要です。
## 掃引CSVの解析

### 電圧安定性・PD交渉・往復差の統合

「掃引CSV / 解析ZIPを開く」でCSVまたは以前の解析ZIP（`normalized.csv`入り）を読み込み、「同じ測定のPD＋scopeを追加」でPD CSVとscope CSVをまとめて選択してください。PD記録を含むJSONバックアップも利用できます。新しいCSV／ZIPを開くと以前のPD対応付けを解除します。ブラウザーでPD記録付き掃引を実行した場合は、その記録を自動利用します。ファイルをサーバーへ送信せず、ログの読み込みは機器を操作しません。

各点に序盤平均・終盤平均・その差（終盤−序盤）を追加します。窓は先頭／末尾20%のサンプル（最低2点ずつ）、全4点未満は未判定です。単調な経過時刻があればその取得順、なければ行順を使います。標準偏差は時間ドリフトも含むばらつきです。1点だけの掃引ADCから標準偏差・ドリフトを生成しません。

「掃引のPD要求電流 mA」を掃引欄で指定できます。電圧要求欄の電流入力と同期し、変更時には接続・負荷の確認を解除します。外部負荷の設定とは別です。実電流の符号を保持し、絶対値が `要求値 + max(0.05 A, 要求値の5%)` を超えた集計点を警告します。低い負荷電流は警告しません。このしきい値は解析用で、USB PD規格適合の判定ではありません。

`request_status=sent_unverified` は生の送信結果として保持します。別の `pd_status` 列で `confirmed`（対応するSourceのACCEPT → PS_RDY）、`unconfirmed`（未確認）、`rejected`（REJECT / NOT_SUPPORTED）、`deferred`（WAIT）を表示します。Serialのready文字列や実測電圧だけでは成立扱いにしません。次の要求・リセット等をまたいで応答を借用しません。同じ設定を50 ms以内に再要求し先行要求に応答がなければ、最後の要求自身の応答を照合します。

新しいブラウザーCSVは記録の識別キーとPD行の範囲を保存します。旧CSVは、ユーザーが同じ測定として追加したPDログ中で、PDO種別・番号・電圧・要求電流（記録があればRaw PDOも）の全順序が一意に一致する場合のみ対応付けます。曖昧な一致・別の識別キーは未確認です。ホスト時刻と機器時刻のオフセットは推測しません。PDログだけでも応答を照合できますが、定常統計には同じ機器時計のscopeが必要です。

成立確認後、観測到達値±0.5%の80 ms収束点＋80 ms以降、次の要求等までを定常区間として平均・標本標準偏差・Min/Max・序盤／終盤平均・ドリフトを別列に集計します。100 msを超える欠測がある区間は集計しません。統合表にREQUESTのSno・機器時刻、ACCEPT／PS_RDY遅延、要求電圧への収束／観測到達値への収束時間も並びます。観測到達値への収束は要求電圧への到達を意味しません。

往復比較は同じ試行・PDO・要求電流・設定電圧・外部負荷条件・往復cycleのペアだけを使い、`復路平均−往路平均` をグラフ化します。両側に定常統計があればその平均、それ以外は掃引ADC平均を使い、データ源を別系列に表示します。passがない場合はcycleを推測せず、片側だけの折り返し電圧も補いません。温度上昇などの原因は断定しません。

HTMLレポートに統合表と全グラフを埋め込みます。ZIPには追加で `pd_checks.csv` と `hysteresis.csv` を含め、JSONバックアップには明示的に追加したPD／scopeも保持します。集計CSVには統合した全列を保存します。表は先頭500点です。ZIPの読み込みは100MB以下、展開するnormalized.csvは25MB以下でCRCを検証します。

解析結果はページ上で閲覧できます。対応する全グラフを一覧表示し、「大きく表示」で上部のグラフを切り替えます。測定条件・集計・誤差・未測定項目を含むレポートも、見出し付きで常時表示します。「解析デモ」は合成データで表示を試せる機能で、機器への接続・要求は行いません。デモ表示と保存したレポートには実測ではない旨を明記します。

「掃引CSVの解析」では `KM003C-CLI/analyze_sweep_csv.py` 1.0.0 の集計機能をブラウザーだけで利用できます。ブラウザー／ローカルCLIの掃引終了時には自動解析し、過去のCSVは「掃引CSVを開く」から読み込みます。機器の接続やCLIのインストールは不要で、ファイルをサーバーへ送信しません。ページ上部のログ読み込みも掃引CSVを認識します。

各点の平均・最小・最大・電圧の標本標準偏差、設定値からの電圧誤差と誤差率、平均電流・電力を集計します。試行開始時刻、モード、PDO、PD要求電流、往路／復路、passを分離し、符号付き電流・電力を保持します。失敗・中断した要求、error付き行、測定の欠落・非有限値は除外します。初期設定では主掃引を優先し、予備動作・安定待ちを除外します。詳細設定で対象フェーズ、モード（`avs`, `pps`, `hold`のファミリー指定可）、各集計点の先頭除外数を変更できます。一致するフェーズ／モードがない場合はPython版と同じく全有効行へ戻し、警告を表示します。

CSVの列から電圧掃引・電子負荷の電流掃引・時間軸の保持／AVSシーケンスを選びます。旧ASD-PD31列名とヘッダーなし形式も対応。リップル列がある場合は平均、隣接点の差、電圧での正規化、最大変化の候補、温度列がある場合は温度グラフと温度対リップルを追加します。外部温度列は正規化CSVとレポートに保持します。PD要求電流から負荷電流を推測せず、ADCのばらつきから高周波リップルを生成しません。誤差やリップル変化は規格適合の合否判定ではありません。

「集計CSV」「正規化CSV」（解析対象として残った行）、「レポートTXT／Markdown／HTML」、選択グラフのPNGを保存できます。「レポート・全グラフZIP」には日英TXT、HTML、2種類のCSV、該当する全グラフPNGを含めます。JSONバックアップでは読み込んだ掃引CSVと解析設定も保存・復元します。

Python版からの変更点：最大リップル変化の候補は異なる試行・PDO・要求電流をまたいで比較しません。追加のCSV列も正規化CSVに保持し、欠測しかないグラフは出力しません。表は先頭500点、グラフは最大50系列・各系列2000点の描画に制限しますが、CSVには全解析点を保存します。CSVは25MB・20万行まで。測定していない掃引は解析できません。

ブラウザー掃引CSVにも試行・PDO種別・往路／復路の列を追加しました。古いCSVにこの情報がない場合は、後から往復を推測して分離しません。ローカル方式では更新した `bridge.py` を再起動してください。移植元のMITライセンスは `sweep-LICENSE.txt` に含めています。

検証：Python版から生成した12ケースで各集計列と除外行を照合します。ブラウザーテストは合成CSVと模擬機器を使い、実機へ電圧要求しません。参照データを更新する場合は `python tools/sweep_reference.py D:/KM003C/analyze_sweep_csv.py`、集計検証は `node --test km003c/tests/sweep.test.js` を使います。

遷移の要求形式は [Linux USB PDヘッダー](https://kernel.googlesource.com/pub/scm/linux/kernel/git/gregkh/usb/+/5d5fd841c34649f1b09220fe58e59dffd61c447d/include/linux/usb/pd.h) のPPS・SPR AVS RDOのフィールド定義を照合しました。EPRの65ケースに加え、独立に組んだSPRの上昇・下降波形で電圧・電流・応答・収束時刻、PDO更新・未記録・リセット・拒否・拡張PDO分割・欠測を検証します。ブラウザーテストはCSV読み込み、自動解析、日英表示、スマホ表示とPNG保存を模擬機器で検証し、実機への電圧要求は行いません。

## PD-Interpreter：ログ変換と同時通訳

画面のPD-Interpreter欄で、PD CSV / records.jsonlを充電器と機器の会話に変換できます。KM003CをUSBで接続して「PD＋電圧・電流を記録」を開始すると、会話も随時更新します。HIDの測定だけではPD会話を取得できません。

「会話デモ · 240W」で実機なしでも試せます。自然な会話・関西弁・マブダチ・ギャル・English・時代劇、GoodCRCの既読、EPR接続維持スタンプに対応します。会話HTML / Markdownには全パケットの元ログも保存します。ログはブラウザー内で処理し、Python・APIキーは不要です。

Web版は電力メニュー・要求・了承・準備完了・EPR移行を中心に解釈します。Python版の詳細解析はすべて移植していないため、未対応の情報は原文を残します。KM003Cの受信成否がないログは「未記録」として扱います。

配信には `interpreter.js`、`interpreter-ui.js`、`interpreter-voice.js`、`interpreter.css` も同じkm003cフォルダーに含めてください。

初心者向けには[PD-Interpreter専用ページ](../pd-interpreter/)を使えます。デモ・ログ読み込み・USB同時通訳を独立して利用でき、原文と既読は初期状態で折りたたみます。

## ケーブル情報（SOP’）

「ケーブルの情報だけ読み直す」は、取得済みの充電器の対応表（EPRを含む）と元の測定値を保持し、ケーブル結果だけを更新します。充電器の表には前回取得分であることを表示します。接続を変更した場合は「充電器の情報を読み直す」で更新してください。問い合わせ時のSPR一覧や初期化中の波形は別の通信記録として残し、元の充電測定へ混ぜません。JSONバックアップと保存セッションにもこの区別を保持します。直出し（captive）など、情報を返さないケーブルの未取得は故障を示しません。

接続欄の **ケーブル情報を取得** を押します。USBを選択した後、もう一度押して同じKM003CのSerialを選択します。ケーブル模擬をOFF（`em=0`）にしてSPR PDを初期化し、SOP’ Discover Identity（PD3 / SVDM2、未応答時はPD2）を送信します。停止・失敗時も `reset` → `pdm close` を試みます。外部負荷はOFFにしてください。対象のケーブル経路にVCONN給電が必要で、接続状態やファームウェアによっては取得できません。

VID/PID、XID、bcdDevice、Passive / Active、電流定格、最大VBUS電圧、EPR対応の申告、USB速度、生VDOを表示し、JSONとUSB生ログを保存できます。読み込んだPDログのSOP’応答も解析します。予約値や未知形式は不明のまま表示します。EPRフラグのデコードはPassiveのPD3 VDOに対応し、Activeや旧形式は生VDOを保持してEPR不明と表示します。応答なし・NAK・BUSY・不完全な応答を区別します。表示はケーブルの申告値であり、負荷試験や認証結果ではありません。

更新したKM003C-CLIでは次を実行できます。
```powershell
python D:\KM003C\km003c_cli.py cable --port COM3 --json-file cable.json
python D:\KM003C\km003c_cli.py cable --dry-run
```
旧CLIにも接続セット付属のアダプターで対応します。
```powershell
python km003c/cable_cli.py D:\KM003C\km003c_cli.py --port COM3 --json-file cable.json
```
`--serial` でUSBとCDCの機器を揃えます。既存JSONの上書きは `--force` 指定時だけです。ローカルCLI画面もこのアダプターを使い、操作の排他と停止を維持します。

## セッション自動保存・Wh / mAh・低電流終了

「記録・測定」欄でセッション名を設定できます。ブラウザーのPD記録・電圧電流測定と、ローカルCLIモードの記録・測定は、既定で約1秒おきにIndexedDBへ追加保存します。「保存セッションを開く」から再読込でき、保存済み部分はページ再読込・異常終了後も残ります。未完了の記録は未完了と表示し、開いても機器へ送信しません。元のPDイベント、測定値、測定条件、積算設定を保存します。USBフレームのrecords.binとCLI生ファイルは従来の元データ保存から取得してください。

この保存領域はブラウザー・サイトのオリジンごとに別です。HTTPSの公開サイトとlocalhostの記録は共有しません。サイトデータ削除・プライベートモード終了などで失われるため、長期保存にはセッションのJSONを書き出します。保存容量不足・IndexedDBが使えない場合は画面にエラーを表示し、測定は続けられます。約1秒おきの保存はベストエフォートであり、最後の未保存区間まで保証しません。

Whは各サンプルの電圧×符号付き電流、mAhは符号付き電流を、取得順の有効な隣接点間で台形積分します。正・逆方向を別々に積算し、主表示はその差です。電流がゼロをまたぐ区間はゼロ交差で分割します。最大測定間隔（既定1秒）を超える区間、不正値、重複・逆行時刻、時計変更をまたぐ区間は積算しません。積算時間・除外時間・不連続件数も表示します。サンプルが1点以下なら積算は未取得で、欠測を0に置き換えません。実測していないバッテリー内部容量・充電完了・規格適合の判定には使いません。

低電流終了は既定OFFです。5 / 10 / 50 / 100 mA未満を選び、継続秒数を設定します。絶対電流が閾値未満かつVBUSが4 V以上の連続した有効サンプルでのみ継続時間を進めます。欠測・不正値・時計変更・電流上昇・VBUS低下で継続時間をリセットします。条件成立・時間終了・手動停止のうち先に到来したもので記録を終了します。記録を止める機能であり、給電や外部負荷は操作しません。PDO取得・電圧要求・掃引には適用しません。

時間プリセットは10秒・1分・15分・1時間・6時間・12時間です。個別指定は1〜43200秒、各記録はPDイベント・測定値それぞれ20万件で停止します。長い記録でも上限は同じです。ローカルCLIはブリッジ側で低電流条件を監視するため、画面を閉じても条件で停止します。CLIの元ファイルと `recording-summary.json` はcaptures配下へ保存し、画面へは追加分だけを送ります。更新ZIPのbridge.pyでブリッジを再起動してください。CLI本体の直接起動にこの画面設定を自動適用する機能ではありません。

セッションJSON／JSONバックアップは単独で100MBまで読み込めます。その他のログは従来どおり合計25MBまでです。記録件数は20万件の上限を維持します。

### PDログの検索・詳細と充電の状態確認

- PD一覧で全件を検索し、Control / Data / Extended / イベントとSOPで絞り込みます。1ページ200件で前後に移動できます。CSV保存はフィルターの影響を受けません。
- メッセージを選ぶとヘッダービット、Object、拡張ヘッダー、記録されたWire bytes・元JSONを表示します。SOP’ / SOP”のビットをSOPの送受信ロールとして扱いません。未取得のCRC判定や生バイトを作りません。
- 「充電の状態を確認する」では「給電が途切れていない？」「充電が遅い理由を調べたい」を選びます。最初に結論・充電器の対応出力・記録中の平均電力・次の操作を表示し、細かい測定値と判定の根拠は折りたたんでいます。記録・時間の選択も変更でき、診断の根拠をJSON保存できます。診断の表示操作は機器に制御コマンドを送りません。
- 充電器・ケーブルの情報取得と、実際の充電中の記録を区別します。情報を読んだだけなら「充電中の状態は、まだ測っていません」と表示し、初期化中の電圧低下を充電中の異常として案内しません。「充電を記録する操作へ進む」は操作欄を開くだけで、自動では記録を始めません。実際に給電した状態で約10秒記録してください。
- 安定性には約10秒（端のサンプル間隔を許容して9.5秒）、20点、有効区間9秒以上が必要です。欠測・時計逆行・取得エラーは不足として表示します。変動5%、隣接変化max(0.25 V,前値5%)は確認の目安です。高周波リップル・規格適合の判定ではありません。
- 電力の標本平均・最大と、同じ記録の最後のPDOセットの最大能力を別々に表示します。PDOの電圧×電流が実際の要求電力を意味するわけではありません。電池残量、温度、負荷側の制限や充電速度は断定しません。ホスト時刻のADCとデバイス時刻のPDを対応付けません。

### 入口・接続ウィザードと利用モード

初期画面は「KM003Cを繋ぐ」「デモ」「保存ログ」の3つの入口です。結果パネルはデータが入ってから必要なものを表示します。デモは自動では読み込まず、選んだ場合だけ合成データの表示を出します。

- 初回は配線図に従って、充電器→テストケーブル→IN、HID / PC接続ポート→PCと接続し、OUTを空・外部負荷OFFにします。USB許可、同じKM003CのSerial許可、PDO＋ケーブル取得を順にクリックします。許可だけでは取得しません。
- 「3. 充電器・ケーブルの情報を読む」はPD 3.1 / EPRのPDO取得とSOP’ Discover Identityを順に行い、両方を表示します。ケーブルの問い合わせは別記録として保持し、元時刻をsource_timestamp_usに残します。PDO取得の時計と混ぜません。ケーブルACK未取得でもPDO結果を残します。
- かんたん診断が初期モードです。任意の電圧要求・手動EPR操作・掃引を隠し、操作の実行側でも拒否します。PDO取得はPD 3.1 / EPRです。PDO・ケーブル取得ではPD初期化と通信を行うため、受動的な観測だけのモードではありません。外部負荷をOFFにしてください。
- プロ制御・スイープへ切り替えると、従来のEPR取得・任意要求・掃引・PD詳細・過渡応答解析を利用できます。モード切替で送信確認とEPRチェックを解除し、コマンド確認に戻します。実行中はモード切替できません。再読み込み後はかんたん診断に戻ります。
- 判定アルゴリズム・欠測の扱い・申告値などの説明は「ⓘ 判定基準・仕様」から読めます。記録名・保存設定・低電流条件は「記録の保存・終了条件を調整」にまとめています。必要な操作ガイドと取得エラー・停止操作は表示を維持します。

負荷なしのPDO取得でも、初期のSPR一覧で終了せず、EPRの追加PDOを最大15秒待ちます。安定した一覧が2回続いたことを確認します。待機終了時に応答が途切れた場合、通常の取得では直前の確認済み一覧を警告付きで保持します。電圧要求直前の再確認ではこのフォールバックを使用しません。EPR未観測は非対応の確定ではありません。PDOの28～48 V表示は提示能力で、その電圧を要求した意味ではありません。EPRの初期化ではCLIと同じtype=2, em=2, sink=1を使用し、実ケーブルの申告値は別のSOP’取得（em=0）で読みます。
