Bauprojekt · Stand 8. November 2026Build log · as of 8 November 2026

KI-TelefonAI Telephone

Ich habe ein oranges Posttelefon FeTAp 611-2 aus den Siebzigern umgebaut. Wer den Hörer abhebt, hört das Freizeichen, wählt eine Ziffer und hat eine von neun Figuren am Apparat. Die Figuren spielen Musik ab, setzen Dinge auf unsere Einkaufsliste, schlagen Rezepte vor und merken sich, was man ihnen sagt. Im Gehäuse steckt ein Raspberry Pi 5. Gabelschalter, Wählscheibe, Hörer und Klingel sind die Originalteile. Die Wählscheibe rechtsunten lässt sich mit der Maus oder dem Finger drehen.I converted an orange 1970s German post office telephone, the FeTAp 611-2. Lift the handset, hear the dial tone, dial a digit, and one of nine characters answers. They play music, put things on our shopping list, suggest recipes and remember what you tell them. A Raspberry Pi 5 sits inside the case. The hook switch, rotary dial, handset and bell are the original parts. You can turn the dial on the rightbelow with a mouse or a finger.

9 Figurencharacters 21 Werkzeugetools 425 Hz Freizeichendial tone 25 Hz Klingelringing 24 kHz Audio

Läuft seit dem 8. Juni 2026 bei uns im Haus. Gerade steht es still: Der Wackelkontakt im Hörerkabel ist wieder da, die Ersatzteile sind bestellt.In use at home since 8 June 2026. Right now it is out of action: the loose contact in the handset cord is back, and the spare parts are on order.

Wählscheibe FIGUR WÄHLEN 1 – 9 · 0

Finger ins Loch, bis zum Anschlag drehen, loslassenFinger in a hole, turn to the stop, let go

Mein Telefon, November 2026My phone, November 2026

Von außen ist nichts umgebaut. Die Wählscheibe oben auf dieser Seite habe ich nach diesem Gerät gezeichnet: schwarze Fingerlöcher, weiße Ziffern, Anschlag bei vier Uhr. Auf dem Nummernschild stand unsere alte Rufnummer, die habe ich auf dem Foto entfernt.Nothing has changed on the outside. I drew the dial at the top of this page after this phone: black finger holes, white digits, the finger stop at four o'clock. The number card showed our old phone number, which I removed from the photo.

So läuft ein AnrufHow a call works

Das Programm führt jeden Anruf als Zustandsmaschine. Den Freiton nutze ich als Wartezeit: Während es im Hörer tutet, baut der Pi schon die Verbindung zur Realtime-API von OpenAI auf. Das Mikrofon gebe ich erst danach frei, sonst würde die KI den Freiton mithören.The program runs each call as a state machine. I use the ringback tone as waiting time: while the handset beeps, the Pi is already opening the connection to OpenAI's Realtime API. The microphone only opens after that, otherwise the AI would hear the ringback tone too.

  1. idle → dialing

    Hörer abHandset up

    Der Gabelschalter hängt an GPIO 5, entprellt mit 200 ms. Im Hörer liegt das Freizeichen mit 425 Hz.The hook switch is on GPIO 5, debounced at 200 ms. The handset plays the 425 Hz dial tone.

  2. dialing

    WählenDialling

    Die Wählscheibe an GPIO 26 schickt beim Zurücklaufen Impulse, rund 100 ms auseinander. Was schneller als 80 ms kommt, verwirft der Code als Prellen.On its way back the dial on GPIO 26 sends pulses about 100 ms apart. Anything faster than 80 ms is discarded as contact bounce.

  3. ringback

    FreitonRingback

    Ein Ton, eine Pause. In dieser Zeit steht die Sitzung mit Rolle, Stimme und Werkzeugen.One tone, one pause. During that time the session is set up with character, voice and tools.

  4. in_call

    GesprächConversation

    Audio läuft als PCM16 mono mit 24 kHz in beide Richtungen, mit 250 ms Puffer. Wer dazwischenredet, unterbricht die Figur.Audio flows as 24 kHz mono PCM16 in both directions, with a 250 ms buffer. Talking over the character interrupts it.

  5. → idle

    AuflegenHang up

    Auflegen beendet in jeder Phase. Danach meldet das Telefon die Anrufe des Tages an Home Assistant.Hanging up ends the call in any phase. Afterwards the phone reports the day's call count to Home Assistant.

Spielt den ersten Anruf vom 8. Juni nach, mit Ziffer 1.Replays the first call from 8 June, dialling 1.

Was die Figuren erledigenWhat the characters can do

Das Sprachmodell erkennt im Gespräch, was gewünscht ist, und ruft eines seiner Werkzeuge auf. Ausgeführt wird der Aufruf von meinem Python-Code. Kurze Dinge passieren sofort, längere Aufgaben gehen in eine Warteschlange.During the conversation the language model works out what is wanted and calls one of its tools. My Python code carries out the call. Short things happen right away, longer jobs go into a queue.

  • MusikMusic

    Spiel was von Queen.Play something by Queen.

    Startet Spotify auf unserem Radio oder der Stereoanlage. Wir haben zwei Spotify-Konten; die Figur fragt beim Abheben, wer dran ist. Spotifys eigene Mixe wie die Daylist sind seit November 2024 für fremde Apps gesperrt, das sagt die Figur dann auch.Starts Spotify on our radio or the stereo. We have two Spotify accounts, so the character asks who is calling. Spotify's own mixes such as the daylist have been closed to third-party apps since November 2024, and the character says so.

    spotify_play · spotify_now_playing · spotify_pause
  • EinkaufslisteShopping list

    Brötchen auf die Einkaufsliste, sechs Stück.Bread rolls on the shopping list, six of them.

    Landet sofort in unserer Haushalts-App, die ich ebenfalls selbst geschrieben habe.Goes straight into our household app, which I also wrote myself.

    add_shopping_item
  • RezepteRecipes

    Schlag mir was für Pasta mit Spinat vor.Suggest something with pasta and spinach.

    Claude schreibt ein vollständiges Rezept, die Figur liest eine Zusammenfassung vor. „Mit Knoblauch“ ändert es, „Ja, speichern“ legt es in der Haushalts-App ab.Claude writes a complete recipe and the character reads out a summary. “With garlic” changes it, “Yes, save it” files it in the household app.

    suggest_recipe · modify_recipe · confirm_recipe · discard_recipe
  • Kochbuch durchsuchenSearching the cookbook

    Hab ich ein Rezept mit Aubergine?Do we have a recipe with aubergine?

    Die Figur fragt unser Kochbuch in der Haushalts-App und nennt höchstens drei Treffer mit Titel und Zeit. Auf Nachfrage liest sie das ganze Rezept vor.The character asks our cookbook in the household app and names at most three hits with title and time. If asked, she reads out the whole recipe.

    search_recipes · similar_recipes · read_recipe
  • Wetter und WebsucheWeather and web search

    Regnet es morgen bei uns?Will it rain here tomorrow?

    Das Wetter kommt von Open-Meteo, ohne Schlüssel. Für alles andere gibt es eine Websuche über Claude; vorher sagt die Figur kurz „Moment“. Standard sind höchstens 50 Suchen am Tag.Weather comes from Open-Meteo, no key needed. For everything else there is a web search through Claude, and the character says “one moment” first. By default it allows at most 50 searches a day.

    get_weather · web_suche
  • Haushalts-GedächtnisHousehold memory

    Merk dir für den Italienurlaub: Adapter einpacken.For the Italy trip, remember: pack the adapter.

    Notizen unter einem Thema, die jede Figur später vorlesen oder löschen kann. Ob ein neues Thema zu einem alten gehört, entscheidet ein kleines Modell; gespeichert wird in SQLite.Notes filed under a topic that any character can read out or delete later. A small model decides whether a new topic belongs to an existing one; the notes are stored in SQLite.

    merke · erinnere · vergiss
  • Aufgaben für späterJobs for later

    Finde bis heute Abend heraus, wann der Wertstoffhof offen hat, und ruf mich zurück.Find out by tonight when the recycling centre is open and call me back.

    Die Aufgabe kommt in eine Warteschlange, mein Haus-Agent arbeitet sie ab. Ist das Ergebnis da, klingelt das Telefon, und eine Figur liest es vor. Alternativ kommt es per Mail.The job goes into a queue and my house agent works through it. When the result is ready, the phone rings and a character reads it out. It can also arrive by email.

    delegate_task · zustellung_aendern · ergebnis_per_mail
  • FreisprechenSpeakerphone

    Schalte auf laut.Put it on speaker.

    Das Gespräch wandert auf Elektra, mein Sprachgerät im Haus. Die 1 auf der Wählscheibe schaltet im Gespräch ebenfalls hin und her. Auflegen beendet immer.The conversation moves over to Elektra, my voice device in the house. Dialling 1 during a call also switches back and forth. Hanging up always ends it.

    freisprechen · hoerer_zurueck
  • FranzösischkursFrench course

    Bonjour Camille !Bonjour Camille !

    Unter der 3 meldet sich Camille. Sie notiert Fehler, führt den Lernstand in einer eigenen Datenbank und erzählt vom Wetter in Rennes und den Nachrichten des Tages.Dial 3 for Camille. She notes mistakes, keeps track of progress in a separate database and talks about the weather in Rennes and the day's news.

    note_error · get_news_fr · get_weather
  • Das Telefon ruft anThe phone calls you

    (Das Telefon klingelt von selbst.)(The phone rings by itself.)

    Ist der automatische Anruf eingeschaltet, klingelt das Telefon nach einer Ruhezeit, und beim Abheben ist eine zufällige Figur dran. Ohne Wählen.With automatic calling switched on, the phone rings after a quiet period and a random character is on the line when you pick up. No dialling needed.

    KITELEFON_AUTOCALL_DELAY_S

Ein Gedächtnis pro FigurOne memory per character

Nach dem Auflegen kann Claude aus dem Gespräch herausziehen, was sich die Figur merken soll: bis zu acht Fakten, die bleiben, und das letzte Gespräch, das nach 14 Tagen verfällt. Was Hein weiß, weiß Astrid nicht. Eine gemeinsame Ablage wäre praktischer, aber dann wären es keine verschiedenen Leute mehr.After hanging up, Claude can pick out what the character should remember: up to eight facts that stay, plus the last conversation, which expires after 14 days. What Hein knows, Astrid does not. A shared store would be handier, but then they would no longer be different people.

Dieselben Werkzeuge für ElektraThe same tools for Elektra

Elektra ist mein Sprachassistent auf einem zweiten Gerät und bald auch auf dem Küchen-Display. Sie nutzt die Werkzeuge des Telefons über einen kleinen HTTP-Dienst. So liegen Spotify-Anmeldung und Schlüssel nur an einer Stelle.Elektra is my voice assistant on a second device and soon on the kitchen display as well. She uses the phone's tools through a small HTTP service, so the Spotify login and the keys live in one place only.

Was im Gehäuse stecktWhat is inside the case

Der FeTAp 611 war das Standardtelefon der Bundespost; man mietete es, statt es zu kaufen. Gebaut wurde er von mehreren Firmen, meiner stammt von Hagenuk. Für den Umbau habe ich den Übertrager und einen Kondensatorblock ausgelötet. Sie gehören zur Telefonleitung, die ich nicht mehr brauche, und machen Platz für den Pi.The FeTAp 611 was the standard telephone of the German Bundespost; people rented it rather than bought it. Several companies built it, and mine was made by Hagenuk. For the conversion I desoldered the transformer and a capacitor block. They belong to the phone line, which I no longer need, and removing them makes room for the Pi.

Ein FeTAp 611-2 im Originalzustand, hier in Grün.A FeTAp 611-2 in original condition, here in green.Foto: Felix Winkelnkemper, Wikimedia Commons, CC BY-SA 4.0, verkleinert
Ein unveränderter 611-2 von innen, oben die Platine mit dem Übertrager.An unmodified 611-2 from the inside, with the transformer on the board at the top.Foto: Friedrich Haag, Wikimedia Commons, CC BY-SA 4.0, verkleinert

Vom Original nutze ich fünf Dinge: das Gehäuse, den Gabelschalter, den Nummernschalter (so heißt die Wählscheibe bei der Post), den Hörer mit seinem Kohlemikrofon und den Wecker. Die Hörerkapseln gehen über zwei 3,5-mm-Klinken an eine USB-Soundkarte, Gabel und Wählscheibe direkt an die GPIO-Pins des Pi. Für die Klingel brauche ich eine höhere Spannung, dazu weiter unten mehr.I use five things from the original: the case, the hook switch, the number switch (the post office's name for the rotary dial), the handset with its carbon microphone, and the ringer. The handset capsules connect through two 3.5 mm jacks to a USB sound card; hook switch and dial go straight to the Pi's GPIO pins. The bell needs a higher voltage, more on that below.

Mein Telefon offen auf dem Schreibtisch, Juni 2026.My phone open on the desk, June 2026.
Platinenunterseite mit den neuen Drähten zu Gabel, Wählscheibe und Hörer.Underside of the board with the new wires to hook switch, dial and handset.
Der Pi 5 mit Active Cooler, die Kabel führen zur Telefonplatine.The Pi 5 with Active Cooler, cables running to the phone's board.

VerkabelungWiring

GPIO-Nummern nach BCM · Drahtfarben wie im TelefonGPIO numbers in BCM · wire colours as in the phone

Verkabelung zwischen Raspberry Pi 5, Telefon, USB-Soundkarte und Klingel Raspberry Pi 5 4 GB · Active Cooler Gabelschalter Kontakt GU, gegen Masse Wählscheibe Impulskontakt nsi L298N H-Brücke IN1 · IN2 · ENA Wecker Spule 1654 Ω 25 Hz, Polwechsel MT3608 5 V → 27 V USB-Soundkarte Mikrofon ← Sprechkapsel Kopfhörer → Hörkapsel 48 kHz, ALSA plug
  • FeTAp 611-2 von Hagenuk, orangeby Hagenuk, orangeGehäuse, Gabelschalter, Wählscheibe, Hörer mit Kohlemikrofon, Weckercase, hook switch, dial, handset with carbon microphone, ringer
  • Raspberry Pi 5, 4 GBmit Active Cooler und dem offiziellen Netzteil 5 V / 5 Awith Active Cooler and the official 5 V / 5 A power supply
  • USB-Soundkarte Unitek Y-247AUSB sound card Unitek Y-247AC-Media-Chip, kann nur 48 kHz; ALSA rechnet die 24 kHz umC-Media chip, 48 kHz only; ALSA resamples the 24 kHz stream
  • H-Brücke L298NL298N H-bridgepolt die Weckerspule 25-mal pro Sekunde umflips the ringer coil's polarity 25 times a second
  • Step-up-Wandler MT3608MT3608 boost convertermacht aus den 5 V des Pi rund 27 V, mehr schafft das Bauteil nichtturns the Pi's 5 V into about 27 V, the most this part can do
  • Klinken, Litze, SteckbrückenJacks, wire, jumperszwei 3,5-mm-Stecker für die Hörerkapseln, Litze 0,14 mm²two 3.5 mm plugs for the handset capsules, 0.14 mm² stranded wire
Wecker des Telefons mit Glocke und Klöppel 1654 Ω

Klingel · gemessen am 29. Juli 2026Bell · measured on 29 July 2026

Der Wecker braucht 27 Volt.The ringer needs 27 volts.

1654 ΩSpulecoil
27 Vam Weckerat the ringer
16 mASpulenstromcoil current
25 Hzwie bei der Postpost office standard

Die Vorlage aus dem Make-Magazin fährt die Spule mit halbem Tastgrad bei 30 V. Mein Wandler schafft aber nur 27 V, und bei halbem Tastgrad bleibt zu wenig Strom, um den Anker zu bewegen. Mit vollem Tastgrad und 25 Hz klingelt er. 25 Hz ist die Rufwechselspannung der Post, und im Vergleich mit 10 und 20 Hz klang sie am besten.The Make magazine design drives the coil at half duty cycle and 30 V. My converter only manages 27 V, and at half duty there is not enough current to move the armature. At full duty and 25 Hz it rings. 25 Hz is the post office's ringing frequency, and compared with 10 and 20 Hz it sounded best.

StörungsbuchFault log

Die meisten Fehler lagen in der Hardware. Ich halte jeden mit Datum fest.Most faults were in the hardware. I record each one with its date.

  1. Das Kohlemikrofon funktioniertThe carbon microphone works

    Fast hätte ich die alte Sprechkapsel gegen ein Elektretmikrofon getauscht. Ein Test mit einem normalen Headset hätte gleich gezeigt, dass die Soundkarte in Ordnung ist. Die Kapsel von damals läuft direkt am Mikrofoneingang.I nearly replaced the old capsule with an electret microphone. A test with an ordinary headset would have shown right away that the sound card was fine. The original capsule works straight into the mic input.

  2. Eine kalte LötstelleOne cold solder joint

    Der Hörer blieb still. Ich habe im Treiber gesucht, dabei war eine Lötstelle in einem Klinkenstecker nicht richtig verbunden. Nachgelötet, sofort Ton.The earpiece stayed silent. I searched in the driver, but a joint inside a jack plug was not properly connected. Resoldered, sound straight away.

  3. Das Lötpad ist nicht der SchalterThe pad is not the switch

    Mein erster Draht für den Gabelschalter saß auf einem Pad, das über eine Leiterbahn fest mit dem Nachbarn verbunden war. Den echten Kontakt fand ich mit dem Durchgangsprüfer, während ich den Federarm von Hand drückte.My first hook switch wire sat on a pad that a trace tied permanently to its neighbour. I found the real contact with a continuity tester while pressing the spring arm by hand.

  4. Entprellen ist PflichtDebouncing is a must

    Ohne Entprellen startete das Programm beim Abheben einen Anruf nach dem anderen. Seitdem gelten 200 ms für die Gabel und 80 ms für die Wählscheibe. Am Abend lief das erste Gespräch: „Moin moin, hier ist Hein …“Without debouncing, lifting the handset started one call after another. Since then the hook switch uses 200 ms and the dial 80 ms. That evening the first conversation worked: “Moin moin, hier ist Hein …”

  5. Ein Umweg über das Compute Module 5A detour via the Compute Module 5

    Ein kleineres Board hätte besser ins Gehäuse gepasst. Die Trägerplatine war aber defekt, also bin ich nach einer Woche zum Pi 5 zurück. Dabei lernte ich, dass die Soundkarte nur 48 kHz kann und ALSA die 24 kHz umrechnen muss.A smaller board would have fitted the case better. But the carrier board was faulty, so after a week I went back to the Pi 5. Along the way I learned that the sound card only does 48 kHz and ALSA has to resample the 24 kHz stream.

  6. Erfundene Sätze im ProtokollInvented sentences in the transcript

    Das alte Transkriptionsmodell schrieb ganze englische Sätze ins Gesprächsprotokoll, die niemand gesagt hatte. Ich bin auf ein neueres Modell umgestiegen.The old transcription model wrote whole English sentences into the call transcript that nobody had said. I switched to a newer model.

  7. Nur noch NetzbrummenNothing but mains hum

    Neun Tage lang kam kein verständliches Wort an. Eine Aufnahme direkt von der Soundkarte zeigte, dass rund drei Viertel der Energie bei 50, 100 und 200 Hz lagen. Der Mikrofoneingang hing offen. Ein Wackelkontakt im Hörerkabel, provisorisch behoben, die richtige Reparatur steht noch aus.For nine days not one intelligible word got through. A recording straight from the sound card showed about three quarters of the energy at 50, 100 and 200 Hz. The mic input was floating. A loose contact in the handset cord, patched up for now; the proper repair is still to do.

  8. Der Wackelkontakt ist zurückThe loose contact is back

    Das Provisorium vom Oktober hat nicht gehalten. Diesmal habe ich die Stelle gefunden, die Teile für die Reparatur sind bestellt.The October patch did not last. This time I found the spot, and the parts for the repair are on order.

Stand 1. November 2026As of 1 November 2026

Welche Modelle wo laufenWhich models run where

Welches Modell wo läuft, halte ich in einer eigenen Datei im Repository fest, mit dem Wert, der tatsächlich auf dem Gerät eingestellt ist. Eine monatliche Routine vergleicht sie mit dem Code und meldet, wenn ein Anbieter ein Modell abschaltet.I keep a dedicated file in the repository that records which model runs where, including the value actually set on the device. A monthly routine compares it with the code and flags when a provider retires a model.

AufgabeJobAnbieterProviderModellModelDenkenThinking
Das Gespräch am Telefon, alle Figuren und CamilleThe phone conversation, all characters and CamilleOpenAI Realtimegpt-realtime-2.1-mini–
Mitschrift für Protokoll und AuswertungTranscript for logging and reviewOpenAIgpt-transcribe–
Websuche mitten im Gespräch, Antwort in SekundenWeb search mid-call, answer within secondsAnthropicclaude-haiku-5-5ausoff
Gehört ein neues Thema zu einem vorhandenen?Does a new topic belong to an existing one?Anthropicclaude-haiku-5-5ausoff
Rezeptvorschlag, strukturiert für die Haushalts-AppRecipe suggestion, structured for the household appAnthropicclaude-opus-4-7–
Nach dem Auflegen: was sich die Figur merktAfter hang-up: what the character remembersAnthropicclaude-opus-4-7–

Das Modell urteilt, der Code rechnetThe model judges, the code computes

Das Sprachmodell entscheidet, welches Werkzeug passt. Speichern, Zählen und Schalten macht getesteter Python-Code.The language model decides which tool fits. Storing, counting and switching are done by tested Python code.

Werkzeugaufrufe ohne Anruf prüfenChecking tool calls without a call

Ein Prüfskript schickt Sätze als Text an das Realtime-Modell und zählt, ob das richtige Werkzeug mit den richtigen Argumenten kommt. Nach jeder Änderung am Prompt lasse ich es von Hand laufen.A test script sends sentences as text to the Realtime model and counts whether the right tool arrives with the right arguments. I run it by hand after every prompt change.

Tests ohne GeheimnisseTests without secrets

575 Tests laufen bei jedem Pull Request, ohne einen Schlüssel für OpenAI oder Anthropic. Externe Dienste sind darin nachgebildet; Tests gegen die echte API und auf dem Pi laufen nur auf Zuruf.575 tests run on every pull request without an OpenAI or Anthropic key. External services are mocked; tests against the real API and on the Pi only run on request.

Wie das Telefon entstanden istHow the phone came about

Die Idee stammt aus dem Projekt „KI-Telefon“ von Dirk Wahl in der Make, Ausgabe 2/26. Seinen Code habe ich gelesen und dann eine eigene Fassung geschrieben, mit expliziter Zustandsmaschine, Werkzeugen und Tests. Entwickelt habe ich sie im Gespräch mit Claude Code. Ich entscheide, was das Telefon können soll; Claude schreibt den Code, wertet Logs aus und rechnet Messungen nach.The idea comes from Dirk Wahl's “KI-Telefon” project in Make magazine, issue 2/26. I read his code and then wrote my own version, with an explicit state machine, tools and tests. I developed it in conversation with Claude Code. I decide what the phone should do; Claude writes the code, reads logs and checks measurements.

  1. Erster Commit: Entwurf und Plan für das Grundgerüst.First commit: design and plan for the basic framework.
  2. Pi eingerichtet, Hörer, Gabel und Wählscheibe verkabelt, erstes Gespräch.Pi set up, handset, hook switch and dial wired, first conversation.
  3. Die Klingel klingelt.The bell rings.
  4. Camille übernimmt die 3 als Französischkurs.Camille takes over digit 3 as a French course.
  5. Freisprechen über Elektra.Speakerphone via Elektra.
  6. Haushalts-Gedächtnis und Websuche.Household memory and web search.
  7. 212 Commits, rund 9500 Zeilen Python. Seitdem liegt der Code öffentlich auf GitHub.212 commits, about 9,500 lines of Python. Since then the code has been public on GitHub.

Am Mac ersetzt die Tastatur das Telefon: Die Leertaste ist der Gabelschalter, die Ziffern 1 bis 9 sind die Wählscheibe. Gabel, Wählscheibe und Klingel stecken hinter derselben Schnittstelle, ob am Mac oder am Pi.On the Mac the keyboard stands in for the phone: the space bar is the hook switch, the digits 1 to 9 are the dial. Hook switch, dial and bell sit behind the same interface, whether on the Mac or on the Pi.

KITELEFON_PLATFORM=mac uv run kitelefon

Jede Festlegung halte ich mit Datum und Begründung in einem GitHub-Issue fest.I record every decision with date and reason in a GitHub issue.