65 lines
3.1 KiB
Markdown
65 lines
3.1 KiB
Markdown
# Monitorink
|
||
|
||
Transforme une **Kobo Libra 2** (e-reader e-ink) en écran de monitoring domestique affichant :
|
||
**heure**, **météo**, **statuts du NAS**, **ratios des trackers**, et surtout le **reste de
|
||
tokens des abonnements Claude et Codex**.
|
||
|
||

|
||
|
||
*Rendu généré hors-ligne avec données fictives (`dev/preview.py`).*
|
||
|
||
## Architecture
|
||
|
||
```
|
||
[Homelab] backend PNG (FastAPI + Playwright, Docker, derrière Caddy)
|
||
├─ Claude : GET /api/oauth/usage (login isolé dédié, scope user:profile)
|
||
├─ Codex : usage ChatGPT/Codex via le token Hermes (wham/usage)
|
||
├─ Météo : Open-Meteo (sans clé)
|
||
├─ NAS : moniteur maison nas_monitor (/api/status)
|
||
└─ Trackers : ratios des trackers torrent privés (login session)
|
||
│
|
||
└── GET /image.png (1264×1680 niveaux de gris)
|
||
│ WiFi à la demande
|
||
[Kobo Libra 2] boucle NickelMenu : fetch → fbink → suspend rtcwake
|
||
```
|
||
|
||
- **`backend/`** — serveur Python qui agrège les données et génère l'image du dashboard.
|
||
- **`kobo/`** — scripts client pour la Kobo (overlay sur `usetrmnl/trmnl-kobo`).
|
||
- **`dev/`** — utilitaires de dev (sonde de l'endpoint usage Claude).
|
||
|
||
## Le « reste de tokens Claude »
|
||
|
||
L'endpoint OAuth `/usage` (celui derrière la commande `/usage` de Claude Code) renvoie des
|
||
**pourcentages d'utilisation** des fenêtres glissantes (session 5 h + hebdo), pas un nombre brut
|
||
de tokens — Anthropic n'expose pas de compteur absolu côté abonnement. Monitorink affiche donc
|
||
le **% restant** (`100 − utilisation`) et le temps avant reset. *(ChatGPT : hors scope, aucune
|
||
API officielle de quota restant.)*
|
||
|
||
L'endpoint `/usage` exige le scope OAuth `user:profile`, que le token `claude setup-token`
|
||
**n'a pas** (403). Le backend utilise donc les credentials d'un **login Claude isolé dédié**
|
||
à Monitorink (`CLAUDE_CONFIG_DIR` séparé) : scopes complets + lignée de refresh token propre,
|
||
sans aucun conflit avec le Claude Code du Mac ou du homelab. Le backend lit/rafraîchit
|
||
**uniquement ce fichier isolé** (`/creds/.credentials.json`), jamais le `~/.claude` partagé.
|
||
|
||
## Démarrage backend (dev, sur Mac)
|
||
|
||
```sh
|
||
cd backend
|
||
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
|
||
.venv/bin/python -m playwright install chromium
|
||
cp ../.env.example ../.env # puis compléter
|
||
.venv/bin/uvicorn app:app --reload --port 8080
|
||
# -> http://localhost:8080/image.png et /debug.html (itération design)
|
||
```
|
||
|
||
## Déploiement (homelab, Docker + Caddy)
|
||
|
||
1. Login Claude isolé dédié (scopes complets) sur le homelab :
|
||
`CLAUDE_CONFIG_DIR=/home/jerem/.monitorink-claude claude auth login`
|
||
2. Créer `.env` (depuis `.env.example`) : coords météo, NAS, trackers. Le compose monte
|
||
`~/.monitorink-claude` sur `/creds` (lecture/écriture pour le refresh du token).
|
||
3. `docker compose up -d --build` (le service s'expose via caddy-docker-proxy sur
|
||
`monitorink.homelab.nestor-server.fr`).
|
||
|
||
Voir `kobo/README.md` pour l'installation côté Kobo.
|