simulator-automation について
Even Hub Simulatorが提供するHTTP自動化APIのガイドです。開発者はシミュレーターの画面やログを確認し、タッチパッド入力を送って操作テストを自動化できます。
主な機能
- 01ヘルスチェック用エンドポイント
- 02グラスとWebviewのスクリーンショット取得
- 03コンソールログの読み取りと消去
- 04タッチパッド入力の送信
活用シーン
- 01アプリ起動状態の自動確認
- 02画面表示と実行ログの調査
- 03ジェスチャー操作テストのスクリプト化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ even-realities/ everything-evenhub --skill simulator-automationインストール後、Claude Code で/simulator-automationを入力して読み込まれたか確認します。
詳細
EvenHub Simulator Automation
--automation-port <PORT> を指定して起動すると、シミュレーターは localhost で HTTP API を公開します。
evenhub-simulator https://my-app.example.com --automation-port 9898
ベース URL:http://127.0.0.1:<PORT>
API リファレンス
ヘルスチェック
GET /api/ping
→ "pong"
メガネのスクリーンショット
現在の LVGL フレームバッファーを image/png(576×288、RGBA)として返します。
GET /api/screenshot/glasses
→ image/png binary (RGBA)
RGBA 形式 — 画像分析における重要事項:
- 背景ピクセル:
(R=0, G=255, B=0, A=0)— 透明(アルファ = 0) - 点灯/テキストのピクセル:
(R=0, G=255, B=0, A=255)— 不透明(アルファ = 255)
常に RGBA モードで処理してください。RGB に変換しないでください。アルファチャンネルが失われ、背景ピクセルとテキストピクセルの区別がつかなくなります(どちらも純粋な緑色に見えます)。
from PIL import Image
img = Image.open('glasses.png') # keep as RGBA — do NOT call img.convert('RGB')
pixels = img.load()
# Lit pixel test:
is_lit = lambda px: px[3] > 0 # alpha > 0
Webview のスクリーンショット
html2canvas を使用して、メインのブラウザー Webview をキャプチャします。image/png を返します。処理に数秒かかる場合があり、10 秒後にタイムアウトします。
GET /api/screenshot/webview
→ image/png binary
コンソールログ
メイン Webview からキャプチャした console.* の出力、捕捉されなかった例外、未処理のプロミス拒否、失敗した fetch 呼び出しを返します。
GET /api/console
→ { "entries": [...], "total": N }
各エントリー:
{ "id": 0, "level": "log|warn|error|info|debug|trace", "message": "...", "ts": 1712150400000 }
コンソール以外のソースのプレフィックス:
[uncaught] ...— 捕捉されなかった例外[unhandledrejection] ...— 未処理のプロミス拒否[fetch] ...— 失敗した fetch(成功以外のステータスまたはネットワークエラー)
新しいエントリーのみをポーリングする場合:
GET /api/console?since_id=42
→ entries with id > 42
since_id は 0 以上の整数である必要があります。 負の値(例:-1)を渡すと、空のリストではなくサーバーエラーが返されます。最初のポーリングではパラメーターを省略して現在のすべてのエントリーを取得し、その後、レスポンスの last_id を追跡してください。
# First poll — no since_id
resp = requests.get(f"{BASE_URL}/api/console")
entries = resp.json()["entries"]
last_id = max((e["id"] for e in entries), default=0)
# Subsequent polls
resp = requests.get(f"{BASE_URL}/api/console?since_id={last_id}")
バッファーをクリアする場合:
DELETE /api/console
タイミングに関する注意: 起動時のログ(「ready」シグナルなど)は一度だけ出力されるため、読み取る前にバッファーをクリアすると失われます。手順:まず ready シグナルをポーリングし、必要に応じてその後にクリアしてください。
# Safe: check for ready signal BEFORE clearing
poll_until(target="APP_READY")
requests.delete(f"{BASE_URL}/api/console") # only if you need a clean slate after
メガネへの入力
メガネのディスプレイにタッチパッド操作を送信します。
POST /api/input
Content-Type: application/json
{ "action": "up" | "down" | "click" | "double_click" }
レスポンス:{ "ok": true }
操作はメガネのタッチパッドに対応します:
up/down— リスト項目またはテキストをスクロールしますclick— 現在の項目を選択しますdouble_click— システムレベルのダブルクリックイベントを発生させます(通常は「戻る」または「閉じる」)
自動化のワークフロー
- サーバーが実行中であることを確認します:
GET /api/ping - アプリの準備完了をポーリングします(先にコンソールをクリアせずに):既知のログメッセージを探します。
- 状態を確認します:
/api/screenshot/glasses(RGBA)または/api/consoleを使用します。 - 操作します:
POST /api/inputで入力を送信します。各操作の後、少し(約300ms)待ってから状態が変化したことを確認します。 - 繰り返します: コンソールのポーリング時に
since_idを使用し、古いエントリーを再読み込みしないようにします。
ヒント
- メガネのディスプレイは 576×288 ピクセルで、単色の緑色です。スクリーンショットは RGBA PNG です。
- 入力が機能するのは、アプリがアクティブなイベントコンテナーを作成している場合のみです。アクティブなコンテナーがない場合、入力は何も通知されずに無視されます。
double_clickは通常、前の画面に戻る、または現在のビューを閉じるために使用されます。- 起動後、ポーリングを開始するまでに 4 秒以上待ってください。SDK の初期化と
createStartUpPageContainerに時間がかかります。
タスク
$ARGUMENTS