
2026/02/25 4:43
**古いKindleをハッキングしてバス到着時刻を表示させる**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は4世代目のKindle Touch(K5/KT)を、3分ごとに更新されるリアルタイムバス到着ダッシュボードへ改造し、メニューキーを押すだけで終了できるようにしました。
まず正確なモデルとファームウェアを特定し、対応するjailbreak tar ファイルをダウンロード、OTA 更新を無効化、KUAL(カスタムランチャー)と MRPI(アプリインストーラー)を用いて標準的な脱獄手順を実行しました。
KUAL の USBNetwork 拡張機能を有効にすると、Kindle は USB 経由で SSH インターフェースを公開します;ホスト側は
eips コマンドを実行して画面を制御できます。外部サーバーは Node.js の Docker コンテナ内で動作し、公共 GraphQL エンドポイント(
https://www.njtransit.com/api/graphql/graphql)から curl POST で NJTransit バス到着データを取得し、JSON を HTML ページへフォーマット。3分ごとに wkhtmltoimage を使用して Kindle の 600×800 解像度に合わせた PNG を生成します。サーバーは原始的な HTML 用エンドポイントと生成画像用のエンドポイントをそれぞれ公開しています。
カスタム KUAL アプリ(
menu.json、config.xml、および bin/ ディレクトリ)が start.sh を起動します。このスクリプトはシグナルを捕捉し、rtcwake でウェイクアップをスケジュールし、curl で PNG を取得、eips -c で画面を2回クリアし、(0,30) の位置にグレースケールモード(gc16)で表示。さらに追加の eips 呼び出しで日付/時刻、Wi‑Fi ステータス、バッテリーレベルをオーバーレイします。ユーザー入力は
/dev/input/event2 を evtest で読み取り監視し、メニューキーが押されると stop.sh が実行され、ダッシュボードプロセスを停止、画面をクリアして Kindle の通常 UI に戻します。著者は長時間使用後の色ブレやバッテリー寿命(約5日)などの実用的制限を指摘し、睡眠時に黒/白画面をフラッシュしたりリフレッシュ頻度を減らすことで修正できると提案しています。
この版は元の文章から全ての重要な技術詳細を保持しつつ、更新率推論を訂正し、手順を明確に説明しています。
本文
古いKindleをバス到着時刻表示装置に改造する方法
このガイドでは、Kindle Touch 第4世代(K5/KT)を1分ごとに更新されるライブバスフィードへ変える手順を紹介します。メニューキーを押すとダッシュボードモードから抜けます。基本的にはTRMNLですが、140ドルの価格タグはありません。
高レベルの流れ
- Kindle を脱獄する
- KUAL & MRPI をインストール
- SSH を設定
- インターネット上でアクセス可能なサーバーを立ち上げ、Kindle用画像を生成
- KUAL アプリを作成
1. Kindle の脱獄
- Kindle 型号とファームウェア(FW)を確認。
- フォーラムの指示に従い、対応する tar ファイルをダウンロードして脱獄実行。
- 脱獄完了後は追加ツールのインストールが可能になります。
2. KUAL & MRPI のインストール
- KUAL – カスタム Kindle アプリ起動器。
- MRPI – 独自アプリをインストールできるツール;新型 Kindle は不要な場合も。
ヒント: Kindle モディング wiki が参考になります。各ガイドの下部にある「Next Step」ボタンをクリックし、KUAL & MRPI を入れる前に Setting up a Hotfix ガイドを必ず実行してください。
インストール後は OTA 更新を無効化(他の wiki ガイドはその後は使いません)。
3. SSH の設定
- USBNetwork KUAL 拡張機能(ハッキングバイブルからダウンロード)を利用して、USB 経由で Kindle に SSH 接続。
- ブログ記事に沿って拡張機能のインストールと USB での SSH 設定を行う;パスワードや Wi‑Fi が不要なら設定は省略可能。
接続後、コンピュータ側のネットワークタブに「Connected」モードで新しいエントリが表示されます。
結果: Kindle でカスタムコードが実行できるようになります。
4. 画像を生成するサーバーを動かす
- Kindle の解像度(本例は 600×800)に合わせた PNG を作成。
- NJTransit の公開 GraphQL API からバスデータを取得:
query BusArrivalsByStopID($stopID: ID!) { getBusArrivalsByStopID(stopID: $stopID) { departingIn destination route time capacity __typename } }
の例(curl
を置き換え):YOUR_STOP_NUMBER
curl 'https://www.njtransit.com/api/graphql/graphql' \ -H 'accept: */*' \ -H 'content-type: application/json' \ --data-raw '{"operationName":"BusArrivalsByStopID","variables":{"stopID":"YOUR_STOP_NUMBER"},"query":"query BusArrivalsByStopID($stopID: ID!){getBusArrivalsByStopID(stopID:$stopID){departingIn destination route time capacity __typename}}"}'
サーバー実装
- Node.js(Dockerfile、スクリプト)で構築し:
- バスデータを整形する HTML エンドポイントを提供。
を3分ごとに呼び出して HTML を PNG に変換。wkhtmltoimage- 別のエンドポイントから PNG を配信。
画像回転: Kindle は縦向きで表示されるため、次の CSS を使用:
transform: rotate(90deg) translateX(-100px) translateY(-100px);
これによりバス時刻が正しく揃います。
5. KUAL アプリを作成
ディレクトリ構造
bin/ # 実行可能スクリプト menu.json # KUAL ダッシュボードのメニュー項目 config.xml # (未使用)
拡張フォルダは
/mnt/us/extensions/ 配下に置く。KUAL を再起動するとカスタム拡張と「Start dashboard」メニューが表示されます。
start.sh
のポイント
start.sh# HUP を無視して KUAL から抜けてもスクリプトは継続実行 trap '' HUP # TERM を無視し、GUI が停止した際に早期終了しないように trap '' TERM ... # 夜間のスリープを設定(rtcWake はデバイス選択が必要) do_night_suspend() { sync rtcwake -d rtc1 -m mem -s "$WAKE_IN_SECONDS" }
refresh_screen()
関数
refresh_screen()refresh_screen() { curl -k "$SCREEN_URL" -o "$DIR/screen.png" eips -c; eips -c # 二度クリア eips -g "$DIR/screen.png" -x 0 -y 30 -w gc16 eips 1 1 "$(TZ=EST5EDT date '+%Y-%m-%d %I:%M %p') - wifi $(cat /sys/class/net/wlan0/operstate 2>/dev/null || echo '?') - battery: $(gasgauge-info -c 2>/dev/null | sed 's/%//g' || echo '?')" }
画像を描画し、日付/時刻・Wi‑Fi 状態・バッテリー残量をオーバーレイ表示します。
メニューキーの処理
script -q -c "evtest /dev/input/event2 2>&1" /dev/null \ | grep -m 1 -q "code 102 (Home), value 1" && "$DIR/stop.sh"
メニューキーを押すと
stop.sh が実行され、ダッシュボードが終了し画面がクリアされた後、Kindle UI が再起動します。
最終的な感想
- 色のにじみ は二度クリアしても残る。スリープ時に黒→白をフラッシュすると改善される可能性があります。
- バッテリー寿命:約5日間無接続。夜間シャットダウンを10時間に延長すればさらに2日程度延長できます。更新頻度を長く設定すれば更なる節電が期待できるものの、私はほぼリアルタイム更新を好みます。
全体として、このプロジェクトは実用的でやりがいがあります。通勤時に便利なバス情報表示装置としてだけでなく、カレンダー・天気・タスク管理など他の e‑ink データ表示にも応用できるプラットフォームとなります。