<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Home Assistant &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/tag/home-assistant/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Wed, 13 May 2026 17:31:46 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Smart Home Steuerung am alten Wählscheibentelefon</title>
		<link>https://www.bubuxblog.de/smart-home-steuerung-am-alten-waehlscheibentelefon/</link>
					<comments>https://www.bubuxblog.de/smart-home-steuerung-am-alten-waehlscheibentelefon/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Wed, 13 May 2026 17:28:13 +0000</pubDate>
				<category><![CDATA[Eigenbau]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[Smarthome]]></category>
		<guid isPermaLink="false">https://www.bubuxblog.de/?p=2371</guid>

					<description><![CDATA[Die Make (Ausgabe 2/2026) enthielt einen Vorschlag für die Nutzung eines alten Wählscheibentelefons mit einem Raspberry Pi und einem LLM inklusive Sprachausgabe. Insgesamt ein witziges Projekt, aber irgendwie war es mir ein bisschen zu viel „KI“. Ich hatte jedoch noch so ein altes Schätzchen: Einen Fernsprechtischapparat FeTAp 611 in Grün. Es ist das Telefon meiner [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Die <strong>Make</strong> (Ausgabe 2/2026) enthielt einen Vorschlag für die Nutzung eines alten Wählscheibentelefons mit einem Raspberry Pi und einem LLM inklusive Sprachausgabe. Insgesamt ein witziges Projekt, aber irgendwie war es mir ein bisschen zu viel „KI“.</p>



<p>Ich hatte jedoch noch so ein altes Schätzchen: Einen <strong>Fernsprechtischapparat FeTAp 611</strong> in Grün. Es ist das Telefon meiner Schwiegereltern (und ja, die hatten damals tatsächlich eine dreistellige Telefonnummer!). Ich selbst habe es während meines Studiums in der Studentenbude genutzt. Da ich mich nur schwer von solchen Dingen trennen kann, fristete es seitdem sein Dasein irgendwo im Keller.</p>



<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-scaled.jpg"><img fetchpriority="high" decoding="async" width="1024" height="768" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-1024x768.jpg" alt="" class="wp-image-2378" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-300x225.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-768x576.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-1536x1152.jpg 1536w, https://www.bubuxblog.de/wp-content/uploads/2026/05/telefon-2048x1536.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Der Make-Artikel inspirierte mich schließlich dazu, dem alten Teil wieder Leben einzuhauchen. Fast alle Geräte in unserem Haus werden mittlerweile über <strong>Home Assistant</strong> gesteuert – meist vollautomatisch über Sensoren oder Zeitpläne. Gelegentlich nutze ich aber auch das Tablet im Flur, auf dem noch eine alte FTUI von FHEM läuft (weil ich das Dashboard mit HA einfach nicht so schick hinbekomme), oder eben die Home Assistant App auf dem Handy.</p>



<h3 class="wp-block-heading">Die Umsetzung</h3>



<p>Mittels eines <strong>ESP32 WROOM</strong> wurde die notwendige Technik eingepflanzt. Das Schöne dabei: Das Innenleben blieb weitestgehend original, ich habe nichts ausgebaut.</p>



<ul class="wp-block-list">
<li><strong>Hörergabel:</strong> Den Schalter habe ich direkt auf der Rückseite der Platine angelötet.</li>



<li><strong>Wählscheibe:</strong> Die Impulse werden einfach am ursprünglichen Stecker abgegriffen (Pin 1 &amp; 2).</li>



<li><strong>Audio:</strong> Für die Tonausgabe sorgt ein <strong>MAX98357</strong>. Lediglich für den Anschluss des alten Lautsprechers habe ich zwei Kabel durchgeschnitten und per Lüsterklemme verbunden (ja, es musste am Ende schnell gehen).</li>
</ul>



<p></p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-scaled.jpg"><img decoding="async" width="1024" height="768" data-id="2382" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-1024x768.jpg" alt="" class="wp-image-2382" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-300x225.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-768x576.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-1536x1152.jpg 1536w, https://www.bubuxblog.de/wp-content/uploads/2026/05/hoerer-1-2048x1536.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Anschluss Schalter Hörergabel</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-scaled.jpg"><img decoding="async" width="1024" height="768" data-id="2381" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-1024x768.jpg" alt="" class="wp-image-2381" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-300x225.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-768x576.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-1536x1152.jpg 1536w, https://www.bubuxblog.de/wp-content/uploads/2026/05/innenleben-2048x1536.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">ESP32 und MAX98357</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-scaled.jpg"><img loading="lazy" decoding="async" width="1024" height="768" data-id="2379" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-1024x768.jpg" alt="" class="wp-image-2379" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-300x225.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-768x576.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-1536x1152.jpg 1536w, https://www.bubuxblog.de/wp-content/uploads/2026/05/lautsprecher-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Anschluss Lautsprecher</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-scaled.jpg"><img loading="lazy" decoding="async" width="1024" height="768" data-id="2380" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-1024x768.jpg" alt="" class="wp-image-2380" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-300x225.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-768x576.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-1536x1152.jpg 1536w, https://www.bubuxblog.de/wp-content/uploads/2026/05/waehlscheibe-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Anschluss der Wählscheibe</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://www.bubuxblog.de/wp-content/uploads/2026/05/schaltplan.png"><img loading="lazy" decoding="async" width="559" height="392" data-id="2389" src="https://www.bubuxblog.de/wp-content/uploads/2026/05/schaltplan.png" alt="" class="wp-image-2389" srcset="https://www.bubuxblog.de/wp-content/uploads/2026/05/schaltplan.png 559w, https://www.bubuxblog.de/wp-content/uploads/2026/05/schaltplan-300x210.png 300w" sizes="auto, (max-width: 559px) 100vw, 559px" /></a></figure>
</figure>



<p></p>



<h3 class="wp-block-heading">Das Telefon kann nun</h3>



<ol class="wp-block-list">
<li>Sich ins <strong>WLAN</strong> einbinden</li>



<li>Verbindung zu meinem <strong>MQTT-Server</strong> aufbauen</li>



<li>WLAN und/oder MQTT-Status per <strong>LED anzeigen</strong></li>



<li>Den klassischen <strong>425-Hz-Wählton</strong> ausgeben, sobald der Hörer abgehoben wird.</li>



<li>Die <strong>gewählte Nummer</strong> an den MQTT-Server übermitteln</li>
</ol>



<span id="more-2371"></span>



<h3 class="wp-block-heading">Anschlussbelegung</h3>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Bauteil</strong></td><td><strong>Pin</strong></td></tr><tr><td>LED</td><td>26</td></tr><tr><td>Wählscheibe</td><td>14</td></tr><tr><td>Hörer</td><td>27</td></tr><tr><td>I2S_BCLK (MAX98357)</td><td>18</td></tr><tr><td>I2S_LRC (MAX98357)</td><td>19</td></tr><tr><td>I2S_DOUT (MAX98357)</td><td>23</td></tr></tbody></table></figure>



<h3 class="wp-block-heading has-medium-font-size">Der Code</h3>



<p>Was bisher implementiert ist: Der ESP32 übernimmt das Management der WLAN-Verbindung, die MQTT-Kommunikation und die Dekodierung der Wählscheiben-Impulse. Über den MAX98357 wird der klassische Wählton via I2S direkt im Code generiert und mit einem leichten Rauschen unterlegt, um den alten analogen Charakter des Hörers beizubehalten.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;WiFi.h>
#include &lt;PubSubClient.h>
#include &lt;driver/i2s.h>

// ================== WLAN ==================
const char* ssid = "hier_die_ssid";
const char* password = "hier_das_wlan_passwort";

// ================== MQTT ==================
const char* mqtt_server = "192.168.xxx.xxx";
int mqtt_fail_count = 0;
const int mqtt_max_retries = 5;
bool mqtt_blocked = false;

// ================== LED ===================
const int ledPin = 26;

enum LedState {
  LED_WIFI_CONNECTING,
  LED_WIFI_CONNECTED,
  LED_MQTT_CONNECTING,
  LED_MQTT_CONNECTED
};

LedState currentState = LED_WIFI_CONNECTING;

// ================== Wifi ==================
WiFiClient espClient;
PubSubClient client(espClient);

// ================== Fetap ==================
const int dialPin = 14;
const int hookPin = 27;

// ================== I2S AUDIO ==================
#define I2S_BCLK 18
#define I2S_LRC  19
#define I2S_DOUT 23

bool toneActive = false;
uint32_t toneIndex = 0;

// ================== Waehlen ==================
volatile int pulses = 0;
volatile unsigned long lastPulseMicros = 0;
unsigned long lastActivity = 0;

bool lastHookState = false;

// ================== Interrupt ==================
void IRAM_ATTR onPulse() {
  unsigned long now = micros();
  if (now - lastPulseMicros &lt; 80000) return;
  pulses++;
  lastPulseMicros = now;
  lastActivity = millis();
}

// ================== SETUP ==================
void setup() {
  Serial.begin(115200);

  pinMode(dialPin, INPUT_PULLUP);
  attachInterrupt(dialPin, onPulse, FALLING);

  pinMode(hookPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

  // ================== I2S INIT ==================
  i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
    .sample_rate = 8000,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_I2S,
    .intr_alloc_flags = 0,
    .dma_buf_count = 8,
    .dma_buf_len = 64,
    .use_apll = false
  };

  i2s_pin_config_t pin_config = {
    .bck_io_num = I2S_BCLK,
    .ws_io_num = I2S_LRC,
    .data_out_num = I2S_DOUT,
    .data_in_num = I2S_PIN_NO_CHANGE
  };

  i2s_driver_install(I2S_NUM_0, &amp;i2s_config, 0, NULL);
  i2s_set_pin(I2S_NUM_0, &amp;pin_config);

  // ================== WLAN ==================
  currentState = LED_WIFI_CONNECTING;
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    updateLED();
    delay(300);
  }

  currentState = LED_WIFI_CONNECTED;
  client.setServer(mqtt_server, 1883);

  Serial.println("Telefon bereit");
}

// ================== LOOP ==================
void loop() {
  if (!client.connected()) reconnect();
  client.loop();

  updateLED();

  bool hookReading = (digitalRead(hookPin) == LOW);

  // ================== HOOK CHANGE ==================
  if (hookReading != lastHookState) {
    delay(40);

    if (hookReading == (digitalRead(hookPin) == LOW)) {
      lastHookState = hookReading;

      if (hookReading) {
        Serial.println("Hörer ABGENOMMEN");
        pulses = 0;
        sendStatus(true);

        toneActive = true;
        toneIndex = 0;
      } else {
        Serial.println("Hörer AUFGELEGT");
        sendStatus(false);

        toneActive = false;
        i2s_zero_dma_buffer(I2S_NUM_0);
        i2s_stop(I2S_NUM_0);
        i2s_start(I2S_NUM_0);
      }
    }
  }

  // ================== Wählscheibe ==================
  unsigned long now = millis();

  if (lastHookState) {
    if (pulses > 0 &amp;&amp; (now - lastActivity) > 900) {
      int number = pulses;
      if (number == 10) number = 0;

      Serial.print("Gewählt: ");
      Serial.println(number);

      sendMQTT(number);
      pulses = 0;
    }
  }

  // ================== 425 Hz Ton ==================
  if (toneActive) {
    size_t written;

    float freq = 425.0;
    float t = (float)toneIndex / 8000.0;

    int16_t sample =
      (int16_t)(2000 * sin(2 * PI * freq * t));

    sample += random(-300, 300);

    i2s_write(I2S_NUM_0, &amp;sample, sizeof(sample), &amp;written, portMAX_DELAY);

    toneIndex++;
    if (toneIndex > 8000) toneIndex = 0;
  }
}

// ================== MQTT ==================
void sendMQTT(int number) {
  if (!client.connected()) return;

  client.publish("fetap_611/nummer", String(number).c_str());
}

// ================== STATUS ==================
void sendStatus(bool onHook) {
  if (!client.connected()) return;

  client.publish("fetap_611/hoerer", onHook ? "ON" : "OFF");
  client.publish("fetap_611/nummer", "-1");
}

// ================== MQTT reconnect ==================
void reconnect() {
  if (mqtt_blocked) return;

  while (!client.connected()) {
    currentState = LED_MQTT_CONNECTING;

    if (client.connect("fetap_phone")) {
      mqtt_fail_count = 0;
      currentState = LED_MQTT_CONNECTED;
    } else {
      mqtt_fail_count++;
      if (mqtt_fail_count >= mqtt_max_retries) {
        mqtt_blocked = true;
        return;
      }
      delay(1500);
    }
  }
}

// ================== LED ==================
void updateLED() {
  static unsigned long lastBlink = 0;
  static bool state = false;

  unsigned long now = millis();

  switch (currentState) {

    case LED_WIFI_CONNECTING:
      if (now - lastBlink > 200) {
        state = !state;
        digitalWrite(ledPin, state);
        lastBlink = now;
      }
      break;

    case LED_WIFI_CONNECTED:
      if (now - lastBlink > 800) {
        state = !state;
        digitalWrite(ledPin, state);
        lastBlink = now;
      }
      break;

    case LED_MQTT_CONNECTING:
      if (now - lastBlink > 150) {
        state = !state;
        digitalWrite(ledPin, state);
        lastBlink = now;
      }
      break;

    case LED_MQTT_CONNECTED:
      digitalWrite(ledPin, HIGH);
      break;
  }
}</pre>



<h3 class="wp-block-heading">Die Herausforderung: Timing und Entprellung</h3>



<p>Die Abfrage eines so alten mechanischen Geräts bringt ein paar Besonderheiten mit sich, die man im Code berücksichtigen muss. Hier sind zwei Punkte, bei denen man eventuell individuell nachjustieren muss:</p>



<ul class="wp-block-list">
<li><strong>Entprellen der Wählscheibe:</strong> Im Interrupt nutze ich eine Sperrzeit von <code>80ms</code>. Das ist notwendig, da die mechanischen Kontakte beim Öffnen und Schließen kurz &#8222;prellen&#8220;. Wenn eure Wählscheibe falsche Ziffern erkennt, ist dieser Wert der erste Hebel, an dem ihr ansetzen solltet.</li>



<li><strong>Der Hörerschalter (Gabel):</strong> Auch dieser Schalter ist mechanisch und neigt zum Prellen. Ich habe hier ein <code>delay(40)</code> eingebaut, um sicherzugehen, dass der Zustand stabil ist, bevor die MQTT-Meldung &#8222;Hörer abgenommen&#8220; rausgeht.</li>



<li></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Warum das Ganze?</h3>



<p>Im Gegensatz zu moderner Digitaltechnik gibt die Wählscheibe einfach nur mechanische Impulse (Unterbrechungen) aus, etwa 10 Impulse pro Sekunde (10Hz). Eine gewählte &#8222;3&#8220; sind drei kurze Unterbrechungen der Leitung. Da der ESP32 im Vergleich zur Wählscheibe sehr schnell ist, würde er ohne diese künstlichen &#8222;Gedenksekunden&#8220; (Delays und Sperrzeiten) jedes mechanische Zittern als extra Impuls interpretieren.</p>



<p>Die aktuell im Code gewählten Zeiten und Mechanismen funktionieren bei meinem Telefon sehr zuverlässig.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Automatisierung in HA</h3>



<p>Auf die Änderungen des entsprechenden MQTT-Topics reagiere ich mit einer Automatisierung im Home Assistant. Im folgenden Beispiel werden zwei Lampen bei Wahl der 1 oder der 2 getoggelt</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">alias: FeTap Steuerung
description: Schaltet Aktoren basierend auf Sensorwert 1-9
triggers:
  - entity_id: sensor.fetap_nummer
    trigger: state
conditions:
  - condition: template
    value_template: "{{ trigger.to_state.state in ['1','2','3','4','5','6','7','8','9'] }}"
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.fetap_nummer
            state: "1"
        sequence:
          - action: light.toggle
            target:
              entity_id:
                - light.lampe_fensterbank
      - conditions:
          - condition: state
            entity_id: sensor.fetap_nummer
            state: "2"
        sequence:
          - action: light.toggle
            target:
              entity_id:
                - light.lampe_couch
    default: []
mode: restart</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Ausblick</h3>



<p>Das war ein erster PoC was man mit dem alten Telefon alles machen kann. Der Quellcode ist nicht wirklich aufgeräumt und die WLAN Credentials noch direkt im Code enthalten. Ich glaube die alten Telefone haben auch mit dem 425Hz-Ton aufgehört sobald man gewählt hat. </p>



<p>Ideen für die nächsten Schritte:</p>



<ul class="wp-block-list">
<li>WLAN-Credentials komfortabel über eine Webseite z.B. im SPIFFS/LittleFS konfigurieren.</li>



<li>Wählton deaktivieren, sobald die erste Ziffer gewählt wurde (originalgetreuer).</li>



<li>Ein kurzes akustisches Signal ausgeben, wenn das MQTT-Telegramm erfolgreich gesendet wurde.</li>



<li>Mittels Step-Up-Wandler die alte mechanische Klingel des Telefons für Benachrichtigungen integrieren.</li>



<li>Das Mikrofon in Betrieb nehmen (eventuell durch eine moderne Elektret-Kapsel ersetzen).</li>



<li>Ziffernfolgen implementieren (aktuell funktioniert das nur mit einzelnen Ziffern)</li>
</ul>



<p>Viel Spaß beim Bauen und erweitern!</p>



<p>Gruß<br>Chris</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/smart-home-steuerung-am-alten-waehlscheibentelefon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
