<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title>Simeon&#x27;s Blog</title>
        <link>https://simeon.staneks.de</link>
        <description>lieber unperfekt starten als perfekt warten</description>
        <image>
            <url>https:&#x2F;&#x2F;simeon.staneks.de&#x2F;android-chrome-512x512.png</url>
            <title>Simeon&#x27;s Blog</title>
            <link>https:&#x2F;&#x2F;simeon.staneks.de</link>
        </image>
        <generator>Zola</generator>
        <author>Simeon Stanek</author>
        <language>de</language>
        <link href="https://simeon.staneks.de/rss.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Sun, 29 Mar 2026 12:00:00 +0100</lastBuildDate>
        <item>
            <title>Ich spreche, Obsidian schreibt – Sprachmemos via Telegram, Whisper &amp; n8n</title>
            <pubDate>Sun, 29 Mar 2026 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/stt-telegram-n8n-nextcloud-obsidian/</link>
            <guid>https://simeon.staneks.de/posts/stt-telegram-n8n-nextcloud-obsidian/</guid>
            <description xml:base="https://simeon.staneks.de/posts/stt-telegram-n8n-nextcloud-obsidian/">&lt;p&gt;Ich stehe auf dem Spielplatz. Zwei Kinder klettern auf dem Klettergerüst herum, eine Kindergartenmutter, ein Kindergartenvater und ich reden über Kings of Convenience. Über &lt;em&gt;The Weight of my Words&lt;&#x2F;em&gt;. Über das Album &lt;em&gt;Versus&lt;&#x2F;em&gt;. Über die Zeit, als Musik noch wehtat, weil man jung und etwas unfertig war.&lt;&#x2F;p&gt;
&lt;p&gt;Und dann ist der Moment weg. Die Kinder rufen. Man geht nach Hause. Und diese kleine, kostbare Erinnerung bleibt irgendwo auf der Strecke zwischen Spielplatz und Kühlschrank.&lt;&#x2F;p&gt;
&lt;p&gt;Nicht mehr. Weil ich jetzt einfach mein Handy raushole, Telegram öffne, auf Aufnahme drücke – und alles von alleine weiterläuft.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-problem-gedanken-verdampfen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-problem-gedanken-verdampfen&quot; aria-label=&quot;Anchor link for: das-problem-gedanken-verdampfen&quot;&gt;Das Problem: Gedanken verdampfen&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ich habe schon lange mit Obsidian als zweites Gehirn gearbeitet. Das Problem: Ein zweites Gehirn nützt nichts, wenn man zu faul ist, es zu füttern. Tippen am Spielplatz? Nein danke. Eine Notiz-App öffnen, eintippen, Markdown formatieren? Auch nein. Ich bin ein Mensch, der &lt;em&gt;spricht&lt;&#x2F;em&gt;. Also musste die Lösung auch mit Sprache funktionieren.&lt;&#x2F;p&gt;
&lt;p&gt;Die Idee war simpel: Ich schicke eine Sprachnachricht an einen Telegram-Bot. Der Rest passiert automatisch. Das Ergebnis landet als fertige &lt;code&gt;.md&lt;&#x2F;code&gt;-Datei in meinem Obsidian Vault – dank Nextcloud-Sync. Magic.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;die-zutaten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-zutaten&quot; aria-label=&quot;Anchor link for: die-zutaten&quot;&gt;Die Zutaten&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Bevor ich in die Details gehe, kurz der Überblick was ich hier eigentlich zusammengebaut habe:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Telegram Bot&lt;&#x2F;strong&gt; – mein mobiles Mikrofon&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;n8n&lt;&#x2F;strong&gt; – der Kleber, der alles zusammenhält (selbst gehostet, natürlich)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;faster-whisper-server&lt;&#x2F;strong&gt; – ein lokaler KI-Transkriptions-Dienst, der Deutsch kann und keine Cloud braucht&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nextcloud&lt;&#x2F;strong&gt; – mein selbst gehosteter Cloudspeicher, der mit Obsidian synchronisiert&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Obsidian&lt;&#x2F;strong&gt; – das Endlager für alle meine Gedanken&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Kein Abo. Keine Cloud. Keine Datenschutzbedenken. Alles läuft zuhause.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;schritt-1-whisper-lokal-betreiben&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#schritt-1-whisper-lokal-betreiben&quot; aria-label=&quot;Anchor link for: schritt-1-whisper-lokal-betreiben&quot;&gt;Schritt 1: Whisper lokal betreiben&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der erste Baustein ist ein lokaler Whisper-Server. Ich nutze dafür das Docker-Image &lt;code&gt;fedirz&#x2F;faster-whisper-server&lt;&#x2F;code&gt; – eine schnelle, OpenAI-API-kompatible Implementierung, die auf normaler CPU läuft.&lt;&#x2F;p&gt;
&lt;p&gt;Mein &lt;code&gt;docker-compose.yml&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;┌─────────────────────────────────────────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│                     docker-compose.yml                          │
&lt;&#x2F;span&gt;&lt;span&gt;├─────────────────────────────────────────────────────────────────┤
&lt;&#x2F;span&gt;&lt;span&gt;│  services:                                                      │
&lt;&#x2F;span&gt;&lt;span&gt;│    whisper-api:                                                 │
&lt;&#x2F;span&gt;&lt;span&gt;│      image: fedirz&#x2F;faster-whisper-server:latest-cpu            │
&lt;&#x2F;span&gt;&lt;span&gt;│      container_name: whisper-api                               │
&lt;&#x2F;span&gt;&lt;span&gt;│      environment:                                               │
&lt;&#x2F;span&gt;&lt;span&gt;│        - WHISPER__MODEL=Systran&#x2F;faster-whisper-small           │
&lt;&#x2F;span&gt;&lt;span&gt;│      volumes:                                                   │
&lt;&#x2F;span&gt;&lt;span&gt;│        - whisper_cache:&#x2F;root&#x2F;.cache&#x2F;huggingface                │
&lt;&#x2F;span&gt;&lt;span&gt;│      ports:                                                     │
&lt;&#x2F;span&gt;&lt;span&gt;│        - &amp;quot;5092:8000&amp;quot;                                           │
&lt;&#x2F;span&gt;&lt;span&gt;│      networks:                                                  │
&lt;&#x2F;span&gt;&lt;span&gt;│        - home_default                                           │
&lt;&#x2F;span&gt;&lt;span&gt;│      restart: unless-stopped                                    │
&lt;&#x2F;span&gt;&lt;span&gt;│                                                                 │
&lt;&#x2F;span&gt;&lt;span&gt;│  volumes:                                                       │
&lt;&#x2F;span&gt;&lt;span&gt;│    whisper_cache:                                               │
&lt;&#x2F;span&gt;&lt;span&gt;│                                                                 │
&lt;&#x2F;span&gt;&lt;span&gt;│  networks:                                                      │
&lt;&#x2F;span&gt;&lt;span&gt;│    home_default:                                                │
&lt;&#x2F;span&gt;&lt;span&gt;│      external: true                                             │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────────────────────────────────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Das Model &lt;code&gt;faster-whisper-small&lt;&#x2F;code&gt; ist der Sweet Spot: klein genug für ältere Hardware, gut genug für Sprache auf Deutsch. Beim ersten Start lädt Docker das Hugging-Face-Modell herunter und cached es im Volume – danach ist alles offline.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; docker compose up&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -d
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;[+]&lt;&#x2F;span&gt;&lt;span&gt; Running 2&#x2F;2
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;✔&lt;&#x2F;span&gt;&lt;span&gt; Volume &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;whisper_cache&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; created
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;✔&lt;&#x2F;span&gt;&lt;span&gt; Container whisper-api started
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; curl http:&#x2F;&#x2F;localhost:5092&#x2F;v1&#x2F;models
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;data&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;id&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Systran&#x2F;faster-whisper-small&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;object&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;model&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Der Server ist jetzt erreichbar unter &lt;code&gt;http:&#x2F;&#x2F;192.168.178.118:5092&lt;&#x2F;code&gt; und versteht die OpenAI-kompatible API. Heißt: alles, was mit &lt;code&gt;whisper-1&lt;&#x2F;code&gt; umgehen kann, kann auch meinen lokalen Server ansprechen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;schritt-2-der-n8n-workflow&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#schritt-2-der-n8n-workflow&quot; aria-label=&quot;Anchor link for: schritt-2-der-n8n-workflow&quot;&gt;Schritt 2: Der n8n-Workflow&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Jetzt kommt n8n ins Spiel – mein selbst gehostetes Automatisierungsgehirn. Der Workflow hat genau sechs Schritte, und sieht so aus:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;┌─────────────────────────────────────────────────────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│                         n8n Workflow: Telegram → Memo                       │
&lt;&#x2F;span&gt;&lt;span&gt;├──────────────────┐                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;│  Telegram        │  Sprachnachricht kommt rein (voice message)             │
&lt;&#x2F;span&gt;&lt;span&gt;│  Trigger  ───────┼──────────────────────────────────────────────────────►  │
&lt;&#x2F;span&gt;&lt;span&gt;│  (Bot: Memo)     │                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;         │                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;         ▼                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;┌──────────────────┐                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;│  Get a file      │  Telegram-API: Audiodatei (.ogg) herunterladen          │
&lt;&#x2F;span&gt;&lt;span&gt;│  (Telegram)      │  → fileId aus message.voice.file_id                     │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;         │                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;         ▼                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;┌──────────────────┐                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;│  HTTP Request    │  POST → http:&#x2F;&#x2F;192.168.178.118:5092&#x2F;v1&#x2F;audio&#x2F;           │
&lt;&#x2F;span&gt;&lt;span&gt;│  (Whisper API)   │         transcriptions                                  │
&lt;&#x2F;span&gt;&lt;span&gt;│                  │  Body: multipart&#x2F;form-data                              │
&lt;&#x2F;span&gt;&lt;span&gt;│                  │    model=whisper-1                                       │
&lt;&#x2F;span&gt;&lt;span&gt;│                  │    file=&amp;lt;audio binary&amp;gt;                                   │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;         │                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;         ▼                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;┌──────────────────┐                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;│  Code in JS      │  Hashtags aus dem transkribierten Text entfernen        │
&lt;&#x2F;span&gt;&lt;span&gt;│                  │  text.replaceAll(&amp;quot;Hashtag &amp;quot;, &amp;quot;#&amp;quot;)                         │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;         │                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;         ▼                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;┌──────────────────┐  ┌──────────────────────────────────────────────────┐  │
&lt;&#x2F;span&gt;&lt;span&gt;│  Upload .md      │  │  Upload .ogg                                      │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  (Nextcloud)     │  │  (Nextcloud)                                      │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  Notizen&#x2F;Memos&#x2F;  │  │  Notizen&#x2F;Memos&#x2F;                                   │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  YYYY-MM-DD      │  │  YYYY-MM-DD_&amp;lt;updateId&amp;gt;.ogg                        │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  HH-mm-ss.md     │  └──────────────────────────────────────────────────┘  │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;         │                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;         ▼                                                                    │
&lt;&#x2F;span&gt;&lt;span&gt;┌──────────────────┐                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;│  Send a text     │  Transkription zurück an Telegram senden                │
&lt;&#x2F;span&gt;&lt;span&gt;│  message         │  → Bestätigung, dass alles geklappt hat                │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────┘                                                          │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────────────────────────────────────────────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;stt-telegram-n8n-nextcloud-obsidian&#x2F;images&#x2F;Bildschirmfoto%202026-03-29%20um%2012.45.04.png&quot; alt=&quot;Screenshot von n8n&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-1-telegram-trigger&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-1-telegram-trigger&quot; aria-label=&quot;Anchor link for: node-1-telegram-trigger&quot;&gt;Node 1: Telegram Trigger&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Ein einfacher Webhook-Trigger, der auf eingehende Nachrichten des Bots „Memo&quot; wartet. Sobald eine Sprachnachricht ankommt, feuert der Workflow.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-2-get-a-file&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-2-get-a-file&quot; aria-label=&quot;Anchor link for: node-2-get-a-file&quot;&gt;Node 2: Get a file&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Telegram gibt uns nur die &lt;code&gt;file_id&lt;&#x2F;code&gt; der Sprachdatei. Mit diesem Node holen wir uns die eigentliche &lt;code&gt;.ogg&lt;&#x2F;code&gt;-Datei via Telegram-API herunter. Der Ausdruck &lt;code&gt;$json.message.voice.file_id&lt;&#x2F;code&gt; liefert den richtigen Wert.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-3-http-request-whisper&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-3-http-request-whisper&quot; aria-label=&quot;Anchor link for: node-3-http-request-whisper&quot;&gt;Node 3: HTTP Request → Whisper&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das ist das Herzstück. Wir schicken einen &lt;code&gt;POST&lt;&#x2F;code&gt;-Request an unseren lokalen Whisper-Server:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;POST http:&#x2F;&#x2F;192.168.178.118:5092&#x2F;v1&#x2F;audio&#x2F;transcriptions
&lt;&#x2F;span&gt;&lt;span&gt;Content-Type: multipart&#x2F;form-data
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;model=whisper-1
&lt;&#x2F;span&gt;&lt;span&gt;file=&amp;lt;binary audio data&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Zurück kommt JSON mit dem transkribierten Text. Auf Deutsch, offline, auf meinem eigenen Server.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-4-code-in-javascript&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-4-code-in-javascript&quot; aria-label=&quot;Anchor link for: node-4-code-in-javascript&quot;&gt;Node 4: Code in JavaScript&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Whisper transkribiert manchmal das Wort „Hashtag&quot; wörtlich, wenn ich aufzähle. Ein schneller Einzeiler bereinigt das:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span&gt;item &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;of &lt;&#x2F;span&gt;&lt;span&gt;$input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;replaceAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Hashtag &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;#&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;$input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Super gut, weil ich dann auch nach den inline Tags in Obsidian suchen kann, ohne manuell nachzubessern.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-5-6-upload-zu-nextcloud&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-5-6-upload-zu-nextcloud&quot; aria-label=&quot;Anchor link for: node-5-6-upload-zu-nextcloud&quot;&gt;Node 5 &amp;amp; 6: Upload zu Nextcloud&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Zwei parallele Uploads gehen raus:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Die &lt;strong&gt;Markdown-Datei&lt;&#x2F;strong&gt; – Pfad: &lt;code&gt;Notizen&#x2F;Memos&#x2F;YYYY-MM-DD HH-mm-ss.md&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Die &lt;strong&gt;Originalaudio-Datei&lt;&#x2F;strong&gt; – Pfad: &lt;code&gt;Notizen&#x2F;Memos&#x2F;YYYY-MM-DD_&amp;lt;updateId&amp;gt;.ogg&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Der Dateiinhalt der &lt;code&gt;.md&lt;&#x2F;code&gt;-Datei sieht so aus:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;markdown&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-markdown &quot;&gt;&lt;code class=&quot;language-markdown&quot; data-lang=&quot;markdown&quot;&gt;&lt;span&gt;Memo vom 29.03.2026
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Letztens habe ich mich auf dem Spielplatz mit einer Kindergartenmutter
&lt;&#x2F;span&gt;&lt;span&gt;und einem Kindergartenvater unterhalten. Da ging es um unsere alte Musik,
&lt;&#x2F;span&gt;&lt;span&gt;die Musik, die wir früher gehört haben...
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#61676c10;font-weight:bold;color:#abb0b6;&quot;&gt;---
&lt;&#x2F;span&gt;&lt;span&gt;![[2026-03-29 617268880.ogg]]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;stt-telegram-n8n-nextcloud-obsidian&#x2F;images&#x2F;Bildschirmfoto%202026-03-29%20um%2012.41.11.png&quot; alt=&quot;Screenshot von Obsidian&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Der Timestamp kommt aus &lt;code&gt;now.toUTC().format(&#x27;dd.MM.yyyy&#x27;)&lt;&#x2F;code&gt; direkt in n8n – kein manuelles Datum mehr.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-7-bestatigung-zuruck-an-telegram&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#node-7-bestatigung-zuruck-an-telegram&quot; aria-label=&quot;Anchor link for: node-7-bestatigung-zuruck-an-telegram&quot;&gt;Node 7: Bestätigung zurück an Telegram&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Als letzten Schritt schickt der Workflow den transkribierten Text zurück an meinen Telegram-Chat. So sehe ich sofort: Hat Whisper mich richtig verstanden? Oder hat es aus „Kings of Convenience&quot; irgendwas wie „Königs von Konvenienz&quot; gemacht? (Hat es nicht. Ich bin beeindruckt.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;schritt-3-nextcloud-obsidian&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#schritt-3-nextcloud-obsidian&quot; aria-label=&quot;Anchor link for: schritt-3-nextcloud-obsidian&quot;&gt;Schritt 3: Nextcloud ↔ Obsidian&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Schöne an diesem Setup: Nextcloud und Obsidian kennen sich schon. Ich habe den Ordner &lt;code&gt;Notizen&#x2F;Memos&#x2F;&lt;&#x2F;code&gt; in meinem Nextcloud als synchronisierten Pfad eingerichtet. Sobald n8n die &lt;code&gt;.md&lt;&#x2F;code&gt;-Datei hochlädt, landet sie binnen Sekunden in meinem Obsidian Vault – auf Desktop und Handy.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;Nextcloud (Server)
&lt;&#x2F;span&gt;&lt;span&gt;└── Notizen&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;    └── Memos&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;        ├── 2026-03-29 12-27-03.md   ← Transkript als Markdown
&lt;&#x2F;span&gt;&lt;span&gt;        └── 2026-03-29 617268880.ogg ← Originalaudio zum Nachhören
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In Obsidian sieht das dann fertig aus – mit Datum im Titel, dem vollen Text und einem Link zur Audiodatei darunter. Ich muss nichts anfassen. Nichts formatieren. Nichts umbenennen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-ergebnis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-ergebnis&quot; aria-label=&quot;Anchor link for: das-ergebnis&quot;&gt;Das Ergebnis&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ich stehe wieder auf dem Spielplatz. Das Gespräch endet. Ich halte kurz mein Handy hoch, drücke auf Aufnahme im Telegram-Bot, spreche 30 Sekunden – und gehe dann einfach nach Hause.&lt;&#x2F;p&gt;
&lt;p&gt;Irgendwo in meinem Heimnetzwerk passiert gerade Folgendes:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;[Telegram]  → Sprachnachricht empfangen (617268880)
&lt;&#x2F;span&gt;&lt;span&gt;[n8n]       → .ogg heruntergeladen (128 KB)
&lt;&#x2F;span&gt;&lt;span&gt;[Whisper]   → Transkription gestartet...
&lt;&#x2F;span&gt;&lt;span&gt;[Whisper]   → Fertig in 2.3s: &amp;quot;Letztens habe ich mich auf dem Spielplatz...&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;[Nextcloud] → 2026-03-29 12-27-03.md hochgeladen ✓
&lt;&#x2F;span&gt;&lt;span&gt;[Nextcloud] → 2026-03-29 617268880.ogg hochgeladen ✓
&lt;&#x2F;span&gt;&lt;span&gt;[Telegram]  → Bestätigung gesendet ✓
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Und das alles ohne einen einzigen Cloud-Dienst von Drittanbietern. Kein OpenAI-API-Key. Keine Abo-Kosten. Kein „Ihre Sprachdaten helfen uns, unsere Dienste zu verbessern.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Kings of Convenience – &lt;em&gt;The Weight of my Words&lt;&#x2F;em&gt;. Jetzt hat auch das Gewicht meiner Worte endlich einen Platz gefunden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;danke-j&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#danke-j&quot; aria-label=&quot;Anchor link for: danke-j&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;enthusiastic.dev&#x2F;&quot;&gt;Danke, J.!&lt;&#x2F;a&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Wer meinen Blog schon länger liest, kennt J. – meinen Freund, der mich in epische Rabbit Holes schubst und dann unschuldig guckt. Diesmal hat er mir Parakeet von NVIDIA vorgeschlagen, ein sehr schnelles Speech-to-Text-Modell, das ich mir auch ernsthaft angeschaut habe.&lt;&#x2F;p&gt;
&lt;p&gt;Das Problem: Telegram schickt Sprachnachrichten im Ogg-Vorbis-Format (.ogg) – und Parakeet mag kein Vorbis. Man könnte das Audio vorher konvertieren, aber ehrlich gesagt wollte ich keinen weiteren Umwandlungsschritt in den Workflow bauen. Whisper hingegen schluckt Ogg klaglos, ohne mit der Wimper zu zucken.&lt;&#x2F;p&gt;
&lt;p&gt;Also: J., danke für den Tipp. Du hattest wieder eine gute Idee. Ich habe sie nur ein kleines bisschen verbogen – wie immer.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/stt-telegram-n8n-nextcloud-obsidian/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/stt-telegram-n8n-nextcloud-obsidian/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Wie ich mit einem Telegram-Bot, einem lokalen Whisper-Server, n8n und Nextcloud meine gesprochenen Gedanken automatisch als Markdown-Memos in meinen Obsidian Vault beame. </info>
        </item>
        <item>
            <title>Meine 420€ Steam Machine Lite: AWOW Mini-PC, Bazzite, EmuDeck, Heroic und Citron</title>
            <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/bazzite-steam-machine-lite/</link>
            <guid>https://simeon.staneks.de/posts/bazzite-steam-machine-lite/</guid>
            <description xml:base="https://simeon.staneks.de/posts/bazzite-steam-machine-lite/">&lt;h2 id=&quot;von-ebay-zum-endgegner-der-awow-wurfel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#von-ebay-zum-endgegner-der-awow-wurfel&quot; aria-label=&quot;Anchor link for: von-ebay-zum-endgegner-der-awow-wurfel&quot;&gt;Von eBay zum Endgegner: Der AWOW-Würfel&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Es fing – wie so oft – völlig harmlos an: „Ich schau nur kurz bei eBay, was Mini-PCs so kosten.“&lt;br &#x2F;&gt;
Ein bisschen Budget von Weihnachten und Geburtstag war übrig, und die Idee, eine Art „Steam Machine Lite“ zu bauen, schwebte schon länger im Hinterkopf herum. - Die Alternative wäre ein Mac Mini M4 gewesen, aber der Preisunterschied war einfach zu groß, um ihn zu ignorieren und eine Nintendo Switch 2 wäre die andere Alterntaive gewesen, die ich wahrscheinlich eh nicht so oft nutzen würde.
Zwei Scrolls, ein innerer Monolog und ein leicht schlechtes Gewissen später war es passiert: Ein &lt;strong&gt;AWOW Mini Gaming PC&lt;&#x2F;strong&gt; mit ziemlich absurden Specs für die Größe lag im Warenkorb.&lt;&#x2F;p&gt;
&lt;p&gt;Drin steckt:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMD Ryzen 7 7840HS&lt;&#x2F;strong&gt; – 8 Kerne, 16 Threads, Boost bis 5,1 GHz&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;32 GB DDR5 RAM&lt;&#x2F;strong&gt; – genug, um nebenbei noch drei Browser mit je 40 Tabs offen zu lassen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;1 TB NVMe PCIe 4.0 SSD&lt;&#x2F;strong&gt; – Ladezeiten, was sind Ladezeiten?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Radeon 780M iGPU&lt;&#x2F;strong&gt; – die kleine integrierte GPU, die so tut, als wäre sie eine Mittelklasse-Grafikkarte (Ciao du alte 1050Ti, du bist jetzt überflüssig)&lt;&#x2F;li&gt;
&lt;li&gt;WiFi 6, Bluetooth 5.2, 2.5G LAN, 4K-Triple-Display-Support&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Also alles in allem: Ein sehr kompakter Klotz mit ernstzunehmender Hardware. Perfekt, um daraus meine ganz persönliche &lt;strong&gt;„Steam Machine Lite“&lt;&#x2F;strong&gt; zu bauen – und das Ganze für rund &lt;strong&gt;420€&lt;&#x2F;strong&gt; Gesamtbudget.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis:&lt;&#x2F;strong&gt; Der folgende Link ist ein Amazon Affiliate-Link. Wenn du über diesen Link einkaufst, erhalte ich eine kleine Provision, ohne dass dir zusätzliche Kosten entstehen.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4bgi1os&quot;&gt;AWOW Mini Gaming PC auf Amazon ansehen →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;bazzite-steam-machine-lite&#x2F;images&#x2F;steam-machine-lite.png&quot; alt=&quot;AWOW Mini Gaming PC&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/bazzite-steam-machine-lite/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/bazzite-steam-machine-lite/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Wie ich aus einem AWOW Mini Gaming PC mit Ryzen 7 7840HS, 32 GB RAM und 1 TB SSD eine Steam Machine Lite gebaut habe – mit Bazzite, EmuDeck, Heroic, Citron und Hogwarts in Full HD mit Raytracing. </info>
        </item>
        <item>
            <title>Die 3D-Druck Hölle - Ein weiteres Rabbit Hole</title>
            <pubDate>Sat, 31 Jan 2026 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/3d-print-rabbit-hell/</link>
            <guid>https://simeon.staneks.de/posts/3d-print-rabbit-hell/</guid>
            <description xml:base="https://simeon.staneks.de/posts/3d-print-rabbit-hell/">&lt;h2 id=&quot;die-genese-mein-einstieg-in-den-3d-druck&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-mein-einstieg-in-den-3d-druck&quot; aria-label=&quot;Anchor link for: die-genese-mein-einstieg-in-den-3d-druck&quot;&gt;Die Genese: Mein Einstieg in den 3D-Druck&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;J. hatte gemeint, dass es ihn schon sehr wundert, dass ich noch keinen 3D-Drucker hätte, aber wahrscheinlch ist es auch besser so, weil ich mich sonst in endlosen Rabbit Holes verlieren würde. Tja, da hat er wohl recht gehabt, denn kaum hatte ich meinen Bambu Lab P1S Drucker aufgebaut, war ich auch schon mittendrin in der Welt des 3D-Drucks, die jetzt schon einige Wochen meines Lebens in Anspruch nimmt. Gefühlt läuft der Drucker mehr als dass ich schlafe und das ist wirklich kein Witz.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;meine-bisherigen-erfahrungen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#meine-bisherigen-erfahrungen&quot; aria-label=&quot;Anchor link for: meine-bisherigen-erfahrungen&quot;&gt;Meine bisherigen Erfahrungen&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Von Anfang an war ich begeistert von den Möglichkeiten, die mir der 3D-Drucker bietet. Allerdings musste ich auch schnell feststellen, dass es nicht immer so einfach ist, wie es auf den ersten Blick scheint und dass ein 3D-Drucker auch nicht die Eierlegende Wollmilchsau ist. So der Alltasgretter ist er definitiv nicht, aber für spezielle Anwendungsfälle ist er wirklich genial und unterhaltsam. Ich zähle jetzt nicht auf, was ich bisher so gedruckt habe, aber das lustigste war mit Abstand eine Nasenflöte.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;einfaches-drucken-von-symbolen-und-2d-logos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#einfaches-drucken-von-symbolen-und-2d-logos&quot; aria-label=&quot;Anchor link for: einfaches-drucken-von-symbolen-und-2d-logos&quot;&gt;Einfaches Drucken von Symbolen und 2D-Logos&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Genial finde ich es, dass ich jetzt ganz einfach Logos und Symbole in 3D drucken kann. Zum Beispiel habe ich das Logo meines Blogs als 3D-Modell erstellt. Hatte keinen Grund es zu drucken, aber es sah einfach cool aus. Solche kleinen Projekte machen einfach Spaß und sind eine tolle Möglichkeit, die Fähigkeiten des Druckers zu testen. Für die Arbeit habe ich aber das Logo unserer Sinnstifterorte in eine .svg Datei umgewandelt und dann in ein 3D-Modell konvertiert, um es als Pfandchip zu drucken. Sieht super aus und ist wirklich praktisch.&lt;&#x2F;p&gt;
&lt;p&gt;Hier ein kurzer Ablauf meines Vorgehens:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Logo in Vektorgrafik (SVG) umwandeln. In meinem Fall hatte ich nur ein einfaches jpg Bild, also habe ich es zu erst in Gimp in schwarz-weiß umgewandelt und dann in Inkscape als SVG exportiert.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;3d-print-rabbit-hell&#x2F;images&#x2F;logo.png&quot; alt=&quot;Logo in Inkscape als SVG&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Dann habe ich einfach das SVG in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bambulab&#x2F;BambuStudio&quot;&gt;Bambu Studio&lt;&#x2F;a&gt; importiert und die Höhe des Logos auf 2,3mm gesetzt, damit es ein flaches Objekt wird und Breite und Länge auf 23,25mm skaliert, damit es die richtige Größe für einen Pfandchip hat.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;3d-print-rabbit-hell&#x2F;images&#x2F;logo1.png&quot; alt=&quot;Logo in Bambu Studio importiert&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Zum Schluss habe ich das Modell 108mal kopiert, auf der Druckplatte positioniert und den Druck gestartet. Nach ca. 3 Stunden waren die 108 Pfandchips fertig gedruckt und sehen super aus, zwar gab es auch fehlerhafte Drucke, aber die konnte ich einfach aussortieren. Da die Haftung von PLA auf der Druckplatte des Bambu Lab P1S sehr schlecht ist, habe ich PETG Filament verwendet, das haftet super und die Drucke sehen auch sehr gut aus.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;3d-print-rabbit-hell&#x2F;images&#x2F;logo2.png&quot; alt=&quot;Logo in Bambu Studio skaliert&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;3d-print-rabbit-hell&#x2F;images&#x2F;print.webp&quot; alt=&quot;Gedruckte Pfandchips&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Fertig sind die Pfandchips für unsere Sinnstifterorte! Nun bin ich gespannt, was mein Chef zu den selbst gedruckten Merchandisingartikeln sagt.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ob sich der 3D-Drucker für mich gelohnt hat?
Das wird sich wahrscheinlich noch herausstellen, aber auch wenn nicht auf Anhieb alles klappt, macht es doch unglaublich viel Spaß, eigene Ideen in die Realität umzusetzen und die Möglichkeiten des 3D-Drucks zu entdecken. Ich bin gespannt, welche Projekte ich in Zukunft noch umsetzen werde und wie sich meine Fähigkeiten im 3D-Druck weiterentwickeln. Eines ist sicher: Es wird nie langweilig mit einem 3D-Drucker zu Hause, solange das Filament reicht!&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/3d-print-rabbit-hell/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/3d-print-rabbit-hell/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Meine ersten Erfahrungen mit meinem eigenen 3D-Drucker, den Herausforderungen und unnötigen Abenteuern in der Welt des 3D-Drucks, bis hin zu tatsächlich praktischen Drucken. </info>
        </item>
        <item>
            <title>Eine NFC-Holzbox für Kindermusik – DIY Alternative zur Toniebox</title>
            <pubDate>Wed, 31 Dec 2025 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/nfc-box-for-music-and-tv/</link>
            <guid>https://simeon.staneks.de/posts/nfc-box-for-music-and-tv/</guid>
            <description xml:base="https://simeon.staneks.de/posts/nfc-box-for-music-and-tv/">&lt;h2 id=&quot;die-idee-musik-fur-kleine-hande&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-idee-musik-fur-kleine-hande&quot; aria-label=&quot;Anchor link for: die-idee-musik-fur-kleine-hande&quot;&gt;Die Idee: Musik für kleine Hände&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So im Alltag mit Kindern gibt es viele mögliche Konfliktsituationen. Eine, die immer wieder auftritt ist: Die Kinder wollen ihre Musik hören – Bibi &amp;amp; Tina, Benjamin Blümchen, Peppa Wutz – und zwar jetzt sofort. Aber Smartphone-Apps sind zu kompliziert, Sprachassistenten verstehen &quot;Benjamün Blömchen&quot; nicht, und die Toniebox ist... nun ja, teuer und proprietär. Und ehrlich gesagt habe ich ja schon Kindermusik daheim, bzw. im Spotify-Account, ist doch Käse wenn ich das doppelt kaufen muss. (Obwohl eine Toniebox natürlich auch daheim steht.)&lt;&#x2F;p&gt;
&lt;p&gt;Eine weitere Situaton ist das Anschauen von Serien auf dem Fernseher. Die Kinder würden ja alles schauen und da sich meine Frau nicht wirklich auskennt wo welche Serie läuft, schaltet sie immer auf Youtube und sucht da rum. Nicht optimal, alleine schon wegen der Werbung, deshalb wollte ich eine einfache Möglichkeit schaffen, dass die Kinder selbstständig ihre Lieblingsserien starten können, netürlich im Beisein der Eltern, mit Zeitlimit und mit dem richtigen Inhalt.&lt;&#x2F;p&gt;
&lt;p&gt;Deshalb habe ich eine NFC-Holzbox gebaut, die du ganz einfach nachbauen kannst. Die Kinder legen eine beklebte Karte auf die Box, und schon spielt die Squeezebox im Wohnzimmer das gewünschte Album. Der Adventskalender spielt jeden Tag eine neue Geschichte – mit 24 individuellen Chips, oder der Fernseher geht an und spielt eine zufällige Episode der Serie &quot;Bluey&quot;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-herz-ein-schlafender-esp32&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-herz-ein-schlafender-esp32&quot; aria-label=&quot;Anchor link for: das-herz-ein-schlafender-esp32&quot;&gt;Das Herz: Ein schlafender ESP32&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der ESP32 schläft die meiste Zeit und wacht alle 3 Sekunden kurz auf, um nach NFC-Tags zu schauen. So spart man enorm viel Strom und da der Interupt-Modus des MFRC522 NFC-Readers nicht zuverlässig funktioniert, habe ich mich für diese Polling-Lösung entschieden:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#define &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;WAKEUP_INTERVAL &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3000000    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 3 Sekunden
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#define &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;CARD_READ_TIME &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;800         &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 800ms für Kartenerkennung
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;powerOffRFID&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;disconnect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;(WIFI_OFF)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_wifi_deinit&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_sleep_pd_config&lt;&#x2F;span&gt;&lt;span&gt;(ESP_PD_DOMAIN_RTC_PERIPH&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; ESP_PD_OPTION_OFF)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_sleep_enable_timer_wakeup&lt;&#x2F;span&gt;&lt;span&gt;(WAKEUP_INTERVAL)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_deep_sleep_start&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Wird eine Karte erkannt, spielt der ESP32 einen Piepton, verbindet sich mit dem WiFi und sendet die UID an einen n8n-Webhook.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;die-intelligenz-n8n-orchestriert-alles&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-intelligenz-n8n-orchestriert-alles&quot; aria-label=&quot;Anchor link for: die-intelligenz-n8n-orchestriert-alles&quot;&gt;Die Intelligenz: n8n orchestriert alles&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;n8n übernimmt die Steuerung. Der Workflow prüft in einer Datenbank, was die jeweilige NFC-UID bedeutet, und führt dann die passende Aktion aus:&lt;&#x2F;p&gt;
&lt;style&gt;
.mermaid svg{
max-height: 100% !important;
}
&lt;&#x2F;style&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
graph LR
    A[NFC-Tag erkannt] --&amp;gt; B[Webhook empfängt UID]
    B --&amp;gt; C{Tag bekannt?}
    C --&amp;gt;|Nein| D[Telegram-Benachrichtigung]
    D --&amp;gt; N[Neuen Tag anlegen]
    C --&amp;gt;|Ja| E[Datenbankabfrage]
    E --&amp;gt; F{Aktionstyp?}
    F --&amp;gt;|favorite| G[Favorit abspielen]
    F --&amp;gt;|spotify_search| H[Spotify durchsuchen]
    F --&amp;gt;|volume| I[Lautstärke ändern]
    F --&amp;gt;|advent| J[Adventsgeschichte]
    F --&amp;gt;|series| K[Zufällige Episode]
    G --&amp;gt; L[Squeezebox steuern]
    H --&amp;gt; L
    J --&amp;gt; L
    K --&amp;gt; M[Home Assistant Script]
&lt;&#x2F;pre&gt;
&lt;p&gt;Die Datenbank ist sehr einfach, wusste gar nicht das n8n so etwas kann. Hier ein paar Beispiele:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;UID&lt;&#x2F;th&gt;&lt;th&gt;action_type&lt;&#x2F;th&gt;&lt;th&gt;parameter&lt;&#x2F;th&gt;&lt;th&gt;description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;EC0E72EB&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;spotify_search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;bibi_tina&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bibi und Tina&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;BCF172EB&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;spotify_album&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Bluey the Album&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bluey&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;8C1A8EEB&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;volume&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;5&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Leiser&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;04E1A89C240289&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;advent&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;track:67gj...&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;2.12.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;D4C3B2A1&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;series&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Bluey&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bluey zufällig&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;besondere-features&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#besondere-features&quot; aria-label=&quot;Anchor link for: besondere-features&quot;&gt;Besondere Features&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;adventskalender-integration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#adventskalender-integration&quot; aria-label=&quot;Anchor link for: adventskalender-integration&quot;&gt;Adventskalender-Integration&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Jeder Tag im Dezember bekommt eine eigene NFC-Scheibe mit einer passenden Geschichte. Der Workflow spielt automatisch den richtigen Spotify-Track:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tv-steuerung-mit-timer&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tv-steuerung-mit-timer&quot; aria-label=&quot;Anchor link for: tv-steuerung-mit-timer&quot;&gt;TV-Steuerung mit Timer&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Mit einer speziellen &quot;Karte&quot; schaltest du den Fernseher nach 10 Minuten aus und dimmst das Licht im Wohnzimmer wieder auf 100%.&lt;&#x2F;p&gt;
&lt;p&gt;Andere Karten spielen gezielt eine zufällige Episode der Serie &quot;Bluey&quot; oder &quot;Bobo Siebenschläfer&quot; auf dem Fernseher ab. Dafür habe ich n8n mit dem Home Assistant verbunden, der den Fernseher steuert.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;laute-karten-fur-dauerschleife&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#laute-karten-fur-dauerschleife&quot; aria-label=&quot;Anchor link for: laute-karten-fur-dauerschleife&quot;&gt;&quot;Laute Karten&quot; für Dauerschleife&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Bestimmte Karten (Lauter&#x2F;Leiser) reagieren anders: Solange sie aufliegen, wird die Aktion alle 500ms wiederholt – perfekt zum Lautstärke-Regeln!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isLoudCard&lt;&#x2F;span&gt;&lt;span&gt;(uid)) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;while &lt;&#x2F;span&gt;&lt;span&gt;(count &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isCardStillPresent&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; last &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;sendWebhook&lt;&#x2F;span&gt;&lt;span&gt;(uid)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      last &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;was-ich-gelernt-habe&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#was-ich-gelernt-habe&quot; aria-label=&quot;Anchor link for: was-ich-gelernt-habe&quot;&gt;Was ich gelernt habe&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Meine wichtigsten Learnings:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Deep Sleep spart enorm Strom: Der ESP32 verbraucht im Deep Sleep nur wenige µA. Damit sind batteriebetriebene NFC-Reader möglich, wobei ich bei mir zwei parallele 18650er-Akkus nutze.&lt;&#x2F;li&gt;
&lt;li&gt;n8n ist ideal für Smart Home: Komplexe Workflows lassen sich ohne Programmierung bauen. Neue NFC-Karten sind schnell hinzugefügt.&lt;&#x2F;li&gt;
&lt;li&gt;Kinder lieben Haptik: Die gestalteten Karten oder Figuren mit drangeklebten Chips sind viel greifbarer als App-Icons. Das Prinzip ist sofort verständlich (selbst für meine drei jährige) und so viel billiger als Toniefiguren.&lt;&#x2F;li&gt;
&lt;li&gt;Duplikat-Erkennung ist wichtig: Ohne diese würde jedes versehentliche Anlegen die Musik neu starten.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;style&gt;
   .containerimg img {
        width: 200px;
        min-height: 200px;
        margin: 0 10px;
        cursor: pointer;
        transition: transform 0.2s;
    }
    .containerimg img:hover {
        transform: scale(1.05);
    }
    .lightbox {
        display: none;
        position: fixed;
        z-index: 999;
        padding-top: 50px;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        overflow: auto;
        background-color: rgba(0,0,0,0.9);
    }
    .lightbox-content {
        margin: auto;
        display: block;
        max-width: 90%;
        max-height: 80%;
    }
    .lightbox-close {
        position: absolute;
        top: 15px;
        right: 35px;
        color: #f1f1f1;
        font-size: 40px;
        font-weight: bold;
        cursor: pointer;
    }
    .lightbox-close:hover {
        color: #bbb;
    }
&lt;&#x2F;style&gt;
&lt;div class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img onclick=&quot;openLightbox(this.src)&quot; src=&quot;&#x2F;posts&#x2F;nfc-box-for-music-and-tv&#x2F;images&#x2F;nfc1.jpeg&quot; alt=&quot;NFC Box&quot;&gt;
&lt;img onclick=&quot;openLightbox(this.src)&quot; src=&quot;&#x2F;posts&#x2F;nfc-box-for-music-and-tv&#x2F;images&#x2F;nfc2.jpeg&quot; alt=&quot;NFC Box&quot;&gt;
&lt;img onclick=&quot;openLightbox(this.src)&quot; src=&quot;&#x2F;posts&#x2F;nfc-box-for-music-and-tv&#x2F;images&#x2F;nfc3.jpeg&quot; alt=&quot;NFC Box&quot;&gt;
&lt;img onclick=&quot;openLightbox(this.src)&quot; src=&quot;&#x2F;posts&#x2F;nfc-box-for-music-and-tv&#x2F;images&#x2F;nfc4.jpeg&quot; alt=&quot;NFC Box&quot;&gt;
&lt;&#x2F;div&gt;
&lt;div id=&quot;lightbox&quot; class=&quot;lightbox&quot; onclick=&quot;closeLightbox()&quot;&gt;
    &lt;span class=&quot;lightbox-close&quot; onclick=&quot;closeLightbox()&quot;&gt;&amp;times;&lt;&#x2F;span&gt;
    &lt;img class=&quot;lightbox-content&quot; id=&quot;lightbox-img&quot;&gt;
&lt;&#x2F;div&gt;
&lt;script&gt;
function openLightbox(src) {
    document.getElementById(&#x27;lightbox&#x27;).style.display = &#x27;block&#x27;;
    document.getElementById(&#x27;lightbox-img&#x27;).src = src;
}

function closeLightbox() {
    document.getElementById(&#x27;lightbox&#x27;).style.display = &#x27;none&#x27;;
}

document.addEventListener(&#x27;keydown&#x27;, function(event) {
    if (event.key === &#x27;Escape&#x27;) {
        closeLightbox();
    }
});
&lt;&#x2F;script&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Die NFC-Musikbox ist bei uns nicht mehr wegzudenken, obwohl sie erst 5 Wochen alt ist. Die Kinder können ihre Musik selbst starten und du kannst die Lösung flexibel erweitern. Der Adventskalender ist das Highlight – jeden Morgen eine neue Geschichte, ganz automatisch. --&amp;gt; Kinder nehmen den Chip vom Esszimmertisch, legen ihn auf die Box, und schon geht&#x27;s los.&lt;&#x2F;p&gt;
&lt;p&gt;Achtung jetzt kommen Affiliate-Links:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Kosten:&lt;&#x2F;strong&gt; ca. 15€ (&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4qv3Ctt&quot;&gt;ESP32 &lt;&#x2F;a&gt; + &lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4iHk2w5&quot;&gt;MFRC522&lt;&#x2F;a&gt; + &lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4iNwc6O&quot;&gt;NFC-Tags&lt;&#x2F;a&gt; + Holzbox vom Tedi)  optional: 10€ (18650er-Akkus + &lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;44TDqAy&quot;&gt;Gehäuse&lt;&#x2F;a&gt;)&lt;br &#x2F;&gt;
&lt;strong&gt;Zeit:&lt;&#x2F;strong&gt; Ein Wochenende&lt;br &#x2F;&gt;
&lt;strong&gt;Freude:&lt;&#x2F;strong&gt; Unbezahlbar&lt;&#x2F;p&gt;
&lt;p&gt;Die kompletten Sourcen und die n8n-Workflows bekommst du auf Anfrage. Viel Spaß beim Nachbauen!&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Hinweis: Die Kinder könnten theoretisch ja den Fernseher damit steuern. Aber die entsprechende NFC-Karte liegt ganz oben auf dem Kamin...&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/nfc-box-for-music-and-tv/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/nfc-box-for-music-and-tv/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Wie ich mit einem ESP32, NFC-Tags und n8n eine smarte Musikbox gebaut habe, die sogar unseren Adventskalender spielt. Eine kostengünstige DIY-Lösung für Kinder. </info>
        </item>
        <item>
            <title>BLE-Button mit Deep Sleep: Wenn ein ESP32-S3 zum Foto-Auslöser wird</title>
            <pubDate>Wed, 19 Nov 2025 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/ble-button-deep-sleep-esp32/</link>
            <guid>https://simeon.staneks.de/posts/ble-button-deep-sleep-esp32/</guid>
            <description xml:base="https://simeon.staneks.de/posts/ble-button-deep-sleep-esp32/">&lt;h2 id=&quot;die-ausgangslage-ein-glucksrad-braucht-einen-button&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-ausgangslage-ein-glucksrad-braucht-einen-button&quot; aria-label=&quot;Anchor link for: die-ausgangslage-ein-glucksrad-braucht-einen-button&quot;&gt;Die Ausgangslage: Ein Glücksrad braucht einen Button&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Vor einiger Zeit habe ich für die Tourismuspastoral ein &lt;a href=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;&quot;&gt;digitales Glücksrad&lt;&#x2F;a&gt; entwickelt. Bei Veranstaltungen drücken die Leute einen roten Button, der per USB verbunden ist, damit sich das Rad dreht. Und wenn sie auf dem richtigen Feld landen, soll ein Foto gemacht werden - für die Erinnerung, fürs Gästebuch, für Instagram. Doch nicht jedes Feld löst ein Foto aus. Deshalb brauchte ich eine einfache Möglichkeit, den Foto-Auslöser zu betätigen.&lt;&#x2F;p&gt;
&lt;p&gt;Die Idee: Ein kabelloser Button, den die Besucher drücken können, um das Foto auszulösen. Simpel, oder?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Spoiler&lt;&#x2F;strong&gt;: War es nicht. Aber am Ende läuft&#x27;s - und wie! 🎉&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-drei-anforderungen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-drei-anforderungen&quot; aria-label=&quot;Anchor link for: das-konzept-drei-anforderungen&quot;&gt;Das Konzept: Drei Anforderungen&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ich hatte klare Vorstellungen, was der Button können sollte:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Batteriebetrieben&lt;&#x2F;strong&gt;: Keine Kabel bei Veranstaltungen, bitte!&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zuverlässig&lt;&#x2F;strong&gt;: Beim Drücken soll die Taste &quot;2&quot; gesendet werden (die löst in meinem Setup die Fotofunktion aus)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lange Laufzeit&lt;&#x2F;strong&gt;: Ich will nicht ständig Batterien wechseln&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Die Lösung: Ein &lt;strong&gt;ESP32-S3&lt;&#x2F;strong&gt; mit &lt;strong&gt;BLE&lt;&#x2F;strong&gt; (Bluetooth Low Energy), der sich als Tastatur ausgibt und im &lt;strong&gt;Deep Sleep&lt;&#x2F;strong&gt; auf Button-Drücke wartet.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hardware-keep-it-simple&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hardware-keep-it-simple&quot; aria-label=&quot;Anchor link for: hardware-keep-it-simple&quot;&gt;Hardware - Keep it simple!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Für dieses Projekt brauchst du wirklich nicht viel:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ESP32-S3 Dev Module (~5-10 Euro)&lt;&#x2F;li&gt;
&lt;li&gt;Ein Taster&#x2F;Button (z.B. 100mm Arcade-Button)&lt;&#x2F;li&gt;
&lt;li&gt;CR123A Batterie + Batteriehalter (siehe Einkaufsliste unten)&lt;&#x2F;li&gt;
&lt;li&gt;Optional: Ein Gehäuse (3D-Druck, Projektbox, Aschenbecher vom Tedi, etc.)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Das Setup:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Button an GPIO5 und GND&lt;&#x2F;li&gt;
&lt;li&gt;Interne Pullup-Widerstände nutzen (keine externe Elektronik nötig!)&lt;&#x2F;li&gt;
&lt;li&gt;Bei Button-Druck: Pin wird LOW → ESP wacht auf&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;┌─────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   ESP32-S3  │
&lt;&#x2F;span&gt;&lt;span&gt;│             │
&lt;&#x2F;span&gt;&lt;span&gt;│  GPIO5 ◄────┼──── Button ──── GND
&lt;&#x2F;span&gt;&lt;span&gt;│             │
&lt;&#x2F;span&gt;&lt;span&gt;│  (Pullup    │
&lt;&#x2F;span&gt;&lt;span&gt;│   intern)   │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;die-herausforderungen-ein-steiniger-weg-zum-erfolg&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-herausforderungen-ein-steiniger-weg-zum-erfolg&quot; aria-label=&quot;Anchor link for: die-herausforderungen-ein-steiniger-weg-zum-erfolg&quot;&gt;Die Herausforderungen: Ein steiniger Weg zum Erfolg&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;problem-1-esp-ging-nicht-in-deep-sleep&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-1-esp-ging-nicht-in-deep-sleep&quot; aria-label=&quot;Anchor link for: problem-1-esp-ging-nicht-in-deep-sleep&quot;&gt;Problem #1: ESP ging nicht in Deep Sleep&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Symptom&lt;&#x2F;strong&gt;: Der ESP wollte einfach nicht schlafen. Stromverbrauch blieb hoch, Battery Monitor zeigte 80-120mA statt der erwarteten ~10µA.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Diagnose&lt;&#x2F;strong&gt;: Beim ESP32-S3 verhindert die aktive USB-Serial-Verbindung den Deep Sleep! Außerdem war BLE noch nicht vollständig deaktiviert.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lösung&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Serial beenden
&lt;&#x2F;span&gt;&lt;span&gt;USBSerial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; ESP32-S3 spezifisch!
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;btStop&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Bluetooth komplett stoppen
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_deep_sleep_start&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;problem-2-esp-wachte-sofort-wieder-auf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-2-esp-wachte-sofort-wieder-auf&quot; aria-label=&quot;Anchor link for: problem-2-esp-wachte-sofort-wieder-auf&quot;&gt;Problem #2: ESP wachte sofort wieder auf&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das war frustrierend: Der ESP ging schlafen... und 300ms später war er wieder wach. Endlos-Schleife!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ursache&lt;&#x2F;strong&gt;: Der Button-Pin war beim Einschlafen noch LOW (gedrückt). Der ext0-Wakeup triggerte sofort, weil die Bedingung &quot;wache auf bei LOW&quot; schon erfüllt war.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lösung&lt;&#x2F;strong&gt;: Warten bis der Button losgelassen wird!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW) {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Button gedrückt - warte...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Sicherheitspuffer
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;problem-3-rtc-gpio-konfiguration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-3-rtc-gpio-konfiguration&quot; aria-label=&quot;Anchor link for: problem-3-rtc-gpio-konfiguration&quot;&gt;Problem #3: RTC GPIO Konfiguration&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der ESP32-S3 hat eine Besonderheit: Für ext0-Wakeup muss man die &lt;strong&gt;RTC GPIO&lt;&#x2F;strong&gt; explizit konfigurieren. Ohne das funktioniert der Wakeup nicht zuverlässig.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_init&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_set_direction&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; RTC_GPIO_MODE_INPUT_ONLY)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_pullup_en&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_hold_en&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Config im Sleep halten!
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Das &lt;code&gt;rtc_gpio_hold_en()&lt;&#x2F;code&gt; ist crucial - es sorgt dafür, dass die Pin-Konfiguration im Deep Sleep erhalten bleibt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;problem-4-2-wurde-nicht-gesendet&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-4-2-wurde-nicht-gesendet&quot; aria-label=&quot;Anchor link for: problem-4-2-wurde-nicht-gesendet&quot;&gt;Problem #4: &quot;2&quot; wurde nicht gesendet&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der ESP wachte auf, BLE startete... aber keine Taste wurde gesendet. Dann kam der Timeout und er ging wieder schlafen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ursache&lt;&#x2F;strong&gt;: BLE braucht 5-10 Sekunden zum Verbinden! Der ursprüngliche 10-Sekunden-Timer lief aber schon beim Aufwachen los.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lösung&lt;&#x2F;strong&gt;: Timer wird &lt;strong&gt;nach&lt;&#x2F;strong&gt; erfolgreichem Senden zurückgesetzt:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isConnected&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;  bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; JETZT Timer neu starten!
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Timer neu gestartet - 10 Sekunden wach&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;problem-5-verbindung-brach-standig-ab&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problem-5-verbindung-brach-standig-ab&quot; aria-label=&quot;Anchor link for: problem-5-verbindung-brach-standig-ab&quot;&gt;Problem #5: Verbindung brach ständig ab&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nach jedem Deep Sleep musste das Gerät neu gepairt werden. Nervig!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ursache&lt;&#x2F;strong&gt;: Keine Bonding-Informationen wurden gespeichert. Der Computer sah nach jedem Aufwachen ein &quot;neues&quot; Gerät.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lösung&lt;&#x2F;strong&gt;: BLE Security mit Bonding aktivieren:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span&gt;esp_ble_auth_req_t auth_req &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ESP_LE_AUTH_REQ_SC_MITM_BOND&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_AUTHEN_REQ_MODE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;auth_req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; ... weitere Security-Parameter
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Und eine &lt;strong&gt;feste MAC-Adresse&lt;&#x2F;strong&gt; im Flash speichern:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setCustomMacAddress&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ble-button&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getBool&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_set&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Beim ersten Start: Zufällige MAC generieren
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_fill_random&lt;&#x2F;span&gt;&lt;span&gt;(newMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0xFE&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0x02&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Locally administered
&lt;&#x2F;span&gt;&lt;span&gt;    preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;putBytes&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_addr&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; newMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;putBool&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_set&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; customMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getBytes&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_addr&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; customMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_base_mac_addr_set&lt;&#x2F;span&gt;&lt;span&gt;(customMac)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;der-code-kompakt-und-durchdacht&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-code-kompakt-und-durchdacht&quot; aria-label=&quot;Anchor link for: der-code-kompakt-und-durchdacht&quot;&gt;Der Code: Kompakt und durchdacht&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Hier ist der finale, funktionierende Code:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;BleKeyboard.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;Preferences.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;driver&#x2F;rtc_io.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;esp_bt_device.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;esp_gap_ble_api.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;BleKeyboard &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;bleKeyboard&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Blauer Button&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Espressif&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;Preferences preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; buttonPin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const unsigned long&lt;&#x2F;span&gt;&lt;span&gt; awakeTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 10 Sekunden wach
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const unsigned long&lt;&#x2F;span&gt;&lt;span&gt; bleTimeout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;15000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 15 Sekunden für BLE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; HIGH&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; startTime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setCustomMacAddress&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ble-button&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; macExists &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getBool&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_set&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;macExists) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Erster Start - generiere neue MAC...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_fill_random&lt;&#x2F;span&gt;&lt;span&gt;(newMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(newMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0xFE&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0x02&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;putBytes&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_addr&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; newMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;putBool&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_set&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; customMac[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getBytes&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mac_addr&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; customMac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_base_mac_addr_set&lt;&#x2F;span&gt;&lt;span&gt;(customMac)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setupBLESecurity&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  esp_ble_auth_req_t auth_req &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ESP_LE_AUTH_REQ_SC_MITM_BOND&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  esp_ble_io_cap_t iocap &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ESP_IO_CAP_NONE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; key_size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; init_key &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ESP_BLE_ENC_KEY_MASK &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span&gt; ESP_BLE_ID_KEY_MASK&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt; rsp_key &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ESP_BLE_ENC_KEY_MASK &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span&gt; ESP_BLE_ID_KEY_MASK&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_AUTHEN_REQ_MODE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;auth_req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_IOCAP_MODE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;iocap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_MAX_KEY_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;key_size&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_SET_INIT_KEY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;init_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_ble_gap_set_security_param&lt;&#x2F;span&gt;&lt;span&gt;(ESP_BLE_SM_SET_RSP_KEY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;rsp_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint8_t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; BLE Security aktiviert&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Bereite Deep Sleep vor...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Warte bis Button losgelassen
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; BLE sauber beenden
&lt;&#x2F;span&gt;&lt;span&gt;  bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;btStop&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; RTC GPIO konfigurieren
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_init&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_set_direction&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; RTC_GPIO_MODE_INPUT_ONLY)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_pullup_en&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_pulldown_dis&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_hold_en&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_sleep_enable_ext0_wakeup&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Gehe schlafen...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  USBSerial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_deep_sleep_start&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;115200&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_deinit&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;rtc_gpio_hold_dis&lt;&#x2F;span&gt;&lt;span&gt;((gpio_num_t)buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; INPUT_PULLUP)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;=== AUFGEWACHT! ===&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setCustomMacAddress&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setupBLESecurity&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;BLE gestartet - warte auf Verbindung...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Warte auf BLE und sende dann
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;alreadySentOnWake) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isConnected&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; BLE VERBUNDEN! Sende &amp;#39;2&amp;#39;...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;#39;2&amp;#39; gesendet!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Timer zurücksetzen
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; bleTimeout) {
&lt;&#x2F;span&gt;&lt;span&gt;        Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Timeout - schlafen ohne Senden&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Nach Senden: 10 Sekunden wach
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span&gt; awakeTime) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Timeout!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Button während Wachzeit
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; HIGH) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isConnected&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Button: Sende &amp;#39;2&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Timer zurücksetzen
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; buttonState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;wie-es-funktioniert-der-ablauf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wie-es-funktioniert-der-ablauf&quot; aria-label=&quot;Anchor link for: wie-es-funktioniert-der-ablauf&quot;&gt;Wie es funktioniert: Der Ablauf&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;┌─────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   DEEP SLEEP (~10µA)        │
&lt;&#x2F;span&gt;&lt;span&gt;│   CPU: OFF                  │
&lt;&#x2F;span&gt;&lt;span&gt;│   RAM: OFF                  │
&lt;&#x2F;span&gt;&lt;span&gt;│   BLE: OFF                  │
&lt;&#x2F;span&gt;&lt;span&gt;│   RTC: ON (wartet)          │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────┘
&lt;&#x2F;span&gt;&lt;span&gt;            │
&lt;&#x2F;span&gt;&lt;span&gt;            │ [Button gedrückt!]
&lt;&#x2F;span&gt;&lt;span&gt;            ▼
&lt;&#x2F;span&gt;&lt;span&gt;┌─────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   WAKEUP (~300ms)           │
&lt;&#x2F;span&gt;&lt;span&gt;│   - CPU startet             │
&lt;&#x2F;span&gt;&lt;span&gt;│   - setup() läuft           │
&lt;&#x2F;span&gt;&lt;span&gt;│   - MAC laden               │
&lt;&#x2F;span&gt;&lt;span&gt;│   - BLE starten             │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────┘
&lt;&#x2F;span&gt;&lt;span&gt;            │
&lt;&#x2F;span&gt;&lt;span&gt;            │ [BLE Verbindung]
&lt;&#x2F;span&gt;&lt;span&gt;            ▼
&lt;&#x2F;span&gt;&lt;span&gt;┌─────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   VERBINDUNG (2-10 Sek)     │
&lt;&#x2F;span&gt;&lt;span&gt;│   - Bonding-Keys prüfen     │
&lt;&#x2F;span&gt;&lt;span&gt;│   - Sichere Verbindung      │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────┘
&lt;&#x2F;span&gt;&lt;span&gt;            │
&lt;&#x2F;span&gt;&lt;span&gt;            │ [isConnected()]
&lt;&#x2F;span&gt;&lt;span&gt;            ▼
&lt;&#x2F;span&gt;&lt;span&gt;┌─────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   TASTE SENDEN              │
&lt;&#x2F;span&gt;&lt;span&gt;│   bleKeyboard.print(&amp;quot;2&amp;quot;)    │
&lt;&#x2F;span&gt;&lt;span&gt;│   Timer zurücksetzen        │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────┘
&lt;&#x2F;span&gt;&lt;span&gt;            │
&lt;&#x2F;span&gt;&lt;span&gt;            │ [10 Sekunden warten]
&lt;&#x2F;span&gt;&lt;span&gt;            ▼
&lt;&#x2F;span&gt;&lt;span&gt;┌─────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│   ZURÜCK IN SLEEP           │
&lt;&#x2F;span&gt;&lt;span&gt;│   - BLE trennen             │
&lt;&#x2F;span&gt;&lt;span&gt;│   - RTC GPIO config         │
&lt;&#x2F;span&gt;&lt;span&gt;│   - esp_deep_sleep_start()  │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;stromversorgung-mit-cr123a-batterie&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stromversorgung-mit-cr123a-batterie&quot; aria-label=&quot;Anchor link for: stromversorgung-mit-cr123a-batterie&quot;&gt;Stromversorgung mit CR123A Batterie&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Für den mobilen Einsatz habe ich mich für eine &lt;strong&gt;CR123A Batterie&lt;&#x2F;strong&gt; entschieden - eine geniale Lösung für dieses Projekt!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;warum-cr123a&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#warum-cr123a&quot; aria-label=&quot;Anchor link for: warum-cr123a&quot;&gt;Warum CR123A?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hohe Kapazität&lt;&#x2F;strong&gt;: 1.500-1.700mAh bei 3V&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kompakte Bauform&lt;&#x2F;strong&gt;: Perfekt für portable Geräte&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lange Haltbarkeit&lt;&#x2F;strong&gt;: Bis zu 10 Jahre Lagerfähigkeit&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Stabile Spannung&lt;&#x2F;strong&gt;: 3V passt perfekt zum ESP32 (2,3V-3,6V toleriert)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Überall verfügbar&lt;&#x2F;strong&gt;: In jedem Elektronik- oder Fotogeschäft&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;anschluss&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anschluss&quot; aria-label=&quot;Anchor link for: anschluss&quot;&gt;Anschluss&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der ESP32-S3 kann direkt mit 3V betrieben werden:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CR123A Batterie: Plus (+) an 3V3-Pin&lt;&#x2F;li&gt;
&lt;li&gt;CR123A Batterie: Minus (-) an GND&lt;&#x2F;li&gt;
&lt;li&gt;Batteriehalter mit Schalter empfohlen&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Achtung&lt;&#x2F;strong&gt;: Bei USB-Betrieb den 3V3-Pin nicht nutzen, sondern über USB versorgen! Beim Flashen die Batterie trennen oder einen Batteriehalter mit Schalter verwenden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stromverbrauch-die-zahlen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stromverbrauch-die-zahlen&quot; aria-label=&quot;Anchor link for: stromverbrauch-die-zahlen&quot;&gt;Stromverbrauch: Die Zahlen&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Zustand&lt;&#x2F;th&gt;&lt;th&gt;Verbrauch&lt;&#x2F;th&gt;&lt;th&gt;Dauer&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Deep Sleep&lt;&#x2F;td&gt;&lt;td&gt;~10-150µA&lt;&#x2F;td&gt;&lt;td&gt;99% der Zeit&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wakeup + BLE&lt;&#x2F;td&gt;&lt;td&gt;~80-120mA&lt;&#x2F;td&gt;&lt;td&gt;2-10 Sekunden&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Connected&lt;&#x2F;td&gt;&lt;td&gt;~40-80mA&lt;&#x2F;td&gt;&lt;td&gt;10 Sekunden&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Senden&lt;&#x2F;td&gt;&lt;td&gt;~100-150mA&lt;&#x2F;td&gt;&lt;td&gt;&amp;lt;1 Sekunde&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;Mit CR123A (1.600mAh)&lt;&#x2F;strong&gt;: Theoretisch &lt;strong&gt;Monate bis Jahre&lt;&#x2F;strong&gt; Laufzeit, abhängig von der Häufigkeit der Button-Drücke.&lt;&#x2F;p&gt;
&lt;p&gt;Bei 10 Foto-Auslösungen pro Tag:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;10 × 15 Sekunden wach = 150 Sekunden = 2,5 Minuten&lt;&#x2F;li&gt;
&lt;li&gt;Verbrauch während Wachzeit: ~80mA × 2,5min = ~3,3mAh pro Tag&lt;&#x2F;li&gt;
&lt;li&gt;Deep Sleep restliche Zeit: ~23,96h × 0,1mA = ~2,4mAh pro Tag&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gesamt: ~5,7mAh pro Tag&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Laufzeit mit CR123A: ca. 280 Tage (9+ Monate)!&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mit der CR123A Batterie hält der Button also fast ein Jahr durch - perfekt für Events und Veranstaltungen!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;die-wichtigsten-erkenntnisse&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-wichtigsten-erkenntnisse&quot; aria-label=&quot;Anchor link for: die-wichtigsten-erkenntnisse&quot;&gt;Die wichtigsten Erkenntnisse&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-esp32-s3-ist-anders&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-esp32-s3-ist-anders&quot; aria-label=&quot;Anchor link for: 1-esp32-s3-ist-anders&quot;&gt;1. ESP32-S3 ist anders&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der S3 braucht explizite RTC GPIO-Konfiguration und das Beenden von USBSerial. Die &quot;normalen&quot; ESP32-Beispiele funktionieren oft nicht 1:1.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-deep-sleep-ist-pingelig&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-deep-sleep-ist-pingelig&quot; aria-label=&quot;Anchor link for: 2-deep-sleep-ist-pingelig&quot;&gt;2. Deep Sleep ist pingelig&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der Pin-Status beim Einschlafen ist entscheidend. Immer warten bis der Button wirklich losgelassen ist!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-ble-braucht-zeit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-ble-braucht-zeit&quot; aria-label=&quot;Anchor link for: 3-ble-braucht-zeit&quot;&gt;3. BLE braucht Zeit&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;5-10 Sekunden für eine Verbindung sind normal. Plant euren Timeout entsprechend.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-bonding-ist-gold-wert&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-bonding-ist-gold-wert&quot; aria-label=&quot;Anchor link for: 4-bonding-ist-gold-wert&quot;&gt;4. Bonding ist Gold wert&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Mit Bonding verbindet sich das Gerät nach jedem Aufwachen automatisch wieder. Ohne Bonding muss man jedes Mal neu pairen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-feste-mac-happy-life&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-feste-mac-happy-life&quot; aria-label=&quot;Anchor link for: 5-feste-mac-happy-life&quot;&gt;5. Feste MAC = Happy Life&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Ohne feste MAC sieht der Computer nach jedem Sleep ein &quot;neues&quot; Gerät. Die MAC im Flash speichern löst das Problem elegant.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;warum-du-es-selbst-ausprobieren-solltest&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#warum-du-es-selbst-ausprobieren-solltest&quot; aria-label=&quot;Anchor link for: warum-du-es-selbst-ausprobieren-solltest&quot;&gt;Warum du es selbst ausprobieren solltest&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Dieses Projekt ist perfekt zum Lernen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analoge Hardware trifft digitale Logik&lt;&#x2F;strong&gt;: RTC GPIO, Pullups, Wakeup-Quellen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Power Management&lt;&#x2F;strong&gt;: Deep Sleep, Stromverbrauch optimieren&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BLE verstehen&lt;&#x2F;strong&gt;: Bonding, Security, Pairing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Persistente Daten&lt;&#x2F;strong&gt;: Preferences Library für Flash-Speicher&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Debugging&lt;&#x2F;strong&gt;: Serial Monitor, Logik-Analyse, Trial &amp;amp; Error&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Und das Beste: Am Ende hast du ein &lt;strong&gt;praktisches Gerät&lt;&#x2F;strong&gt;, das wirklich nützlich ist!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;einsatz-beim-glucksrad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#einsatz-beim-glucksrad&quot; aria-label=&quot;Anchor link for: einsatz-beim-glucksrad&quot;&gt;Einsatz beim Glücksrad&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der Button wird beim Tourismus-Glücksrad eingesetzt: Besucher drücken den Button, die Taste &quot;2&quot; wird gesendet, das Javascript auf dem Raspberry Pi löst die Fotofunktion aus. Simpel, zuverlässig, keine Kabel.&lt;&#x2F;p&gt;
&lt;p&gt;Die Besucher lieben es - besonders die haptische Komponente. Ein echter Button fühlt sich einfach besser an als &quot;Drück mal auf den Bildschirm&quot;.&lt;&#x2F;p&gt;
&lt;style&gt;
   .containerimg   img {
        width: 200px;
       min-height: 200px;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div  class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img onclick=&quot;location.href=&#x27;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00001.jpg&#x27;&quot; src=&quot;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00001.jpg&quot; alt=&quot;Blauer Button&quot;&gt;
&lt;img onclick=&quot;location.href=&#x27;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00002.jpg&#x27;&quot; src=&quot;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00002.jpg&quot; alt=&quot;Blauer Button&quot;&gt;
&lt;img onclick=&quot;location.href=&#x27;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00003.jpg&#x27;&quot; src=&quot;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00003.jpg&quot; alt=&quot;Blauer Button&quot;&gt;
&lt;img onclick=&quot;location.href=&#x27;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00004.jpg&#x27;&quot; src=&quot;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00004.jpg&quot; alt=&quot;Blauer Button&quot;&gt;
&lt;img onclick=&quot;location.href=&#x27;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00005.jpg&#x27;&quot; src=&quot;&#x2F;posts&#x2F;ble-button-deep-sleep-esp32&#x2F;images&#x2F;image00005.jpg&quot; alt=&quot;Blauer Button&quot;&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;ausblick-was-noch-moglich-ware&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ausblick-was-noch-moglich-ware&quot; aria-label=&quot;Anchor link for: ausblick-was-noch-moglich-ware&quot;&gt;Ausblick: Was noch möglich wäre&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Mit diesem Setup könnte man noch viel mehr machen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LED-Feedback&lt;&#x2F;strong&gt;: Kurzes Blinken bei erfolgreicher Übertragung&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Battery Monitoring&lt;&#x2F;strong&gt;: Batteriespannung messen und warnen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Button&lt;&#x2F;strong&gt;: Verschiedene Tasten je nach Druck-Dauer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OTA Updates&lt;&#x2F;strong&gt;: Firmware über BLE aktualisieren&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bewegungssensor&lt;&#x2F;strong&gt;: Zusätzlicher Wakeup per Accelerometer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;los-geht-s&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-geht-s&quot; aria-label=&quot;Anchor link for: los-geht-s&quot;&gt;Los geht&#x27;s!&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Du hast Lust bekommen, selbst einen BLE-Button zu bauen? Perfekt! Besorg dir einen ESP32-S3, einen Taster und leg los. Der Code ist da, die Erklärungen auch.&lt;&#x2F;p&gt;
&lt;p&gt;Und wenn du Fragen hast oder dein Projekt teilen möchtest - melde dich gerne!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Happy Hacking!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;einkaufsliste-alles-was-du-brauchst&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#einkaufsliste-alles-was-du-brauchst&quot; aria-label=&quot;Anchor link for: einkaufsliste-alles-was-du-brauchst&quot;&gt;Einkaufsliste - Alles was du brauchst&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Hier findest du alle Komponenten, die du für dieses Projekt benötigst. Die Links führen zu Amazon und sind Affiliate-Links, wo du die Teile direkt bestellen kannst:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hauptkomponenten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hauptkomponenten&quot; aria-label=&quot;Anchor link for: hauptkomponenten&quot;&gt;Hauptkomponenten&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;ESP32-S3 Development Board&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3M3FQGv&quot;&gt;ESP32-S3 DevKit (2er Set)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Empfehlung: Das 2er-Set ist günstiger pro Board und du hast Ersatz für weitere Projekte&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;100mm Arcade Button&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;45Gditn&quot;&gt;LED Arcade Button 100mm (verschiedene Farben)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Große, gut fühlbare Taste - perfekt für Events&lt;&#x2F;li&gt;
&lt;li&gt;Alternative: &lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4ro8TDG&quot;&gt;Standard Arcade Button 60mm&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;stromversorgung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stromversorgung&quot; aria-label=&quot;Anchor link for: stromversorgung&quot;&gt;Stromversorgung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;CR123A Batterien&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4rlJ1YZ&quot;&gt;Varta CR123A Lithium Batterien (2er Pack)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Hochwertige Markenbatterien mit langer Lebensdauer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Batteriehalter für CR123A&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;45GdmcB&quot;&gt;CR123A Batteriehalter mit Anschlusskabel&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Mit Schalter zum einfachen Ein&#x2F;Ausschalten&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;optional-aber-nutzlich&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#optional-aber-nutzlich&quot; aria-label=&quot;Anchor link for: optional-aber-nutzlich&quot;&gt;Optional aber nützlich&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;USB-C Kabel zum Flashen&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;3M4jxAu&quot;&gt;USB-C Datenkabel&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Wichtig: Datenkabel verwenden, nicht nur Ladekabel!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Jumper Kabel&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amzn.to&#x2F;4a1duoc&quot;&gt;Dupont Jumper Kabel Set&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Zum einfachen Verbinden während des Prototypings&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;geschatzte-gesamtkosten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#geschatzte-gesamtkosten&quot; aria-label=&quot;Anchor link for: geschatzte-gesamtkosten&quot;&gt;Geschätzte Gesamtkosten&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minimal-Setup&lt;&#x2F;strong&gt;: ~25-30 Euro (ESP32, Button, Batterie + Halter)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Viel Spaß beim Nachbauen! 🛠️&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Verwendete Hardware:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ESP32-S3 Dev Module&lt;&#x2F;li&gt;
&lt;li&gt;100mm Arcade Button&lt;&#x2F;li&gt;
&lt;li&gt;CR123A Batterie + Batteriehalter&lt;&#x2F;li&gt;
&lt;li&gt;Optional: Gehäuse&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;em&gt;Benötigte Libraries:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;T-vK&#x2F;ESP32-BLE-Keyboard&quot;&gt;ESP32-BLE-Keyboard&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Preferences (ESP32 Core)&lt;&#x2F;li&gt;
&lt;li&gt;driver&#x2F;rtc_io.h (ESP32 Core)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;em&gt;Board Manager für ESP32:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Version 2.0.17 !!!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;em&gt;Stromversorgung:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Für Entwicklung&#x2F;Flashen: USB-C Kabel&lt;&#x2F;li&gt;
&lt;li&gt;Für Produktivbetrieb: CR123A Batterie mit Batteriehalter (siehe Einkaufsliste)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hier der komplette Code für den ESP32-C3 BLE-Button mit Deep Sleep:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Fork des ESP32-BLE-Keyboard von T-vK wurde verwendet, der mit dem ESP32-C3 kompatibel ist:
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lewisxhe&#x2F;ESP32-BLE-Keyboard-fork&quot;&gt;Fork von lewisxhe&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Außerdem braucht man die Bibliothek NimBLEDevice.h für die Security Einstellungen.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;BleKeyboard.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;Preferences.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;esp_sleep.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;driver&#x2F;gpio.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;esp_system.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;NimBLEDevice.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;BleKeyboard &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;bleKeyboard&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Blauer Button&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Espressif&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;Preferences preferences&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; buttonPin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; ESP32-C3 GPIO3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const unsigned long&lt;&#x2F;span&gt;&lt;span&gt; awakeTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 10 Sekunden wach
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const unsigned long&lt;&#x2F;span&gt;&lt;span&gt; bleTimeout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;15000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 15 Sekunden für BLE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; HIGH&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; startTime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Bereite Deep Sleep vor...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Warte bis Button losgelassen
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; BLE sauber beenden
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Beende BLE...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Konfiguriere Deep Sleep GPIO Wakeup...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; GPIO Pin Maske erstellen
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;uint64_t&lt;&#x2F;span&gt;&lt;span&gt; gpio_pin_mask &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;ULL &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Deep Sleep GPIO Wakeup aktivieren
&lt;&#x2F;span&gt;&lt;span&gt;  esp_err_t err &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_deep_sleep_enable_gpio_wakeup&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;    gpio_pin_mask&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, 
&lt;&#x2F;span&gt;&lt;span&gt;    ESP_GPIO_WAKEUP_GPIO_LOW
&lt;&#x2F;span&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(err &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; ESP_OK) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;OK - Deep Sleep Wakeup fuer GPIO &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; aktiviert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;FEHLER bei GPIO Wakeup Config: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; err)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;GPIO &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Status vor Sleep: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Gehe schlafen... (Druecke Button zum Aufwachen)&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_deep_sleep_start&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;115200&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; INPUT_PULLUP)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;=============================&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;=== ESP32-C3 AUFGEWACHT! ===&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;=============================&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  esp_sleep_wakeup_cause_t wakeup_reason &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;esp_sleep_get_wakeup_cause&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Wakeup Cause: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; wakeup_reason)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span&gt;(wakeup_reason) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt; ESP_SLEEP_WAKEUP_GPIO&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; ERFOLG: Wakeup durch GPIO!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt; ESP_SLEEP_WAKEUP_TIMER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Wakeup durch Timer!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt; ESP_SLEEP_WAKEUP_UNDEFINED&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Power-On &#x2F; Reset &#x2F; Upload&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;GPIO &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Status: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; ERST BleKeyboard starten
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Starte BLE Keyboard...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Wichtig: Warten bis BLE komplett initialisiert ist!
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; DANN Security konfigurieren
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Konfiguriere Bonding...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  NimBLEDevice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setSecurityAuth&lt;&#x2F;span&gt;&lt;span&gt;(BLE_SM_PAIR_AUTHREQ_BOND)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  NimBLEDevice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setSecurityIOCap&lt;&#x2F;span&gt;&lt;span&gt;(BLE_HS_IO_NO_INPUT_OUTPUT)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;OK - Just Works Bonding aktiviert!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;==============================&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  PAIRING: Keine PIN noetig!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;==============================&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;PAIRING-ANLEITUNG:&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  1. Bluetooth-Einstellungen oeffnen&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  2. &amp;#39;Blauer Button&amp;#39; suchen&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  3. Auf &amp;#39;Verbinden&amp;#39; tippen&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  4. Pairing bestaetigen (kein PIN!)&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  5. Verbindung wird gespeichert!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;  6. Bei erneutem Wake-up: Auto-Reconnect!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;BLE gestartet - warte auf Verbindung...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Warte auf BLE und sende dann
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;alreadySentOnWake) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isConnected&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; BLE VERBUNDEN!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; Sende &amp;#39;2&amp;#39;...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;#39;2&amp;#39; erfolgreich gesendet!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zeige Wartezeit an
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; elapsed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; startTime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(elapsed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2000 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;) {  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Alle 2 Sekunden
&lt;&#x2F;span&gt;&lt;span&gt;        Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Warte auf BLE... (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%lu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;%lu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; ms)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; elapsed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; bleTimeout)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;      
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(elapsed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; bleTimeout) {
&lt;&#x2F;span&gt;&lt;span&gt;        Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; BLE Timeout - gehe schlafen&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Tipp: Pairing in Bluetooth-Einstellungen pruefen!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Nach Senden: 10 Sekunden wach
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(alreadySentOnWake &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span&gt; awakeTime) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Awake-Timeout erreicht!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;goToSleep&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Button während Wachzeit
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; HIGH) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;isConnected&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Button gedrueckt - Sende &amp;#39;2&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      bleKeyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;#39;2&amp;#39; gesendet!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      startTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Timer zurücksetzen
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Button gedrueckt - aber nicht verbunden!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  lastButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; buttonState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/ble-button-deep-sleep-esp32/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/ble-button-deep-sleep-esp32/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ein stromsparender Bluetooth-Button für das Tourismus-Glücksrad - mit Deep Sleep, Bonding und monatelanger Batterielebensdauer. Von Fehlschlägen, Debugging-Sessions und dem finalen Durchbruch. </info>
        </item>
        <item>
            <title>Und schon wieder ein Dashboard: Ipad Air Gen1 - Cheap and Funny</title>
            <pubDate>Thu, 30 Oct 2025 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/ipad-air-gen1-dashboard-cheap-and-funny/</link>
            <guid>https://simeon.staneks.de/posts/ipad-air-gen1-dashboard-cheap-and-funny/</guid>
            <description xml:base="https://simeon.staneks.de/posts/ipad-air-gen1-dashboard-cheap-and-funny/">&lt;h1 id=&quot;19eur-smart-home-dashboard-mit-ipad-air-gen1-cheap-and-funny&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#19eur-smart-home-dashboard-mit-ipad-air-gen1-cheap-and-funny&quot; aria-label=&quot;Anchor link for: 19eur-smart-home-dashboard-mit-ipad-air-gen1-cheap-and-funny&quot;&gt;19€ Smart Home Dashboard mit iPad Air Gen1 - Cheap and Funny&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Im Grunde war der Plan, das Dashboard des vorherigen Artikels mit einem Raspberry Pi und einem alten Laptop Display zu realisieren. Aber dann habe ich ein iPad Air der ersten Generation für nur 19€ auf Kleinanzeigen gefunden. Da konnte ich einfach nicht widerstehen. Das iPad Air Gen1 hat einen 9,7 Zoll Retina Bildschirm mit einer Auflösung von 2048 x 1536 Pixeln, was für ein Dashboard absolut ausreichend ist. Außerdem ist es leicht, kompakt und hat eine gute Akkulaufzeit. Viel wichtiger ist jedoch, dass es günstiger ist als ein Raspberry Pi mit Display und es macht einfach Spaß, mit einem iPad zu arbeiten.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-cordova-app-als-dashboard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-cordova-app-als-dashboard&quot; aria-label=&quot;Anchor link for: das-konzept-cordova-app-als-dashboard&quot;&gt;Das Konzept: Cordova App als Dashboard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Anstatt das iPad zu jailbreaken, habe ich mich entschieden, eine Cordova App zu erstellen, die mein Dashboard anzeigt. Cordova ermöglicht es, Webanwendungen in native Apps zu verwandeln und es ist einfach, HTML, CSS und JavaScript zu verwenden, um die Benutzeroberfläche zu gestalten. Die App läuft im Vollbildmodus und bietet eine nahtlose Erfahrung.&lt;&#x2F;p&gt;
&lt;p&gt;Außerdem kann sie unter &lt;a href=&quot;https:&#x2F;&#x2F;buymeacoffee.com&#x2F;simeonlukas&#x2F;e&#x2F;456968&quot;&gt;Buy me a coffee - Shop&lt;&#x2F;a&gt; erworben werden, falls jemand Interesse hat. Eine Anleitung zur Verwendung wird automatisch mitgeliefert. Hier eine Kurzanleitung:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ios-kiosk-app-so-installierst-du-sie-auf-deinem-ipad&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ios-kiosk-app-so-installierst-du-sie-auf-deinem-ipad&quot; aria-label=&quot;Anchor link for: ios-kiosk-app-so-installierst-du-sie-auf-deinem-ipad&quot;&gt;iOS Kiosk App: So installierst du sie auf deinem iPad&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;was-du-benotigst&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#was-du-benotigst&quot; aria-label=&quot;Anchor link for: was-du-benotigst&quot;&gt;Was du benötigst&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;iPad mit iOS 12.5.7 oder höher&lt;br &#x2F;&gt;
Computer (Windows oder macOS)&lt;br &#x2F;&gt;
Sideloadly (kostenlos)&lt;br &#x2F;&gt;
Apple ID (kostenlos)&lt;br &#x2F;&gt;
iOS Kiosk App-Datei (.ipa)&lt;&#x2F;p&gt;
&lt;h4 id=&quot;installation-in-3-schritten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation-in-3-schritten&quot; aria-label=&quot;Anchor link for: installation-in-3-schritten&quot;&gt;Installation in 3 Schritten&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;ol&gt;
&lt;li&gt;Sideloadly einrichten
Lade Sideloadly von sideloadly.io herunter und installiere die Software auf deinem Computer.&lt;&#x2F;li&gt;
&lt;li&gt;iPad verbinden
Verbinde dein iPad per USB-Kabel mit dem Computer und bestätige die Vertrauensanfrage auf dem iPad.&lt;&#x2F;li&gt;
&lt;li&gt;App installieren
Öffne Sideloadly, ziehe die .ipa-Datei in das Programmfenster, gib deine Apple ID ein, wähle dein iPad aus und klicke auf &quot;Start Sideloading&quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;erste-einrichtung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#erste-einrichtung&quot; aria-label=&quot;Anchor link for: erste-einrichtung&quot;&gt;Erste Einrichtung&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Beim ersten Start der App erscheint automatisch ein Konfigurationsfenster. Gib hier die URL deiner gewünschten Website oder deines Dashboards ein und bestätige mit &quot;OK&quot;. Die App startet automatisch im Vollbildmodus ohne sichtbare Statusleiste.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;konfiguration-anpassen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#konfiguration-anpassen&quot; aria-label=&quot;Anchor link for: konfiguration-anpassen&quot;&gt;Konfiguration anpassen&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Nach dem App-Start erscheint für 5 Sekunden ein &quot;Konfiguration&quot;-Button. Tippe darauf, um die angezeigte URL jederzeit zu ändern.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;wichtige-hinweise&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wichtige-hinweise&quot; aria-label=&quot;Anchor link for: wichtige-hinweise&quot;&gt;Wichtige Hinweise&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Zertifikat-Laufzeit: Mit einer kostenlosen Apple ID läuft das App-Zertifikat 7 Tage. Danach musst du die App neu installieren. Ein kostenpflichtiger Apple Developer Account (99€&#x2F;Jahr) verlängert die Laufzeit auf 1 Jahr.
Optimale Nutzung: Deaktiviere die automatische iPad-Sperre in den Einstellungen und verwende eine stabile WLAN-Verbindung. Für zusätzliche Sicherheit empfiehlt sich die Aktivierung von iOS Guided Access unter Einstellungen &amp;gt; Bedienungshilfen.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;fehlerbehebung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fehlerbehebung&quot; aria-label=&quot;Anchor link for: fehlerbehebung&quot;&gt;Fehlerbehebung&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Falls die Website nicht lädt, überprüfe die URL auf Tippfehler und die Internetverbindung deines iPads. Bei Problemen hilft meist eine Neuinstallation der App über Sideloadly.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;ipad-air-gen1-dashboard-cheap-and-funny&#x2F;images&#x2F;image001.jpeg&quot; alt=&quot;Dashboard&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das iPad Air Gen1 als Smart Home Dashboard ist eine clevere und kostengünstige Alternative zu Raspberry Pi Lösungen. Für gerade einmal 19€ bekommst du ein hochwertiges 9,7 Zoll Retina Display mit exzellenter Auflösung, das sich perfekt für die Dashboard-Visualisierung eignet.&lt;&#x2F;p&gt;
&lt;p&gt;Die Cordova-basierte Kiosk App bietet eine elegante Lösung ohne Jailbreak und lässt sich dank Sideloadly kinderleicht installieren. Der einzige Wermutstropfen ist die 7-Tage-Zertifikatslaufzeit bei kostenloser Apple ID – aber hey, für 19€ kann man auch alle Woche einmal das iPad kurz anstöpseln. (Oder man hat wie ich zum Glück einen kostenpflichtigen Apple Developer Account)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Vorteile auf einen Blick:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Extrem günstiger Einstieg (19€ gebraucht)&lt;&#x2F;li&gt;
&lt;li&gt;Brillantes Retina Display&lt;&#x2F;li&gt;
&lt;li&gt;Einfache Installation ohne technische Vorkenntnisse&lt;&#x2F;li&gt;
&lt;li&gt;Kein Jailbreak notwendig&lt;&#x2F;li&gt;
&lt;li&gt;Kompakt, leicht und stromsparend&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Nachteile:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Wöchentliche Neuinstallation bei kostenloser Apple ID&lt;&#x2F;li&gt;
&lt;li&gt;Auf Sideloadly angewiesen (keine App Store Lösung)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Für alle, die ein günstiges, schickes Smart Home Display suchen und keine Lust auf Bastelei mit Raspberry Pi haben, ist diese Lösung perfekt. Und mal ehrlich: Es macht einfach mehr Spaß, mit einem iPad zu arbeiten als mit einem zusammengebastelten Display-Setup, dass vielleicht beim Hinschauen schon wieder auseinanderfällt.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/ipad-air-gen1-dashboard-cheap-and-funny/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/ipad-air-gen1-dashboard-cheap-and-funny/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ja ich weiß, schon wieder ein Dashboard. Aber dieses Mal mit einem iPad Air der ersten Generation. Warum? Weil es günstig ist, Spaß macht und perfekt für mein Smart Home Setup geeignet ist. Im Grunde ist es das Display für mein Dashboard im vorherigen Artikel </info>
        </item>
        <item>
            <title>Wie ein Kindle aus dem Jahr 2011 mein Pip-Boy fürs Home wurde</title>
            <pubDate>Mon, 01 Sep 2025 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/another-magic-home-dashboard-with-kindle/</link>
            <guid>https://simeon.staneks.de/posts/another-magic-home-dashboard-with-kindle/</guid>
            <description xml:base="https://simeon.staneks.de/posts/another-magic-home-dashboard-with-kindle/">&lt;h1 id=&quot;wie-ein-kindle-aus-der-vergangenen-zeit-mein-hub-fur-das-smart-home-wurde&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wie-ein-kindle-aus-der-vergangenen-zeit-mein-hub-fur-das-smart-home-wurde&quot; aria-label=&quot;Anchor link for: wie-ein-kindle-aus-der-vergangenen-zeit-mein-hub-fur-das-smart-home-wurde&quot;&gt;Wie ein Kindle aus der vergangenen Zeit mein Hub für das Smart Home wurde&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Das Tutorial ist für meinen lieben Freund &lt;a href=&quot;https:&#x2F;&#x2F;enthusiastic.dev&#x2F;&quot;&gt;J.&lt;&#x2F;a&gt; und alle anderen, die vielleicht auch so ein altes Kindle-Gerät herumliegen haben und es als Smart Home Dashboard nutzen möchten - oder einfach nur, weil sie Spaß an so etwas haben. 2020 hat mir mein Schwager das alte Kindle 4 Touch geschenkt, das er nicht mehr brauchte. Ursprünglich wollte ich es als E-Book-Reader nutzen, aber nach ein paar Wochen merkte ich, dass ich es kaum benutzte. Also begann ich, nach anderen Verwendungsmöglichkeiten zu suchen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-ein-interface-das-jeden-endzeitkrieg-ubersteht&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-ein-interface-das-jeden-endzeitkrieg-ubersteht&quot; aria-label=&quot;Anchor link for: das-konzept-ein-interface-das-jeden-endzeitkrieg-ubersteht&quot;&gt;Das Konzept: Ein Interface, das jeden Endzeitkrieg übersteht&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Kindle soll wie ein Pip-Boy sein. Naja... ähm... zumindest ein bisschen. Es soll mir ermöglichen, mein Smart Home, die Squeezeboxen zu steuern, ohne dass ich ständig mein Smartphone oder PC benutzen muss. Das Gerät ist robust und braucht wenig Strom. Außerdem hat es einen E-Ink-Bildschirm, der auch bei direkter Sonneneinstrahlung gut lesbar ist - perfekt für den Einsatz in verschiedenen Lichtverhältnissen. Außerdem dient es als Anzeige für unterschiedliche Bilder (je nach Wetter) und die Abfallabfuhrtermine sollen auch erkennbar sein. Also fast wie ein Pip-Boy, außer Waffen und den Rest. Das einzige was vielleicht ein bisschen daran erinnert, ist die Tatsache, dass das Gerät die Musik steuert und einfach alt ist.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;die-technische-umsetzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-technische-umsetzung&quot; aria-label=&quot;Anchor link for: die-technische-umsetzung&quot;&gt;Die technische Umsetzung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Projekt basiert auf mehreren Technologien und Komponenten:&lt;&#x2F;p&gt;
&lt;h4 id=&quot;software&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#software&quot; aria-label=&quot;Anchor link for: software&quot;&gt;Software&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;&#x2F;strong&gt; für die Struktur&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;&#x2F;strong&gt; für das Design und die richtige Anzeige auf dem E-Ink-Display&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;&#x2F;strong&gt; für die Interaktivität&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;PHP&lt;&#x2F;strong&gt; für die serverseitige Logik&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;hardware&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hardware&quot; aria-label=&quot;Anchor link for: hardware&quot;&gt;Hardware&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;jailbroken Kindle 4 Touch&lt;&#x2F;strong&gt; als Display und Steuergerät&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Micro-USB-Kabel&lt;&#x2F;strong&gt; für die Stromversorgung&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bilderrahmen&lt;&#x2F;strong&gt; als Case&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;der-jailbreak-mit-aktuellen-developer-zertifikaten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-jailbreak-mit-aktuellen-developer-zertifikaten&quot; aria-label=&quot;Anchor link for: der-jailbreak-mit-aktuellen-developer-zertifikaten&quot;&gt;Der Jailbreak mit aktuellen Developer Zertifikaten&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In diesem Jahr sind tatsächlich die alten Developer-Zertifikate für das Mobileread Kindlet Kit abgelaufen und die Extensions, vor allem KUAL (Kindle Unified Application Launcher) auf den früheren jailbroken Kindle-Geräten funktionieren nicht mehr. Aber keine Sorge, es gibt eine Lösung! Mit den neuen Zertifikaten von &lt;a href=&quot;https:&#x2F;&#x2F;www.mobileread.com&#x2F;forums&#x2F;showpost.php?p=4506164&amp;amp;postcount=1295&quot;&gt;NiLuJe&lt;&#x2F;a&gt; läuft alles wieder wie geschmiert.&lt;&#x2F;p&gt;
&lt;p&gt;Hier ist eine kurze Anleitung, wie du dein Kindle 4 Touch jailbreaken kannst:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Vorbereitung&lt;&#x2F;strong&gt;: Verbinde dein Kindle mit dem Computer und sichere alle wichtigen Daten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Download der aktuellen Updates für dein Kindle&lt;&#x2F;strong&gt;: Lade die neueste Firmware von der &lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;-&#x2F;de&#x2F;gp&#x2F;help&#x2F;customer&#x2F;display.html?nodeId=GX3VVAQS4DYDE5KE#GUID-4C9EFFF2-2B4E-4DB8-997D-6DC9B3566220__SECTION_AA6BD2D5AAF04CE196510F7D3FA2B2F0&quot;&gt;Amazon-Website&lt;&#x2F;a&gt; herunter. In diesem Fall (Kindle 4 Touch) muss dein Kindle bis zur Verion &lt;em&gt;5.3.7.3&lt;&#x2F;em&gt; geupdatet werden. Die .bin Datei wird in das Wurzelverzeichnis des Kindles kopiert und über das &quot;Menü&quot; -&amp;gt; &quot;Einstellungen&quot; -&amp;gt; &quot;Menü&quot; -&amp;gt; &quot;Kindle aktualisieren&quot; installiert. Das Gerät startet danach neu.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Download der Jailbreak-Dateien&lt;&#x2F;strong&gt;: Lade die aktuellen &lt;a href=&quot;https:&#x2F;&#x2F;storage.gra.cloud.ovh.net&#x2F;v1&#x2F;AUTH_2ac4bfee353948ec8ea7fd1710574097&#x2F;mr-public&#x2F;Touch&#x2F;kindle-jailbreak-1.16.N-r19426.tar.xz&quot;&gt;Jailbreak-Dateien&lt;&#x2F;a&gt; herunter.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vorbereitung des Jailbreaks&lt;&#x2F;strong&gt;: Entpacke die heruntergeladenen Dateien und kopiere den Inhalt von &lt;em&gt;kindle-5.4-jailbreak.zip&lt;&#x2F;em&gt; in das Wurzelverzeichnis deines Kindles.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zertifikate austauschen&lt;&#x2F;strong&gt;: Lade die neuen Zertifikate von &lt;a href=&quot;https:&#x2F;&#x2F;storage.gra.cloud.ovh.net&#x2F;v1&#x2F;AUTH_2ac4bfee353948ec8ea7fd1710574097&#x2F;mr-public&#x2F;KUAL&#x2F;developer.keystore&quot;&gt;NiLuJe&lt;&#x2F;a&gt; herunter und ersetze die alte &lt;em&gt;developer.keystore&lt;&#x2F;em&gt; Datei im Wurzelverzeichnis deines Kindles.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Installation des Jailbreaks&lt;&#x2F;strong&gt;: Aktiviere den Jailbreak über das &quot;Menü&quot; -&amp;gt; &quot;Einstellungen&quot; -&amp;gt; &quot;Menü&quot; -&amp;gt; &quot;Kindle aktualisieren&quot;. Wenn alles geklappt hat, dann müsste am unteren Rand des Bildschirms &lt;strong&gt;**Jailbreak**&lt;&#x2F;strong&gt; stehen. Das Gerät muss danach neu gestartet werden.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;anleitung-fur-bisherige-jailbroken-kindles-mit-kual&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anleitung-fur-bisherige-jailbroken-kindles-mit-kual&quot; aria-label=&quot;Anchor link for: anleitung-fur-bisherige-jailbroken-kindles-mit-kual&quot;&gt;Anleitung für bisherige Jailbroken Kindles mit KUAL&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Falls dein Kindle bereits jailbroken ist, dann kannst du direkt die Zertifikate austauschen, indem du folgende Datei von &lt;a href=&quot;https:&#x2F;&#x2F;www.mobileread.com&#x2F;forums&#x2F;attachment.php?attachmentid=215127&amp;amp;d=1745098511&quot;&gt;NiLuJe&lt;&#x2F;a&gt; herunterlädst und die passende .bin-Datei für dein Kindle in das Wurzelverzeichnis deines Kindles packst. In diesem Fall wäre es &lt;em&gt;Update_mkk-20250419-k4-ALL_keystore-install.bin&lt;&#x2F;em&gt;. Danach kannst du die Datei über das &quot;Menü&quot; -&amp;gt; &quot;Einstellungen&quot; -&amp;gt; &quot;Menü&quot; -&amp;gt; &quot;Kindle aktualisieren&quot; installieren. KUAL sollte wieder funktionieren.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;installation-von-kual-und-weblaunch&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation-von-kual-und-weblaunch&quot; aria-label=&quot;Anchor link for: installation-von-kual-und-weblaunch&quot;&gt;Installation von KUAL und WebLaunch&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Download und Installation von KUAL&lt;&#x2F;strong&gt;: Lade die neueste Version von &lt;a href=&quot;https:&#x2F;&#x2F;www.mobileread.com&#x2F;forums&#x2F;showthread.php?t=225030&quot;&gt;KUAL&lt;&#x2F;a&gt; herunter. Entpacke die ZIP-Datei und kopiere in das &lt;em&gt;documents&lt;&#x2F;em&gt; Verzeichnis deines Kindles die Datei &lt;em&gt;KUAL-KDK-2.0.azw2&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Download und Installation von WebLaunch&lt;&#x2F;strong&gt;: Lade die neueste Version von &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;PaulFreund&#x2F;WebLaunch&quot;&gt;WebLaunch&lt;&#x2F;a&gt; herunter. Entpacke die ZIP-Datei und kopiere den gesamten Inhalt in ein Verzeichnis namens &lt;em&gt;WebLaunch&lt;&#x2F;em&gt; in das &lt;em&gt;extension&lt;&#x2F;em&gt; Verzeichnis deines Kindles.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Konfiguration von WebLaunch&lt;&#x2F;strong&gt;: Erstelle eine &lt;em&gt;settings.js&lt;&#x2F;em&gt; Datei im &lt;em&gt;WebLaunch&lt;&#x2F;em&gt; Verzeichnis und passe diese an (siehe unten). Starte KUAL auf dem Homescreen deines Kindles, wähle WebLaunch aus und schon müsste die Webseite erscheinen.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;struktur-und-konfiguration-der-settings-js-datei&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#struktur-und-konfiguration-der-settings-js-datei&quot; aria-label=&quot;Anchor link for: struktur-und-konfiguration-der-settings-js-datei&quot;&gt;Struktur und Konfiguration der &lt;em&gt;settings.js&lt;&#x2F;em&gt; Datei&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;├── extensions&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   ├── WebLaunch&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   │   ├── Alle Dateien von WebLaunch und
&lt;&#x2F;span&gt;&lt;span&gt;|   │   └── settings.js
&lt;&#x2F;span&gt;&lt;span&gt;|── documents&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   ├── KUAL-KDK-2.0.azw2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span&gt;settings &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;{ 
&lt;&#x2F;span&gt;&lt;span&gt;	url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;#39;http:&#x2F;&#x2F;192.168.178.***&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; IP-Adresse deines Dashboards (achte darauf, dass es per HTTP erreichbar ist), du kannst auch eine lokale HTML-Datei angeben, z.B. &amp;#39;control.html&amp;#39;, die muss dann im Ordner &amp;#39;bin&amp;#39; liegen.
&lt;&#x2F;span&gt;&lt;span&gt;	title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;#39;Pip-Boy Home&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, 
&lt;&#x2F;span&gt;&lt;span&gt;	hideStatusbar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	enableWireless&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	powerButtonClose&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	enablePreventScreenSaver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;	landscape&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;jetzt-bist-du-dran&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jetzt-bist-du-dran&quot; aria-label=&quot;Anchor link for: jetzt-bist-du-dran&quot;&gt;Jetzt bist du dran!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nachdem du dein Kindle erfolgreich jailbroken und KUAL sowie WebLaunch installiert hast, kannst du jetzt dein eigenes Smart Home Dashboard erstellen. Hier ist ein einfaches Beispiel, wie du eine HTML-Seite für dein Dashboard gestalten kannst:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;DOCTYPE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;html &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;lang&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;de&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;charset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;viewport&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Smart Home Dashboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;div &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;dashboard&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Willkommen zu deinem Smart Home Dashboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;button &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;onclick&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;toggleLight1&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Licht An&#x2F;Aus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Hier kannst du weitere Smart Home Steuerungselemente hinzufügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;div&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;toggleLight1&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Hier kommt der Code zum Steuern deines Smart Home Lichts hin
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;xmlhttp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;new &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;XMLHttpRequest&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Beispiel für eine Shelly-API-Anfrage
&lt;&#x2F;span&gt;&lt;span&gt;			xmlhttp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;GET&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;192.168.178.***&#x2F;light&#x2F;0?turn=toggle&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;			xmlhttp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Denke daran, dass das Kindle JavaScript nur eingeschränkt unterstütz. Aktuelle Funktionen wie fetch fehlen.
&lt;&#x2F;span&gt;&lt;span&gt;		}
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So schaut mein Ergebnis aus:&lt;&#x2F;p&gt;
&lt;style&gt;
     .containerimg img {
        width: 200px;
       min-height: 200px;
        margin: 0 10px;
    }
  .containerimg  .full {
        width: 95%;
        height: auto;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div  class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;another-magic-home-dashboard-with-kindle&#x2F;images&#x2F;image1.jpeg&quot; alt=&quot;Foto vom Kindle&quot;&gt;
&lt;img  class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;another-magic-home-dashboard-with-kindle&#x2F;images&#x2F;image2.jpeg&quot; alt=&quot;Foto vom Kindle&quot;&gt;
&lt;img  class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;another-magic-home-dashboard-with-kindle&#x2F;images&#x2F;image3.jpeg&quot; alt=&quot;Foto vom Kindle&quot;&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Aus einem verstaubten E-Reader von 2011 ist ein funktionales Smart Home Dashboard geworden - und das mit überraschend wenig Aufwand. Das Kindle überzeugt durch seinen stromsparenden E-Ink-Bildschirm, die einfache Bedienung und die robuste Hardware.
Was als Experiment begann, läuft nun seit Monaten zuverlässig und steuert täglich Licht, Musik und andere Smart Home Geräte. Alte Hardware muss nicht im Schrank verstauben - manchmal braucht sie nur eine neue Aufgabe. Und falls doch mal die Apokalypse kommt, haben wir schon mal ein funktionierendes Terminal.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/another-magic-home-dashboard-with-kindle/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/another-magic-home-dashboard-with-kindle/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Technik... Technik bleibt immer gliech - oder? Wie ich mit HTML, PHP, CSS und JavaScript ein Smart Home Dashboard auf einem alten jailbroken Kindle 4 Touch realisierte. Ein leichtes Tutorial vom Jailbreaken bis zum fertigen Dashboard. </info>
        </item>
        <item>
            <title>Wie man mit drei Ingredienzien ein magisches Smart Home Dashboard braut</title>
            <pubDate>Tue, 26 Aug 2025 12:00:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/home-dashboard-pixelart-pointandclick/</link>
            <guid>https://simeon.staneks.de/posts/home-dashboard-pixelart-pointandclick/</guid>
            <description xml:base="https://simeon.staneks.de/posts/home-dashboard-pixelart-pointandclick/">&lt;h1 id=&quot;wie-man-mit-drei-ingredienzien-ein-magisches-smart-home-dashboard-braut&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wie-man-mit-drei-ingredienzien-ein-magisches-smart-home-dashboard-braut&quot; aria-label=&quot;Anchor link for: wie-man-mit-drei-ingredienzien-ein-magisches-smart-home-dashboard-braut&quot;&gt;Wie man mit drei Ingredienzien ein magisches Smart Home Dashboard braut&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;em&gt;oder: &quot;Mein Name ist Simeon Stanek und ich will Pirat ähhhh. Programmierer werden!&quot;&lt;&#x2F;em&gt;
Als technikbegeisterter Mensch mit einem Smart Home System stand ich vor einem Rätsel, das selbst der mächtige Voodoo-Priester von Mêlée Island™ nicht hätte lösen können: Wie steuert man ein modernes Zuhause, ohne sich in einem Labyrinth aus Apps zu verlieren? Die Antwort war so einfach wie das Mischen eines Grog: Ich würde mein eigenes Dashboard entwickeln - mit den drei magischen Zutaten des Webs: HTML, CSS und JavaScript.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-ein-interface-das-selbst-lechuck-beeindrucken-wurde&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-ein-interface-das-selbst-lechuck-beeindrucken-wurde&quot; aria-label=&quot;Anchor link for: das-konzept-ein-interface-das-selbst-lechuck-beeindrucken-wurde&quot;&gt;Das Konzept: Ein Interface, das selbst LeChuck beeindrucken würde&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Dashboard sollte vor allem eines sein: funktional. Ich brauchte eine Übersicht über verschiedene Räume und die Möglichkeit, Lichter und andere Geräte zu steuern. Die Benutzeroberfläche sollte intuitiv sein und sich an meine Gewohnheiten anpassen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;die-technische-umsetzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-technische-umsetzung&quot; aria-label=&quot;Anchor link for: die-technische-umsetzung&quot;&gt;Die technische Umsetzung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Projekt basiert auf drei Hauptkomponenten:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;&#x2F;strong&gt; für die Struktur&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;&#x2F;strong&gt; für das Design&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;&#x2F;strong&gt; für die Interaktivität&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Die Daten werden in einer JSON-Datei gespeichert, die als eine Art einfache Datenbank fungiert. Dies ermöglicht es mir, Änderungen an der Konfiguration vorzunehmen, ohne den Code anzufassen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;die-raume-meine-personliche-scumm-bar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-raume-meine-personliche-scumm-bar&quot; aria-label=&quot;Anchor link for: die-raume-meine-personliche-scumm-bar&quot;&gt;Die Räume - Meine persönliche SCUMM-Bar&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Dashboard zeigt verschiedene Räume meines Zuhauses - quasi wie eine moderne Version der SCUMM-Bar, nur dass hier statt Grog verschiedene Smart-Home-Getränke ausgeschenkt werden:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Wohnzimmer (hier gibt&#x27;s definitiv besseres Licht als in der Taverne)&lt;&#x2F;li&gt;
&lt;li&gt;Schlafzimmer (perfekt für einen Powernap zwischen den Abenteuern)&lt;&#x2F;li&gt;
&lt;li&gt;Diele (der erste Eindruck zählt, auch ohne sprechenden Totenkopf)&lt;&#x2F;li&gt;
&lt;li&gt;Esszimmer (hier schmeckt sogar das Root Beer™)&lt;&#x2F;li&gt;
&lt;li&gt;Küche (für die unvergleichliche Hintergrundmusik beim Kochen)&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Stock (wo die geheimen Schätze lagern)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Fernseherzimmer (für die epischen Filmabende)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jeder Raum wird durch ein eigenes Bild repräsentiert und zeigt den aktuellen Status der Geräte an - ganz ohne Voodoo-Zauber oder sprechende Schädel. Die Bilder habe ich so gewählt, dass sie den jeweiligen Raum gut repräsentieren und gleichzeitig eine atmosphärische Stimmung schaffen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;die-steuerung-ein-mini-point-and-click-adventure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-steuerung-ein-mini-point-and-click-adventure&quot; aria-label=&quot;Anchor link for: die-steuerung-ein-mini-point-and-click-adventure&quot;&gt;Die Steuerung: Ein Mini-Point-and-Click-Adventure&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Als großer Fan von Point-and-Click-Adventurespielen wollte ich etwas von diesem spielerischen Charme in mein Dashboard bringen. Statt gewöhnlicher Buttons habe ich mich für eine HTML Image Map entschieden - eine Technik, die viele vielleicht noch aus den klassischen Adventure-Spielen kennen. Man klickt einfach direkt auf die Objekte im Raum, die man steuern möchte, ganz wie bei einem Adventure-Spiel.&lt;&#x2F;p&gt;
&lt;p&gt;Für jedes Gerät gibt es klickbare Bereiche im Raumbild:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hauptbeleuchtung - ein Klick auf die Deckenlampe&lt;&#x2F;li&gt;
&lt;li&gt;Ambientebeleuchtung (wie die Stehlampe im Wohnzimmer) - direkt auf die Lampe klicken&lt;&#x2F;li&gt;
&lt;li&gt;Andere Geräte (wie Musik in der Küche) - einfach das entsprechende Gerät anklicken&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Die Statusänderungen werden sofort visuell dargestellt, sodass man auf einen Blick sehen kann, welche Geräte eingeschaltet sind - fast wie wenn man in einem Adventure-Spiel ein Rätsel gelöst hat und sich die Umgebung verändert. Diese spielerische Interaktion macht die Steuerung nicht nur funktional, sondern auch unterhaltsam.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;besonderheiten-der-implementierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#besonderheiten-der-implementierung&quot; aria-label=&quot;Anchor link for: besonderheiten-der-implementierung&quot;&gt;Besonderheiten der Implementierung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;performante-datenhaltung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#performante-datenhaltung&quot; aria-label=&quot;Anchor link for: performante-datenhaltung&quot;&gt;Performante Datenhaltung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die Daten werden in einer JSON-Datei gespeichert:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data.json&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;wohnzimmer&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;items&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span&gt;[
&lt;&#x2F;span&gt;&lt;span&gt;            {
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Licht Wohnzimmer&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;coords&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;972,194,120&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shape&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;circle&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ip&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;192.168.178.***&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;device&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shelly&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;onclick&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shelly(&amp;#39;192.168.178.***&amp;#39;, &amp;#39;light&amp;#39;, &amp;#39;toggle&amp;#39;)&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;            {
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;name&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Stehlampe Wohnzimmer&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;coords&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;1395,797,1467,489&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shape&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;rect&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ip&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;192.168.178.***&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;device&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shelly&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;onclick&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;shelly(&amp;#39;192.168.178.***&amp;#39;, &amp;#39;relay&amp;#39;, &amp;#39;toggle&amp;#39;)&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;            }
&lt;&#x2F;span&gt;&lt;span&gt;        ]
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f51818;&quot;&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;bildoptimierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bildoptimierung&quot; aria-label=&quot;Anchor link for: bildoptimierung&quot;&gt;Bildoptimierung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die Bilder wurden sorgfältig ausgewählt und optimiert, um schnelle Ladezeiten zu gewährleisten. Für Status-Änderungen werden kleine, effiziente PNG-Dateien oder für Animationen GIF-Dateien verwendet.&lt;&#x2F;p&gt;
&lt;p&gt;By the way: Die Bilder wurden alle mit ChatGPT generiert. Ich habe einfach Fotos von meinen Räumen gemacht und diese dann als Anhang zum Prompt &quot;Verwandle das in ein Pixelart-Image wie bei einem Point-and-Click-Adventure&quot; hinzugefügt. Die Ergebnisse sind überraschend gut geworden!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;struktur-und-beispiele&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#struktur-und-beispiele&quot; aria-label=&quot;Anchor link for: struktur-und-beispiele&quot;&gt;Struktur und Beispiele&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;struktur&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#struktur&quot; aria-label=&quot;Anchor link for: struktur&quot;&gt;Struktur&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Projekt folgt einer klaren Ordnerstruktur:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;├── css&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   ├── style.css
&lt;&#x2F;span&gt;&lt;span&gt;│   └── style.min.css
&lt;&#x2F;span&gt;&lt;span&gt;├── js&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   ├── script.js
&lt;&#x2F;span&gt;&lt;span&gt;│   └── script.min.js
&lt;&#x2F;span&gt;&lt;span&gt;├── images&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;│   └── [verschiedene Bilder für Räume und Status]
&lt;&#x2F;span&gt;&lt;span&gt;├── data.json
&lt;&#x2F;span&gt;&lt;span&gt;└── index.html
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;beispiele&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#beispiele&quot; aria-label=&quot;Anchor link for: beispiele&quot;&gt;Beispiele&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;video controls style=&quot;max-width: 100%; height: auto;&quot;&gt;
  &lt;source src=&quot;images&#x2F;clip.mp4&quot; type=&quot;video&#x2F;mp4&quot;&gt;
  Your browser does not support the video tag.
&lt;&#x2F;video&gt;
&lt;h2 id=&quot;fazit-und-ausblick-das-ende-dieser-entwickler-geschichte&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit-und-ausblick-das-ende-dieser-entwickler-geschichte&quot; aria-label=&quot;Anchor link for: fazit-und-ausblick-das-ende-dieser-entwickler-geschichte&quot;&gt;Fazit und Ausblick - Das Ende dieser Entwickler-Geschichte&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Dashboard erfüllt seinen Zweck perfekter als ein Gummihühnchen mit Rolle: Es bietet eine einfache, schnelle und zuverlässige Möglichkeit, mein Smart Home zu steuern. Die Verwendung von Webtechnologien macht es so flexibel.&lt;&#x2F;p&gt;
&lt;p&gt;Für die Zukunft plane ich einige Erweiterungen (oder wie Murray sagen würde: &quot;Mächtige Pläne!&quot;):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Integration weiterer Smart Home Geräte (vielleicht sogar ein Root Beer™ Dispenser?)&lt;&#x2F;li&gt;
&lt;li&gt;Automatisierungsregeln direkt im Dashboard (komplizierter als das Rezept für Monkey Island™ Grog)&lt;&#x2F;li&gt;
&lt;li&gt;Statistiken zur Nutzung&lt;&#x2F;li&gt;
&lt;li&gt;Energieverbrauchsüberwachung&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Das Projekt zeigt, dass man auch mit einfachen Mitteln eine effektive Lösung schaffen kann - ganz ohne einen sprechenden Totenkopf. Manchmal braucht man eben nur drei Zutaten und den Mut eines Möchtegern-Piraten, um etwas Großartiges zu erschaffen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Wie würde Guybrush Threepwood sagen? &quot;Das ist das zweitbeste Dashboard, das ich je gesehen habe!&quot; - &quot;Das zweitbeste? Was ist denn das beste?&quot; - &quot;Oh, das habe ich noch nicht gefunden, aber bei einem so großen Ozean muss es da draußen noch ein besseres geben!&quot;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/home-dashboard-pixelart-pointandclick/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/home-dashboard-pixelart-pointandclick/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Yarr! In diesem Artikel zeige ich, wie ich mit HTML, CSS und JavaScript - quasi den drei Zutaten eines mächtigen Voodoo-Zaubers - ein interaktives Smart Home Dashboard erschaffen habe. Eine Geschichte über Point-and-Click Magie und moderne Technologie. </info>
        </item>
        <item>
            <title>Backup: Günstig und einfach mit Hetzner-Storagebox und restic</title>
            <pubDate>Mon, 28 Jul 2025 22:59:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/backup-cheap-and-easy/</link>
            <guid>https://simeon.staneks.de/posts/backup-cheap-and-easy/</guid>
            <description xml:base="https://simeon.staneks.de/posts/backup-cheap-and-easy/">&lt;h1 id=&quot;die-genese-wenn-daten-floten-gehen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-wenn-daten-floten-gehen&quot; aria-label=&quot;Anchor link for: die-genese-wenn-daten-floten-gehen&quot;&gt;Die Genese: Wenn Daten flöten gehen&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Als Selfhoster und Technik-Enthusiast bringt man sich oft gerne in selbstgebaute Zwickmühlen. Vor einiger Zeit hatte ich mir einen günstigen Mini-PC gekauft, der als Server für meine unterschieldichen Projekte dienen sollte. Vielleicht erstelle ich in nächster Zeit eine Liste meiner Projekte, die ich so hoste. Auf jedenfall war Windows 11 vorinstalliert und ich hatte geglaubt, dass ich mit WSL2 und Docker gut arbeiten könnte. Da Backblaze eine Windows Client anbietet, dachte ich, dass damit das Problem Backup gelöst sei. Aber wie es so ist, kam es anders. Meine Daten wie Videos und Bilder, die auf einer externen Festplatte gespeichert waren, wurden zwar nach und nach auf Backblaze hochgeladen, aber irgwnwie und ohne Grund nicht komplett. Eines Tages verabschiedet sich die Festplatte und ich bestellte bei Backblaze eine Wiederherstellungsfestplatte. Als die Festplatte ankam, war ich sehr enttäuscht, dass nur ein Bruchteil meiner Daten wiederhergestellt wurde. Ich hatte zwar eine Sicherung, aber die war unvollständig und ich hatte keine Ahnung warum.&lt;&#x2F;p&gt;
&lt;p&gt;Lange Rede, kurzer Sinn: Ich brauchte eine neue Backup-Lösung, die einfach zu bedienen ist und zuverlässig funktioniert. Und so kam ich auf Hetzner-Storagebox und restic.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-externes-backup-bei-hetzner-verschlusselt-mit-restic&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-externes-backup-bei-hetzner-verschlusselt-mit-restic&quot; aria-label=&quot;Anchor link for: das-konzept-externes-backup-bei-hetzner-verschlusselt-mit-restic&quot;&gt;Das Konzept: Externes Backup bei Hetzner, verschlüsselt mit restic&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Falls mal die eigene Hardware kaputt geht, die Hütte abbrennt oder ein Ransomware-Angriff die Daten verschlüsselt, ist es wichtig, eine externe Sicherung zu haben. Ich habe mich für eine Hetzner-Storagebox entschieden, weil sie günstig und einfach zu bedienen ist. Mit einem Preis von 12,97 Euro pro Monat für 5 TB Speicherplatz ist es eine der günstigsten Lösungen auf dem Markt und kommt tatsächlich an das tolle Angebot von Backblaze ran.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;software-und-einrichtung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#software-und-einrichtung&quot; aria-label=&quot;Anchor link for: software-und-einrichtung&quot;&gt;Software und Einrichtung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Zu allererst braucht es natürlich einen Hetzner-Account. Wenn du noch keinen hast, kannst du dich &lt;a href=&quot;https:&#x2F;&#x2F;hetzner.cloud&#x2F;?ref=znuwnh4Uno3D&quot;&gt;hier&lt;&#x2F;a&gt; anmelden und bekommst 20 Euro Guthaben geschenkt. Dies ist ein persönlicher Weiterempfehlungslink von mir.&lt;&#x2F;p&gt;
&lt;p&gt;An der storagebox, kann man dann entscheiden, wie man auf sie zugreifen möchte. Ich greife per SFTP zu, da ich damit schon Erfahrung habe. Benutzername, Serveradresse und Passwort werden benötigt, um sich mit der Storagebox zu verbinden. Ich nutze dafür das Tool &lt;a href=&quot;https:&#x2F;&#x2F;rclone.org&#x2F;&quot;&gt;rclone&lt;&#x2F;a&gt;, das eine einfache Möglichkeit bietet, einen externen Host in das eigene System einzubinden.&lt;&#x2F;p&gt;
&lt;p&gt;Mit dem Befehl &lt;code&gt;rclone config&lt;&#x2F;code&gt; richtet man die Verbindung ein. Hierbei wird ein neuer Remote-Host angelegt, der auf die Storagebox verweist. Die Konfiguration ist einfach und selbsterklärend, da dich rclone durch den Prozess führt. Du musst lediglich die Zugangsdaten eingeben und den Typ der Verbindung auswählen (in diesem Fall SFTP).&lt;&#x2F;p&gt;
&lt;p&gt;Für das Backup selbst nutze ich das Tool &lt;a href=&quot;https:&#x2F;&#x2F;restic.net&#x2F;&quot;&gt;restic&lt;&#x2F;a&gt;, das deine Daten verschlüsselt und inkrementell sichert. Außerdem komprimiert es die Daten, sodass du weniger Speicherplatz benötigst. So habe ich meine Daten von 3,62 TB auf 2,67 TB komprimiert.&lt;&#x2F;p&gt;
&lt;p&gt;Warscheinlich braucht es kein eigenes System für die Backups, aber ich habe mir einen extra Alpine LXC (Linux Container) erstellt, der nur für die Backups zuständig ist. Das hat den Vorteil, dass ich das System einfach neu aufsetzen kann, falls mal etwas schiefgeht und er unabhängig von meinen anderen Systemen läuft. Ich nutze dafür Proxmox, aber das ist natürlich optional.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;rclone&lt;&#x2F;code&gt; und &lt;code&gt;restic&lt;&#x2F;code&gt; stehen sowieso für fast alle Betriebssysteme zur Verfügung und können einfach installiert werden.&lt;&#x2F;p&gt;
&lt;p&gt;Eine genauere Anleitung zur Installation und Konfiguration von rclone und restic findest du in der &lt;a href=&quot;https:&#x2F;&#x2F;restic.readthedocs.io&#x2F;en&#x2F;stable&#x2F;&quot;&gt;restic-Dokumentation&lt;&#x2F;a&gt; und der &lt;a href=&quot;https:&#x2F;&#x2F;rclone.org&#x2F;docs&#x2F;&quot;&gt;rclone-Dokumentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;backup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#backup&quot; aria-label=&quot;Anchor link for: backup&quot;&gt;Backup&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Anfangs hatte ich gedacht, dass ich mit Claude von Anthropic bestimmt ein tolles Skript schreiben könnte, das mir die Backups automatisiert. Aber ich habe es dann doch selbst gemacht, da mir die KI denn Prozess zu sehr verkompliziert hat. Folgendes Bash-Skript sichert meine Daten:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Simeon&amp;#39;s Backup Script für Hetzner
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# =============================================================================
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# EINSTELLUNGEN - Hier anpassen!
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# =============================================================================
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;SOURCE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;mnt&#x2F;f&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Quellverzeichnis, das gesichert werden soll, also die gesamten 3,62 TB bis jetzt.
&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;rclone:Hetzner:backup&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Remote-Host, der auf die Hetzner-Storagebox verweist
&lt;&#x2F;span&gt;&lt;span&gt;PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;etc&#x2F;restic-password&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Datei mit dem Passwort für restic
&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;var&#x2F;log&#x2F;backup_$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;A)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;.log&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Log-Datei für das Backup
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# =============================================================================
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Prüfe ob restic bereits läuft
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pgrep&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;restic&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Ein Backup läuft bereits.&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Ein Backup läuft bereits.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span&gt; 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Backup startet...&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;START_TIME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;s)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Optimierte restic Parameter für maximale Geschwindigkeit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; backup &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;SOURCE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --password-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --tag &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;backup-$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --verbose --verbose &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --pack-size&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --compression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude-caches &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --one-file-system &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;node_modules&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.git&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.cache&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;tmp&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;logs&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;cache&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;platforms&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;vendor&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.obsidian&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.@__thumb&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;*.log&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;*.tmp&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;*~&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.DS_Store&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Thumbs.db&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;desktop.ini&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;thumbs&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;    --exclude &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Proxmox&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Prüfen, ob das Backup erfolgreich war
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#55b4d4;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;-eq&lt;&#x2F;span&gt;&lt;span&gt; 0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;then
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Backup erfolgreich!&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; unlock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --password-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Alte Backups werden aufgeräumt...&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; forget&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --keep-last&lt;&#x2F;span&gt;&lt;span&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --prune --password-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span&gt;    END_TIME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;s)
&lt;&#x2F;span&gt;&lt;span&gt;    DURATION&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;END_TIME &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; START_TIME&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Backup abgeschlossen in $&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;DURATION &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Minuten und $&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;DURATION &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Sekunden.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Backup abgeschlossen in $&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;DURATION &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Minuten und $&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;DURATION &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; Sekunden.&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;LOG_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; +%&lt;&#x2F;span&gt;&lt;span&gt;Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;-%&lt;&#x2F;span&gt;&lt;span&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;:%&lt;&#x2F;span&gt;&lt;span&gt;S)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt; - Backup fehlgeschlagen!&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span&gt; 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Im Vorfeld muss natürlich auf der Storagebox ein Repository angelegt werden, damit restic weiß, wo die Daten gesichert werden sollen. Das geht ganz einfach mit dem Befehl:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span&gt; init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;außerdem muss das Passwort für restic in der Datei &lt;code&gt;&#x2F;etc&#x2F;restic-password&lt;&#x2F;code&gt; gespeichert werden. Diese Datei sollte natürlich nur für den root-Benutzer lesbar sein, damit niemand unbefugt auf das Passwort zugreifen kann.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;automatisierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#automatisierung&quot; aria-label=&quot;Anchor link for: automatisierung&quot;&gt;Automatisierung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Um das Backup regelmäßig zu automatisieren, nutze n8n wie ich es schon in anderen Artikel beschrieben habe, natürlich ginge das auch mit cron, aber ich mag n8n einfach und es verschaft mir einen besseren Überblick über alle Workflows. Ich habe einen Workflow erstellt, der das Skript einmal am Tag um 2 Uhr morgens ausführt. So habe ich immer ein aktuelles Backup meiner Daten, ohne dass ich mich darum kümmern muss.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;backup-cheap-and-easy&#x2F;images&#x2F;n8n.png&quot; alt=&quot;Backup Workflow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Folgender Befehl ist total sinnvoll und kann ich jedem empfehlen, der sein Backup regelmässig automatisieren will:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;restic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;REMOTE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; forget&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --keep-last&lt;&#x2F;span&gt;&lt;span&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --prune --password-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span&gt;PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;es werden damit die letzten 10 Backups behalten und alle älteren gelöscht. Das spart Speicherplatz und hält die Backup-Datenbank übersichtlich. Der &#x27;prune&#x27; Befehl überprüft das Repository und entfernt Daten, die nicht mehr referenziert und daher nicht mehr benötigt werden. Der ganze Prozess dauer natürlich dadurch etwas länger, aber an einem ganz normalen Tag sind es nur so 5 - 10 Minuten, da ich ja nur die neuen Daten sichern muss.&lt;&#x2F;p&gt;
&lt;p&gt;Für mich ist es außerdem sehr praktisch, dass alles in eine Log-Datei geschrieben wird, die ich mir jederzeit anschauen kann. So sehe ich, ob das Backup erfolgreich war und wie lange es gedauert hat. Diese Dateien, werden nach dem Wochentag benannt, sodass ich immer die Logs der letzten Woche habe. Das ist besonders nützlich, wenn ich mal ein Problem mit dem Backup habe und nachsehen möchte, was schiefgelaufen ist.&lt;&#x2F;p&gt;
&lt;p&gt;Das schöne an n8n ist außerdem, dass ich nach dem vollendeten Backup eine Benachrichtigung per Telegram bekomme. So weiß ich immer, ob das Backup erfolgreich war oder ob es ein Problem gab. Das gibt mir ein gutes Gefühl, dass meine Daten sicher sind.
Folgendes Diagramm zeigt den Ablauf des Backups:&lt;&#x2F;p&gt;
&lt;style&gt;
.mermaid svg{
max-height: 100% !important;
}
&lt;&#x2F;style&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart TD
    A[&amp;quot;Daten&amp;lt;br&amp;#x2F;&amp;gt;3.62 TB&amp;quot;] --&amp;gt; B[&amp;quot;Alpine LXC Container&amp;quot;]
    
    B --&amp;gt; C[&amp;quot;rclone SFTP Verbindung&amp;quot;]
    C --&amp;gt; D[&amp;quot;restic Backup&amp;quot;]
    D --&amp;gt; E[&amp;quot;Verschlüsselung + Komprimierung&amp;quot;]
    
    E --&amp;gt; F[&amp;quot;Hetzner Storagebox&amp;lt;br&amp;#x2F;&amp;gt;5TB &amp;#x2F; 12.97€&amp;quot;]
    
    F --&amp;gt; G{Backup erfolgreich?}
    G --&amp;gt;|Ja| H[&amp;quot;Alte Backups löschen&amp;lt;br&amp;#x2F;&amp;gt;keep-last 10&amp;quot;]
    G --&amp;gt;|Nein| I[&amp;quot;Fehler-Log&amp;quot;]
    
    H --&amp;gt; J[&amp;quot;Success-Log&amp;quot;]
    J --&amp;gt; L[&amp;quot;Telegram: Backup erfolgreich&amp;quot;]
    I --&amp;gt; M[&amp;quot;Telegram: Backup fehlgeschlagen&amp;quot;]
    
    K[&amp;quot;Täglich 2:00 Uhr&amp;quot;] --&amp;gt; B
    
    style A fill:#e1f5fe
    style F fill:#c8e6c9
    style E fill:#fff3e0
    style J fill:#e8f5e8
    style I fill:#ffebee
    style L fill:#f3e5f5
    style M fill:#f3e5f5
&lt;&#x2F;pre&gt;&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Mit dieser Lösung habe ich eine einfache, günstige und zuverlässige Backup-Lösung gefunden, die meine Daten sicher aufbewahrt. Ich kann jedem empfehlen, der seine Daten sichern möchte, eine Hetzner-Storagebox und restic zu nutzen. Es ist einfach einzurichten, kostengünstig und bietet eine hohe Sicherheit durch Verschlüsselung. Außerdem ist es einfach, die Backups zu automatisieren und regelmäßig durchzuführen. So habe ich immer ein aktuelles Backup meiner Daten, ohne dass ich mich darum kümmern muss. Und das Beste ist, dass ich mir keine Sorgen mehr machen muss, dass meine Daten verloren gehen könnten. Ich hoffe, dieser Artikel hilft dir, eine ähnliche Lösung für deine Backups zu finden.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/backup-cheap-and-easy/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/backup-cheap-and-easy/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Wenn es um Backups geht, sollte man nie zu lang warten. Dieser Artikel beschreibt kurz, wie eine meiner Backuplösungen aussieht. Ich nutze eine Hetzner-Storagebox und das Tool restic, um meine Daten zu sichern. Das Ganze ist einfach, günstig und funktioniert zuverlässig. </info>
        </item>
        <item>
            <title>Nützliche Escape Room Technik: Drehscheibentelefon als Eingabegerät</title>
            <pubDate>Wed, 28 May 2025 22:59:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/useful-escape-room-technology/</link>
            <guid>https://simeon.staneks.de/posts/useful-escape-room-technology/</guid>
            <description xml:base="https://simeon.staneks.de/posts/useful-escape-room-technology/">&lt;h1 id=&quot;die-genese-wenn-nostalgie-auf-technik-trifft&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-wenn-nostalgie-auf-technik-trifft&quot; aria-label=&quot;Anchor link for: die-genese-wenn-nostalgie-auf-technik-trifft&quot;&gt;Die Genese: Wenn Nostalgie auf Technik trifft&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Als kleiner Hobbyist bin ich ständig auf der Suche nach kreativen Lösungen für meine Escape Rooms in der Firmvorbereitung. Seit drei Jahren baue ich für die Firmvorbereitung im Dekanat Werdenfels-Rottenbuch regelmäßig knifflige Rätselparcours und experimentiere dabei gerne mit ungewöhnlichen Eingabegeräten.&lt;&#x2F;p&gt;
&lt;p&gt;Die Idee kam mir, als ich bei meinem Vater im Keller ein altes Drehwähltelefon entdeckte. &quot;Das wäre doch perfekt für einen Escape Room!&quot;, dachte ich mir. Stell dir vor: Die Teilnehmer müssen eine geheime Nummer wählen, und erst wenn sie die richtige Kombination eingeben, öffnet sich die nächste Rätseletappe. Pure Nostalgie meets moderne Technik!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-konzept-drei-drahte-unendliche-moglichkeiten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-konzept-drei-drahte-unendliche-moglichkeiten&quot; aria-label=&quot;Anchor link for: das-konzept-drei-drahte-unendliche-moglichkeiten&quot;&gt;Das Konzept: Drei Drähte, unendliche Möglichkeiten&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hardware-keep-it-simple&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hardware-keep-it-simple&quot; aria-label=&quot;Anchor link for: hardware-keep-it-simple&quot;&gt;Hardware - Keep it simple!&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Für dieses Projekt brauchst du wirklich nicht viel:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ein altes Drehwähltelefon (Flohmarkt, eBay, Kleinanzeigen, Oma&#x27;s Dachboden 😉)&lt;&#x2F;li&gt;
&lt;li&gt;Einen WemosD1 Mini (ESP8266) - kostet keine 5 Euro&lt;&#x2F;li&gt;
&lt;li&gt;Drei simple Jumperkabel&lt;&#x2F;li&gt;
&lt;li&gt;Eine passende Telefonbuchse (Telekommunikations-Anschluss-Einheit auch TAE genannt)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Das Geniale: Du musst nur drei Jumperkabel an die Telefonbuchse anschließen! Kein kompliziertes Löten, keine aufwendige Verkabelung. Der ESP8266 liest die Drehimpulse über den analogen Pin und interpretiert sie als Ziffern. Genaueres siehst du im Diagramm unten.&lt;&#x2F;p&gt;
&lt;style&gt;
.mermaid svg{
max-height: 100% !important;
}
&lt;&#x2F;style&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart TD
    A[👤 Spieler dreht Wählscheibe] --&amp;gt; B{📞 Drehwähltelefon}
    B --&amp;gt; C[⚡ Impulse über 3 Drähte]
    C --&amp;gt; D[🔧 WemosD1 Mini ESP8266]
    
    D --&amp;gt; E[📊 Analoger Pin A0&amp;lt;br&amp;#x2F;&amp;gt;liest Impulse]
    E --&amp;gt; F[🧮 Impulse zählen&amp;lt;br&amp;#x2F;&amp;gt;&amp;amp; entprellen]
    F --&amp;gt; G[🔢 Ziffer erkennen&amp;lt;br&amp;#x2F;&amp;gt;1 Impuls = 1&amp;lt;br&amp;#x2F;&amp;gt;10 Impulse = 0]
    
    G --&amp;gt; H[📝 Komplette Nummer&amp;lt;br&amp;#x2F;&amp;gt;zusammenbauen]
    H --&amp;gt; I{⏱️ Pause erkannt?&amp;lt;br&amp;#x2F;&amp;gt;3 Sekunden ohne Eingabe}
    
    I --&amp;gt;|Nein| G
    I --&amp;gt;|Ja| J[📡 WLAN-Verbindung prüfen]
    
    J --&amp;gt; K[🌐 HTTP GET Request&amp;lt;br&amp;#x2F;&amp;gt;an n8n Webhook]
    K --&amp;gt; L[🎯 n8n Workflow]
    
    L --&amp;gt; M[🔓 Escape Room Aktion]
    M --&amp;gt; N1[💡 Smart Home steuern]
    M --&amp;gt; N2[📧 E-Mail senden]  
    M --&amp;gt; N3[🔊 Sound abspielen]
    M --&amp;gt; N4[🚪 Schloss öffnen]
    
    D --&amp;gt; B[📞 Drehwähltelefon &amp;amp; Telefonhörer für Feedback]
    B --&amp;gt; P1[📢 Impuls-Beep]
    B --&amp;gt; P2[🎵 Ziffer-Beep]
    B --&amp;gt; P3[✅ Erfolgs-Melodie]
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style D fill:#fff3e0
    style L fill:#e8f5e8
    style M fill:#fff8e1
&lt;&#x2F;pre&gt;&lt;h3 id=&quot;software-von-analog-zu-digital&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#software-von-analog-zu-digital&quot; aria-label=&quot;Anchor link for: software-von-analog-zu-digital&quot;&gt;Software - Von analog zu digital&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der Code ist überraschend simpel gehalten. Das Drehwähltelefon erzeugt bei jeder gewählten Ziffer eine bestimmte Anzahl von Impulsen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ziffer 1 = 1 Impuls&lt;&#x2F;li&gt;
&lt;li&gt;Ziffer 2 = 2 Impulse&lt;&#x2F;li&gt;
&lt;li&gt;...&lt;&#x2F;li&gt;
&lt;li&gt;Ziffer 0 = 10 Impulse&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Der ESP8266 zählt diese Impulse, erkennt Pausen zwischen den Ziffern und baut daraus die komplette gewählte Nummer zusammen. Sobald eine vollständige Nummer erkannt wurde, sendet er diese via HTTP-Request an einen n8n-Webhook weiter.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Kurzer Code-Ausschnitt
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Wenn wir eine Ziffer zählen und es gibt eine Pause, interpretiere die Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; lastPulseTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; interDigitDelay)) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; dialedDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(pulseCount &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; pulseCount&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Gewählte Ziffer: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Spiele einen Ton für die erkannte Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playDigitBeep&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Füge die Ziffer zur gewählten Nummer hinzu
&lt;&#x2F;span&gt;&lt;span&gt;    dialedNumber &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    lastDigitTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zurücksetzen für die nächste Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;    pulseCount &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;br&gt;
&lt;details&gt;
  &lt;summary&gt;Kompletter Code &lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;ESP8266WiFi.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;ESP8266HTTPClient.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;lt;WiFiClient.h&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; WLAN-Konfiguration
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; ssid &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;MeinWLAN&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ändern Sie dies zu Ihrem WLAN-Namen
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; password &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;**********&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ändern Sie dies zu Ihrem WLAN-Passwort
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Webhook-Konfiguration
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; webhookUrl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;example.com&#x2F;webhook&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ändern Sie dies zu Ihrer Webhook-URL sie darf in diesem Fall nicht SSL sein, da der ESP8266 kein SSL unterstützt
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Konfiguration für das Drehwähltelefon
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; phonePin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; A0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Analoger Pin für das Drehwähltelefon
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; threshold &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Schwellenwert für die Impulserkennung
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; debounceDelay &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Entprellzeit in Millisekunden
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; interDigitDelay &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;700&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zeit zum Warten vor der Erkennung einer neuen Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Buzzer &#x2F; Sound Output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; buzzerPin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; D5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Pin für den Buzzer oder Lautsprecher
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; pulseBeepDuration &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Dauer des Beep-Tons in Millisekunden
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; digitBeepDuration &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Dauer des Beep-Tons für erkannte Ziffern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; digitBeepFrequency &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Tonhöhe für erkannte Ziffern
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; pulseState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Aktueller Impulszustand
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; lastPulseState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Vorheriger Impulszustand
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; pulseCount &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Anzahl der Impulse (Drehklicks)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; lastPulseTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zeit des letzten Impulses
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ob wir gerade dabei sind, eine Ziffer zu zählen
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;String dialedNumber &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Speichert die komplette gewählte Nummer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; lastDigitTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zeit der letzten erkannten Ziffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; completeNumberDelay &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zeit nach der letzten Ziffer, bevor die Nummer als vollständig betrachtet wird
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; WLAN-Management
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;unsigned long&lt;&#x2F;span&gt;&lt;span&gt; lastWifiCheckTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; wifiCheckInterval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;30000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Überprüfe WLAN alle 30 Sekunden
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;9600&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(phonePin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; INPUT)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(buzzerPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; OUTPUT)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Deaktiviere WiFi-Schlafmodus für stabilere Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;  WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setSleepMode&lt;&#x2F;span&gt;&lt;span&gt;(WIFI_NONE_SLEEP)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Verbinde mit WLAN mit höherem Timeout-Wert
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;connectToWifi&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Drehwähltelefon-Leser gestartet&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;-------------------------&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Startup sound
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playSuccessSound&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Einfacher Ton mit der angegebenen Frequenz und Dauer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;frequency&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;duration&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Wir verwenden einen einfachen On&#x2F;Off-Ton für ESP8266
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Die Frequenz wird durch die Verzögerung zwischen den Umschaltungen simuliert
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span&gt; delayValue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000000 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; frequency &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span&gt; numCycles &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; frequency &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; duration &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; numCycles&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(buzzerPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delayMicroseconds&lt;&#x2F;span&gt;&lt;span&gt;(delayValue)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(buzzerPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; LOW)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delayMicroseconds&lt;&#x2F;span&gt;&lt;span&gt;(delayValue)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Kurzer Ton für erkannte Impulse
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playPulseBeep&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(buzzerPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(pulseBeepDuration)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(buzzerPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; LOW)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ton für erkannte Ziffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playDigitBeep&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;digit&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Spiele einen Ton mit der Frequenz proportional zur Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; freq &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; digitBeepFrequency &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;(digit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Höherer Ton für höhere Ziffern
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(freq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; digitBeepDuration)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Erfolgsmelodie für erfolgreiches Senden
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playSuccessSound&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1500&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;connectToWifi&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Verbinde mit WLAN &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(ssid)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;(WIFI_STA)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Setze explizit den Station-Modus
&lt;&#x2F;span&gt;&lt;span&gt;  WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(ssid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; password)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Setze einen höheren Timeout-Wert für die Verbindung (10 Sekunden)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 10 Sekunden Timeout
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;while &lt;&#x2F;span&gt;&lt;span&gt;(WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span&gt; WL_CONNECTED &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; WL_CONNECTED) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;WiFi verbunden!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;IP-Adresse: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;localIP&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playSuccessSound&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Ton für erfolgreiche Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;WiFi-Verbindung fehlgeschlagen. Versuche es später erneut.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Fehlerton für fehlgeschlagene Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;checkWifiConnection&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; lastWifiCheckTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; wifiCheckInterval) {
&lt;&#x2F;span&gt;&lt;span&gt;    lastWifiCheckTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span&gt; WL_CONNECTED) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;WLAN-Verbindung verloren. Versuche Wiederverbindung...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;disconnect&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;connectToWifi&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Optional: Bestätigung, dass WLAN noch verbunden ist
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Serial.println(&amp;quot;WLAN-Verbindung OK&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Überprüfe regelmäßig die WLAN-Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;checkWifiConnection&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Lese den Eingang vom Drehwähltelefon
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; sensorValue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;analogRead&lt;&#x2F;span&gt;&lt;span&gt;(phonePin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Bestimme den Impulszustand (hoch oder niedrig)
&lt;&#x2F;span&gt;&lt;span&gt;  pulseState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(sensorValue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; threshold)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Erkennung einer fallenden Flanke (Impulsbeginn)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(pulseState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span&gt;lastPulseState) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Entprellen
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(debounceDelay)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Nochmals lesen zur Bestätigung
&lt;&#x2F;span&gt;&lt;span&gt;    sensorValue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;analogRead&lt;&#x2F;span&gt;&lt;span&gt;(phonePin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(sensorValue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; threshold) {
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Gültiger Impuls erkannt
&lt;&#x2F;span&gt;&lt;span&gt;      countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      pulseCount&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      lastPulseTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Impuls erkannt! Zählung: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(pulseCount)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Erzeugt einen kurzen Signalton für jeden erkannten Impuls
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playPulseBeep&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Wenn wir eine Ziffer zählen und es gibt eine Pause, interpretiere die Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; lastPulseTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; interDigitDelay)) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; dialedDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;(pulseCount &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; pulseCount&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Gewählte Ziffer: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Spiele einen Ton für die erkannte Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playDigitBeep&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Füge die Ziffer zur gewählten Nummer hinzu
&lt;&#x2F;span&gt;&lt;span&gt;    dialedNumber &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;(dialedDigit)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    lastDigitTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zurücksetzen für die nächste Ziffer
&lt;&#x2F;span&gt;&lt;span&gt;    pulseCount &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    countingDigit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Prüfe, ob die komplette Nummer gewählt wurde (keine neue Ziffer seit X Sekunden)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(dialedNumber&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; lastDigitTime &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; completeNumberDelay)) {
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Komplette gewählte Nummer: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(dialedNumber)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Sende die Nummer an den Webhook
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;sendNumberToWebhook&lt;&#x2F;span&gt;&lt;span&gt;(dialedNumber)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Zurücksetzen für die nächste Nummer
&lt;&#x2F;span&gt;&lt;span&gt;    dialedNumber &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Speichere aktuellen Zustand für den nächsten Vergleich
&lt;&#x2F;span&gt;&lt;span&gt;  lastPulseState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; pulseState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Kleine Verzögerung für Stabilität
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;sendNumberToWebhook&lt;&#x2F;span&gt;&lt;span&gt;(String &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Überprüfen der WLAN-Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(WiFi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; WL_CONNECTED) {
&lt;&#x2F;span&gt;&lt;span&gt;    WiFiClient client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    HTTPClient http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; URL mit der gewählten Nummer erstellen
&lt;&#x2F;span&gt;&lt;span&gt;    String url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;(webhookUrl) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;?number=&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Sende Nummer an Webhook: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(url)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Beginne HTTP-Verbindung mit höherem Timeout
&lt;&#x2F;span&gt;&lt;span&gt;    http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; url)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; 10 Sekunden Timeout für HTTP-Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Sende HTTP GET-Request
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; httpResponseCode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;GET&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(httpResponseCode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;HTTP Antwort-Code: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(httpResponseCode)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      String payload &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getString&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(payload)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Erfolgssound spielen
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playSuccessSound&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Fehler beim HTTP-Request. Fehlercode: &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(httpResponseCode)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;      
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Fehlerton spielen
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;    
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Beende HTTP-Verbindung
&lt;&#x2F;span&gt;&lt;span&gt;    http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    Serial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;WLAN nicht verbunden. Nummer wird zwischengespeichert und später gesendet.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Fehlerton spielen
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;playTone&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;br&gt;
&lt;style&gt;
  .containerimg  img {
        width: 200px;
        height: auto;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;useful-escape-room-technology&#x2F;images&#x2F;drehscheibe00001.jpg&quot; alt=&quot;Drehwähltelefon&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;useful-escape-room-technology&#x2F;images&#x2F;drehscheibe00003.jpg&quot; alt=&quot;TAE Buchse&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;useful-escape-room-technology&#x2F;images&#x2F;drehscheibe00004.jpg&quot; alt=&quot;TAE Buchse Anschluss&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;useful-escape-room-technology&#x2F;images&#x2F;drehscheibe00002.jpg&quot; alt=&quot;ESP8266&quot;&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;die-moglichkeiten-mehr-als-nur-telefon&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-moglichkeiten-mehr-als-nur-telefon&quot; aria-label=&quot;Anchor link for: die-moglichkeiten-mehr-als-nur-telefon&quot;&gt;Die Möglichkeiten: Mehr als nur Telefon&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Auch wenn ich das Telefon noch nicht in einem meiner Escape Rooms eingesetzt habe, schwirren mir schon unzählige Ideen im Kopf herum:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;🔐 Klassischer Safe-Code:&lt;&#x2F;strong&gt; Die Teilnehmer müssen eine bestimmte Nummer wählen, um den nächsten Hinweis zu erhalten.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;📋 Kontaktliste-Rätsel:&lt;&#x2F;strong&gt; &quot;Rufe deinen Großvater an!&quot; - Die Spieler müssen erst herausfinden, welche Nummer sie wählen müssen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;🎵 Musikalische Codes:&lt;&#x2F;strong&gt; Jede Ziffer spielt einen anderen Ton - die richtige Melodie öffnet das Schloss.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;⏰ Zeitreise-Szenarien:&lt;&#x2F;strong&gt; Perfekt für 70er&#x2F;80er-Jahre Settings - authentischer geht&#x27;s nicht!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;🔄 Sequenz-Rätsel:&lt;&#x2F;strong&gt; Mehrere Nummern müssen in einer bestimmten Reihenfolge gewählt werden.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;der-webhook-zauber-n8n-macht-s-moglich&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-webhook-zauber-n8n-macht-s-moglich&quot; aria-label=&quot;Anchor link for: der-webhook-zauber-n8n-macht-s-moglich&quot;&gt;Der Webhook-Zauber: n8n macht&#x27;s möglich&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das Schöne an dieser Lösung: Über n8n kannst du die gewählten Nummern mit praktisch allem verknüpfen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Smart Home Geräte steuern&lt;&#x2F;li&gt;
&lt;li&gt;E-Mails versenden&lt;&#x2F;li&gt;
&lt;li&gt;Andere APIs ansprechen&lt;&#x2F;li&gt;
&lt;li&gt;Datenbanken füllen&lt;&#x2F;li&gt;
&lt;li&gt;Und vieles mehr!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ein einfacher HTTP-Request genügt, und schon reagiert dein gesamtes Escape Room-System auf die gewählte Nummer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;warum-du-es-selbst-ausprobieren-solltest&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#warum-du-es-selbst-ausprobieren-solltest&quot; aria-label=&quot;Anchor link for: warum-du-es-selbst-ausprobieren-solltest&quot;&gt;Warum du es selbst ausprobieren solltest&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Dieses Projekt ist perfekt für Tüftler, die gerne mit Technik spielen.
Du lernst:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analoge Signale lesen&lt;&#x2F;strong&gt; - Wie Hardware und Software zusammenspielen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WLAN-Kommunikation&lt;&#x2F;strong&gt; - Webhooks und HTTP-Requests verstehen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Entprellung und Timing&lt;&#x2F;strong&gt; - Komplizierte aber spannende Programmierkonzepte&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Audio-Feedback&lt;&#x2F;strong&gt; - Benutzerinteraktion verbessern&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Und das Beste: Das Erfolgserlebnis ist garantiert! Wenn das erste Mal der Webhook aufgerufen wird, nachdem du eine Nummer gewählt hast, ist das ein magischer Moment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;los-geht-s-muscle&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#los-geht-s-muscle&quot; aria-label=&quot;Anchor link for: los-geht-s-muscle&quot;&gt;Los geht&#x27;s! 💪&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Du hast Lust bekommen, selbst ein Drehwähltelefon zu hacken? Perfekt! Schnapp dir ein altes Telefon, bestell einen ESP8266 und leg einfach los. Der Code ist simpel, die Hardware überschaubar, und die Möglichkeiten sind endlos.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Happy Hacking!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/useful-escape-room-technology/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/useful-escape-room-technology/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> In diesem Artikel beschreibe ich wie man ein altes Drehscheibentelefon als Eingabegerät für Escape Rooms nutzen kann. Ich erkläre die technische Umsetzung, die Programmierung und die Integration in ein Escape Room Konzept. Der Artikel richtet sich an Technikbegeisterte und Escape Room Enthusiasten. </info>
        </item>
        <item>
            <title>Gameboy Spiele für Bildungs- und Pastoralarbeit</title>
            <pubDate>Wed, 30 Apr 2025 22:59:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/gameboy-games-for-education-and-pastoral-work/</link>
            <guid>https://simeon.staneks.de/posts/gameboy-games-for-education-and-pastoral-work/</guid>
            <description xml:base="https://simeon.staneks.de/posts/gameboy-games-for-education-and-pastoral-work/">&lt;h1 id=&quot;die-genese-gameboy-spiele-fur-bildungs-und-pastoralarbeit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-gameboy-spiele-fur-bildungs-und-pastoralarbeit&quot; aria-label=&quot;Anchor link for: die-genese-gameboy-spiele-fur-bildungs-und-pastoralarbeit&quot;&gt;Die Genese: Gameboy Spiele für Bildungs- und Pastoralarbeit&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Wer mir auf diesem Blog folgt ahnt vielleicht, dass ich ein kleiner Fan von Retrospielen bin. Ich habe zu meinem Leidwesen noch nie einen Gameboy bessessen, aber das hielt mich nicht davon ab, mich mit dem Thema zu beschäftigen. Als ich vor drei Jahren dann an meiner App für die Firmvorberietung (feiafanga) im Dekanat Werdenfels-Rottenbuch gearbeitet habe, kam mir die Idee, dass ich zum Gamefification von Bildungsinhalten auch Gameboy-Spiele erstellen könnte. Ich habe mich dann auf die Suche nach einem Tool gemacht, mit dem ich Gameboy Spiele erstellen kann. Ich bin dann auf &lt;a href=&quot;https:&#x2F;&#x2F;www.gbstudio.dev&#x2F;&quot;&gt;GB Studio&lt;&#x2F;a&gt; gestoßen. Das ist ein Tool mit dem man ohne Programmierkenntnisse Gameboy-Spiele erstellen kann. Tatsächliche Gameboyspiele, die auf originalen Gameboy-Hardware laufen. Das Tool ist sehr einfach zu bedienen und ich kann es jedem empfehlen, der sich für Gameboy-Spiele interessiert. Zugleich bietet es Dir die Möglichkeit die Spiele als HTML5-Spiele zu exportieren, die dann im Browser laufen. Das ist natürlich eine tolle Sache, denn so kann ich die Spiele direkt in meine App einbauen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vorbereitung-zur-erstellung-eines-gameboy-spiels&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vorbereitung-zur-erstellung-eines-gameboy-spiels&quot; aria-label=&quot;Anchor link for: vorbereitung-zur-erstellung-eines-gameboy-spiels&quot;&gt;Vorbereitung zur Erstellung eines Gameboy-Spiels&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Hier möchte ich kurz erklären, was du alles zur Erstellung von einem kurzen Gameboy-Spiel brauchst:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GB Studio&lt;&#x2F;strong&gt;: Das ist das Tool, mit dem du die Spiele erstellen kannst. Es ist kostenlos und Open Source.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GB Assets&lt;&#x2F;strong&gt;: Das sind die Grafiken, die du für dein Spiel brauchst. Du kannst sie selbst erstellen oder im Internet suchen. Es gibt viele Seiten, die kostenlose Grafiken anbieten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GB Emulator&lt;&#x2F;strong&gt;: Das ist ein Programm, mit dem du die Spiele testen kannst. Es gibt viele Emulatoren, die du kostenlos herunterladen kannst, außerdem lässt sich das Spiel innerhalb von GB Studio als HTML5 Spiel esportieren.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GB Music&lt;&#x2F;strong&gt;: Das sind die Musik, die du brauchst. Du kannst sie selbst erstellen oder im Internet suchen. Es gibt viele Seiten, die kostenlose Musik anbieten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Story&lt;&#x2F;strong&gt;: Das ist die Geschichte, die du erzählen möchtest. Du kannst sie selbst schreiben oder dir von einem Sprachmodell helfen lassen. Es gibt viele Seiten, die kostenlose Geschichten anbieten. Im Bildungskontext ist es wichtig, dass die Geschichte auch einen Bezug zu dem Thema hat, das du vermitteln möchtest.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LDtk&lt;&#x2F;strong&gt;: Das ist ein Tool, mit dem du die Level erstellen kannst. Es ist kostenlos und Open Source. Du kannst es hier herunterladen: &lt;a href=&quot;https:&#x2F;&#x2F;ldtk.io&#x2F;&quot;&gt;LDtk&lt;&#x2F;a&gt;. Das Tool ist sehr einfach zu bedienen und ich kann es jedem empfehlen, der sich für Gameboy-Spiele interessiert. Es gibt viele Tutorials im Internet, die dir helfen, das Tool zu verstehen.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;erstellung-anhand-eines-beispiels&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#erstellung-anhand-eines-beispiels&quot; aria-label=&quot;Anchor link for: erstellung-anhand-eines-beispiels&quot;&gt;Erstellung Anhand eines Beispiels&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;beispielbilder&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#beispielbilder&quot; aria-label=&quot;Anchor link for: beispielbilder&quot;&gt;Beispielbilder&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;style&gt;
   .containerimg   img {
        width: 200px;
        height: auto;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div  class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00001.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00002.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00003.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00004.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00005.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00006.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;gb00007.jpg&quot; alt=&quot;Gameboy-Bild&quot;&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;die-story&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-story&quot; aria-label=&quot;Anchor link for: die-story&quot;&gt;Die Story&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Für die feiafanga App habe ich kleine und kurze Spiele erstellt, die alle einen Bezug zu den Themen der Firmvorbereitung haben. Ich nutze die sieben Gaben des Heiligen Geistes als Grundlage für die Spiele. Die Spiele sind alle sehr kurz und einfach gehalten, damit sie auch in der Firmvorbereitung eingesetzt werden können. Ich habe mir eine kleine Geschichte ausgedacht, die ich dann in die Spiele eingebaut habe. Die Geschichten handeln von Eli, die&#x2F;der auf dem Weg zur ersten Firmstunde ist. Auf dem Weg erfährt Eli unterschiedliche Aufgaben, die im Zusammenhang mit den Gaben des Heiligen Geistes stehen. Nachdem Eli die Aufgabe gelöst hat, erhält der Spieler ein Abzeichen in der App. Hier die kurze Geschichte zur Gabe der Erkenntnis:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eli ist immer noch auf dem Weg zur ersten Firmstunde. Eli kommt an der Bibliothek vorbei und merkt, dass der Weg durch die Bibliothek schneller ist. Da die Tür zum Ausgang der Bibliothek verschlossen ist, geht Eli zur Bibliothekarin und fragt sie, wie die Tür geöffnet werden kann. Die ist in Gedanken versunken und ist auf der Suche nach der Antwort auf die Frage: &quot;Was führt zu einem glücklichen Leben?&quot;. Eli reißt sie aus ihren Gedanken und sie bemerkt, dass sie nicht weiß wor der Schlüssel für die Tür ist. Während sie auf der Suche ist, fragt sie Eli, ob Eli ihr ein Buch bringen kann. Nachdem Eli ihr insgesmat zwei Bücher bringt, findet sie immer noch keine Antwort auf dies Frage, bis Eli von sich sagt: &quot;Was sagt Dir denn Dein Herz?&quot;. Daraufhin sagt die Bibliothekarin: &quot;Das ist eine gute Frage. Ich werde darüber nachdenken.&quot; und gibt Eli den Schlüssel für die Tür. Eli kann jetzt die Bibliothek verlassen und zur ersten Firmstunde gehen.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Hier wird plakativ deutlich, dass die Gabe der Erkenntnis nicht nur eine intellektuelle Fähigkeit ist, sondern auch eine emotionale und spirituelle Dimension hat. Die Gabe der Erkenntnis hilft uns, die Welt um uns herum besser zu verstehen und die richtigen Entscheidungen zu treffen. Sie ist eine Gabe des Heiligen Geistes, die uns hilft, die Wahrheit zu erkennen und zu leben.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;die-erstellung-des-spiels&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-erstellung-des-spiels&quot; aria-label=&quot;Anchor link for: die-erstellung-des-spiels&quot;&gt;Die Erstellung des Spiels&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Zuerst erstelle ich die Grafiken, die ich für das Spiel brauche. Die meisten Assets habe ich bei &lt;a href=&quot;https:&#x2F;&#x2F;itch.io&#x2F;&quot;&gt;itch.io&lt;&#x2F;a&gt; gefunden und mit LDtk habe ich die passenden Hintergründe erstellt. Änderungen habe ich einfach mit &lt;a href=&quot;https:&#x2F;&#x2F;www.gimp.org&#x2F;&quot;&gt;Gimp&lt;&#x2F;a&gt; vorgenommen und &lt;a href=&quot;https:&#x2F;&#x2F;studio.polotno.com&#x2F;&quot;&gt;Polotno Studio&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;style&gt;
   .containerimg   img {
        width: 200px;
       min-height: 200px;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div  class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;tiles00001.png&quot; alt=&quot;Tile-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;tiles00002.png&quot; alt=&quot;Tile-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;tiles00005.png&quot; alt=&quot;Tile-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;tiles00006.png&quot; alt=&quot;Tile-Bild&quot;&gt;
&lt;&#x2F;div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Innerhalb von GB Studio erstelle ich dann die einzelnen Level und die Logik. Dies ist recht einfach und im Internet gibt es viele Tutorials, die dir helfen, das Tool zu verstehen. Ich habe mir ein paar Tutorials angeschaut und dann einfach drauf losgelegt. Hier ein paar Bilder zum besseren Verständnis, aber man kommt schnell rein und es macht wirklich Spaß.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;style&gt;
     .containerimg img {
        width: 200px;
       min-height: 200px;
        margin: 0 10px;
    }
  .containerimg  .full {
        width: 95%;
        height: auto;
        margin: 0 10px;
    }
&lt;&#x2F;style&gt;
&lt;div  class=&quot;containerimg&quot; style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;screen00001.png&quot; alt=&quot;Screen-Bild&quot;&gt;
&lt;img  class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;screen00002.png&quot; alt=&quot;Screen-Bild&quot;&gt;
&lt;img  class=&quot;full&quot; src=&quot;&#x2F;posts&#x2F;gameboy-games-for-education-and-pastoral-work&#x2F;images&#x2F;screen00003.png&quot; alt=&quot;Screen-Bild&quot;&gt;
&lt;&#x2F;div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Danach exportiere ich das Spiel als .gb Rom und lade es auf meinen Server hoch. Die App lädt das Spiel dann herunter und die Jugendlichen können es direkt in der App spielen. Durch ein kleines JavaScript-Script innerhalb der App erkennt die App wann das Spiel beendet ist und hinterlegt dann ein Abzeichen in der App. Hier ist das Snippet. Es liest praktischerweise den Videobuffer des Emulators und erkennt anhand eine Farbcodes ob das Spiel beendet wurde. Diese Methode ist zwar nicht perfekt, aber es funktioniert.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setInterval&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;( emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;248 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;248 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;12&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;248 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span&gt;emulator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;buffer[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;addBadge&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Spiel &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;localStorage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getItem&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;romname&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;          window&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;location&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;href &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;index.html&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;gamification-in-der-bildung-und-pastoralarbeit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gamification-in-der-bildung-und-pastoralarbeit&quot; aria-label=&quot;Anchor link for: gamification-in-der-bildung-und-pastoralarbeit&quot;&gt;Gamification in der Bildung und Pastoralarbeit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Gamification bietet wertvolle Möglichkeiten, die Motivation von Lernenden zu steigern und komplexe Inhalte zugänglicher zu machen. Im Kontext der Pastoralarbeit können Spielelemente spirituelle Themen anschaulicher vermitteln.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vorteile-von-gameboy-spielen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vorteile-von-gameboy-spielen&quot; aria-label=&quot;Anchor link for: vorteile-von-gameboy-spielen&quot;&gt;Vorteile von Gameboy-Spielen&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Einfacher Zugang&lt;&#x2F;strong&gt;: Leicht verständliche Spielmechanik&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fokus auf Inhalt&lt;&#x2F;strong&gt;: Reduzierte Grafik lenkt nicht vom Lerninhalt ab&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Universelle Verfügbarkeit&lt;&#x2F;strong&gt;: HTML5-Export und Rom-Export ermöglicht Nutzung auf verschiedenen Geräten, selbst billig Handhelds wie der R36S können genutzt werden.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;lerneffekte-durch-gamification&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lerneffekte-durch-gamification&quot; aria-label=&quot;Anchor link for: lerneffekte-durch-gamification&quot;&gt;Lerneffekte durch Gamification&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Aktiveres Engagement statt passiver Informationsaufnahme&lt;&#x2F;li&gt;
&lt;li&gt;Emotionale Verbindung durch Charaktere und Geschichten&lt;&#x2F;li&gt;
&lt;li&gt;Unmittelbares Feedback zum Lernfortschritt&lt;&#x2F;li&gt;
&lt;li&gt;Selbstbestimmtes Lernen im eigenen Tempo&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;integration-in-die-firmvorbereitung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#integration-in-die-firmvorbereitung&quot; aria-label=&quot;Anchor link for: integration-in-die-firmvorbereitung&quot;&gt;Integration in die Firmvorbereitung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die Gameboy-Spiele rund um Eli veranschaulichen die Gaben des Heiligen Geistes und dienen als Gesprächsgrundlage. Die Verknüpfung mit Abzeichen in der App schafft zusätzliche Motivation für die Jugendlichen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;herausforderungen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#herausforderungen&quot; aria-label=&quot;Anchor link for: herausforderungen&quot;&gt;Herausforderungen&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Bei der Entwicklung war es wichtig, eine Balance zwischen Unterhaltung und Lerninhalt zu finden. Die technische Integration und zielgruppengerechte Gestaltung erforderten kreative Lösungen. Die Übersetzung theologischer Konzepte in Spielmechaniken benötigte besondere Sorgfalt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;weitere-anwendungsmoglichkeiten&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#weitere-anwendungsmoglichkeiten&quot; aria-label=&quot;Anchor link for: weitere-anwendungsmoglichkeiten&quot;&gt;Weitere Anwendungsmöglichkeiten&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Konzept lässt sich auf andere Bereiche wie Bibelgeschichten, Kirchengeschichte oder ethische Fragestellungen übertragen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der Einsatz von Gameboy-Spielen in der Bildungs- und Pastoralarbeit hat sich als effektive Methode erwiesen, um Jugendliche emotional anzusprechen und komplexe theologische Themen erfahrbar zu machen. GB Studio ermöglicht auch technisch weniger versierten Personen die Entwicklung eigener Bildungsspiele. Die positiven Rückmeldungen bestätigen, dass dieser innovative Ansatz die Firmvorbereitung bereichert und die intrinsische Motivation der Jugendlichen fördert. Die Kombination aus nostalgischer Spielästhetik und modernen pädagogischen Konzepten schafft neue Wege für eine zeitgemäße religiöse Bildung.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/gameboy-games-for-education-and-pastoral-work/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/gameboy-games-for-education-and-pastoral-work/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Gamefication in der Bildung und Pastoralarbeit: Wie das Einsetzen von Gameboy-Spielen in der Bildung und Pastoralarbeit die intrinsische Motivation steigern kann. Einblicke in die Nutzung von Gameboy-Spielen in der Bildung und Pastoralarbeit. Mit Tutorial zur Erstellung von Gameboy-Spielen mit GB Studio. </info>
        </item>
        <item>
            <title>Papierloses Arbeiten mit Obsidian, Epubs und Ebook-Reader</title>
            <pubDate>Mon, 31 Mar 2025 22:59:00 +0100</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/work-paperlesse-with-obsidian-epub-and-ebookreader/</link>
            <guid>https://simeon.staneks.de/posts/work-paperlesse-with-obsidian-epub-and-ebookreader/</guid>
            <description xml:base="https://simeon.staneks.de/posts/work-paperlesse-with-obsidian-epub-and-ebookreader/">&lt;h1 id=&quot;die-genese-papierloses-arbeiten-in-der-pastoral&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-papierloses-arbeiten-in-der-pastoral&quot; aria-label=&quot;Anchor link for: die-genese-papierloses-arbeiten-in-der-pastoral&quot;&gt;Die Genese: Papierloses Arbeiten in der Pastoral&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Wenn es um Notiz-Tools geht, dann kann man da tief abtauchen und nach Jahren auftauchen und ist immer noch auf der Suche nach einer perfekten Lösung für den eigenen Workflow. Ich habe in den letzten Jahren viele Tools ausprobiert, um meine Notizen und Gedanken zu organisieren. Immer wieder kehre ich zu &lt;a href=&quot;https:&#x2F;&#x2F;obsidian.md&quot;&gt;Obsidian&lt;&#x2F;a&gt; zurück, da es mir die größte Freiheit bietet, meine Notizen zu organisieren und zu strukturieren, geschweige der Menge an Plugins, die es bietet. Ich habe Obsidian als mein Haupt-Notiz-Tool etabliert, um meine Gedanken und Ideen festzuhalten. Ich nutze es für alles, was ich so mache: von der Planung von Projekten über die Dokumentation von Ideen bis hin zur Erstellung von Gottesdiensten und Predigten. Eigentlich bin ich vollkommen glücklich mit dem Tool, aber irgendwie betrachte ich es seit Jahren als Übergangslösung und ich glaube da bin ich nicht alleine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vorteile-der-nutzung-von-obsidian&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vorteile-der-nutzung-von-obsidian&quot; aria-label=&quot;Anchor link for: vorteile-der-nutzung-von-obsidian&quot;&gt;Vorteile der Nutzung von Obsidian&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nicht destotrotz gibt es einige Vorteile, die ich an Obsidian schätze:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Einfacher Zugang&lt;&#x2F;strong&gt;: Durch die einfache Benutzeroberfläche kann ich schnell und einfach meine Notizen organisieren und verwalten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Markdown&lt;&#x2F;strong&gt;: Ich kann meine Notizen in Markdown schreiben, was mir die Freiheit gibt, sie in verschiedenen Formaten zu exportieren.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Plugins&lt;&#x2F;strong&gt;: Ich kann viele Plugins verwenden, um meine Notizen zu verbessern und zu verwalten. Natürlich kann ich auch selbst Plugins dafür programmieren, was das Tool noch flexibler macht.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Offline-Zugriff&lt;&#x2F;strong&gt;: Ich synchronisiere meine Notizen zwar mit Nextcloud, aber ich kann sie auch offline nutzen, was mir die Freiheit gibt, überall zu arbeiten.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Wunderschön&lt;&#x2F;strong&gt;: Ich kann meine Notizen mit verschiedenen Themes und CSS anpassen, um sie schöner zu gestalten. Und ich liebe das flexoki Theme. Es sieht einfach fantastisch aus.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;praktischer-workflow-ein-beispiel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#praktischer-workflow-ein-beispiel&quot; aria-label=&quot;Anchor link for: praktischer-workflow-ein-beispiel&quot;&gt;Praktischer Workflow: Ein Beispiel&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;der-gottesdienst&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-gottesdienst&quot; aria-label=&quot;Anchor link for: der-gottesdienst&quot;&gt;Der Gottesdienst&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In meinem Fall ist es so, dass ich meine Gottesdienste und Predigten in Obsidian plane und schreibe. Ich habe dafür ein Template, das ich immer wieder verwende. Denn ein Gottesdienst besteht ja meistens aus den gleichen Elementen: Eröffnung, Kreuzzeichen, Begrüßung, Kyrie, Tagesgebet, Lesung, Evangelium, Predigt, Fürbitten, Vater unser, Schlussgebet und Segen. Ich habe mir ein Template erstellt, das ich immer wieder verwenden kann. Das Template sieht so aus:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;markdown&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-markdown &quot;&gt;&lt;code class=&quot;language-markdown&quot; data-lang=&quot;markdown&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;# &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Wortgottesfeier am {{date:DD.MM.YYYY}}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[Stille.mp3]]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Eröffnung
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[{{location}}Musik.mp3]]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Kreuzzeichen
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Im Namen des Vaters und des Sohnes und des Heiligen Geistes. Amen. +
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Begrüßung
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Liebe Schwestern und Brüder, ich begrüße Sie alle herzlich zu unserer heutigen Wortgottesfeier {{location}}.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Hier individuelle Begrüßung und thematische Einführung einfügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Kyrie
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Herr Jesus Christus, du bist gekommen, um uns den Weg zum Vater zu zeigen. Herr, erbarme dich unser. Du hast uns die frohe Botschaft verkündet und uns zum Reich Gottes eingeladen. Christus, erbarme dich unser. Du führst uns und begleitest uns in das ewige Leben. Herr, erbarme dich unser.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[Musik1.mp3]]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Tagesgebet
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Tagesgebet entsprechend dem liturgischen Tag einfügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Lesung
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Lesung entsprechend dem liturgischen Tag einfügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[Musik2.mp3]]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Christus Sieger... &#x2F; Halleluja...
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Je nach Jahreszeit --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Evangelium
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Evangelium entsprechend dem liturgischen Tag einfügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Predigt
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Predigt einfügen - Gliederung: --&amp;gt; &amp;lt;!-- - Bezug zum Evangelium --&amp;gt; &amp;lt;!-- - Hauptthema entfalten --&amp;gt; &amp;lt;!-- - Lebensbezug herstellen --&amp;gt; &amp;lt;!-- - Hoffnungsvollen Abschluss formulieren --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[Musik3.mp3]]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Fürbitten
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Guter Gott, in Vertrauen auf deine Liebe bringen wir unsere Bitten vor dich:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;1. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 1 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;2. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 2 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;3. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 3 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;4. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 4 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;5. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 5 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;6. &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Fürbitte 6 --&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#f07171;&quot;&gt;_Wir bitten dich, erhöre uns._
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Gott, unser Vater, du hörst unsere Bitten. Wir vertrauen darauf, dass du uns nahe bist und uns mit deiner Liebe begleitest. Darum bitten wir durch Christus, unseren Herrn. Amen.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Vater unser
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Schlussgebet
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Passendes Schlussgebet einfügen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Segen
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Der Gott des Lichts und des Lebens segne euch mit dem Licht seiner Gegenwart, das die Nacht vertreibt und die Dunkelheit erhellt.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Der Schöpfer aller Dinge erfülle euer Herz mit der Weite des Himmels und der Festigkeit des Bodens unter euren Füßen.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Dritten Segensteil entsprechend dem Thema anpassen --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Und so segne euch der allmächtige Gott, der Vater, der Sohn und der Heilige Geist. Amen.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#fa6e32;&quot;&gt;## &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#399ee6;&quot;&gt;Schlusslied
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;![[Schlusslied.mp3]]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Die wenigsten nutzen wahrscheinlich Obsidian zur Gottesdienstvorbereitung, aber ich finde tatsächlich, dass das ein sehr guter use-case für Obsidian ist.&lt;&#x2F;p&gt;
&lt;p&gt;Wenn der Gottesdienst dann erstellt ist, dann würde man ihn normalerweise ausdrucken und mitnehmen. Aber ich habe mir gedacht, dass ich das auch anders machen kann. Ich habe mir einen Ebook-Reader gekauft, um meine Gottesdienste und Predigten papierlos zu halten. Ich wollte einfach mal ausprobieren, wie das so ist. Und ich muss sagen, es ist wirklich eine tolle Sache. Ich kann meine Gottesdienste und Predigten auf dem Ebook-Reader lesen und muss sie nicht mehr ausdrucken. Das spart Papier und ist viel praktischer. Und wenn du aufgepasst hast, findest du in dem Template auch schon die Links zu den Musikdateien, die ich in den Gottesdienst einfüge. Das ist wirklich praktisch, denn ich kann die Musik direkt auf dem Ebook-Reader abspielen und muss nicht mehr zwischen verschiedenen Geräten wechseln. Dank des .epub-Formats kann ich die Musikdateien direkt in den Ablauf einfügen. Ein weiterer Mehrwert ist natürlich auch die bessere Lesbarkeit auf dem Ebook-Reader. Ich kann die Schriftgröße, Kontrast und Helligkeit individuell anpassen. Selbst in kompletter Dunkelheit kann ich meine Texte lesen. Das ist wirklich großartig.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;der-export&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-export&quot; aria-label=&quot;Anchor link for: der-export&quot;&gt;Der Export&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Leider gab es dafür noch kein Plugin für Obsidian, deshalb habe ich vor 3 Jahren mein eigenes dafür geschrieben: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SimeonLukas&#x2F;obsidian-kindle-export&quot;&gt;obsidian-kindle-export&lt;&#x2F;a&gt;. Damals besass ich noch einen Kindle, deshalb der Name. Das Plugin exportiert die Markdown-Dateien in ein .epub-Format, das dann per Mail an den Kindle geschickt wird. Das Plugin kann einfach in den Community-Plugins gesucht werden und installiert werden. Das Plugin ist sehr einfach zu bedienen und ich kann es jedem empfehlen, der seine Notizen auf seinem Ebook-Reader lesen möchte. In den Settings gibt man einfach die nötigen Daten an und das Plugin macht die Arbeit. Mit dem Befehl &lt;code&gt;Kindle: Export&lt;&#x2F;code&gt; kann man die Konvertierung starten. Ich habe den Befehl auf die Tasten &lt;code&gt;cmd+0&lt;&#x2F;code&gt; gelegt, damit er schnell und einfach ausgeführt werden kann.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;work-paperlesse-with-obsidian-epub-and-ebookreader&#x2F;images&#x2F;screenrecord.gif&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Leider ist es nicht möglich aus Obsidian heraus eine Mail zu schicken, deshalb gibt es noch ein weiteres Programm, dass diese Funktion übernimmt. &lt;a href=&quot;https:&#x2F;&#x2F;md2epub.staneks.de&#x2F;&quot;&gt;Md2epub&lt;&#x2F;a&gt; ist ein in PHP geschriebener Server, der die Dateien von Obsidian entgegenimmt und dann versendet.  Meine gehostete Version kann natürlich verwendet werden, aber ich empfehle das Programm selbst zu betreiben. Dafür gibt es einen Docker-Container, der hier &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;r&#x2F;simeonstanek&#x2F;md2epub&quot;&gt;hier&lt;&#x2F;a&gt; zu finden ist.&lt;&#x2F;p&gt;
&lt;p&gt;Folgendes Bild zeigt übrigens ein Epub, das ich erstellt habe, Cover hat sich aber geändert.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;work-paperlesse-with-obsidian-epub-and-ebookreader&#x2F;images&#x2F;ebook.jpg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hardware&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hardware&quot; aria-label=&quot;Anchor link for: hardware&quot;&gt;Hardware&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Seit zwei Jahren nutze ich jetzt das Pocketbook Era, das unterstützt das abspielen von Audiodateien innerhalb des .epub-Formats, außerdem kann ich jeden Bluetooth-Lautsprecher damit verbinden. In meinem Fall die Teufelbox Rockster Cross. Damit bin ich völlig zufrieden. Das Pocketbook ist ein sehr guter Ebook-Reader und ich kann ihn jedem empfehlen, der einen Ebook-Reader sucht. Er ist sicher langsamer als ein Kindle, aber der Mehrwert mit der Audiowiedergabe hat mich überzeugt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit-die-digitale-transformation-pastoraler-arbeit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit-die-digitale-transformation-pastoraler-arbeit&quot; aria-label=&quot;Anchor link for: fazit-die-digitale-transformation-pastoraler-arbeit&quot;&gt;Fazit: Die digitale Transformation pastoraler Arbeit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Was als Suche nach dem optimalen Notiz-Tool begann, hat sich zu einem umfassenden digitalen Workflow für die pastorale Arbeit entwickelt. Obsidian hat sich dabei als ideale Plattform erwiesen, die durch ihre Flexibilität, Markdown-Unterstützung und Erweiterbarkeit überzeugt. Die Kombination mit einem E-Book-Reader wie dem Pocketbook Era schafft eine durchgängig digitale Lösung, die nicht nur papierlos ist, sondern auch neue Möglichkeiten eröffnet.
Die Integration von Audiodateien direkt in den Gottesdienstablauf, die verbesserte Lesbarkeit durch individuell anpassbare Schrift und die Möglichkeit, in jeder Lichtsituation zu arbeiten, sind handfeste Vorteile gegenüber herkömmlichen Papier, auch wenn man die Haptik so mag (vorallem in der Kirche 😇). Durch selbst entwickelte Tools wie das obsidian-kindle-export Plugin wird diese Brücke zwischen Vorbereitung und Durchführung nahtlos geschlagen.
Letztendlich geht es nicht nur um Digitalisierung um ihrer selbst willen. Es geht darum, pastorale Arbeit effizienter, flexibler und nachhaltiger zu gestalten. Die Zeit, die früher für Ausdrucken, Sortieren und Transportieren von Papier aufgewendet wurde, kann nun für die inhaltliche Arbeit genutzt werden. Und während manche vielleicht zögern, auf digitale Lösungen umzusteigen, zeigt dieser Workflow, dass Technologie und Spiritualität sich nicht ausschließen, sondern gewinnbringend ergänzen können.&lt;&#x2F;p&gt;
&lt;p&gt;Amen😘&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/work-paperlesse-with-obsidian-epub-and-ebookreader/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/work-paperlesse-with-obsidian-epub-and-ebookreader/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Einblicke in meinen papierlosen Workflow mit Obsidian, Epubs und Ebook-Readern. Tipps zur Nutzung von Obsidian für Notizen und das Erstellen von Epubs aus Markdown-Dateien. Vorstellung meiner Nutzung von Epubs und Ebook-Readern für das papierlose Arbeiten. </info>
        </item>
        <item>
            <title>Automatische Cover-Bildgenerierung für Zola-Blogs mit Bun, TypeScript und Polotno</title>
            <pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/image-generation-for-zola-with-polotno/</link>
            <guid>https://simeon.staneks.de/posts/image-generation-for-zola-with-polotno/</guid>
            <description xml:base="https://simeon.staneks.de/posts/image-generation-for-zola-with-polotno/">&lt;h1 id=&quot;die-genese-warum-automatisch-bilder-generieren&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-genese-warum-automatisch-bilder-generieren&quot; aria-label=&quot;Anchor link for: die-genese-warum-automatisch-bilder-generieren&quot;&gt;Die Genese: Warum automatisch Bilder generieren?&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Ich liebe Podcasts und höre wirklich viel, deshalb habe ich auf meinem Android Smartphone &lt;a href=&quot;https:&#x2F;&#x2F;antennapod.org&#x2F;&quot;&gt;Antennapod&lt;&#x2F;a&gt; installiert. Wirklich mein lieblings Podcatcher, der dann und wann als Feed-Reader verwendet wird, dabei ist mir aufgefallen, dass ganz einfache RSS-Feeds keine Coverbilder haben, doch für meinen Feed wollte ich das ändern, außerdem brauchte ich sowieso Vorschaubilder für die sozialen Medien. Jeder Blogbeitrag braucht ein ansprechendes Titelbild, um in sozialen Medien, RSS-Feeds und auf der Website selbst Aufmerksamkeit zu erregen. Doch das manuelle Erstellen individueller Bilder für jeden Artikel ist zeitaufwändig und kostet unglaublich viel Überwindung.&lt;&#x2F;p&gt;
&lt;p&gt;Ich habe mich daher entschieden, diesen Prozess zu automatisieren: Ein Script, das aus den Metadaten meiner Blogbeiträge automatisch verschiedene Bilder für verschiedene Plattformen generiert - mit einheitlichem Design, aber individuellen Elementen basierend auf dem Inhalt des jeweiligen Artikels.&lt;&#x2F;p&gt;
&lt;div style=&quot;
    text-align: center;
    display: flex;
    overflow: scroll;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;de&#x2F;feed.jpg&quot; alt=&quot;RSS-Feed-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;en&#x2F;feed.jpg&quot; alt=&quot;RSS-Feed-Bild&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;de&#x2F;instagram1.jpg&quot; alt=&quot;Instagram-Bild 1&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;de&#x2F;instagram2.jpg&quot; alt=&quot;Instagram-Bild 2&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;en&#x2F;instagram1.jpg&quot; alt=&quot;Instagram-Bild 1&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;en&#x2F;instagram2.jpg&quot; alt=&quot;Instagram-Bild 2&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;de&#x2F;preview.jpg&quot; alt=&quot;OG-Image&quot;&gt;
&lt;img src=&quot;&#x2F;posts&#x2F;20241120&#x2F;&#x2F;images&#x2F;en&#x2F;preview.jpg&quot; alt=&quot;OG-Image&quot;&gt;
&lt;&#x2F;div&gt;
&lt;h1 id=&quot;die-technik-zola-bun-typescript-und-polotno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-technik-zola-bun-typescript-und-polotno&quot; aria-label=&quot;Anchor link for: die-technik-zola-bun-typescript-und-polotno&quot;&gt;Die Technik: Zola, Bun, TypeScript und Polotno&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;die-technische-losung-im-uberblick&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-technische-losung-im-uberblick&quot; aria-label=&quot;Anchor link for: die-technische-losung-im-uberblick&quot;&gt;Die technische Lösung im Überblick&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Meine Lösung nutzt folgende Technologien:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zola&lt;&#x2F;strong&gt; als statischer Site-Generator für den Blog und in diesem Fall als Server für den RSS-Feed&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bun&lt;&#x2F;strong&gt; als JavaScript-Runtime (schneller als Node.js)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;&#x2F;strong&gt; für die Programmlogik&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Polotno&lt;&#x2F;strong&gt; zur programmatischen Bildgenerierung&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;RSS-Feeds&lt;&#x2F;strong&gt; als Datenquelle für die Beitragsinformationen&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Das System generiert für jeden Blogbeitrag vier verschiedene Bildformate:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Ein OG-Image für Social Media Previews&lt;&#x2F;li&gt;
&lt;li&gt;Ein Instagram-Format 1&lt;&#x2F;li&gt;
&lt;li&gt;Ein Instagram-Format 2&lt;&#x2F;li&gt;
&lt;li&gt;Ein Feed-Bild für RSS-Reader&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Zusätzlich werden alle Bilder automatisch für verschiedene Sprachversionen des Blogs erstellt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-deployment-script&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-deployment-script&quot; aria-label=&quot;Anchor link for: das-deployment-script&quot;&gt;Das Deployment-Script&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Hier ist das Bash-Script, das den gesamten Prozess startet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Veröffentlichungs-Skript für den Blog
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;Users&#x2F;simeonstanek&#x2F;Apps&#x2F;BLOG-Homepage&#x2F;simeonsblog&#x2F;scripts
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# start the server
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1234 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;span&gt; 5
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# run the generator
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;bun&lt;&#x2F;span&gt;&lt;span&gt; run index.ts
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# stop the server
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;kill &lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;lsof&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -t -i&lt;&#x2F;span&gt;&lt;span&gt;:1234)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# commit all changes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;Users&#x2F;simeonstanek&#x2F;Apps&#x2F;BLOG-Homepage&#x2F;simeonsblog
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; pull
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; add &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; commit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt; -m &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;update content on $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; push
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dieses Script führt folgende Schritte aus:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Wechselt in das Scripts-Verzeichnis&lt;&#x2F;li&gt;
&lt;li&gt;Startet den Zola-Server im Hintergrund (für den RSS-Feed)&lt;&#x2F;li&gt;
&lt;li&gt;Wartet 5 Sekunden, bis der Server vollständig hochgefahren ist&lt;&#x2F;li&gt;
&lt;li&gt;Führt das TypeScript-Script mit Bun aus&lt;&#x2F;li&gt;
&lt;li&gt;Stoppt den Zola-Server&lt;&#x2F;li&gt;
&lt;li&gt;Checkt Änderungen ein und pusht sie zum Git-Repository&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;der-bildgenerator-unter-der-haube&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-bildgenerator-unter-der-haube&quot; aria-label=&quot;Anchor link for: der-bildgenerator-unter-der-haube&quot;&gt;Der Bildgenerator: Unter der Haube&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nun schauen wir uns den Kern der Lösung an - das TypeScript-Script, das die eigentliche Arbeit erledigt:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;typescript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-typescript &quot;&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span&gt;{ hash } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;from &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;bun&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span&gt;fs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;fs&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span&gt;{ DOMParser } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;xmldom&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span&gt;{ createInstance } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;polotno-node&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Hauptfunktion, die den gesamten Prozess steuert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;async function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;lang&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;titles &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;dates &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;urls &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;content &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;de&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; RSS-Feed abrufen und verarbeiten
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span&gt;data &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span&gt;(lang)
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;parser &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;DOMParser&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;xml &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;parser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;parseFromString&lt;&#x2F;span&gt;&lt;span&gt;(str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;text&#x2F;xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;items &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;xml&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;item&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;xml&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;language&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;childNodes[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodeValue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Informationen aus dem RSS-Feed extrahieren
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;o &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;o &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span&gt;items&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                titles&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(items[o]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;title&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;childNodes[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodeValue)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;date &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;(items[o]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;pubDate&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;childNodes[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodeValue)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;options &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;{ year&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;numeric&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;month&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;long&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;day&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;numeric&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;formattedDate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;toLocaleDateString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;de-DE&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;options)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                dates&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(formattedDate)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;items[o]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;link&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;childNodes[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodeValue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;url[url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url[url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                urls&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(url)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;description &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;items[o]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;childNodes[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodeValue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                    description &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;...&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;                description &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;&#x2F;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;&amp;gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#4cbf99;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;gm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(description)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Templates anpassen und Bilder generieren
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;k &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;k &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span&gt;titles&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;template &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#ed9366;&quot;&gt;JSON&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span&gt;(fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;readFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;data&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;utf8&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;i &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;i &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span&gt;template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                    template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;background &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;linear-gradient(228deg,white 0%,&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getRGB&lt;&#x2F;span&gt;&lt;span&gt;(titles[k]) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot; 100%)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;j &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;j &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span&gt;template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span&gt;j&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;title&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                            template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;titles[k]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                        }
&lt;&#x2F;span&gt;&lt;span&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;date&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                            template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Simeon Stanek :: &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;dates[k]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                        }
&lt;&#x2F;span&gt;&lt;span&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;hintergrundtext&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;                            template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pages[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;children[j]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;content[k]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;                        }
&lt;&#x2F;span&gt;&lt;span&gt;                    }
&lt;&#x2F;span&gt;&lt;span&gt;                }
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;exporter&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;urls[k]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;languages)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            }
&lt;&#x2F;span&gt;&lt;span&gt;        })&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Funktion zur Bildgenerierung und -speicherung
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;async function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;exporter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;languages&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;        fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;mkdirSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ recursive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ogimage.json&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;existsSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;preview.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;instance &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;createInstance&lt;&#x2F;span&gt;&lt;span&gt;({ key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;[your-api-key]&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span&gt;instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;jsonToImageBase64&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ mimeType&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;image&#x2F;jpeg&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;writeFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;preview.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;base64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;close&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram1.json&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;existsSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;instagram1.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;instance &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;createInstance&lt;&#x2F;span&gt;&lt;span&gt;({ key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;[your-api-key]&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span&gt;instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;jsonToImageBase64&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ mimeType&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;image&#x2F;jpeg&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;writeFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;instagram1.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;base64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;close&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram2.json&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;existsSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;instagram2.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;instance &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;createInstance&lt;&#x2F;span&gt;&lt;span&gt;({ key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;[your-api-key]&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span&gt;instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;jsonToImageBase64&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ mimeType&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;image&#x2F;jpeg&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;writeFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;instagram2.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;base64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;close&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;feed.json&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp; !&lt;&#x2F;span&gt;&lt;span&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;existsSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;feed.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;instance &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;createInstance&lt;&#x2F;span&gt;&lt;span&gt;({ key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;[your-api-key]&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span&gt;instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;jsonToImageBase64&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{ mimeType&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;image&#x2F;jpeg&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;writeFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;..&#x2F;content&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;images&#x2F;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;languages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;feed.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;base64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;            instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;close&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Funktion zur Erzeugung eines RGB-Farbwerts aus einem String
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getRGB&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;hashed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;hash&lt;&#x2F;span&gt;&lt;span&gt;(str)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;hashed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;#&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Hauptfunktion zur Generierung der Bilder
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;async function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;generate&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ogimage.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram1.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram2.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;feed.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;ogimage.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;en&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram1.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;en&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram2.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;en&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;feed.json&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;http:&#x2F;&#x2F;127.0.0.1:1234&#x2F;en&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;generate&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;der-ablauf-im-detail&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#der-ablauf-im-detail&quot; aria-label=&quot;Anchor link for: der-ablauf-im-detail&quot;&gt;Der Ablauf im Detail&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-daten-aus-dem-rss-feed-auslesen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-daten-aus-dem-rss-feed-auslesen&quot; aria-label=&quot;Anchor link for: 1-daten-aus-dem-rss-feed-auslesen&quot;&gt;1. Daten aus dem RSS-Feed auslesen&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Script beginnt damit, den RSS-Feed des Blogs zu fetchen und die relevanten Informationen zu extrahieren:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Titel der Beiträge&lt;&#x2F;li&gt;
&lt;li&gt;Veröffentlichungsdatum (formatiert)&lt;&#x2F;li&gt;
&lt;li&gt;URLs der Beiträge&lt;&#x2F;li&gt;
&lt;li&gt;Kurzbeschreibungen (auf 500 Zeichen gekürzt)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Dabei wird der Feed als XML geparst und die Daten in Arrays gespeichert.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-individuelle-farbgebung-pro-artikel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-individuelle-farbgebung-pro-artikel&quot; aria-label=&quot;Anchor link for: 2-individuelle-farbgebung-pro-artikel&quot;&gt;2. Individuelle Farbgebung pro Artikel&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Eine clevere Funktion des Scripts ist die automatische Farbgenerierung für jeden Artikel:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;typescript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-typescript &quot;&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;getRGB&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;hashed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;hash&lt;&#x2F;span&gt;&lt;span&gt;(str)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span&gt;hashed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;#&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Diese Funktion erzeugt aus dem Titel des Artikels einen Hash-Wert und wandelt diesen in einen HEX-Farbcode um. So erhält jeder Artikel eine einzigartige, aber konsistente Farbgebung, die bei jedem Durchlauf gleich bleibt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-template-anpassung-fur-jeden-artikel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-template-anpassung-fur-jeden-artikel&quot; aria-label=&quot;Anchor link for: 3-template-anpassung-fur-jeden-artikel&quot;&gt;3. Template-Anpassung für jeden Artikel&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Für jeden Bildtyp (OG-Image, Instagram, Feed) gibt es eine JSON-Vorlage im &quot;data&quot;-Verzeichnis. Diese Vorlagen werden für jeden Artikel dynamisch angepasst. Erstellt habe ich die Templates mit &lt;a href=&quot;https:&#x2F;&#x2F;studio.polotno.com&#x2F;&quot;&gt;Polotno Studio&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Der Hintergrund erhält einen individuellen Farbverlauf&lt;&#x2F;li&gt;
&lt;li&gt;Der Titel wird eingefügt&lt;&#x2F;li&gt;
&lt;li&gt;Das Datum mit Autorname wird hinzugefügt&lt;&#x2F;li&gt;
&lt;li&gt;Ein Ausschnitt des Inhalts wird als Hintergrundtext verwendet
Natürlich sollte man sich vergwissern, dass die Layer im jeweiligen JSON-Template auch so heißen, wie sie im TypeScript-Script angesprochen werden.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;image-generation-for-zola-with-polotno&#x2F;images&#x2F;polotno00001.png&quot; alt=&quot;Polotno Studio&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-bildgenerierung-mit-polotno&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-bildgenerierung-mit-polotno&quot; aria-label=&quot;Anchor link for: 4-bildgenerierung-mit-polotno&quot;&gt;4. Bildgenerierung mit Polotno&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die angepassten Templates werden mit Polotno in JPEG-Bilder umgewandelt:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;typescript&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-typescript &quot;&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;instance &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;createInstance&lt;&#x2F;span&gt;&lt;span&gt;({
&lt;&#x2F;span&gt;&lt;span&gt;  key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;[your&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;api&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;key]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f51818;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; hatte es verpasst die Variabele umzubenennen
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;pdfBase64 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span&gt;instance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;jsonToImageBase64&lt;&#x2F;span&gt;&lt;span&gt;(template&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  mimeType&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;image&#x2F;jpeg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;5-speicherung-der-bilder-in-der-blogstruktur&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-speicherung-der-bilder-in-der-blogstruktur&quot; aria-label=&quot;Anchor link for: 5-speicherung-der-bilder-in-der-blogstruktur&quot;&gt;5. Speicherung der Bilder in der Blogstruktur&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die generierten Bilder werden in einem strukturierten Verzeichnisbaum gespeichert:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#fafafa;color:#61676c;&quot;&gt;&lt;code&gt;&lt;span&gt;&#x2F;content&#x2F;[artikelname]&#x2F;images&#x2F;[sprache]&#x2F;[bildtyp].jpg
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;6-mehrsprachige-unterstutzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#6-mehrsprachige-unterstutzung&quot; aria-label=&quot;Anchor link for: 6-mehrsprachige-unterstutzung&quot;&gt;6. Mehrsprachige Unterstützung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Script generiert automatisch Bilder für alle Sprachversionen des Blogs (im Beispiel Deutsch und Englisch).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zola-konfiguration-fur-die-bildnutzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zola-konfiguration-fur-die-bildnutzung&quot; aria-label=&quot;Anchor link for: zola-konfiguration-fur-die-bildnutzung&quot;&gt;Zola-Konfiguration für die Bildnutzung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Damit Zola die generierten Bilder korrekt nutzen kann, hier ein Beispiel für die entsprechende Template-Konfiguration:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span&gt;    {% if page.path %}
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;property&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;og:image&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;{{config.base_url | safe}}{{ page.path | safe }}&#x2F;images&#x2F;{{lang}}&#x2F;preview.jpg&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&#x2F;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;property&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;og:logo&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;{{config.base_url | safe}}{{ page.path | safe }}&#x2F;images{{lang}}&#x2F;preview.jpg&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&#x2F;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- twitter card --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;twitter:card&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;summary_large_image&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;twitter:image&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;{{config.base_url | safe}}{{ page.path | safe }}images&#x2F;{{lang}}&#x2F;preview.jpg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    {% elif config.extra.favicon %}
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;property&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;og:image&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;{{ config.extra.favicon }}&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&#x2F;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    {% endif %}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;die-vorteile-der-automatisierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-vorteile-der-automatisierung&quot; aria-label=&quot;Anchor link for: die-vorteile-der-automatisierung&quot;&gt;Die Vorteile der Automatisierung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Diese Lösung bietet mehrere Vorteile:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Konsistentes Design&lt;&#x2F;strong&gt;: Alle Bilder folgen demselben Design-Schema, was die Markenidentität stärkt (wenn ich eine hätte).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Individueller Touch&lt;&#x2F;strong&gt;: Jeder Artikel erhält trotzdem eine eigene Farbgebung und seinen Inhalt als visuelle Elemente.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zeiteinsparung&lt;&#x2F;strong&gt;: Die Bildgenerierung erfolgt bevor der Artikel veröffentlicht wird, indem ich nur das Deployment-Script ausführe.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mehrsprachigkeit&lt;&#x2F;strong&gt;: Alle Sprachversionen werden ohne zusätzlichen Aufwand unterstützt.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vollständige Integration&lt;&#x2F;strong&gt;: Durch die Git-Integration werden alle Änderungen sofort veröffentlicht.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Mit dieser Kombination aus Zola, Bun, TypeScript und Polotno habe ich eine elegante Lösung gefunden, um den Workflow für meinen Blog zu verbessern. Die automatische Bildgenerierung sorgt dafür, dass jeder Artikel visuell ansprechend präsentiert wird, ohne dass ich dafür zusätzlichen Aufwand betreiben muss.&lt;&#x2F;p&gt;
&lt;p&gt;Die Lösung ist flexibel und kann leicht an andere Anforderungen angepasst werden - sei es durch Änderung der Templates, Hinzufügen weiterer Bildformate oder Anpassung der visuellen Elemente.&lt;&#x2F;p&gt;
&lt;p&gt;Falls du diesen Ansatz für deinen eigenen Blog verwenden möchtest, stelle sicher, dass du einen eigenen Polotno-API-Key erhältst und die Templates an dein eigenes Design anpasst.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/image-generation-for-zola-with-polotno/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/image-generation-for-zola-with-polotno/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ein Script, das aus den Metadaten von Blogbeiträgen automatisch verschiedene Bilder für verschiedene Plattformen generiert - mit einheitlichem Design, aber individuellen Elementen basierend auf dem Inhalt des jeweiligen Artikels. </info>
        </item>
        <item>
            <title>Bibelstudien mit Bible Crawler, Obsidian und Bible Linker</title>
            <pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/bible-crawler-obsidian-and-bible-linker/</link>
            <guid>https://simeon.staneks.de/posts/bible-crawler-obsidian-and-bible-linker/</guid>
            <description xml:base="https://simeon.staneks.de/posts/bible-crawler-obsidian-and-bible-linker/">&lt;h1 id=&quot;genese&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#genese&quot; aria-label=&quot;Anchor link for: genese&quot;&gt;Genese&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Vor ca. drei Jahren wollte ich meine Bibelstudien digitalisieren. Ich wollte die Bibel in verschiedenen Versionen lesen und vergleichen können, doch leider ist es in Deutschland geradezu unmöglich, an die Texte der Bibel in digitaler Form zu kommen. Die meisten Bibelversionen sind urheberrechtlich geschützt. Zum Glück gibt es aber eine Menge Webseiten, die die Bibeltexte in digitaler Form lesbar anbieten. So kam ich auf die Idee, ein Programm zu schreiben, das die Bibeltexte von diesen Webseiten &quot;crawled&quot; und in einer für mich nutzbaren Form speichert, da vor kurzem ein paar Issues auf Github aufgetaucht sind, habe ich mich entschieden, das Programm zu verbessern und zu erweitern und natürlich einen Blogpost darüber zu schreiben.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bible-crawler&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bible-crawler&quot; aria-label=&quot;Anchor link for: bible-crawler&quot;&gt;Bible Crawler&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Das kleine Programm habe ich auf &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SimeonLukas&#x2F;Bible-Crawler-Rust&quot;&gt;Github&lt;&#x2F;a&gt; veröffentlicht und es gibt 3 Versionen: eine für Windows, eine für Linux und eine für MacOS, so dass jeder der möchte sich die Bibeltexte in Markdown-Dateien herunterladen kann. Da ich zu der Zeit ein großes Interesse an der Programmiersprache Rust hatte, habe ich das Programm in Rust geschrieben. Rust ist eine moderne, performante und sichere Programmiersprache, die sich besonders für Systemprogrammierung eignet. Das Programm ist sehr einfach gehalten und besteht aus nur einer Datei und den enstprechenden JSON-Dateien, die die Konfiguration für die Bibelversionen enthalten.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;was-macht-der-bible-crawler&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#was-macht-der-bible-crawler&quot; aria-label=&quot;Anchor link for: was-macht-der-bible-crawler&quot;&gt;Was macht der Bible Crawler?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der Bible Crawler fetcht das HTML der Webseiten der verschiedenen Bibelversionen (bibleserver.com und die-bibel.de) und extrahiert die Bibeltexte. Die Bibeltexte werden in Kapitel und Verse unterteilt und in einer für mich lesbaren Form gespeichert. Die Bibeltexte können dann in einem Texteditor wie Obsidian gelesen und bearbeitet werden.
Folgende Bibelversionen stehen aktuell in der neuesten Version zur Verfügung:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Übersetzungen&lt;&#x2F;span&gt;&lt;span&gt; von bibleserver.com:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span&gt; Einheitsübersetzung (EU)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span&gt; Luther Bibel (LUT)          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;3.&lt;&#x2F;span&gt;&lt;span&gt; Elberfelder Bibel (ELB)     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;4.&lt;&#x2F;span&gt;&lt;span&gt; Hoffnung für alle (HFA)    
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;5.&lt;&#x2F;span&gt;&lt;span&gt; Schlachter Bibel (SLT)      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;6.&lt;&#x2F;span&gt;&lt;span&gt; La Biblia Textual (BTX)     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;7.&lt;&#x2F;span&gt;&lt;span&gt; Gute Nachricht Bibel 2018 (GNB) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;8.&lt;&#x2F;span&gt;&lt;span&gt; Neue Evangelistische Übersetzung (NEUE &#x2F; NeÜ)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Übersetzungen&lt;&#x2F;span&gt;&lt;span&gt; von die-bibel.de:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;9.&lt;&#x2F;span&gt;&lt;span&gt; Basis Bibel (BB)            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;10.&lt;&#x2F;span&gt;&lt;span&gt; Nestle-Aland 28 (NA28)     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;11.&lt;&#x2F;span&gt;&lt;span&gt; Biblia Hebraica Stuttgartensia (BHS)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;Installation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Man muss einfach nur das &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SimeonLukas&#x2F;Bible-Crawler-Rust&#x2F;releases&#x2F;latest&quot;&gt;Programm&lt;&#x2F;a&gt; herunterladen und ausführen. Es gibt keine weiteren Abhängigkeiten. Das Programm ist sehr einfach gehalten.&lt;&#x2F;p&gt;
&lt;p&gt;Als Nutzer von MacOS oder Linux muss man lediglich die Datei mit &lt;code&gt;chmod +x .&#x2F;biblecrawler&lt;&#x2F;code&gt; ausführbar machen, damit man sie per &lt;code&gt;.&#x2F;biblecrawler&lt;&#x2F;code&gt; ausführen kann.&lt;&#x2F;p&gt;
&lt;p&gt;Für MacOS Nutzer muss man zusätzlich in den Sicherheitseinstellungen die Ausführung von nicht signierten Programmen erlauben.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;nutzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#nutzung&quot; aria-label=&quot;Anchor link for: nutzung&quot;&gt;Nutzung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Das Programm ist sehr einfach zu bedienen.
Nachdem man per Nummer oder Kürzel die gewünschte Bibelversion ausgewählt hat, darf man in der neusten Version sich für eine Namenskonvention entscheiden.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Welche&lt;&#x2F;span&gt;&lt;span&gt; Namenskonvention soll verwendet werden&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span&gt; Abkürzungen Großbuchstaben (GEN, EXO, LEV, NUM, DEU, etc.)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span&gt; Abkürzungen Groß und Kleinbuchstaben  (Gen, Exo, Lev, Num, Deu, etc.)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;3.&lt;&#x2F;span&gt;&lt;span&gt; Deutsch typisch evangelisch (1. Mose, 2. Mose, 3. Mose, 4. Mose, 5. Mose, etc.)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;4.&lt;&#x2F;span&gt;&lt;span&gt; Deutsch typisch katholisch (Genesis, Exodus, Levitikus, Numeri, Deuteronomium, etc.)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;5.&lt;&#x2F;span&gt;&lt;span&gt; Englisch (Genesis, Exodus, Leviticus, Numbers, Deuteronomy, etc.)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;6.&lt;&#x2F;span&gt;&lt;span&gt; Latein (Genesis, Exodus, Leviticus, Numeri, Deuteronomium, etc.)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;video loop autoplay controls width=&quot;100%&quot;&gt;&lt;source src=&quot;images&#x2F;video.mp4&quot; type=&quot;video&#x2F;mp4&quot;&gt;&lt;&#x2F;video&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Danach wird der Bible Crawler die Bibeltexte herunterladen und in Markdown-Dateien speichern. Die Dateien werden in einem Ordner mit dem Namen der ausgewählten Bibelversion gespeichert und die Kapitel werden in einzelnen Dateien gespeichert.
Folglich wird die Bibel zweimal geladen, einmal jedes Buch in einer Markdown-Datei und einmal jedes Kapitel in einer Markdown-Datei.
Das Buch findet sich im Wurzelverzeichnis der Bibelversion und die Kapitel in einem Unterordner mit dem Namen des Buches.
Die Dateien bzw. Ordner sind nach der ausgewählten Namenskonvention benannt, wie z.B. &lt;code&gt;1. Mose&lt;&#x2F;code&gt; oder &lt;code&gt;Genesis&lt;&#x2F;code&gt;.
Das ist für die Nutzung in Obsidian sehr praktisch, da man mit dem Bible-Linker Plugin die Bibeltexte in Obsidian verlinken kann und sich nur eine Namenkonvention merken muss.&lt;&#x2F;p&gt;
&lt;p&gt;Durch das neue Update des Bible Crawlers kann die Einheitsübersetzung je nach Gerät unter einer Minute heruntergeladen werden.&lt;&#x2F;p&gt;
&lt;p&gt;Natürlich kann man die Dateien auch in anderen Programmen nutzen und weiterverarbeiten, doch ich nutze sie hauptsächlich in Obsidian und der folgende Abschnitt zeigt, wie man sie in Obsidian gut nutzen kann.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;obsidian&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#obsidian&quot; aria-label=&quot;Anchor link for: obsidian&quot;&gt;Obsidian&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Die heruntergeladenen Bibeltexte müssen dann in das Obsidian Vault importiert werden. Am besten legt man die Bibeltexte in einem Ordner namens &lt;code&gt;Bible&lt;&#x2F;code&gt; im Wurzelverzeichnis der Vault ab.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;bible-crawler-obsidian-and-bible-linker&#x2F;images&#x2F;crawler00001.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bible-linker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bible-linker&quot; aria-label=&quot;Anchor link for: bible-linker&quot;&gt;Bible Linker&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nachdem man unter den Community Plugins das Bible Linker Plugin installiert hat, kann der Spaß beginnen. Dabei müssen ein paar Einstellungen vorgenommen werden:&lt;&#x2F;p&gt;
&lt;p&gt;Verse offset: -1&lt;br &#x2F;&gt;
Enable muliple translations: true&lt;br &#x2F;&gt;
Paths to translations with their names: Bible&#x2F;NeÜ, Bible&#x2F;BB, Bible&#x2F;NA28, Bible&#x2F;BHS, Bible&#x2F;EU, Bible&#x2F;LUT, Bible&#x2F;ELB, Bible&#x2F;HFA, Bible&#x2F;SLT, Bible&#x2F;BTX, Bible&#x2F;GNB&lt;&#x2F;p&gt;
&lt;p&gt;Nun kann man während des Schreibens in Obsidian einfach die Bibelverse in der gewünschten Version verlinken. Das Plugin erkennt die Bibelverse und verlinkt sie automatisch.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;bible-crawler-obsidian-and-bible-linker&#x2F;images&#x2F;crawler00003.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;bible-crawler-obsidian-and-bible-linker&#x2F;images&#x2F;crawler00002.jpg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nach stetiger Entwicklung und Nutzung bin ich sehr zufrieden mit meinem Bible Crawler. Was als persönliche Lösung für mein digitales Bibelstudium begann, ist zu einem nützlichen Tool geworden, das auch anderen hilft, Bibeltexte digital zu erschließen. Die Kombination aus dem Crawler und Obsidian ermöglicht mir genau das, was ich ursprünglich wollte: verschiedene Bibelübersetzungen einfach lesen, vergleichen und in meine Studien einbinden zu können.
Besonders freut es mich, dass durch die Performance-Verbesserungen das Herunterladen nun so schnell geht und die Unterstützung verschiedener Namenskonventionen die Nutzung noch flexibler macht. Das Projekt zeigt mir, wie aus einer persönlichen Herausforderung eine praktische Lösung entstehen kann, die auch für andere einen Mehrwert bietet.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/bible-crawler-obsidian-and-bible-linker/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/bible-crawler-obsidian-and-bible-linker/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ein von mir geschriebenes Programm, das unterschiedliche Bibelversionen herunterlädt, die man dann in Obsidian nutzen kann. Zudem kann man die Bibelversionen als Markdown-Dateien nutzen und mit ihnen arbeiten und zu anderen Dokumenten konvertieren. </info>
        </item>
        <item>
            <title>Zola: Der Heilige Gral der Static-Site-Generatoren</title>
            <pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/zola-the-holy-grail-of-ssg/</link>
            <guid>https://simeon.staneks.de/posts/zola-the-holy-grail-of-ssg/</guid>
            <description xml:base="https://simeon.staneks.de/posts/zola-the-holy-grail-of-ssg/">&lt;h1 id=&quot;genese&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#genese&quot; aria-label=&quot;Anchor link for: genese&quot;&gt;Genese&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Bei unseren wöchentlichen Jogging-Meetups, reden J. und ich über Gott und die Welt, doch 90% unsere Nerd-Talks handeln von Hosting, Programmierung und jeglichem Technikzeugs, das man sich vorstellen kann. Die Talks sind wahrscheinlich auch der erste Grund fürs Joggen und letztens kam J. auf die grandiose Idee, dass wir doch beide bloggen sollten. Let&#x27;s do it! Mindestens ein Artikel, einmal im Monat. Da bietet sich doch gleich ein Artikel über den eigenen Blog an. - Denn es gibt so viele Wege zum Blog, wie es Menschen gibt.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;zola-ein-rostiges-wegstuck&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zola-ein-rostiges-wegstuck&quot; aria-label=&quot;Anchor link for: zola-ein-rostiges-wegstuck&quot;&gt;Zola - Ein rostiges Wegstück&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Als kleiner Fan der Programmiersprache Rust, bin ich grundsätzlich immer auf der Suche nach Rust-Software. Zola ist ein Static-Site-Generator, der es wirklich in sich hat. Hier ist die Website, der in Entwicklung befindlichen Software: &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;getzola.org&lt;&#x2F;a&gt;
Wenn man nicht vor CLI-Tools zurückschreckt, dann empfehle ich die Software mal zu testen.
Natürlich gibt es weitere Alternativen, wie &lt;a href=&quot;https:&#x2F;&#x2F;gohugo.io&#x2F;&quot;&gt;HUGO&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;nextjs.org&#x2F;&quot;&gt;Next.js&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.gatsbyjs.com&#x2F;&quot;&gt;Gatsby&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;astro.build&#x2F;&quot;&gt;Astro&lt;&#x2F;a&gt;, etc. J. hat sich in diesem Fall für Astro entschieden, doch da ich schon gute Erfahrungen mit Zola gemacht habe, entschied ich mich dafür.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;was-macht-zola&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#was-macht-zola&quot; aria-label=&quot;Anchor link for: was-macht-zola&quot;&gt;Was macht Zola?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Zola erstellt dir aus statischen Inhalten, aus &lt;a href=&quot;https:&#x2F;&#x2F;keats.github.io&#x2F;tera&#x2F;&quot;&gt;Tera-Templates&lt;&#x2F;a&gt; und Markdown Dateien eine sog. statische Webseite. Konfiguriert wird alles in einer sog. &lt;code&gt;config.toml&lt;&#x2F;code&gt;, die im Wurzelverzeichnis des Projekts bzw. Repositories liegt. Die generierte Webseite findet sich dann im &lt;code&gt;public&lt;&#x2F;code&gt; Verzeichnis und kann dann von einem beliebigen Webserver (z.B.&lt;a href=&quot;https:&#x2F;&#x2F;httpd.apache.org&#x2F;&quot;&gt;Apache&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;caddyserver.com&#x2F;&quot;&gt;Caddy&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.nginx.com&#x2F;&quot;&gt;nginx&lt;&#x2F;a&gt;, etc.) bereitgestellt werden. Für mein Projekt nutze ich die Infrastruktur von Github Pages, aber dazu später mehr.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aufbruch-mit-zola&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#aufbruch-mit-zola&quot; aria-label=&quot;Anchor link for: aufbruch-mit-zola&quot;&gt;Aufbruch mit Zola&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Zola ist einfach zu installieren und zu benutzen, aber auch zu konfigurieren. In diesem Artikel werde ich auf einzelne Schritte eingehen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;Installation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Es gibt quasi für jedes Betriebssystem eine passende Binärdatei. Auf Gihtub findet man in den meisten Fällen den passenden &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getzola&#x2F;zola&#x2F;releases&quot;&gt;Release&lt;&#x2F;a&gt;, wenn der nicht zu finden ist, dann findet man auch auf &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;installation&#x2F;&quot;&gt;getzola.org&lt;&#x2F;a&gt; Installationsskripte und auch eine Anleitung zum kompilieren von Zola.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;initialisierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#initialisierung&quot; aria-label=&quot;Anchor link for: initialisierung&quot;&gt;Initialisierung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Wenn Zola installiert ist, kann man mit &lt;code&gt;zola init&lt;&#x2F;code&gt; die Verzeichisstruktur eines neuen Projekts erstellen.
Zola frägt dich dann:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Welcome&lt;&#x2F;span&gt;&lt;span&gt; to Zola!
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Please&lt;&#x2F;span&gt;&lt;span&gt; answer a few questions to get started quickly.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Any&lt;&#x2F;span&gt;&lt;span&gt; choices made can be changed by modifying the `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;config.toml&lt;&#x2F;span&gt;&lt;span&gt;` file later.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; What &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;is&lt;&#x2F;span&gt;&lt;span&gt; the URL of your site&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span&gt; (https:&#x2F;&#x2F;example.com)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07171;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;test.staneks.de
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Do &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;you&lt;&#x2F;span&gt;&lt;span&gt; want to enable Sass compilation&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;Y&#x2F;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: n
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Do &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;you&lt;&#x2F;span&gt;&lt;span&gt; want to enable syntax highlighting&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;y&#x2F;N&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: y
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Do &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;you&lt;&#x2F;span&gt;&lt;span&gt; want to build a search index of the content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;y&#x2F;N&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: n
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Done!&lt;&#x2F;span&gt;&lt;span&gt; Your site was created in &#x2F;Users&#x2F;simeon&#x2F;zola&#x2F;testblog.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Get&lt;&#x2F;span&gt;&lt;span&gt; started by moving into the directory and using the built-in server: `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve`
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;Visit&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;www.getzola.org for the full documentation.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;zola-serve&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zola-serve&quot; aria-label=&quot;Anchor link for: zola-serve&quot;&gt;zola serve&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Mit dem Befehl &lt;code&gt;zola serve&lt;&#x2F;code&gt; kann man nun die Webseite auf &lt;code&gt;localhost:1111&lt;&#x2F;code&gt; einsehen. Bei jeder Änderung passt sich die Seite dann auch an.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;images&#x2F;zola00002.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;konfiguration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#konfiguration&quot; aria-label=&quot;Anchor link for: konfiguration&quot;&gt;Konfiguration&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die Konfiguartionsdatei &lt;code&gt;config.toml&lt;&#x2F;code&gt; liegt im Wurzelverzeichnis des Projekts. Sie ist der Dreh und Angelpunkt für das Projekt. Alle möglichen Konfigurationen finden sich in der &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;configuration&#x2F;&quot;&gt;Dokumentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Je nach dem empfiehlt dir Zola eine &lt;code&gt;ìndex.html&lt;&#x2F;code&gt; datei unter &lt;code&gt;templates&lt;&#x2F;code&gt; zu erstellen, bzw. kann man direkt ein Theme installieren, das schon Templates und mögliche statische Inhalte beinhaltet. Eine genauere Anletung dazu gibt es unter &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;themes&#x2F;installing-and-using-themes&#x2F;&quot;&gt;Installing &amp;amp; using themes&lt;&#x2F;a&gt;. Für meinen Blog gehe ich mit dem Theme &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;themes&#x2F;apollo&#x2F;&quot;&gt;Apollo&lt;&#x2F;a&gt;. Diese Theme bringt schon einen Darkmode mit. Man kann sich dann entscheiden ob man die Templates im Theme anpasst, oder weitere im Ordner &lt;code&gt;&#x2F;templates&lt;&#x2F;code&gt; hinzufügt.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;theme&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#theme&quot; aria-label=&quot;Anchor link for: theme&quot;&gt;Theme&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Nachdem das Theme per git installiert wurde, oder die Daten von einem .zip Archiv in das Verzeichnis &lt;code&gt;&#x2F;themes&lt;&#x2F;code&gt; extrahiert wurden, muss man die &lt;code&gt;config.toml&lt;&#x2F;code&gt; Datei dem entsprechend anpassen:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Die URL der Webseite
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;base_url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;test.staneks.de&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Name des Themes, das im Ordner `&#x2F;themes&#x2F;apollo` liegt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;theme &lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;apollo&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Title der Webseite
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Testing&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Bezeichnung der Schlagworte, die den Artikeln zugewiesen werden sollen
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;taxonomies &lt;&#x2F;span&gt;&lt;span&gt;= [{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;tags&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Generiere eine CSS Datei aus sass
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;compile_sass &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Erstelle einen Suchindex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;build_search_index &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;#Markdown abhängige Einstellungen
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;markdown&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Erlaube Syntax Highlighting
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;highlight_code &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Theme abhängige Einstellungen
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Aktiviere das Darkmode
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;theme &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;auto&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Social links
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;socials &lt;&#x2F;span&gt;&lt;span&gt;= [
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mastodon&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;indieweb.social&#x2F;@simerl&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;icon &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;mastodon&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;www.instagram.com&#x2F;simeonstanek&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;icon &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;instagram&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;github&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;github.com&#x2F;SimeonLukas&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;icon &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;github&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;rss&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;rss.xml&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;icon &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;rss&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Navigationleiste
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;menu &lt;&#x2F;span&gt;&lt;span&gt;= [
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;posts&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;posts&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;weight &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;pages&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;pages&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;weight &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;about&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;pages&#x2F;about&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;weight &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;tags&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;&#x2F;tags&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;weight &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Platz für Variablen, die für die ganze Webseite zur Verfügung stehen.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Danach schaut die Webseite so aus:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;images&#x2F;zola00003.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Je nachdem wie der Entwickler des Themes seine Templates erstellt hat findet man unter &lt;code&gt;themes&#x2F;apollo&#x2F;templates&lt;&#x2F;code&gt; die unterschiedlichen .html-Dateien, die mit der Template Engine &lt;a href=&quot;https:&#x2F;&#x2F;keats.github.io&#x2F;tera&#x2F;&quot;&gt;Tera&lt;&#x2F;a&gt; ausgezeichnet wurden.
Diese Templates können dann nach und nach an die eigenen Bedürfnisse angepasst werden. Anhand der Dokumentaion und der schon erstellten Templates kann die Syntax schnell verstanden werden. Hier ein paar Beispiele:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Wenn es einen Titel für eine spezifische Seite gibt, dann nimm diese. --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        {% if page.title %} {{ page.title }}
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Wenn es einen Titel fuür eine spezifische Section gibt, dann nimm diese. --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        {% elif section.title %} {{ section.title }}
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Wenn es keinen Titel gibt, dann den Titel der Webseite. --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        {% else %} {{ config.title }}
&lt;&#x2F;span&gt;&lt;span&gt;        {% endif %}
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- templates&#x2F;base.html --&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;DOCTYPE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;html &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;lang&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;en&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;charset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Testing&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;section &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;section&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;div &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;container&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;      {% block content %} {% endblock %}
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;div&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;section&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- templates&#x2F;index.html --&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Erweitere das base Template und füge es ein --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt; {% extends &amp;quot;base.html&amp;quot; %}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Inhalt der Seite --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;{% block content %}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;h1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;title&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;  This is my blog made with Zola.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- Inhalt der Seite die im Markdown unterhlab de Konfiguration ist --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;{{ page.content }}
&lt;&#x2F;span&gt;&lt;span&gt;{% endblock content %}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Jede .md Datein, bei der in der Konfiguartion &lt;code&gt;template = &quot;index.html&quot;&lt;&#x2F;code&gt; gesetzt wurde, wird wie oben beschrieben gerendert.
Der zola Kompiler weißt dankenswerterweise darauf hin, wenn keys in der Konfiguartion fehlen. Somit kann innerhalb dieser Templates einfaches HTML geschrieben werden und es lassen sich mit der Logik der Engine die Inhalte der Seiten anpassen. Sections sind wie bei anderen SSGs auch notwendig um einzelne Seiten zur gruppieren. Section Dateien liegen im Quellverzeichnis eines Ordners und werden mit Unterstrich gekennzeichnet &lt;code&gt;_index.md&lt;&#x2F;code&gt;. Diesen Sections liegen dann andere Werte vor und durch eine Section kann man über andere Seiten, die auch in dem Ordner liegen iterieren.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- templates&#x2F;section.html --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    {% block post_list %}  
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;main &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;list&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            {%- if paginator %}
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- get section --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                {%- set show_pages = paginator.pages -%}
&lt;&#x2F;span&gt;&lt;span&gt;            {% else %}
&lt;&#x2F;span&gt;&lt;span&gt;                {%- set show_pages = section.pages  -%}
&lt;&#x2F;span&gt;&lt;span&gt;            {% endif -%}
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&amp;lt;!-- macros können in einem anderen Template hinterlegt werden und durch das importieren geladen werden, diese sind dann global verfügbar --&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            {{ post_macros::list_posts(pages=show_pages) }}
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#55b4d490;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    {% endblock post_list %}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;inhalt&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#inhalt&quot; aria-label=&quot;Anchor link for: inhalt&quot;&gt;Inhalt&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Der Inhalt wird einfach unter &lt;code&gt;&#x2F;content&lt;&#x2F;code&gt; abgelegt. Einfache .md Dateien mit einer toml Konfiguration im Header, der durch drei Pluszeichen gekennzeichnete wird. Zola rendert diese Dateien dann zu html und fügt sie zugleich der Sitemap hinzu und wenn gewünscht dem RSS Feed und dem Suchindex.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;md&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-md &quot;&gt;&lt;code class=&quot;language-md&quot; data-lang=&quot;md&quot;&gt;&lt;span&gt;+++
&lt;&#x2F;span&gt;&lt;span&gt;title = &amp;quot;Zola&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;template = &amp;quot;index.html&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;date = 2025-01-01
&lt;&#x2F;span&gt;&lt;span&gt;+++
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nachdem die Seite erstellt wurde und der Inhalt eingefügt wurde, geht es darum die Webseite öffentlich zu machen.
Anhand von Github-Pages möchte ich hier eine grobe Anleitung geben:&lt;&#x2F;p&gt;
&lt;h2 id=&quot;upload-der-webseite-mit-github-pages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#upload-der-webseite-mit-github-pages&quot; aria-label=&quot;Anchor link for: upload-der-webseite-mit-github-pages&quot;&gt;Upload der Webseite mit Github Pages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;add-a-domain-to-github&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#add-a-domain-to-github&quot; aria-label=&quot;Anchor link for: add-a-domain-to-github&quot;&gt;Add a domain to Github&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Zu allererst muss die private Domain bei Github hinzugefügt werden. Die Schritte kann man auf folgenden Screenshots nachsehen:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;images&#x2F;zola00005.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;images&#x2F;zola00006.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gihtub-pages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gihtub-pages&quot; aria-label=&quot;Anchor link for: gihtub-pages&quot;&gt;Gihtub Pages&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Erstelle ein öffentliches Repository auf Github&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Erstelle ein Branch namens &lt;code&gt;gh-pages&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Kopiere die durch &lt;code&gt;zola build&lt;&#x2F;code&gt; erstellten Dateien im &lt;code&gt;public&lt;&#x2F;code&gt; Verzeichnis in den Branch &lt;code&gt;gh-pages&lt;&#x2F;code&gt;  oder rendere die Seite durch Github Actions in den Branch &lt;code&gt;gh-pages&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Füge diesen Script in `.github&#x2F;workflows` ein und benenne es in `zola.yml` oder `main.yml`
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;# Dein Repository muss öffentlich sein
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;push
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;Build and deploy GH Pages
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;runs-on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;ubuntu-latest
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;github.ref == &amp;#39;refs&#x2F;heads&#x2F;main&amp;#39;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;steps&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;      - &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;checkout
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;uses&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;actions&#x2F;checkout@v4
&lt;&#x2F;span&gt;&lt;span&gt;      - &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;build_and_deploy
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;uses&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;shalzz&#x2F;zola-deploy-action@v0.19.2
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#399ee6;&quot;&gt;TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;${{ secrets.GITHUB_TOKEN }}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;Erstelle eine CNAME Datei in das Verzeichnis &lt;code&gt;gh-pages&lt;&#x2F;code&gt; mit der Domain deiner Webseite. Du kannst sie direkt im Ordner &lt;code&gt;static&lt;&#x2F;code&gt; ablegen, dann ist sie immer an der richtigen Stelle.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Ändere den A Record deiner Domain auf den A-Record von Github Pages: &lt;code&gt;185.199.108.153&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Passe deine Einstellungen auf Github an, wie du es auf dem folgenden Bild siehst:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;images&#x2F;zola00004.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Wenn das alles funktioniert hat, dürfte die Webseite auf deiner Domain sichtbar sein.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Zola überzeugt als leichtgewichtiger, performanter Static-Site-Generator, der die Vorzüge von Rust optimal nutzt. Die Kombination aus einfacher Konfiguration, mächtigem Tera-Templating und nahtlosem GitHub-Pages-Deployment macht ihn zu einer hervorragenden Wahl für Entwickler, die Wert auf Einfachheit und Kontrolle legen.
Die Lernkurve ist moderat - mit grundlegenden Markdown- und HTML-Kenntnissen kann man schnell eine funktionale Website aufbauen. Die Flexibilität bei Themes und Templates erlaubt eine individuelle Gestaltung, während die Rust-basierte Architektur für Geschwindigkeit und Zuverlässigkeit bürgt.
Für alle, die einen unkomplizierten, schnellen und anpassungsfähigen Static-Site-Generator suchen, ist Zola definitiv einen genaueren Blick wert.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/zola-the-holy-grail-of-ssg/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/zola-the-holy-grail-of-ssg/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> In diesem Artikel gebe ich dir eine detaillierte Einführung in den Static-Site-Generator (SSG) Zola und die Nutzung von Github Pages. Wir werden die Installation, Konfiguration und den Einsatz von Zola Schritt für Schritt durchgehen und zeigen, wie du deine erstellten Seiten einfach auf Github Pages hosten kannst. </info>
        </item>
        <item>
            <title>Der ATmega32u4 und die Arduino IDE: Eine Offenbarung mit ein bisschen Fegefeuer</title>
            <pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/20241124/</link>
            <guid>https://simeon.staneks.de/posts/20241124/</guid>
            <description xml:base="https://simeon.staneks.de/posts/20241124/">&lt;h1 id=&quot;genese&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#genese&quot; aria-label=&quot;Anchor link for: genese&quot;&gt;Genese&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Bereits 2018 suchte ich nach einer Möglichkeit, eine Tastatur zu emulieren. Damals baute ich eine Fotobox für meine Hochzeit und benötigte Tastatureingaben für ein von GitHub geladenes Programm. Heute stehe ich vor einer ähnlichen Herausforderung – diesmal für ein Projekt in meiner Arbeit. Details dazu finden sich hier: &lt;a href=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;&quot;&gt;Digitales Glücksrad: Lustiger Firlefanz für die Tourismuspastoral&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241124&#x2F;images&#x2F;foto00001.jpeg&quot; alt=&quot;ATmega32u4: Pro Micro&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;installation-und-einrichtung-der-weg-durchs-fegefeuer&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation-und-einrichtung-der-weg-durchs-fegefeuer&quot; aria-label=&quot;Anchor link for: installation-und-einrichtung-der-weg-durchs-fegefeuer&quot;&gt;Installation und Einrichtung - Der Weg durchs Fegefeuer&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;arduino-ide&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#arduino-ide&quot; aria-label=&quot;Anchor link for: arduino-ide&quot;&gt;Arduino IDE&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Die einfachste Methode zur Programmierung des Chips ist die &lt;a href=&quot;https:&#x2F;&#x2F;www.arduino.cc&#x2F;en&#x2F;software&quot;&gt;Arduino IDE&lt;&#x2F;a&gt;. Diese lässt sich unkompliziert herunterladen und installieren.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;atmega32u4-konfigurieren&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#atmega32u4-konfigurieren&quot; aria-label=&quot;Anchor link for: atmega32u4-konfigurieren&quot;&gt;ATmega32u4 konfigurieren&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nach der Installation navigiert man zu den &lt;em&gt;Einstellungen&lt;&#x2F;em&gt; und fügt unter &lt;em&gt;Zusätzliche Boardverwalter-URLs&lt;&#x2F;em&gt; folgenden Link ein:
&lt;code&gt;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;sparkfun&#x2F;Arduino_Boards&#x2F;main&#x2F;IDE_Board_Manager&#x2F;package_sparkfun_index.json&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241124&#x2F;images&#x2F;foto00002.png&quot; alt=&quot;Boardverwalter&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Anschließend wählt man unter &lt;em&gt;Werkzeuge&lt;&#x2F;em&gt; das entsprechende Board aus – in diesem Fall den &lt;em&gt;Sparkfun Pro Micro&lt;&#x2F;em&gt;. Wichtig ist auch die Auswahl des korrekten Prozessors, abhängig von der Betriebsspannung. Der Programmer sollte ebenfalls zum Chip passen. Das Board wird per USB (in meinem Fall USB-C) angeschlossen und sollte sofort erkannt werden.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241124&#x2F;images&#x2F;foto00003.png&quot; alt=&quot;Prozessor&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;div class=&quot;note-container&quot;&gt;
  
    &lt;div class=&quot;note-header&quot;&gt;
      
        &lt;div class=&quot;note-icon&quot;&gt;
        &lt;p&gt;Das wahre Fegefeuer: &lt;br&gt;Ein wichtiger Hinweis!&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
      
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;note-content&quot;&gt;
      &lt;p&gt;Bei falscher Prozessorauswahl und anschließendem Upload kann der Chip funktionsunfähig werden. In diesem Fall muss der Bootloader neu geflasht werden:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Korrekten Prozessor auswählen&lt;&#x2F;li&gt;
&lt;li&gt;Bootloader-Modus aktivieren (2x schnell hintereinander die Pins &lt;code&gt;RST&lt;&#x2F;code&gt; &amp;amp; &lt;code&gt;GND&lt;&#x2F;code&gt; verbinden)&lt;&#x2F;li&gt;
&lt;li&gt;Innerhalb von 8 Sekunden nach dem Reset die Datei hochladen (am besten Upload vorbereiten und dann erst in den Bootloader-Modus wechseln)&lt;&#x2F;li&gt;
&lt;li&gt;Bei Fehlermeldungen Vorgang wiederholen&lt;&#x2F;li&gt;
&lt;li&gt;Erfolgreicher Upload wird mit der Meldung &lt;code&gt;avrdude done. Thank you.&lt;&#x2F;code&gt; bestätigt&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

    &lt;&#x2F;div&gt;
  
&lt;&#x2F;div&gt;
&lt;p&gt;Nach der Bewältigung des Prozessor-Fegefeuers kann die eigentliche Programmierung beginnen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;die-offenbarung-programmierung-des-chips&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#die-offenbarung-programmierung-des-chips&quot; aria-label=&quot;Anchor link for: die-offenbarung-programmierung-des-chips&quot;&gt;Die Offenbarung: Programmierung des Chips&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Zum Testen eignet sich das Blink-Beispiel unter &lt;em&gt;Datei &amp;gt; Beispiele &amp;gt; 01.Basics &amp;gt; Blink&lt;&#x2F;em&gt;. Auch wenn dieses bei mir nicht wie erwartet funktionierte, zeigte der erfolgreiche Upload, dass die grundlegende Kommunikation mit dem Board funktioniert. Für Tastatureingaben wird zusätzlich die Keyboard-Bibliothek benötigt, die sich über &lt;em&gt;Sketch &amp;gt; Bibliothek einbinden&lt;&#x2F;em&gt; installieren lässt. Ein funktionierendes &lt;a href=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;#codebeispiel&quot;&gt;Codebeispiel&lt;&#x2F;a&gt; findet sich im verlinkten Artikel.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Der ATmega32u4 erweist sich als wahre Offenbarung in der Welt der Mikrocontroller. Wenn man einmal das anfängliche Fegefeuer der Konfiguration durchschritten hat, bietet er sowohl erfahrenen Arduino-Entwicklern als auch Einsteigern durch seine kompakte Größe und die umfangreiche Beispielsammlung in der IDE einen hervorragenden Weg zur Mikrocontroller-Programmierung.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/20241124/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/20241124/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ich erkläre dir in diesem Artikel, wie du den ATmega32u4-Mikrocontroller mit der Arduino IDE programmierst. Wir gehen Schritt für Schritt durch die Installation, Konfiguration und den Einsatz des ATmega32u4 und zeigen, wie du ihn für deine Projekte nutzen kannst. Dieser Leitfaden richtet sich an Anfänger und Fortgeschrittene, die eine effiziente und flexible Lösung für ihre Mikrocontroller-Projekte suchen. </info>
        </item>
        <item>
            <title>SummerCart64 N64 Flashcart: Must-Have für N64 Enthusiasten</title>
            <pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/20241122/</link>
            <guid>https://simeon.staneks.de/posts/20241122/</guid>
            <description xml:base="https://simeon.staneks.de/posts/20241122/">&lt;h1 id=&quot;genese&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#genese&quot; aria-label=&quot;Anchor link for: genese&quot;&gt;Genese&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Ich glaube 10 Jahre waren es. Jedenfalls suchten wir lange nach unserer alten N64-Konsole. Kurz bevor ich sie dann bei Kleinanzeigen erworben hätte, lag sie in einer weißen Tüte im Keller meiner Eltern. Dabei lag noch eine PS2-Slim. Nostalgia kicked in. Ich war so glücklich mit dem Fund und freute mich schon aufs Zocken.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;sc64-n64-flashcart-der-moderne-weg-n64-spiele-zu-geniessen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#sc64-n64-flashcart-der-moderne-weg-n64-spiele-zu-geniessen&quot; aria-label=&quot;Anchor link for: sc64-n64-flashcart-der-moderne-weg-n64-spiele-zu-geniessen&quot;&gt;SC64 N64 Flashcart: Der moderne Weg N64 Spiele zu genießen&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Als langjähriger Nintendo 64 Enthusiast war ich immer auf der Suche nach einer zuverlässigen Möglichkeit, meine Lieblingsspiele auf Original-Hardware zu spielen. Nach einiger Recherche bin ich auf den SC64 Flashcart gestoßen - und ich muss sagen, es war eine der besten Entscheidungen für mein Retro-Gaming Setup. Zusätzlich kaufte ich mir noch zwei neue Controller auf AliExpress und ich war bereit für eine neue Erlebnisreise mit meinem N64.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241122&#x2F;images&#x2F;n6400001.jpeg&quot; alt=&quot;N64 SC64&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;was-ist-der-sc64-summercart64&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#was-ist-der-sc64-summercart64&quot; aria-label=&quot;Anchor link for: was-ist-der-sc64-summercart64&quot;&gt;Was ist der SC64 - SummerCart64?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der SC64 ist ein moderner Flashcart für das Nintendo 64, der es ermöglicht, ROMs von einer SD-Karte zu laden. Im Vergleich zu älteren Lösungen wie dem 64drive oder EverDrive-64 bietet er einige moderne Annehmlichkeiten wie einen USB-C Anschluss und eine ausgezeichnete PC-Integration. Außerdem ist das ganze Projekt Open Source und kann auf GitHub eingesehen werden. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Polprzewodnikowy&#x2F;N64FlashcartMenu&#x2F;blob&#x2F;main&#x2F;docs&#x2F;00_getting_started_sd.md&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;Polprzewodnikowy&#x2F;SummerCart64&#x2F;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation-und-ersteinrichtung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation-und-ersteinrichtung&quot; aria-label=&quot;Anchor link for: installation-und-ersteinrichtung&quot;&gt;Installation und Ersteinrichtung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Der SC64 funktioniert wie ein klassischer Flashcart:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SD-Karte mit FAT32 oder exFAT formatieren&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sc64menu.n64&lt;&#x2F;code&gt; in das Wurzelverzeichnis kopieren (In der Anleitung steht, dass man einen Ordner &lt;code&gt;menu&lt;&#x2F;code&gt; erstellen muss, aber das bitte nicht machen)&lt;&#x2F;li&gt;
&lt;li&gt;SD-Karte in den SC64 einstecken&lt;&#x2F;li&gt;
&lt;li&gt;SC64 in den Nintendo 64 einstecken&lt;&#x2F;li&gt;
&lt;li&gt;Einschalten und kurz warten&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Dann sollte alles geklappt haben. Jetzt hat das Wurzelverzeichnis der SD-Karte einen Ordner &lt;code&gt;menu&lt;&#x2F;code&gt;. Jetzt kann man die Roms einfach auf der SD-Karte ablegen (nicht in &lt;code&gt;menu&lt;&#x2F;code&gt;) und los gehts. Auf der &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Polprzewodnikowy&#x2F;SummerCart64&#x2F;blob&#x2F;main&#x2F;docs&#x2F;00_quick_startup_guide.md&quot;&gt;Webseite&lt;&#x2F;a&gt; ist alles beschrieben und erklärt. Zudem kann man mit dem Programm SC64Deployer die Firmware der SC64 flashen, die SD-Karte formatieren und ROMs hochladen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241122&#x2F;images&#x2F;n6400002.jpeg&quot; alt=&quot;N64 SC64&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fazit&quot; aria-label=&quot;Anchor link for: fazit&quot;&gt;Fazit&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nach einigen Tagen intensiver Nutzung kann ich den SC64 uneingeschränkt empfehlen. Die Kombination aus benutzerfreundlicher Bedienung macht ihn zu einem perfekten Begleiter für N64-Enthusiasten.&lt;&#x2F;p&gt;
&lt;p&gt;Vorteile:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Einfache Installation&lt;&#x2F;li&gt;
&lt;li&gt;Schnelle ROM-Ladezeiten&lt;&#x2F;li&gt;
&lt;li&gt;Zuverlässige Speicherstand-Verwaltung&lt;&#x2F;li&gt;
&lt;li&gt;Moderne USB-C Verbindung&lt;&#x2F;li&gt;
&lt;li&gt;Aktive Firmware-Entwicklung&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Nachteile:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Preis höher als bei einigen Alternativen&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Der SC64 ist für mich der derzeit beste N64 Flashcart auf dem Markt. Er vereint moderne Technologie mit der nostalgischen N64-Hardware auf eine Art und Weise, die sowohl Gelegenheitsspieler als auch Hardware-Enthusiasten begeistern wird.&lt;&#x2F;p&gt;
&lt;p&gt;Weitere Infos und Bauanleitung gibt es auf der offiziellen &lt;a href=&quot;https:&#x2F;&#x2F;summercart64.dev&#x2F;&quot;&gt;Webseite&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/20241122/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/20241122/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Hier teile ich meine Erfahrungen mit dem SC64 N64 Flashcart und zeige dir, wie du es installierst, konfigurierst und nutzt. Wir gehen Schritt für Schritt durch die Installation, Konfiguration und den täglichen Gebrauch des Flashcarts und zeigen, wie du deine Lieblingsspiele auf Original-Hardware genießen kannst. Dieser Leitfaden richtet sich an Retro-Gaming-Enthusiasten, die eine zuverlässige und flexible Lösung für ihre N64-Spiele suchen. </info>
        </item>
        <item>
            <title>Über mich</title>
            <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/pages/about/</link>
            <guid>https://simeon.staneks.de/pages/about/</guid>
            <description xml:base="https://simeon.staneks.de/pages/about/">&lt;h1 id=&quot;simeon-stanek&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#simeon-stanek&quot; aria-label=&quot;Anchor link for: simeon-stanek&quot;&gt;Simeon Stanek&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Ich bin beruflich Seelsorger und ein leidenschaftlicher Hobbyist mit Freude an spannenden und individuellen Projekten in Webentwicklung, Appentwicklung, Programmiering, und mehr. Außerdem gestalte ich Webseiten, Webanwendungen und Apps auf Anfrage.&lt;br &#x2F;&gt;
Meine Interessen umfassen:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Webentwicklung&lt;&#x2F;li&gt;
&lt;li&gt;Appentwicklung&lt;&#x2F;li&gt;
&lt;li&gt;Programmierung&lt;&#x2F;li&gt;
&lt;li&gt;Design&lt;&#x2F;li&gt;
&lt;li&gt;Gaming&lt;&#x2F;li&gt;
&lt;li&gt;Hardware
und mehr...&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;erfahrung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#erfahrung&quot; aria-label=&quot;Anchor link for: erfahrung&quot;&gt;Erfahrung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;frontend-programmierung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#frontend-programmierung&quot; aria-label=&quot;Anchor link for: frontend-programmierung&quot;&gt;Frontend &amp;amp; Programmierung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;HTML&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;85&quot; max=&quot;100&quot;&gt; 85% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;CSS&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;85&quot; max=&quot;100&quot;&gt; 85% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;JavaScript&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;75&quot; max=&quot;100&quot;&gt; 75% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;TypeScript&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;60&quot; max=&quot;100&quot;&gt; 60% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;PHP&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;60&quot; max=&quot;100&quot;&gt; 60% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;RUST&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;50&quot; max=&quot;100&quot;&gt; 50% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;backend-tooling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#backend-tooling&quot; aria-label=&quot;Anchor link for: backend-tooling&quot;&gt;Backend &amp;amp; Tooling&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;Docker&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;60&quot; max=&quot;100&quot;&gt; 60% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;label for=&quot;file&quot;&gt;git&lt;&#x2F;label&gt;
&lt;progress id=&quot;file&quot; value=&quot;50&quot; max=&quot;100&quot;&gt; 50% &lt;&#x2F;progress&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#links&quot; aria-label=&quot;Anchor link for: links&quot;&gt;Links&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;staneks.de&quot;&gt;&lt;strong&gt;Portfolio&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;simeon.staneks.de&quot;&gt;&lt;strong&gt;Blog&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simeonlukas&quot;&gt;&lt;strong&gt;GitHub&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;pages&#x2F;impressum&quot;&gt;&lt;strong&gt;Impressum&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;pages&#x2F;policy&quot;&gt;&lt;strong&gt;Datenschutzhinweis&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unterstutzung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#unterstutzung&quot; aria-label=&quot;Anchor link for: unterstutzung&quot;&gt;Unterstützung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.buymeacoffee.com&#x2F;simeonlukas&quot; style=&quot;border-bottom: 0px !important;&quot; target=&quot;_blank&quot; &gt;&lt;img src=&quot;https:&#x2F;&#x2F;github.com&#x2F;SimeonLukas&#x2F;obsidian-kindle-export&#x2F;raw&#x2F;main&#x2F;files&#x2F;coffee.jpg&quot; width=&quot;100%&quot;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/pages/about/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/pages/about/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> freier Hobbyist mit Freude an spannenden und individuellen Projekten in Webentwicklung, Appentwicklung, Programmiering, und mehr. </info>
        </item>
        <item>
            <title>Impressum</title>
            <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/pages/impressum/</link>
            <guid>https://simeon.staneks.de/pages/impressum/</guid>
            <description xml:base="https://simeon.staneks.de/pages/impressum/">&lt;h2 id=&quot;impressum&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#impressum&quot; aria-label=&quot;Anchor link for: impressum&quot;&gt;Impressum&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;angaben-gemass-ss-5-tmg&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#angaben-gemass-ss-5-tmg&quot; aria-label=&quot;Anchor link for: angaben-gemass-ss-5-tmg&quot;&gt;Angaben gemäß § 5 TMG:&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Simeon Stanek
Schwabengasse 3
82487 Oberammergau&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Kontakt:&lt;&#x2F;strong&gt;
Telefon: 01774419070
E-Mail: simeon@staneks.de&lt;&#x2F;p&gt;
&lt;h3 id=&quot;haftungsausschluss&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#haftungsausschluss&quot; aria-label=&quot;Anchor link for: haftungsausschluss&quot;&gt;Haftungsausschluss&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;haftung-fur-inhalte&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#haftung-fur-inhalte&quot; aria-label=&quot;Anchor link for: haftung-fur-inhalte&quot;&gt;Haftung für Inhalte&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Die Inhalte dieser Website wurden sorgfältig erstellt. Dennoch übernehmen wir keine Gewähr für die Richtigkeit, Vollständigkeit und Aktualität der bereitgestellten Informationen.&lt;&#x2F;p&gt;
&lt;p&gt;Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten verantwortlich. Wir sind jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen (§§ 8 bis 10 TMG).&lt;&#x2F;p&gt;
&lt;p&gt;Bei bekannt werdenden Rechtsverletzungen werden wir die entsprechenden Inhalte umgehend entfernen.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;haftung-fur-links&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#haftung-fur-links&quot; aria-label=&quot;Anchor link for: haftung-fur-links&quot;&gt;Haftung für Links&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Unsere Website enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Für die Inhalte dieser verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber verantwortlich. Zum Zeitpunkt der Verlinkung waren keine Rechtsverstöße erkennbar.&lt;&#x2F;p&gt;
&lt;p&gt;Bei bekannt werdenden Rechtsverletzungen werden wir derartige Links umgehend entfernen.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;urheberrecht&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#urheberrecht&quot; aria-label=&quot;Anchor link for: urheberrecht&quot;&gt;Urheberrecht&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Die Inhalte dieser Website unterliegen dem deutschen Urheberrecht. Jede Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechts bedarf der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers.&lt;&#x2F;p&gt;
&lt;p&gt;Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.&lt;&#x2F;p&gt;
&lt;p&gt;Sollten Sie auf Urheberrechtsverletzungen aufmerksam werden, bitten wir um einen entsprechenden Hinweis.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;weitere-angaben&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#weitere-angaben&quot; aria-label=&quot;Anchor link for: weitere-angaben&quot;&gt;Weitere Angaben&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Gemäß § 2 Nr. 5 TMG und § 5 TMG:
Die Webseite staneks.de wurde von Simeon Stanek selbst erstellt und enthält keine Cookies oder Formulare.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/pages/impressum/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/pages/impressum/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Die Inhalte dieser Website wurden sorgfältig erstellt. Dennoch übernehme ich keine Gewähr für die Richtigkeit, Vollständigkeit und Aktualität der bereitgestellten Informationen. </info>
        </item>
        <item>
            <title>Datenschutzhinweis</title>
            <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/pages/policy/</link>
            <guid>https://simeon.staneks.de/pages/policy/</guid>
            <description xml:base="https://simeon.staneks.de/pages/policy/">&lt;h2 id=&quot;datenschutzerklarung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#datenschutzerklarung&quot; aria-label=&quot;Anchor link for: datenschutzerklarung&quot;&gt;Datenschutzerklärung&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-verantwortlicher&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-verantwortlicher&quot; aria-label=&quot;Anchor link for: 1-verantwortlicher&quot;&gt;1. Verantwortlicher&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Simeon Stanek&lt;br &#x2F;&gt;
Schwabengasse 3&lt;br &#x2F;&gt;
82487 Oberammergau&lt;br &#x2F;&gt;
E-Mail: simeon@staneks.de&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-grundlegende-informationen-zur-datenverarbeitung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-grundlegende-informationen-zur-datenverarbeitung&quot; aria-label=&quot;Anchor link for: 2-grundlegende-informationen-zur-datenverarbeitung&quot;&gt;2. Grundlegende Informationen zur Datenverarbeitung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;2-1-hosting-auf-github-pages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-1-hosting-auf-github-pages&quot; aria-label=&quot;Anchor link for: 2-1-hosting-auf-github-pages&quot;&gt;2.1 Hosting auf GitHub Pages&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Die Website wird auf GitHub Pages gehostet. GitHub Inc. (headquartered at 88 Colin P. Kelly Jr. St, San Francisco, CA 94107, USA) sammelt dabei möglicherweise technische Daten wie:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;IP-Adresse&lt;&#x2F;li&gt;
&lt;li&gt;Browserinformationen&lt;&#x2F;li&gt;
&lt;li&gt;Zugriffszeit&lt;&#x2F;li&gt;
&lt;li&gt;Besuchte Seiten&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO. Weitere Informationen finden Sie in den &lt;a href=&quot;https:&#x2F;&#x2F;docs.github.com&#x2F;en&#x2F;site-policy&#x2F;privacy-policies&#x2F;github-privacy-statement&quot;&gt;GitHub Privacy Statement&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;2-2-datenverarbeitung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-2-datenverarbeitung&quot; aria-label=&quot;Anchor link for: 2-2-datenverarbeitung&quot;&gt;2.2 Datenverarbeitung&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Diese Website wird als statische Seite ohne aktive Tracking-Mechanismen, Cookies oder Formulare gehostet. Es werden keine zusätzlichen personenbezogenen Daten durch die Website selbst erhoben oder verarbeitet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-ihre-rechte&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-ihre-rechte&quot; aria-label=&quot;Anchor link for: 3-ihre-rechte&quot;&gt;3. Ihre Rechte&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Sie haben folgende Rechte bezüglich Ihrer Daten:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Recht auf Auskunft&lt;&#x2F;li&gt;
&lt;li&gt;Recht auf Berichtigung&lt;&#x2F;li&gt;
&lt;li&gt;Recht auf Löschung&lt;&#x2F;li&gt;
&lt;li&gt;Recht auf Einschränkung der Verarbeitung&lt;&#x2F;li&gt;
&lt;li&gt;Recht auf Widerspruch&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;4-kontakt-bei-datenschutzfragen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-kontakt-bei-datenschutzfragen&quot; aria-label=&quot;Anchor link for: 4-kontakt-bei-datenschutzfragen&quot;&gt;4. Kontakt bei Datenschutzfragen&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Bei Fragen zum Datenschutz können Sie sich jederzeit an uns wenden:&lt;br &#x2F;&gt;
Simeon Stanek&lt;br &#x2F;&gt;
E-Mail: simeon@staneks.de&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-anderungen-der-datenschutzerklarung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-anderungen-der-datenschutzerklarung&quot; aria-label=&quot;Anchor link for: 5-anderungen-der-datenschutzerklarung&quot;&gt;5. Änderungen der Datenschutzerklärung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Wir behalten uns vor, diese Datenschutzerklärung jederzeit zu aktualisieren.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;6-rechtliche-hinweise&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#6-rechtliche-hinweise&quot; aria-label=&quot;Anchor link for: 6-rechtliche-hinweise&quot;&gt;6. Rechtliche Hinweise&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Diese Datenschutzerklärung entspricht den Anforderungen der DSGVO und des BDSG.&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/pages/policy/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/pages/policy/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Datenschutzhinweise für die Webseite von Simeon Stanek </info>
        </item>
        <item>
            <title>Digitales Glücksrad: Lustiger Firlefanz für die Tourismuspastoral</title>
            <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
            <author>Simeon Stanek</author>
            <link>https://simeon.staneks.de/posts/20241120/</link>
            <guid>https://simeon.staneks.de/posts/20241120/</guid>
            <description xml:base="https://simeon.staneks.de/posts/20241120/">&lt;h1 id=&quot;genese&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#genese&quot; aria-label=&quot;Anchor link for: genese&quot;&gt;Genese&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Mein Kollege F. und ich haben uns etwas Besonderes für die Dekanatszusammenlegung der Dekanate Werdenfels und Rottenbuch überlegt. Uns war wichtig, dass das Projekt einen starken Eindruck hinterlässt. So kam ich mit der Idee eines digitalen Glücksrads – oder Schicksalsrads, wie man es auch nennen könnte. Mit einem Fußtaster sollte man es steuern können. Je nach Nummer bekommen die Teilnehmer eine von 10 Postkarten, die persönlich von F. gestaltet wurden. Als Highlight wird bei ausgewählten Nummern ein Foto gemacht. Eine Fotobox und ein Glücksrad in einem – das konnte doch nicht so schwer sein. 😃&lt;&#x2F;p&gt;
&lt;h1 id=&quot;konzept&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#konzept&quot; aria-label=&quot;Anchor link for: konzept&quot;&gt;Konzept&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;software&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#software&quot; aria-label=&quot;Anchor link for: software&quot;&gt;Software&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;frontend&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#frontend&quot; aria-label=&quot;Anchor link for: frontend&quot;&gt;Frontend&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Ich dachte mir, es sollte doch einfach sein, ein Glücksrad mit Vanilla-Webtechnologie zu erstellen. Gesagt, getan – innerhalb einer Stunde stand das Prinzip, und das Rad drehte sich, wenn man auf die Taste 1 auf der Tastatur drückte. Das Design war zunächst eher provisorisch. Doch F., ein leidenschaftlicher Layouter, Grafiker, Zeichner und Designer, zeichnete gleich einen passenden Rahmen für das Glücksrad und die ausgedrehte Nummer.&lt;&#x2F;p&gt;
&lt;p&gt;Ein Probelauf ist möglich unter &lt;a href=&quot;https:&#x2F;&#x2F;tourismuspastoral.de&#x2F;yourturn&#x2F;&quot;&gt;https:&#x2F;&#x2F;tourismuspastoral.de&#x2F;yourturn&#x2F;&lt;&#x2F;a&gt;. Je nach Bildschirmauflösung passt der Rahmen nicht optimal. Aus Zeit- und Einfachkeitsgründen ist die Web-App nur für Bildschirme mit 720p optimiert – das reicht völlig aus.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;screenshot.jpeg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Bei den Nummern 1 und 25 öffnet sich die Kamera und macht nach 5 Sekunden ein Foto. Diese Funktion wird auch beim Drücken der Taste 2 ausgelöst, da wir das Foto den Fotografierten zur Verfügung stellen wollten wird das Foto an meinen Server gesendet und ein QR-Code generiert, mit dem man sich das Foto abholen kann.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;screenshot1.jpeg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;backend&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#backend&quot; aria-label=&quot;Anchor link for: backend&quot;&gt;Backend&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Natürlich brauchte es einige Bemühungen, damit alles funktioniert. Per n8n-Webhook wird das Foto empfangen und auf meinem Server an zwei Stellen gespeichert. Sobald dieser Vorgang abgeschlossen ist, wird eine Rückmeldung gesendet und der passende QR-Code angezeigt. Zusätzlich gibt es einen zweiten Webhook.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;screenshot2.png&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Der QR-Code leitet auf ein PHP-Skript, das es ermöglicht, das Foto zu löschen. Das Foto wird anschließend, wenn gewünscht, durch den zweiten Webhook von beiden Speicherorten entfernt.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;screenshot3.jpg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hardware&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hardware&quot; aria-label=&quot;Anchor link for: hardware&quot;&gt;Hardware&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Für den einfachen Aufbau würde ein Laptop genügen, aber wir wollten es groß machen: 50-Zoll-Bildschirm, Fußtaster, Webcam und Laptop waren notwendig. Die Teilnehmenden hatten sichtlich Spaß.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;weiterentwicklung&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#weiterentwicklung&quot; aria-label=&quot;Anchor link for: weiterentwicklung&quot;&gt;Weiterentwicklung&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Unser Chef war von der Aktion so begeistert, dass er das Glücksrad auf der Freizeitmesse in München aufstellen möchte. Er wünscht sich einen Handtaster, und im Zuge dessen schafften wir uns auch einen Raspberry Pi 5 an, damit niemand seinen Laptop eine Woche lang auf der F.re.e lassen muss.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;hardware.jpeg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Den Taster habe ich bei AliExpress gekauft, zusammen mit einem Atmega32u4. Der Chip kann wie eine Tastatur agieren und sendet bei Tastendruck die &quot;1&quot; an die Web-App. Er lässt sich sehr einfach mit der Arduino-IDE programmieren und kann direkt per USB an den Raspberry angeschlossen werden.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;posts&#x2F;20241120&#x2F;images&#x2F;hardware1.jpeg&quot; alt=&quot;Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;codebeispiel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#codebeispiel&quot; aria-label=&quot;Anchor link for: codebeispiel&quot;&gt;Codebeispiel&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Hier ist übrigens der einfache Code der per Arduino-IDE auf den Atmega32u4 hochgeladen wurde.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cpp&quot; style=&quot;background-color:#fafafa;color:#61676c;&quot; class=&quot;language-cpp &quot;&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;#include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;Keyboard.h&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Deklaration der Pins 4 für den Button und 3 für die LED beide Pins müssen natürlich mit einem Ground verbunden werden
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; buttonPin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;const int&lt;&#x2F;span&gt;&lt;span&gt; ledPin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; previousButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; HIGH&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Definition der Pins
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; INPUT_PULLUP)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;pinMode&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; OUTPUT)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  Keyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Liest den Buttonstatus
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(buttonPin)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Wenn der Button gedrückt wurde:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; previousButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; HIGH) {
&lt;&#x2F;span&gt;&lt;span&gt;    Keyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#86b300;&quot;&gt;&amp;quot;1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Blinkt die LED 😃
&lt;&#x2F;span&gt;&lt;span&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; LOW)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; LOW)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; LOW)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(ledPin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#fa6e32;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(buttonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; HIGH &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; previousButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; LOW) {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Hier passiert nichts
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff8f40;&quot;&gt;50&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#abb0b6;&quot;&gt;&#x2F;&#x2F; Speichert den aktuellen Buttonstatus
&lt;&#x2F;span&gt;&lt;span&gt;  previousButtonState &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ed9366;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; buttonState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#61676ccc;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;s&gt;Wie das Endergebnis schlussendlich aussehen wird, zeigt sich in den nächsten Wochen.&lt;&#x2F;s&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;das-ergebnis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#das-ergebnis&quot; aria-label=&quot;Anchor link for: das-ergebnis&quot;&gt;Das Ergebnis&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;video loop controls width=&quot;50%&quot; style=&quot;margin-left: 25%;&quot;&gt;&lt;source src=&quot;images&#x2F;video.mp4&quot; type=&quot;video&#x2F;mp4&quot;&gt;&lt;&#x2F;video&gt;&lt;&#x2F;p&gt;
</description>
            <enclosure url="https://simeon.staneks.de/posts/20241120/images/de/feed.jpg" length="1967" type="image/jpeg"/>
            <media:thumbnail url="https://simeon.staneks.de/posts/20241120/images/de/feed.jpg" width="500" height="500" time="0"/>
            <info> Ich stelle dir in diesem Artikel ein digitales Glücksrad vor, das ich für die Veranstaltungen der Tourismuspastoral im Werdenfelser Land und die Tourismuspastoral der Erzdiözese München und Freising entwickelt habe. Wir werden die Idee, die technische Umsetzung und die Nutzung des Glücksrads Schritt für Schritt durchgehen und zeigen, wie es bei verschiedenen Veranstaltungen eingesetzt werden kann. Dieser Leitfaden richtet sich an alle, die nach kreativen und interaktiven Lösungen für ihre Events suchen. </info>
        </item>
    </channel>
</rss>