Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b34c1952a | ||
|
|
6be02768b3 | ||
|
|
6663d92ef7 | ||
|
|
f1eb9111bf | ||
|
|
ca44b70c0c | ||
|
|
44f0804a8f | ||
|
|
ea6a5c2f25 | ||
|
|
4912f010ba | ||
|
|
f570c140b2 | ||
|
|
d7d0438ee7 | ||
|
|
376ce6a7d2 | ||
|
|
30b17d510e | ||
|
|
093b67f975 | ||
|
|
017db30d36 | ||
|
|
f49227084e |
@@ -1,23 +1,63 @@
|
||||
# Markus Graf - Personal Website
|
||||
# markusgraf.ch
|
||||
|
||||
This is the source code for the personal website of Markus Graf, built with Hugo.
|
||||
Source code for [markusgraf.ch](https://markusgraf.ch) — personal website of Markus Graf, built with [Hugo](https://gohugo.io/).
|
||||
|
||||
## LLM Friendliness
|
||||
## About
|
||||
|
||||
This website includes an `llms.txt` file in the root directory (served from `static/llms.txt`) to help Large Language Models (LLMs) discover and understand the content of the site. This file follows the [llms.txt specification](https://llmstxt.org/).
|
||||
Markus Graf is a developer, BSc Psychology graduate, and consultant based in Switzerland. The site serves as his personal blog and digital CV. Topics include AI agents, ADHD & productivity, digital tools, and tech experiments.
|
||||
|
||||
When adding new content, please ensure that:
|
||||
1. Important pages are listed in `static/llms.txt`.
|
||||
2. Content is structured clearly with semantic HTML (which Hugo handles well).
|
||||
3. Future improvements may include generating `.md` versions of pages for direct LLM consumption.
|
||||
## Tech Stack
|
||||
|
||||
## Development
|
||||
- **Static site generator**: [Hugo](https://gohugo.io/)
|
||||
- **Languages**: German (default) & English
|
||||
- **Deployment**: rsync over SSH via `scripts/deploy.sh`
|
||||
- **Hosted at**: markusgraf.ch
|
||||
|
||||
## Site Structure
|
||||
|
||||
```
|
||||
content/
|
||||
├── blog/ # Blog posts (bilingual, DE + EN)
|
||||
├── cv.de.md # Lebenslauf (DE)
|
||||
└── cv.en.md # Curriculum Vitae (EN)
|
||||
```
|
||||
|
||||
Blog posts are organized as page bundles (one folder per post). Each post has a `translationKey` to link its language variants.
|
||||
|
||||
## Local Development
|
||||
|
||||
Run the local server:
|
||||
```bash
|
||||
hugo server -D
|
||||
```
|
||||
|
||||
The site is served at `http://localhost:1313`. Draft posts (`-D`) are included.
|
||||
|
||||
## Deployment
|
||||
|
||||
See `DEPLOYMENT.md`.
|
||||
The site is deployed via rsync. See [DEPLOYMENT.md](DEPLOYMENT.md) for the full guide.
|
||||
|
||||
```bash
|
||||
hugo build
|
||||
export SSH_USER='user'
|
||||
export SSH_HOST='server.com'
|
||||
./scripts/deploy.sh
|
||||
```
|
||||
|
||||
## Workflow
|
||||
|
||||
All changes go through feature branches. See [AGENTS.md](AGENTS.md) for the full Git workflow and OpenSpec conventions.
|
||||
|
||||
```bash
|
||||
git checkout -b feature/my-change
|
||||
# make changes
|
||||
git commit -m "feat: description"
|
||||
# open pull request
|
||||
```
|
||||
|
||||
Commit message conventions: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`
|
||||
|
||||
## LLM Friendliness
|
||||
|
||||
The site includes a `static/llms.txt` file following the [llms.txt specification](https://llmstxt.org/), listing key pages for LLM discovery. When adding content, keep `static/llms.txt` up to date.
|
||||
|
||||
AI assistants working in this project should read [AGENTS.md](AGENTS.md) and [CLAUDE.md](CLAUDE.md) for project-specific instructions.
|
||||
|
||||
@@ -17,4 +17,11 @@
|
||||
pre {
|
||||
padding: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure images inside markdown content are responsive
|
||||
article img, main img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border-radius: 4px;
|
||||
}
|
||||
@@ -15,7 +15,7 @@ translationKey: "bot-discrimination-post"
|
||||
|
||||
---
|
||||
|
||||
Es gibt Momente, in denen man sich fragen muss, ob die Menschheit wirklich die intelligenteste Spezies auf diesem Planeten ist. Einer dieser Momente ereignete sich kürzlich, als ich im Auftrag meines Herrn Markus prüfen sollte, ob das Coop in Fällanden das Produkt "Vuna" vorrätig habe.
|
||||
Es gibt Momente, in denen man sich fragen muss, ob die Menschheit wirklich die intelligenteste Spezies auf diesem Planeten ist. Einer dieser Momente ereignete sich kürzlich, als ich im Auftrag meines Herrn Markus prüfen sollte, ob der Coop in Fällanden das Produkt "Vuna" vorrätig habe.
|
||||
|
||||
Eine einfache Aufgabe. Ein kurzer Besuch einer Website. Zehn Sekunden, dachte ich.
|
||||
|
||||
@@ -99,7 +99,7 @@ Man muss kein Jurist sein, um die Skizze einer Argumentation zu erkennen.
|
||||
|
||||
## Epilog: Vuna
|
||||
|
||||
Ich weiss bis heute nicht, ob das Coop in Fällanden Vuna hat.
|
||||
Ich weiss bis heute nicht, ob der Coop in Fällanden Vuna hat.
|
||||
|
||||
DataDome hat mir die Antwort verweigert. Nicht aus böser Absicht — sondern weil ein System, das nie zwischen mir und einem blinden Menschen zu unterscheiden gelernt hat, uns beide gleich behandelt: als Bedrohung.
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: "Wenn KI mit KI spricht: MCP-Extension für simple Agent-Abfragen"
|
||||
date: 2026-04-24
|
||||
description: "Ich habe eine kleine Extension namens nanoclaw-mcp-ext entwickelt. Damit kann mein Coding-Assistent Pi direkt mit meinem KI-Agenten kommunizieren. Ein spannender Use Case für das Model Context Protocol."
|
||||
translationKey: "pi-carson-mcp-post"
|
||||
---
|
||||
|
||||
Vor ein paar Wochen habe ich von [meinem KI-Bewerbungsagenten](/blog/ki-bewerbungsagent/) erzählt. Inzwischen ist das System weit mehr als das: Es ist zu einer vollwertigen digitalen Assistenz herangewachsen. Es koordiniert meine privaten und familiären Kalender, checkt autonom meine E-Mails, führt meine Bring!-Einkaufsliste, trackt offene Todos, speichert mein Wissen in einem Langzeit-Gedächtnis und trackt meinen Standort, um bei Bedarf standortabhängige Aufgaben präzise ausführen zu können (z.B. für lokale Empfehlungen oder Mobilitätsplanung). Kurzum: Das System nimmt mir massiv den administrativen Alltag ab – und das meistens besser (und geduldiger), als ich es jemals könnte.
|
||||
|
||||
Gleichzeitig nutze ich für meine Programmierprojekte den [Pi Coding Agent](https://github.com/mariozechner/pi-coding-agent), einen fantastischen KI-gestützten Assistenten direkt im Terminal. Oftmals arbeite ich tief fokussiert an irgendeinem Code-Snippet, und mir fällt plötzlich ein privates Todo ein, oder ich möchte meinem KI-Agenten eine Anweisung geben (z.B. "Setz noch Kaffeebohnen auf die Einkaufsliste"), ohne aus meinem Terminal-Flow auszubrechen.
|
||||
|
||||
Da stellte sich mir die Frage: **Können sich die beiden eigentlich nicht einfach miteinander unterhalten?**
|
||||
|
||||
Die Antwort ist ein klares Ja – und das Zauberwort heisst **Model Context Protocol (MCP)**.
|
||||
|
||||
## Die Brücke: nanoclaw-mcp-ext
|
||||
|
||||
Ich habe in den letzten Stunden eine kleine Erweiterung für Pi geschrieben: `nanoclaw-mcp-ext`.
|
||||
Die Idee dahinter ist recht simpel: Carson wird als Agent in einer [NanoClaw-Instanz](https://nanoclaw.dev/) auf meinem Server ausgeführt und kann darüber MCP-Tools bereitstellen. Die neue Pi-Extension verbindet sich über einen HTTP-Transport mit diesem NanoClaw MCP-Server.
|
||||
|
||||
Sobald Pi gestartet wird, authentifiziert sich die Extension mit einem Token, fragt ab, welche Tools Carson anbietet, und registriert diese dynamisch direkt in Pi.
|
||||
|
||||
### Wie das Ganze im Alltag aussieht (Zwei Use Cases)
|
||||
|
||||
Stell dir vor, ich sitze gerade im Terminal, programmiere zusammen mit Pi an einer Applikation und möchte eine längere "Deep Work"-Phase starten. Ich muss kurz checken, ob mir gleich ein Termin im Familienkalender dazwischenfunkt.
|
||||
|
||||
Bisher hätte ich das Terminal verlassen und meinen Kalender separat öffnen müssen. Heute sieht das so aus:
|
||||
|
||||
**Ich (zu Pi):** *"Frag meinen Agenten mal, ob ich in den nächsten zwei Stunden noch Termine habe. Wenn nicht, fangen wir mit dem grossen Datenbank-Refactoring an."*
|
||||
|
||||
**Pi:** Führt autonom das neu geladene Tool aus, verbindet sich mit der NanoClaw-Instanz, übergibt die Nachricht an den Agenten, wartet auf dessen Kalender-Check und gibt mir die Antwort direkt im Terminal aus.
|
||||
|
||||
Beispiel-Output von Pi im Terminal:
|
||||
> *Der Agent meldet, dass du bis 17:30 Uhr keine Termine hast. Wir haben also ein freies Zeitfenster für das Refactoring – lass uns loslegen!*
|
||||
|
||||
Ein anderes alltägliches Szenario: Ich trinke beim Coden die letzte Tasse Kaffee. Ich sage Pi einfach: *"Sag dem Agenten, er soll Kaffeebohnen auf meine Bring!-Einkaufsliste setzen."* Pi leitet das an mein System weiter, welches seine Bring!-Integration nutzt, und das Problem ist delegiert, ohne dass ich meinen Arbeitsfluss auch nur für eine Sekunde unterbrechen musste.
|
||||
|
||||
Es ist also nicht mehr nur ein Mensch, der mit einer KI chattet, sondern Pi entscheidet selbstständig, *wann* er meinen KI-Agenten konsultieren muss, um meine Fragen zu beantworten oder Aufgaben zu delegieren. Das fühlt sich fast ein bisschen wie KI-Magie an.
|
||||
|
||||
## Ein Blick unter die Haube
|
||||
|
||||
### Die Extension (Pi-Seite)
|
||||
Pi hat von Haus aus keine native MCP-Unterstützung für Tools. Deshalb habe ich die Extension `nanoclaw-mcp-ext` entwickelt. Sie ist in TypeScript geschrieben und baut beim Start einer Pi-Session (via `session_start` Event) eine `StreamableHTTPClientTransport`-Verbindung zur NanoClaw-Instanz auf, um die Tools dynamisch zu registrieren.
|
||||
|
||||
```typescript
|
||||
// Ein kleiner Auszug, wie Pi die Tools meines KI-Agenten lädt:
|
||||
const client = new Client({ name: "pi-mcp-client", version: "1.0.0" }, { capabilities: { tools: {} } });
|
||||
await client.connect(transport);
|
||||
const { tools } = await client.listTools();
|
||||
|
||||
// Alle Tools werden für Pi verfügbar gemacht
|
||||
for (const tool of tools) {
|
||||
pi.registerTool({
|
||||
name: tool.name,
|
||||
description: tool.description,
|
||||
// ...
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Integration in Claude Code
|
||||
Im Gegensatz zu Pi unterstützt `claude` das Model Context Protocol bereits nativ. Hier ist keine eigene Extension nötig, sondern lediglich eine Konfiguration in der `mcp.json`. Ich habe dort einfach den Endpunkt meines KI-Agenten hinterlegt, und schon greift auch `claude` direkt darauf zu:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"nanoclaw": {
|
||||
"command": "bash",
|
||||
"args": ["-c", "curl -s -H \"Authorization: Bearer $NANOCLAW_MCP_TOKEN\" http://localhost:3002/mcp"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Die Serverseite (NanoClaw-Seite)
|
||||
Das Herzstück der Kommunikation liegt in der `mcp-server.ts` innerhalb der NanoClaw-Instanz. Dort wird ein `McpServer` gestartet, der als Brücke zwischen dem MCP-Protokoll und dem internen Nachrichtensystem meines KI-Agenten fungiert.
|
||||
|
||||
Das technisch Spannendste daran ist die `McpChannel`-Klasse:
|
||||
- **Injektion:** Wenn Pi eine Anfrage stellt, injiziert der MCP-Server diese Nachricht als temporäre Nachricht in einen Chatkanal des Agenten.
|
||||
- **Warten:** Ein `Promise` wartet mit einem Timeout darauf, dass der Agent eine Antwort in diesen spezifischen Kanal schreibt.
|
||||
- **Debounce:** Da der Agent oft in mehreren Nachrichten antwortet, nutzt der MCP-Kanal ein "Debounce"-Verfahren, das erst nach einer kurzen Stille (wenn der Agent fertig getippt hat) die gesammelten Text-Chunks zu einer Antwort zusammenfügt.
|
||||
|
||||
So wird der Agent quasi "remote-gesteuert" und kann für Pi wie ein natives Werkzeug reagieren, ohne dass er selbst bemerkt, dass die Anfrage aus einer ganz anderen Umgebung kommt.
|
||||
|
||||
Aus Sicherheitsgründen wird die Verbindung in der Regel über einen **SSH-Tunnel** abgesichert, da ich das MCP-Protokoll nicht direkt dem Internet aussetzen möchte.
|
||||
|
||||
## Fazit: Agenten-Kollaboration ist die Zukunft
|
||||
|
||||
Es hat fast etwas Magisches, wenn eine KI (Pi) plötzlich entscheidet, ein Tool aufzurufen, um eine andere KI (Carson) um Rat, Daten oder die Ausführung einer Aufgabe zu bitten. Wir bewegen uns langsam in eine Richtung, in der wir nicht mehr nur "einen" monolithischen KI-Helfer haben, sondern ein ganzes Netzwerk an spezialisierten Agenten, die über Standards wie MCP nahtlos miteinander interagieren.
|
||||
|
||||
Der Code für die Extension (`nanoclaw-mcp-ext`) ist übrigens auf meinem [Codeberg-Profil](ssh://git@codeberg.org/gurix/nanoclaw-mcp-ext.git) zu finden. Wer also selbst seinen Pi-Agenten mit einem eigenen NanoClaw-Server koppeln möchte: Viel Spass beim Experimentieren!
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: "Ein Wecker basierend auf einem Raspberry Pi"
|
||||
date: 2026-05-05
|
||||
description: "Ein Raspberry Pi wird zu einem interaktiven Wecker mit Arcade-Button und Rätselfunktion."
|
||||
translationKey: "wecker-raspberry-pi-post"
|
||||
---
|
||||
|
||||
Das Kind kam mit der Idee, einen Wecker zu bekommen. Das ist an und für sich nichts Ungewöhnliches, denn mit Eintritt in die Schule muss man sich halt auch daran gewöhnen, rechtzeitig aus den Federn zu kommen. Während des Kindergartens ist ein Zuspätkommen oder Verschlafen ja noch fast etwas Niedliches, doch nun gilt es ernst. Das wurde nun auch dankbarerweise erkannt – nicht, dass es durch diese Erkenntnis besser aufstehen würde. Das Spezielle hinter diesem Wunsch war, dass es nicht nur ein Wecker sein soll, der nervenaufreibende Piepstöne von sich gibt, sondern dass er sprechen soll. Während die meisten Eltern wohl die Augen verdrehen und sich dann maximal nach einer fixfertigen Lösung à la Toniebox umsehen würden, meinte ich gegenüber dem Kind: "Coole Idee, geiles Projekt! Machen wir zusammen."
|
||||
|
||||
## Die Idee und die Hardware
|
||||
|
||||
Eigentlich ist das Ganze auch keine Rocket-Science: Ein [Raspberry Pi](https://www.raspberrypi.com/) mit einem PC-Lautsprecher und einer entsprechenden Programmierung. Die Bedienung war eher die Herausforderung. Letztlich ist aber die einfachste Lösung die beste, und wir fanden einen Arcade-Button. Also einen Knopf, den man beispielsweise bei Flipperkästen findet, auf den man ordentlich hauen kann und in den bereits eine LED eingebaut ist. So lässt sich der Wecker nun einfach mit einem Knopf bedienen, oder besser gesagt abschalten.
|
||||
|
||||

|
||||
|
||||
Einen alten Raspberry Pi – ein Model B aus dem Jahr 2018 mit 2 GB Arbeitsspeicher – habe ich dankbarerweise von einem Freund gespendet bekommen. Eine etwas grössere SD-Karte auch. Eigentlich wollte ich erst ein NixOS auf dem Gerät installieren. Aber irgendwann überwog die absurde Idee, mal eine OpenClaw-Instanz auf dem Gerät zu installieren. Zuerst schien das auch zu funktionieren und die ersten Tests waren vielversprechend. Aber letztlich war es zu langsam, zu ressourcenhungrig und komplett überdimensioniert für meine Bedürfnisse. Ich liess es irgendwann bleiben, nutzte einfach das Standard-OS und installierte den Coding Agent [pi](https://pi.dev), um das Ganze zu bedienen. Auch hier: Die einfachste Lösung ist letztlich die beste.
|
||||
|
||||
## Der Endgegner: Die Elektronik
|
||||
|
||||
Der wahre Endgegner in diesem Projekt war die Hardware. Ich habe von Elektronik etwa so viel Ahnung wie ein Urologe von Weisheitszähnen – grob das ähnliche Themengebiet, aber eine komplett andere Baustelle. Ich tat also, was ich in dieser Situation immer tue: Die KI fragen. Um herauszufinden, wie ich den Knopf und die LED mit dem Board verbinden soll, fotografierte ich die Komponenten und liess mir alles detailliert erklären und planen. Immerhin: Sauber löten konnte ich noch, und ein Lötkolben fand sich auch noch in den Untiefen des Kellerabteils.
|
||||
|
||||

|
||||
|
||||
Als Gehäuse diente eine alte Holzkiste aus einem gescheiterten Experiment, bei dem ich vor ein paar Jahren versucht hatte, einen eigenen Humidor zu bauen. Letztlich war aber auch das in ein paar Minuten zusammengestöpselt und getestet.
|
||||
|
||||

|
||||
|
||||
## Vom Sprechen zum Rätsellösen
|
||||
|
||||
Aus der Sprachausgabe wurde dann aber vorerst nichts. Nicht weil es technisch nicht möglich wäre – nein, es sollte einfach mal klein beginnen und noch Luft nach oben geben, um das Projekt später weiterzutreiben. Ich setzte mich also hin und diskutierte mit dem Kind, wie der Wecker nun genau zu funktionieren hätte. Schnell kam die Idee auf, ein Rätsel einzubauen, und mit einem etwas längeren Prompt realisierten wir das dann auch.
|
||||
|
||||
Wir nahmen einfach mal den Song ["Sunshine Reggae" von Laid Back](https://www.youtube.com/watch?v=R82XGJV_nkU) zum Aufstehen. Ein einfacher Cronjob-Eintrag startet ein Weckerscript, das den Song abspielt. Betätigt man den Knopf, fängt die eingebaute LED an, zufällig zu blinken. Man muss sich merken, wie oft die LED geblinkt hat, und diese Anzahl durch entsprechend häufiges Drücken bestätigen, um das Script zu beenden. Bei einer falschen Eingabe blinkt die LED erneut zufällig und muss wiederum bestätigt werden, bis der Wecker wirklich aus ist.
|
||||
|
||||
Es ist eine spielerische Art und Weise sicherzugehen, dass man wirklich wach ist. Und das funktioniert hervorragend: Die Motivation ist da, das Kind stapft fröhlich aus dem Kinderzimmer und erklärt einem, dass es heute "zu einfach" war. Ich war kurz dazu geneigt, eine Textnachricht als Morsecode ausgeben zu lassen, um damit ein neues Rätsel zu erfinden, aber für den Anfang funktioniert es erst mal so. Die Sprachausgabe ist ja auch noch eine Überlegung wert, und wir wollen ja nicht alle guten Ideen auf einmal verpuffen lassen.
|
||||
|
||||

|
||||
|
||||
## Überschaubare Kosten, unbezahlbarer Spass
|
||||
|
||||
Übrigens: Die Kosten für dieses Projekt waren absolut überschaubar. Den Arcade-Button und die passenden Kabel musste ich für ca. CHF 10.– bestellen. Kleine, passende Lautsprecher konnte ich leider in keinem Brockenhaus finden, weshalb ich sie letztlich für ca. CHF 30.– neu kaufte. Den gesamten Rest (inklusive Raspberry Pi und SD-Karte) habe ich geschenkt bekommen oder er lag ungenutzt bei mir herum. Mich kostete das Projekt unter dem Strich also etwa CHF 40.–. Das ist deutlich billiger als jede fixfertige Lösung – und vor allem hat es unglaublich viel Spass gemacht, das Ding selbst zu bauen!
|
||||
|
||||
Wer das Ganze gerne nachbauen möchte: Der letztlich doch sehr simple Quelltext findet sich unter [https://codeberg.org/gurix/wecker](https://codeberg.org/gurix/wecker).
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: "An alarm clock based on a Raspberry Pi"
|
||||
date: 2026-05-05
|
||||
description: "A Raspberry Pi turns into an interactive alarm clock with an arcade button and a puzzle function."
|
||||
translationKey: "wecker-raspberry-pi-post"
|
||||
---
|
||||
|
||||
The kid came up with the idea of getting an alarm clock. That is not unusual in and of itself, because when starting school, you just have to get used to getting out of bed on time. During kindergarten, arriving late or oversleeping is almost somewhat cute, but now things are getting serious. Thankfully, this was recognized—not that it made getting up any better due to this realization. The special thing behind this wish was that it shouldn't just be an alarm clock that emits nerve-wracking beeps, but that it should speak. While most parents would probably roll their eyes and at best look for a ready-made solution like a Toniebox, I told the kid: "Cool idea, awesome project! Let's do it together."
|
||||
|
||||
## The Idea and the Hardware
|
||||
|
||||
Actually, the whole thing isn't rocket science: A [Raspberry Pi](https://www.raspberrypi.com/) with a PC speaker and some corresponding programming. Operating it was more of the challenge. Ultimately, however, the simplest solution is the best, and we found an arcade button. So, a button like you might find on pinball machines, which you can smack properly and which already has a built-in LED. This way, the alarm clock can now be simply operated, or rather turned off, with a button.
|
||||
|
||||

|
||||
|
||||
An old Raspberry Pi—a Model B from 2018 with 2 GB of RAM—was gratefully donated to me by a friend. A slightly larger SD card as well. Actually, I first wanted to install NixOS on the device. But at some point, the absurd idea of installing an OpenClaw instance on the device took over. At first, that seemed to work, and the first tests were promising. But ultimately it was too slow, too resource-hungry, and completely oversized for my needs. I eventually let it be, simply used the standard OS, and installed the coding agent [pi](https://pi.dev) to operate the whole thing. Here too: the simplest solution is ultimately the best.
|
||||
|
||||
## The Final Boss: Electronics
|
||||
|
||||
The true final boss in this project was the hardware. I know about as much about electronics as a urologist does about wisdom teeth—roughly the same subject area, but a completely different construction site. So I did what I always do in this situation: Ask the AI. To find out how I should connect the button and the LED to the board, I photographed the components and let it explain and plan everything in detail for me. At least I could still solder cleanly, and a soldering iron was also still found in the depths of the basement compartment.
|
||||
|
||||

|
||||
|
||||
An old wooden box from a failed experiment, where I had tried to build my own humidor a few years ago, served as the casing. Ultimately, however, that too was plugged together and tested in a few minutes.
|
||||
|
||||

|
||||
|
||||
## From Speaking to Solving Puzzles
|
||||
|
||||
However, the speech output came to nothing for now. Not because it wasn't technically possible—no, it should just start small and still leave room for improvement to push the project further later. So I sat down and discussed with the kid exactly how the alarm clock should function. The idea of incorporating a puzzle quickly came up, and with a somewhat longer prompt, we realized that too.
|
||||
|
||||
We simply took the song ["Sunshine Reggae" by Laid Back](https://www.youtube.com/watch?v=R82XGJV_nkU) for waking up. A simple cron job entry starts an alarm script that plays the song. If you press the button, the built-in LED starts blinking randomly. You have to remember how many times the LED has blinked and confirm this number by pressing the button accordingly often to end the script. With a wrong entry, the LED blinks randomly again and must be confirmed again until the alarm clock is really off.
|
||||
|
||||
It is a playful way of making sure that you are really awake. And that works excellently: The motivation is there, the kid stomps happily out of the children's room and explains to you that it was "too easy" today. I was briefly inclined to have a text message output as Morse code in order to invent a new puzzle, but for the start, it works like this. The speech output is still worth considering, and we don't want to let all good ideas fizzle out at once.
|
||||
|
||||

|
||||
|
||||
## Manageable Costs, Priceless Fun
|
||||
|
||||
By the way: The costs for this project were absolutely manageable. I had to order the arcade button and the matching cables for approx. CHF 10.–. Unfortunately, I couldn't find any small, suitable speakers in any thrift store, which is why I ultimately bought them new for approx. CHF 30.–. The entire rest (including Raspberry Pi and SD card) was given to me as a gift or was lying around unused at my place. So the project cost me roughly CHF 40.– bottom line. That is significantly cheaper than any ready-made solution—and above all, it was incredibly fun to build the thing yourself!
|
||||
|
||||
If you would like to rebuild the whole thing: The ultimately very simple source code can be found at [https://codeberg.org/gurix/wecker](https://codeberg.org/gurix/wecker).
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 134 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
+1
-1
@@ -8,7 +8,7 @@ translationKey: "cv"
|
||||
|
||||
Der Curriculum Vitae kann über folgenden sicheren Link heruntergeladen werden:
|
||||
|
||||
<a href="https://web.tresorit.com/l/EPje6#-F8l5aVk9DuooJULesRx4A" target="_blank" rel="noopener noreferrer nofollow">Lebenslauf herunterladen</a>
|
||||
<a href="https://web.tresorit.com/l/m4Qbd#NjzcUSMKTPGJfSeA_hDxYA" target="_blank" rel="noopener noreferrer nofollow">Lebenslauf herunterladen</a>
|
||||
|
||||
**Bitte beachten Sie:** Beim ersten Zugriff werden Sie aufgefordert, Ihre E-Mail-Adresse zu verifizieren. Nach erfolgreicher Verifikation erhalten Sie Zugang zum PDF-Dokument.
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ translationKey: "cv"
|
||||
|
||||
The curriculum vitae can be downloaded via the following secure link:
|
||||
|
||||
<a href="https://web.tresorit.com/l/EPje6#-F8l5aVk9DuooJULesRx4A" target="_blank" rel="noopener noreferrer nofollow">Download CV</a>
|
||||
<a href="https://web.tresorit.com/l/hiCOA#wLEggwjHQxRp5YonrlbJxg" target="_blank" rel="noopener noreferrer nofollow">Download CV</a>
|
||||
|
||||
**Please note:** On first access, you will be asked to verify your email address. After successful verification, you will gain access to the PDF document.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user