Geräte per Geräusch ins Smart Home einbinden: ESP32 erkennt Pieptöne

Viele Geräte sind eigentlich gar nicht so dumm. Sie melden sich. Nur leider nicht per MQTT, HTTP, Zigbee oder WLAN, sondern auf die altmodische Art: Sie piepen.

Der Backofen piept, wenn er fertig ist. Die Mikrowelle piept. Der Kontaktgrill piept. Manche Waschmaschinen, Trockner, USVs oder 3D-Drucker machen das gleiche. Für uns Menschen ist das praktisch. Für das Smart Home ist es erst einmal völlig nutzlos.

Genau daraus ist mein aktuelles Projekt entstanden: ein kleiner Beepdetektor auf ESP32-Basis, mit dem sich Geräte per Geräusch ins Smart Home einbinden lassen.

Kurz gesagt: Ein ESP32 hört mit einem Mikrofon auf typische Pieptöne, erkennt daraus ein Gerät oder Ereignis und sendet das Ergebnis per MQTT an ioBroker, Home Assistant oder ein anderes Smart-Home-System.


Schnellnavigation


Warum Geräte per Geräusch erkennen?

Der große Vorteil: Das eigentliche Gerät muss nicht verändert werden.

Ich muss keinen Backofen öffnen, keine Mikrowelle umbauen und keinen Kontaktgrill hacken. Der Beepdetektor sitzt einfach irgendwo in der Nähe und lauscht auf akustische Muster.

Das ist besonders interessant für Geräte, die keine Smart-Home-Schnittstelle haben, nicht geöffnet werden sollen oder nur akustisch signalisieren, dass sie fertig sind.

Aus „Der Backofen piept irgendwo in der Küche“ wird dann zum Beispiel ein MQTT-Event:

kueche/beepdetector/event = Backofen

Und damit kann das Smart Home endlich etwas anfangen.


Welches Mikrofon?

Für den Beepdetektor verwende ich ein I2S-Mikrofon, zum Beispiel ein Modul mit INMP441 (bezahlter Link).

Der Grund ist simpel: Ein analoges Mikrofonmodul mit einfachem Ausgang reicht oft für Lautstärke-Erkennung, aber genau das ist hier nicht genug. Ich möchte nicht nur wissen, dass „irgendwas laut war“. Ich möchte wissen, ob ein bestimmtes Gerät mit einem bestimmten Muster gepiept hat.

Ein I2S-Mikrofon liefert digitale Audiodaten direkt an den ESP32 (bezahlter Link). Dadurch kann der ESP32 das Signal besser auswerten, Frequenzbereiche prüfen und typische Tonmuster erkennen.

Vereinfacht sieht die Initialisierung eines I2S-Mikrofons so aus:

#include <driver/i2s.h>
#define I2S_WS   25
#define I2S_SCK  26
#define I2S_SD   33
void setupI2SMic()
{
    i2s_config_t config = {
        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
        .sample_rate = 16000,
        .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
        .communication_format = I2S_COMM_FORMAT_I2S,
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
        .dma_buf_count = 4,
        .dma_buf_len = 256,
        .use_apll = false
    };
    i2s_pin_config_t pins = {
        .bck_io_num = I2S_SCK,
        .ws_io_num = I2S_WS,
        .data_out_num = I2S_PIN_NO_CHANGE,
        .data_in_num = I2S_SD
    };
    i2s_driver_install(I2S_NUM_0, &config, 0, NULL);
    i2s_set_pin(I2S_NUM_0, &pins);
}

Das ist noch keine fertige Erkennung, sondern nur der Einstieg: Der ESP32 bekommt Audiodaten, mit denen man arbeiten kann.


Warum ein ESP32?

Der ESP32 (bezahlter Link) ist für dieses Projekt ziemlich passend, weil er mehrere Dinge gleichzeitig gut kann: Audio einlesen, WLAN nutzen, MQTT senden, eine Weboberfläche bereitstellen und ein kleines OLED-Display bedienen.

Ein ESP8266 wäre für viele einfache Smart-Home-Sensoren völlig ausreichend. Bei Geräuscherkennung wird es aber enger. Audiodaten auswerten, Muster vergleichen und gleichzeitig stabil per WLAN kommunizieren — das ist eher ein Fall für den ESP32.

In meinem Aufbau übernimmt der ESP32 aktuell mehrere Aufgaben:

  • Audiosignal vom Mikrofon lesen
  • typische Pieptöne erkennen
  • Muster aus mehreren Beeps vergleichen
  • erkannte Geräte per MQTT melden
  • Weboberfläche bereitstellen
  • OLED-Anzeige aktualisieren
  • OTA-Updates ermöglichen

Das ist für einen kleinen Mikrocontroller schon ordentlich Arbeit.


Wie funktioniert die Erkennung?

Die erste naive Idee wäre: Wenn es laut wird, war ein Gerät fertig.

Das funktioniert ungefähr fünf Minuten. Dann redet jemand in der Küche, Musik läuft, ein Teller klappert oder der Hund macht Hundedinge. Schon ist die Erkennung unbrauchbar.

Deshalb erkennt der Beepdetektor nicht einfach nur Lautstärke, sondern ein Muster.

Ein einzelner Beep besteht grob aus Frequenz, Dauer, Lautstärke und der Pause zum nächsten Beep.

struct Beep
{
    int frequency;
    int durationMs;
    int pauseBeforeMs;
    int rms;
};

Ein erkanntes Gerät ist dann nicht ein einzelnes Geräusch, sondern eine Sequenz. Der Backofen kann zum Beispiel mehrere längere Pieptöne erzeugen, während die Mikrowelle kürzere Töne abgibt.

Beep backofenPattern[] = {
    {3000, 720, 0,   180},
    {3000, 710, 370, 180},
    {3000, 730, 360, 180},
    {3000, 705, 380, 180},
    {3000, 720, 365, 180}
};

Natürlich sind echte Messwerte nie perfekt. Deshalb darf der Beepdetektor nicht auf exakte Werte bestehen. Stattdessen braucht er Toleranzen.

bool inRange(int value, int target, int tolerance)
{
    return value >= target - tolerance && value <= target + tolerance;
}

Damit lässt sich prüfen, ob ein erkannter Ton ungefähr zum gelernten Muster passt.

bool beepMatches(Beep detected, Beep expected)
{
    return inRange(detected.frequency, expected.frequency, 150)
        && inRange(detected.durationMs, expected.durationMs, 120)
        && inRange(detected.pauseBeforeMs, expected.pauseBeforeMs, 150);
}

Das Prinzip ist also nicht: „War es laut?“

Sondern eher: „Kam innerhalb eines bestimmten Zeitfensters ein bekanntes Muster aus Frequenzen, Dauern und Pausen vor?“

MQTT: Vom Piepton zur Automation

Sobald ein Muster erkannt wurde, sendet der ESP32 ein Event per MQTT.

void publishEvent(const char* deviceName, bool isDouble)
{
    mqttClient.publish("kueche/beepdetector/event", deviceName);
    mqttClient.publish("kueche/beepdetector/double", isDouble ? "true" : "false");
    mqttClient.publish("kueche/beepdetector/timestamp", String(millis()).c_str());
}

Damit kann ioBroker oder Home Assistant später reagieren.

  • Backofen fertig: Benachrichtigung aufs Handy
  • Mikrowelle fertig: Ansage im Wohnzimmer
  • Optigrill fertig: Hinweis auf dem Display
  • Gerät piept erneut: Double-Event erkennen oder ignorieren

Das Schöne daran: Das Gerät selbst bleibt komplett unangetastet.


Welche Probleme gibt es?

Natürlich ist das Projekt nicht ganz so einfach, wie es auf dem Papier klingt. Das größte Problem ist: Die Küche ist kein Labor.

Dort gibt es Musik, Gespräche, Geschirr, Lüfter, Wasserkocher, Dunstabzugshauben und andere Störquellen. Ein normaler Geräuschsensor würde dort ständig falsche Events auslösen.

Darum braucht der Beepdetektor mehrere Schutzmechanismen.

Problem 1: Hintergrundgeräusche

Musik und Stimmen können einzelne Frequenzbereiche treffen. Wenn man nur auf „ungefähr 3000 Hz“ achtet, kann es Fehlauslösungen geben.

Die Lösung: Nicht nur Frequenz prüfen, sondern auch Dauer, Pausen und Wiederholung. Ein einzelner Treffer reicht nicht. Erst das komplette Muster zählt.

if (patternMatches(detectedBeeps, backofenPattern, 5))
{
    publishEvent("Backofen", false);
}

Problem 2: Geräte piepen nicht immer exakt gleich

Ein Piepton ist nicht jedes Mal exakt 3000 Hz lang 720 ms laut. Je nach Messung, Position und Umgebung schwanken die Werte.

Die Lösung: Toleranzen statt exakter Werte.

const int FREQ_TOLERANCE = 150;
const int DURATION_TOLERANCE = 120;
const int PAUSE_TOLERANCE = 150;

Das macht die Erkennung robuster, ohne komplett beliebig zu werden.

Problem 3: Doppelte Erkennung

Wenn ein Gerät länger piept oder die gleiche Sequenz mehrfach erkannt wird, kann das Smart Home mehrere Events bekommen.

Die Lösung: Eine Sperrzeit nach einer Erkennung.

unsigned long lastEventTime = 0;
const unsigned long eventCooldownMs = 10000;
bool canPublishEvent()
{
    return millis() - lastEventTime > eventCooldownMs;
}

Nach einem erkannten Event wartet der ESP32 also einige Sekunden, bevor dasselbe Ereignis erneut gemeldet wird.

Problem 4: Erkennung darf den ESP32 nicht blockieren

Wenn die Audioanalyse zu langsam oder blockierend läuft, kann das andere Funktionen stören: Weboberfläche, OLED, MQTT oder sogar Test-Pieptöne.

Deshalb muss die Erkennung möglichst nicht blockierend laufen. Statt lange zu warten, wird permanent ein kleines Fenster der letzten Beeps betrachtet.

void loop()
{
    readAudio();
    detectBeeps();
    checkKnownPatterns();
    mqttClient.loop();
    updateDisplay();
    handleWebServer();
}

Der ESP32 soll also nicht sagen: „Ich analysiere jetzt fünf Sekunden und mache sonst nichts.“ Er soll ständig kurz prüfen, ob in den letzten Sekunden ein bekanntes Muster aufgetaucht ist.


Aktueller Stand

Der Beepdetektor ist noch nicht fertig. Genau deshalb ist dieser Beitrag auch keine finale Bauanleitung, sondern ein Blick in die Werkstatt.

Aktuell erkennt der Prototyp bereits verschiedene Küchengeräte anhand ihrer Pieptöne. Dazu gehören unter anderem:

  • Backofen
  • Mikrowelle
  • Optigrill

Außerdem gibt es bereits MQTT-Ausgaben, eine Weboberfläche, mDNS, OTA-Updates und ein OLED-Display. Das OLED zeigt im Normalbetrieb eine kleine Spektrumanzeige und kann später zusätzlich Statusmeldungen oder erkannte Geräte anzeigen.

Der nächste Schritt ist, die Erkennung weiter zu stabilisieren und das Einlernen neuer Geräte komfortabler zu machen.


Warum das Projekt spannend ist

Mich reizt an dem Projekt vor allem, dass es eine ziemlich universelle Lösung ist.

Es geht nicht nur um einen Backofen. Es geht um alle Geräte, die akustisch signalisieren, aber keine brauchbare Schnittstelle haben.

Statt jedes Gerät einzeln umzubauen, hört ein kleiner ESP32 einfach mit.

Das ist nicht perfekt. Aber es ist lokal, günstig, erweiterbar und ziemlich nerdig.


Fazit

Geräte per Geräusch ins Smart Home einzubinden ist eine praktische Möglichkeit, alte oder geschlossene Geräte smarter zu machen, ohne sie zu öffnen oder auf Cloud-Dienste angewiesen zu sein.

Der ESP32-Beepdetektor erkennt typische Pieptöne, vergleicht Muster und sendet erkannte Events per MQTT an das Smart Home.

Noch ist das Projekt nicht fertig. Aber der aktuelle Stand zeigt schon ziemlich gut, wohin die Reise geht: Das Smart Home soll nicht nur schalten, messen und regeln — es soll auch zuhören.


Passende Beiträge auf Prokrastinerd

Wenn dich das Thema interessiert, passen auch diese Beiträge gut dazu. Der Beepdetektor hängt nämlich genau zwischen lokalem Smart Home, MQTT, ESP32-Bastelei und Automationen ohne Cloud.


FAQ

Kann man Geräte ohne WLAN ins Smart Home einbinden?

Ja. Wenn ein Gerät akustische Signale ausgibt, können diese mit einem Mikrofon und einem Mikrocontroller wie dem ESP32 erkannt und per MQTT an das Smart Home gemeldet werden.

Muss man die Geräte dafür öffnen?

Nein. Der Beepdetektor arbeitet von außen über Geräuscherkennung. Backofen, Mikrowelle oder Kontaktgrill müssen dafür nicht verändert werden.

Warum reicht ein einfacher Geräuschsensor nicht?

Ein einfacher Geräuschsensor erkennt meist nur Lautstärke. Für zuverlässige Erkennung müssen Frequenz, Dauer, Pausen und typische Muster ausgewertet werden.

Warum wird ein I2S-Mikrofon verwendet?

Ein I2S-Mikrofon liefert digitale Audiodaten direkt an den ESP32. Dadurch kann der Mikrocontroller das Signal besser analysieren als bei einfachen analogen Geräuschsensoren.

Kann der ESP32 die erkannten Geräte per MQTT melden?

Ja. Sobald ein bekanntes Piepmuster erkannt wurde, kann der ESP32 ein MQTT-Event senden, zum Beispiel an ioBroker oder Home Assistant.

Schreibe einen Kommentar