Zurück

Ein Claude-Nutzungsdashboard auf dem M5Stack Basic: Planlimits und API-Ausgaben auf dem Schreibtisch

Der M5Stack Basic auf einer Laptop-Tastatur mit dem Dashboard: ein Claude-Max-Konto bei 88% seines Wochenlimits, die 5-Stunden-Sitzung bei 30% und 142M Tokens heute

Ich benutze Claude jeden Tag, und die Frage, die ich am häufigsten stelle, dreht sich nicht um Code. Sie lautet: “Wie viel von meiner Woche ist noch übrig?” Der /usage-Bildschirm von Claude Code beantwortet sie, aber nur, wenn ich innehalte und sie eintippe. Ich wollte die Antwort auf meinem Schreibtisch, so wie eine Uhr die Zeit anzeigt.

Der M5Stack Basic passt gut. Er ist ein fertiges Gerät: ein 2-Zoll-320×240-Bildschirm, drei Tasten, ein Akku und ein ESP32 in einem 54-mm-Gehäuse. Kein Breadboard, kein Löten.

Dieser Artikel beschreibt das Dashboard: was es anzeigt, wie die Daten von Claude auf den Bildschirm gelangen, wie sich das Gerät ohne jede Einrichtung verbindet und welche Schritte nötig sind, um dein eigenes zu bauen. Die UI wurde auf dem M5Stack Core in Velxio entworfen, bevor sie die Hardware berührte, und diesen Weg empfehle ich, wenn du eines bauen willst. Du kannst diese Firmware auch in deinem Browser ausführen, mit Demo-Daten, ohne das Gerät.

Das Dashboard auf dem Gerät: auf YouTube ansehen.

Der gesamte Code, die Firmware und die PC-Bridge, ist auf GitHub unter der MIT-Lizenz verfügbar: velxio/m5claude. Der Abschnitt “Der Code, Teil für Teil” weiter unten geht durch, was jede Datei tut.

Die Hardware

Der M5Stack Basic v2.7: ein ESP32 mit einem 2-Zoll-320x240-IPS-Bildschirm, drei Tasten, USB-C, einem microSD-Slot und einem 110-mAh-Akku

Das Board ist das M5Stack Basic Core IoT Development Kit v2.7:

Sonst ist nichts nötig: Das Dashboard nutzt nur, was im Gehäuse steckt. Das Board hat keinen IMU, kein Mikrofon, keine LEDs und keine Echtzeituhr, also nutzt das Dashboard alles andere: den Bildschirm und die Tasten, den Lautsprecher für Alarme, die Hintergrundbeleuchtung zum Stromsparen und den Stromchip zur Anzeige des Ladezustands.

Was der Bildschirm zeigt

Das Dashboard funktioniert mit zwei Arten von Claude-Konten und mit mehreren von jeder:

Für beide zeigt es Tokens pro Tag für die letzte Woche, aufgeteilt in Eingabe, Ausgabe, Cache-Lesevorgänge und Cache-Schreibvorgänge sowie nach Modell.

Es gibt vier Ansichten. B wechselt zur nächsten, A und C wechseln zwischen Konten, Gedrückthalten von B fordert frische Daten vom PC an, und Gedrückthalten von C öffnet die Einstellungen. Das sind alle Bildschirme, mit der Animation, die jede Ansicht beim Öffnen abspielt:

Ein animierter Rundgang durch alle Bildschirme: die Übersicht mit drei Konten, die Ansichten Limits, Tokens und Aufschlüsselung, eine API-Organisation, die Übersicht mit einem Konto, der Akku beim Laden, die Einstellungen auf Englisch und Spanisch, die Genehmigungsabfrage und der Wartebildschirm

Übersicht. Eine Karte pro Konto. Das Layout passt sich an, wie viele Konten es gibt: ein Konto füllt den Bildschirm, zwei bekommen höhere Karten mit einer Zeile für die heutige Nutzung, und drei oder mehr werden zu einer scrollbaren Liste.

Die Übersicht mit einem Claude-Max-Konto: das Wochenlimit als Ring, die 5-Stunden-Sitzung und die Limits pro Modell rechts, und die heutigen Tokens mit einem Sieben-Tage-Diagramm

Die Übersicht mit zwei Max-Konten und einer API-Organisation: Wochenprozentwert, 5-Stunden- und 7-Tage-Balken, Rücksetzzeiten und Sieben-Tage-Ausgaben für das API-Konto

Limits. Das Wochenlimit als Ring, mit der Sitzung und den Limits pro Modell daneben. Die Modellnamen kommen von Claude selbst, sodass die Zeilen den Limits folgen, die dein Plan hat. Die Farben ändern sich bei 60 % (Bernstein) und 85 % (Rot).

Die Limits-Ansicht: ein Wochenring bei 67 %, die 5-Stunden-Sitzung bei 42 % und Wochenlimits für Opus und Sonnet

Tokens. Heute, die letzten sieben Tage und der Dollar-Betrag, dann Tokens pro Tag mit einer gestrichelten Linie beim Durchschnitt. Bei einem Abo ist der Dollar-Betrag das, was dieselben Tokens zu API-Listenpreisen kosten würden. Es ist keine Abbuchung, aber eine nützliche Möglichkeit zu sehen, wie stark du den Plan nutzt.

Die Tokens-Ansicht: 2,84 Mio. Tokens heute, 20,8 Mio. über sieben Tage, ein API-Wert von 84,20 $ und ein Balkendiagramm der Tokens pro Tag

Die Tokens-Ansicht auf dem Gerät, mit 142 Mio. Tokens heute und 296 Mio. über sieben Tage

Aufschlüsselung. Die Tokens der Woche nach Typ und nach Modell. Mit Claude Code sind Cache-Lesevorgänge normalerweise der Großteil der Summe.

Die Aufschlüsselungsansicht: ein gestapelter Balken aus Eingabe-, Ausgabe-, Cache-Lese- und Cache-Schreib-Tokens und der Anteil jedes Modells

Die Aufschlüsselungsansicht auf dem Gerät: fast alle der 296 Mio. Tokens einer Woche sind Cache-Lesevorgänge, aufgeteilt zwischen Opus und Fable

Der Punkt neben der Uhr zeigt die Verbindung: grün, solange die Daten frisch sind, bernsteinfarben, wenn sie veraltet sind, rot, wenn kein PC verbunden ist. Die Fotos zeigen mein eigenes Konto. Die Screenshots verwenden Demo-Konten.

Akku, Ton und Einstellungen

Neben der Uhr ist der Akku, gezeichnet wie Telefone es tun: der Ladestand und ein Blitz mit einer Füllung, die beim Laden ansteigt. Der IP5306-Stromchip meldet nur vier Stufen (25, 50, 75 und 100 %), daher bewegt sich die Zahl in 25er-Schritten.

Die Kopfzeile beim Laden: 75 % mit einem Blitz und einem grünen Akku, neben dem Verbindungspunkt und der Uhr

Der Lautsprecher wird für Warnungen verwendet. Wenn eine Sitzung oder ein Wochenlimit 90 % überschreitet (oder 80 %, wenn du das wählst), spielt das Gerät einen kurzen doppelten Ton und zeigt, welches Konto und welches Limit betroffen ist. Wenn ein Limit zurückgesetzt wird, spielt es einen aufsteigenden Ton. Genehmigungsanfragen von einem neuen Computer geben ebenfalls einen Ton. Button-Klicks sind optional.

Gedrückthalten von C öffnet die Einstellungen. A und C bewegen, B ändert einen Wert, und Gedrückthalten von B schließt den Bildschirm. Die Einstellungen werden auf dem Gerät gespeichert.

Der Einstellungsbildschirm: Sprache, Helligkeit, Töne, Warnschwelle, Bildschirm aus im Akkubetrieb, Nachtdimmung, gekoppelte Computer und die Firmware-Version

Dieselben Bildschirme auf Spanisch: die Einstellungen und die Übersicht

Die Übersicht auf Spanisch

110 mAh haltbar machen

Die erste Firmware entleerte den Akku in deutlich weniger als einer Stunde. Die CPU lief mit 240 MHz, der Bildschirm wurde jede Sekunde neu gezeichnet, und das Funkmodul sendete mit voller Leistung und einem Verbindungsintervall von 15–30 ms. Nichts davon ist nötig, um eine Zahl anzuzeigen, die sich einmal pro Minute ändert. Im Akkubetrieb macht die Firmware jetzt Folgendes:

Für den ganzen Tag abseits des Schreibtischs stapelt sich das Battery Module 13.2 unter dem Basic und fügt 1500 mAh hinzu.

So funktioniert es

Daten fließen vom Login und den Transkripten von Claude Code sowie von der Admin API in die Python-Bridge und dann über USB oder Bluetooth LE zum M5Stack, der nur zeichnet, was ihm gesendet wird

Die Designregel lautet, dass das Gerät nichts weiß. Es enthält keine Claude-Zugangsdaten und keine Wi-Fi-Einstellungen. Ein kleines Programm auf dem PC, die Bridge, sammelt alles und sendet dem Gerät einen Snapshot zum Zeichnen. Das hält Geheimnisse von einem Gerät fern, das auf einem Schreibtisch steht, und bedeutet, dass ein Wechsel des Computers oder Netzwerks keine Neukonfiguration erfordert.

Woher die Daten kommen

Die Bridge besteht aus etwa 1.100 Zeilen Python mit zwei Abhängigkeiten (pyserial und bleak). Sie liest drei Quellen:

  1. Tariflimits aus dem Login von Claude Code. Jedes Konfigurationsverzeichnis von Claude Code (~/.claude, ~/.claude-work, …) enthält den Login eines Kontos. Die Bridge findet sie alle und nutzt jedes Token, um dieselben Limits zu lesen, die der /usage-Bildschirm von Claude Code anzeigt. Sie liest das Token nur und erneuert es nie, denn eine Erneuerung würde das Token rotieren und Claude Code abmelden.
  2. Tokens aus den Transkripten von Claude Code. Jede Antwort, die Claude Code erhält, wird in eine JSONL-Datei unter projects/ geschrieben, zusammen mit ihrer Token-Nutzung und dem Modell. Die Bridge summiert diese pro Tag, entfernt Duplikate (eine fortgesetzte Sitzung kopiert frühere Nachrichten in eine neue Datei) und bepreist sie mit der API-Preisliste.
  3. Ausgaben für API-Organisationen aus der Usage and Cost Admin API. usage_report/messages liefert Tokens pro Tag und Modell. cost_report liefert die tatsächlichen Ausgaben. Beide benötigen einen Admin-API-Schlüssel (sk-ant-admin01-...).

Zwei Lektionen aus dem Betrieb mit echten Konten:

Der Snapshot

Jede Aktualisierung erzeugt eine JSON-Zeile von etwa 600 Bytes:

{"v":1,"ts":1792770195,"tz":3600,"acc":[
 {"n":"Personal","p":"Max 20x","k":"sub","ok":1,
  "s":[42,1792778235],"w":[67,1793037195],"x":[["Opus",54,1793037195],["Sonnet",31,1793037195]],
  "td":2840000,"tk":[2310000,1480000,15900000,1120000],"c":84.2,"ct":11.35,
  "d":[1900000,3400000,2600000,4100000,3300000,2670000,2840000],"m":[["Opus",61],["Sonnet",34],["Haiku",5]]}]}

s, w und x sind die Sitzungs-, Wochen- und Pro-Modell-Limits als [Prozent, Rücksetzzeit]. d sind Tokens pro Tag. ts und tz sind die Uhr des PCs und der UTC-Offset. Der M5Stack Basic hat keine Echtzeituhr und keine Zeitzonendatenbank, daher übernimmt das Gerät beides aus dem Snapshot und zählt die Sekunden von dort aus weiter. Das reicht für „setzt zurück in 2h 14m” und „Di 04:00”.

Verbinden ohne Konfiguration

Ich wollte überhaupt kein Setup. Ein Wi-Fi-Passwort in ein Gerät mit drei Tasten einzutippen ist unangenehm. Die IP-Adresse des PCs auf dem Gerät zu speichern, bricht, sobald man den Computer wechselt. Also unterstützt das Gerät zwei Verbindungen, und keine davon braucht Einstellungen.

USB. Kabel einstecken. Die Bridge sucht nach seriellen Ports, deren USB-Chip von einem M5Stack stammt (CH9102 oder CP2104). Sie öffnet den Port, ohne DTR und RTS umzuschalten, damit der ESP32 nicht zurückgesetzt wird, und wartet auf eine Begrüßung. Die Firmware sendet alle zwei Sekunden {"hello":"m5claude",...}, bis Daten ankommen. Kommt innerhalb weniger Sekunden keine Begrüßung an, gibt die Bridge den Port frei und lässt ihn eine Weile in Ruhe, damit andere ESP32-Boards und Flash-Werkzeuge nicht beeinträchtigt werden.

Bluetooth LE. Die Firmware bewirbt einen GATT-Dienst mit zwei Characteristics: eine, in die der PC Zeilen schreibt, und eine, auf der das Gerät Benachrichtigungen sendet. Die Bridge sucht nach der Dienst-UUID und verbindet sich. Es gibt keinen Windows-Kopplungsdialog und nichts, was man aus einer Liste auswählen müsste.

Da jeder Computer in Reichweite das Gerät finden könnte, wird jeder neue PC einmal auf dem Gerät bestätigt:

Die Bestätigungsabfrage: „Neuer Computer, DESKTOP-STUDIO. Erlauben, dass er Nutzungsdaten sendet?" mit Ablehnen auf Taste A und Erlauben auf Taste C

Der Kopplungsaustausch: Begrüßung vom Gerät, Name und stabile ID des PCs von der Bridge, eine ausstehende Antwort, die Abfrage auf dem Bildschirm, dann ok, eine Aktualisierungsanfrage und die Snapshots

Die Bridge speichert eine zufällige ID in ~/.m5claude/pc_id. Das Gerät speichert die IDs von bis zu vier bestätigten PCs im NVS. Ein bekannter PC wird sofort akzeptiert, und A beim Einschalten gedrückt zu halten vergisst alle. Ein Gerät, das bereits über USB verbunden ist, wird bei Bluetooth übersprungen, damit es nicht gebeten wird, denselben PC zweimal zu bestätigen.

Bis die Bridge läuft, zeigt das Gerät an, was zu tun ist:

Der Wartebildschirm: „Warte auf deinen PC. Führe m5claude-bridge auf deinem Computer aus. Es verbindet sich automatisch über USB oder Bluetooth."

Die Firmware

Die Firmware ist ein Arduino-Sketch, der mit arduino-cli auf dem arduino-esp32-2.0-Core gebaut wird. Sie verwendet drei Bibliotheken:

Der UI-Code hängt nicht von der Hardware ab. Er zeichnet in ein LovyanGFX-Ziel und liest die drei Tasten. Alles, was spezifisch für das Board ist (das Panel, USB, BLE, NVS), lebt im Sketch.

Einige Details, die es wie ein Produkt statt wie eine Demo aussehen lassen:

Zeichnen ohne PSRAM und die diagonalen Streifen

Ein vollständiger 320×240-Frame in 16-Bit-Farbe sind 150 KB. Der größte freie Speicherblock des ESP32 ist mit laufendem Bluetooth kleiner als das. Also wird die UI viermal pro Frame in ein 320×60-Band (38 KB) gezeichnet. Jeder Durchlauf zeichnet alles um den Offset des Bands nach oben verschoben, und Teile, die außerhalb des Bands liegen, werden abgeschnitten.

Als dies zum ersten Mal auf dem Board lief, zeigte der Bildschirm diagonale Streifen, und die Tasten der Bestätigungsabfrage erschienen zweimal, oben und unten. Die Panel-Konfiguration war mein erster Verdacht. Ich schrieb sie von Hand aus der M5Stack-Dokumentation neu, und nichts änderte sich. Die Ursache lag woanders:

Mit einem Puffer wird das nächste Band in den Puffer gezeichnet, während DMA ihn noch sendet. Mit zwei Puffern wird einer gezeichnet, während der andere gesendet wird, und die CPU wartet auf die Übertragung, bevor ein Puffer wiederverwendet wird

LovyanGFX sendet einen Sprite mit DMA im Hintergrund an das Panel. Meine Schleife begann, das nächste Band in denselben Puffer zu zeichnen, während das vorherige noch gesendet wurde, sodass das Panel die Hälfte eines Bands und die Hälfte des nächsten erhielt. Die Lösung verwendet zwei Puffer abwechselnd und wartet auf die vorherige Übertragung, bevor gepusht wird:

for (int y = 0, k = 0; y < 240; y += 60, k ^= 1) {
  LGFX_Sprite& band = bands[k];
  band.fillScreen(BG);
  draw_ui(band, /*offset_y=*/y);   // runs while the other buffer is still being sent
  lcd.waitDMA();                    // the other buffer's transfer has finished
  band.pushSprite(&lcd, 0, y);      // starts this buffer's transfer
}
lcd.waitDMA();

Das kostet einen weiteren 38-KB-Puffer, von etwa 275 KB freiem RAM.

Der Code, Teil für Teil

Lade den Code mit git clone https://github.com/velxio/m5claude.git herunter oder als ZIP über die Schaltfläche Code des Repositories. Er besteht aus zwei Hälften, die nichts außer dem Protokoll gemeinsam haben: bridge/ läuft auf dem PC, und firmware/ plus src/ laufen auf dem M5Stack.

Auf dem M5Stack

firmware/m5claude/m5claude.ino: alles, was spezifisch für die Platine ist.

src/app/app.cpp: das Protokoll, unabhängig von der Verbindung.

src/model/: die Daten.

src/ui/: die Bildschirme.

Auf dem PC

Die Bridge liegt in bridge/m5claude_bridge/. Ihre einzigen Abhängigkeiten sind pyserial und bleak. HTTPS-Aufrufe verwenden die Standardbibliothek.

__main__.py: die Kommandozeile und die Hauptschleife.

autostart.py registriert die Bridge so, dass sie sich beim Anmelden ohne Fenster startet: der Run-Registrierungsschlüssel mit pythonw unter Windows, ein LaunchAgent unter macOS, eine systemd-User-Unit unter Linux.

config.py: die Konten.

sources/: eine Datei pro Datenquelle.

pricing.py enthält die API-Listenpreise pro Modellfamilie. Es schätzt den Wert der Abonnementnutzung.

snapshot.py: baut den Snapshot.

hub.py behält den neuesten Snapshot und gibt ihn an jedes verbundene Gerät weiter. Eine langsame Verbindung bekommt nur den neuesten, nie einen Rückstau.

transports/: eine Datei pro Verbindung.

Die README des Repositories enthält dieselbe Tour als Tabellen, plus Fehlerbehebung.

Baue dein eigenes

Die Reihenfolge, die ich empfehle: Entwirf die Bildschirme in Velxio, flashe dann das Board und verbinde anschließend die Bridge.

1. Ausführen und anpassen auf dem M5Stack Core in Velxio

Velxio simuliert den M5Stack Core mit seinem 320×240-Bildschirm, den Tasten A, B und C sowie dem Batterie-Chip. Einen 2-Zoll-Bildschirm zu gestalten bedeutet viele kleine Anpassungen (ein Label zwei Pixel zu tief, eine Zahl, die nicht in ihre Karte passt), und jede davon dauert im Browser Sekunden statt eines Flash-Zyklus.

Das Dashboard ist in Velxios Beispielgalerie enthalten, mit denselben Quelldateien wie im Repository:

  1. Öffne M5Stack Core: Claude usage dashboard (m5claude) und klicke auf die Play-Schaltfläche. Eine Anmeldung ist nicht nötig. Es startet mit den Demo-Konten aus diesem Artikel.
  2. Klicke auf A und C, um ein Konto auszuwählen, und auf B, um durch die Ansichten zu blättern. Der Simulator führt die Firmware langsamer aus als das Board, um die Einstellungen zu öffnen, halte C einige Sekunden lang gedrückt.
  3. Um deine eigenen Zahlen zu sehen, führe m5claude-bridge snapshot auf deinem PC aus und füge die ausgegebene Zeile in den seriellen Monitor ein. Der erste Kommentar im Sketch enthält eine Beispielzeile, die du bearbeiten kannst.
  4. Ändere die Bildschirme in ui.cpp und führe es erneut aus. Wenn sie richtig aussehen, flashe das Board.

Zwei Dinge unterscheiden sich vom Board: Velxio hat kein Bluetooth, daher entfällt diese Verbindung und der serielle Monitor ist die einzige Verbindung, und der Lautsprecher-Code verwendet die Aufrufe des neueren ESP32-Arduino-Cores. Jede Änderung ist im Sketch markiert.

Um ein eigenes Dashboard von einem leeren Bildschirm aus zu starten, ist M5Stack Core: Hello LCD + Buttons das kleinste Beispiel. Es verwendet M5Stacks M5GFX, das auf LovyanGFX aufbaut und dessen Zeichen-API teilt, sodass Code zwischen beiden übertragbar ist.

2. Die Firmware flashen

git clone https://github.com/velxio/m5claude.git && cd m5claude
arduino-cli core install esp32:esp32
arduino-cli lib install LovyanGFX NimBLE-Arduino ArduinoJson

./firmware/build.sh /dev/ttyUSB0      # Linux / macOS
.\firmware\build.ps1 -Upload          # Windows, finds the COM port by itself

Die Skripte bauen für den M5Stack Core mit einem Partitionsschema, das Platz für eine große App lässt (PartitionScheme=no_ota). Die Firmware ist etwa 820 KB groß. Zwei Einstellungen haben mich erwischt:

3. Die Bridge ausführen

pip install -e bridge                # from the repository root; installs pyserial and bleak
m5claude-bridge accounts             # which accounts it found
m5claude-bridge autostart on         # start now, and at every login

autostart on registriert die Bridge so, dass sie bei der Anmeldung ohne Fenster startet. Unter Windows fügt es einen Wert unter dem Run-Registrierungsschlüssel des Benutzers hinzu, der pythonw startet. Unter macOS installiert es einen LaunchAgent und unter Linux einen systemd-Benutzerdienst. autostart status zeigt an, ob sie läuft, und die letzten Zeilen ihres Logs in ~/.m5claude/bridge.log. Es läuft immer nur eine Bridge gleichzeitig: Eine zweite würde um den USB-Port und die Bluetooth-Verbindung konkurrieren, daher beendet sie sich mit einer Meldung. Wenn du m5claude-bridge allein ausführst, bleibt sie im Vordergrund, mit dem Log im Terminal.

Pro- und Max-Konten werden aus den Konfigurationsverzeichnissen von Claude Code gefunden. Um ein zweites Abonnement hinzuzufügen, melde es unter seinem eigenen Verzeichnis an:

$env:CLAUDE_CONFIG_DIR = "$HOME\.claude-work"; claude    # then /login

API-Organisationen benötigen einen Admin-API-Schlüssel aus der Claude Console unter Settings → Admin keys:

m5claude-bridge add-api "Acme API" --key-env ACME_ADMIN_KEY

4. Verbinden

Stecke das USB-Kabel ein, oder lass das Gerät auf dem Schreibtisch stehen und Bluetooth es finden. Beim ersten Mal über Bluetooth drücke C am Gerät, um den PC zu bestätigen. Die Daten erscheinen innerhalb weniger Sekunden.

Einschränkungen

Wie es weitergeht

Der Code ist unter github.com/velxio/m5claude zu finden. Issues und Pull Requests sind willkommen.

Danke an M5Stack für ein Board, das sofort einsatzbereit ist, und an die Autoren von LovyanGFX, NimBLE-Arduino, ArduinoJson und bleak.

Links zum M5Stack-Shop auf dieser Seite sind Affiliate-Links: Wenn du darüber kaufst, verdient Velxio eine kleine Provision ohne zusätzliche Kosten für dich, und es hilft, den Simulator kostenlos zu halten.


Teilen auf:
David Montero

Geschrieben von

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Ähnliche Artikel


Vorheriger Artikel
Cute Desktop Robot: ein Gesicht, das auf dem ESP-VoCat zuhört, mit seinem Emulator im Browser
Nächster Artikel
Raspberry Pi 4 und 5 im Browser: Basic-Modus und Linux-Modus, Schritt für Schritt