Zum Hauptinhalt springen
  1. Projekte und Blogs/

Saunasteuerung 2.0: Smarter Schwitzen mit Stil

·1253 Wörter·
Esp8266 Esphome Sauna Iot Home Assistant Pcb Automation Smart Home
Oliver Hihn
Autor
Oliver Hihn
Getrieben von Neugier, angetrieben von Code. Ich entwerfe und baue individuelle Technik mit Leidenschaft und Zweck.

🌡️ Dampf, Schweiß und Silizium
#

Es gibt diesen Moment in jeder Home-Automation-Reise, wo die To-do-Liste von „Flurlicht automatisieren“ zu „Saunasteuerung durch selbstgebaute Platine ersetzen“ kippt – einfach, weil man’s kann.

Willkommen an diesem Punkt.

Hier erzähle ich, wie ich eine individuelle Saunasteuerung gebaut habe – mit einem ESP D1 Mini, digitalen Potentiometern, etwas ESPHome-Zauberei und dem verdammt guten Vorwand, endlich eine eigene Platine mit KiCad zu designen.

Hat’s nach verbranntem Flux und Erfolg gerochen? Absolut. Hat’s auf Anhieb mit Home Assistant funktioniert? Irgendwann, ja.


🔥 Ziele & Zähigkeit
#

Meine Mission: Die alte analoge Saunasteuerung (mit Drehreglern aus der Steinzeit) ins 21. Jahrhundert befördern – mit smarter Temperaturkontrolle, Feedback und automatischem Licht.

Dazu brauchte ich:

  • Einen ESP8266 (Wemos D1 Mini) als Gehirn
  • Ein Solid-State-Relais zum Ein-/Ausschalten des Ofens
  • Digitale Potis, um den analogen Regler zu simulieren
  • Einen WS2812b-LED-Strip für Ambiente und Zeitanzeige
  • Einen Präsenzsensor (Radar statt Bewegung – weil still ≠ weg)
  • Einen DS18B20-Temperatursensor
  • ESPHome-Integration
  • Und natürlich: eine selbst designte Platine, die alles verbindet

📐 Die Platine entwerfen
#

Das sollte kein Drahtverhau werden, der im Saunakasten vor sich hin schmort. Ich wollte Eleganz. Ich wollte eine richtige Platine.

Also: KiCad geöffnet. Ein paar Stunden (gut, Tage) mit Schaltplänen, Footprints, Leiterbahnen und hübscher Silkscreen-Spielerei später – boom:

Schaltplan

Ich hab die Platine bestellt, gewartet wie ein Kind vor Weihnachten, und dann alles in Ruhe verlötet – mit der Geduld eines Menschen, der sehr bewusst keine SMD-Pads kurzschließen will.

Und das Ergebnis?

Fertige Platine

Einfach schön.


⚙️ Klüger als der Durchschnittsofen
#

Die größte Herausforderung war, das Verhalten der alten Steuerung zu emulieren. Diese nutzte ein 2,5 kΩ-Potentiometer zur Temperaturregelung – simpel, aber effektiv. Also:

🔁 Vier digitale Potis parallel
#

Denn Überraschung: Die meisten Digipots kommen nicht auf 2,5 kΩ. Aber vier parallel? Das funktioniert. Ich habe die X9C103S-Serie verwendet und sie über das entsprechende ESPHome-Component angesteuert.

ESPHome, dieses YAML-liebende Wesen, unterstützte meine Schaltung nicht ganz von Haus aus.

Warum? Ich habe Optokoppler verwendet, um die digitalen Potis zu schalten – nicht, weil ich musste, sondern weil ich wollte. Die Originalsteuerung hatte zwar eine 5V-Leitung mit vermutlich genug Strom (laut Berechnung: ja, laut Bauchgefühl: lieber nicht). Ich wollte stattdessen vollständige galvanische Trennung. Also baute ich ein kleines Netzteil ein und koppelte die Steuersignale über Optos ein. Sauber. Getrennt. Sicher.

Nur ein Problem: Optokoppler sind lahm. Zumindest im Vergleich zu dem, was ESPHome erwartet.

Das x9c-Modul in ESPHome schaltete mit 1 Mikrosekunde Delay – viel zu schnell für meine Optos. In Tests (mit etwas Oszilloskop-Magie) fand ich heraus, dass ich eher 50–70 µs brauche.

Was hab ich gemacht? Genau: Ich hab’s gepatcht.

Ich habe dem x9c-Output-Component einen neuen Parameter step_delay spendiert. Der Standardwert bleibt bei 1 µs (damit alte Konfigurationen nicht brechen), aber jetzt kann man ihn bis 100 µs einstellen. Langsam genug selbst für die verschlafensten Optokoppler.

Der Pull-Request wurde angenommen. 🎉 Doku hab ich auch gleich geschrieben – wenn schon, denn schon.

Und jetzt läuft mein Setup ganz ohne Hacks – nur mit sauberem YAML und einer Prise Community-Liebe.

Hier ein Einblick in die ESPHome-Konfiguration:

esphome:
  name: sauna
  friendly_name: sauna

esp8266:
  board: d1_mini

logger:

api:
  encryption:
    key: "redacted"
  services:
    - service: set_pot_value
      variables:
        level: float
      then:
        - lambda: |-
            if (level < 55 || level > 105) {
              ESP_LOGE("custom", "Level out of range (65-105): %.2f", level);
            } else {
              float mapped_level = (level - 55) / 50.0;
              id(x9c_pot).set_level(mapped_level);
              ESP_LOGI("custom", "Setting temperature to %.2f °C (mapped level: %.2f)", level, mapped_level);
            }

ota:
  password: "redacted"
  platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  domain: .fritz.box
  ap:
    ssid: "Sauna Fallback Hotspot"
    password: "redacted"

captive_portal:

switch:
  - platform: gpio
    pin:
      number: D2
    name: "Oven"
    icon: mdi:fire
    id: relay

one_wire:
  - platform: gpio
    pin: D4

sensor:
  - platform: dallas_temp
    name: Temperature
    resolution: 10

light:
  - platform: neopixelbus
    pin: D3
    name: "LED"
    num_leds: 235
    type: GRB
    variant: WS2812
    on_turn_on:
    - logger.log: "Light Turned On!"
    on_turn_off:
    - logger.log: "Light Turned Off!"
    effects:
      - addressable_color_wipe:
          name: Visual Timer 1min
          colors:
            - red: 0%
              green: 100%
              blue: 0%
              num_leds: 235
          add_led_interval: 255ms
          reverse: false
      - addressable_color_wipe:
          name: Visual Timer 10min
          colors:
            - red: 0%
              green: 100%
              blue: 0%
              num_leds: 235
          add_led_interval: 2553ms
          reverse: false
      - addressable_color_wipe:
          name: Visual Timer 15min
          colors:
            - red: 0%
              green: 100%
              blue: 0%
              num_leds: 235
          add_led_interval: 3830ms
          reverse: false

binary_sensor:
  - platform: gpio
    device_class: motion
    pin:
      number: D1
      mode:
        input: true
        pullup: false
    name: "person detected"
    id: presence_sensor

output:
  - platform: x9c
    id: x9c_pot
    cs_pin:
      number: D7
      inverted: true
    inc_pin:
      number: D6
      inverted: true
    ud_pin:
      number: D5
      inverted: true
    initial_value: 0.01
    step_delay: 100us

Ein kleiner Trick, den ich eingebaut habe, ist ein benutzerdefinierter Service in ESPHome, mit dem ich die Saunatemperatur direkt über Home Assistant einstellen kann. Und jetzt kommt das Schöne: Ich wollte nicht einfach rohe Potentiometerwerte schicken – ich wollte echte Zieltemperaturen in Grad Celsius angeben, wie ein normaler Mensch eben.

Also habe ich einen set_pot_value-Service geschrieben, der einen Float-Wert (z. B. 75 °C) entgegennimmt, diesen auf den Wertebereich von 0.0 bis 1.0 (wie vom digitalen Poti erwartet) abbildet und ihn dann entsprechend setzt.

Es gibt sogar eine kleine Plausibilitätsprüfung: Wenn du versuchst, einen Wert außerhalb des zulässigen Sauna-Bereichs (55–105 °C) zu setzen, lehnt das System das höflich, aber bestimmt ab – mit einer ordentlichen Fehlermeldung im Log. Denn niemand will sich versehentlich in eine andere Dimension dämpfen.

Und hier ist der Codeausschnitt, der das möglich macht:

services:
  - service: set_pot_value
    variables:
      level: float
    then:
      - lambda: |-
          if (level < 55 || level > 105) {
            ESP_LOGE("custom", "Level out of range (65-105): %.2f", level);
          } else {
            float mapped_level = (level - 55) / 50.0;
            id(x9c_pot).set_level(mapped_level);
            ESP_LOGI("custom", "Setting temperature to %.2f °C (mapped level: %.2f)", level, mapped_level);
          }

Und so sieht das ganze in Home Assistant aus:

Final PCB


🧠 Intelligenz mit Stil
#

Dank ESPHome ließ sich alles wunderbar in Home Assistant integrieren:

  • Ein virtueller Schalter zum Ein- und Ausschalten des Saunaofens (über das SSR)
  • Eine Temperaturanzeige in Echtzeit
  • Automatisierungen zum Vorheizen oder automatischen Abschalten
  • Ambiente-LEDs, die nicht nur hübsch leuchten, sondern auch etwas sagen

💡 LED-Magie: Die smarte Sanduhr
#

Hier wird’s herrlich nerdig:

Statt einer Sanduhr oder einem Countdown-Timer nutze ich den WS2812b-LED-Streifen, um die Zeit im Blick zu behalten – ganz ohne Uhr:

  1. Beim Betreten der Sauna startet der Streifen in einem warmen, gemütlichen Gelb
  2. Im Verlauf von 15 Minuten wechselt die Farbe schrittweise zu Grün – LED für LED
  3. Sobald alles grün ist: Zeit, rauszugehen

Einfach, elegant, hypnotisch. Und ja – auch ein bisschen cooler als eine Eieruhr.


👀 Präsenz-Erkennung: Auch Bewegungslos ist anwesend
#

Bewegungsmelder sind gut – aber in der Sauna sitzt man eher still und denkt über das Leben nach (oder zählt die Schweißperlen). Deshalb kam ein radarbasiertes Präsenzmodul zum Einsatz.

Der erkennt auch, wenn man sich nicht bewegt. Perfekt für die Sauna.

Solange jemand drin ist, bleiben die LEDs aktiv. Wird niemand mehr erkannt, fährt das System elegant runter. Automatisierter Komfort – fast wie im Spa.


🧪 Lektionen gelernt
#

  • Vier Digipots sind besser als einer
  • ESPHome ist extrem anpassbar, wenn man bereit ist, einzutauchen
  • Radar erkennt, was Bewegungsmelder längst aufgegeben haben.
  • Eine eigene Platine zu bauen bedeutet viel Aufwand – aber eben auch volle Kontrolle.

🤝 Willst du auch eine?
#

Du willst deine Sauna smart machen? Ich helfe gern! Ob Code, Schaltplan oder ESPHome-Config – ich teile alles, was dein Projekt voranbringt (und dich vor dummen Drehreglern bewahrt).


Profi-Tipp: Wenn deine Saunasteuerung grün leuchtet, ist es wahrscheinlich Zeit, rauszugehen. Oder du hast versehentlich eine KI erschaffen, die dein Schwitzverhalten analysiert.


Fragen? Ideen? Lust, Sauna-Setups zu vergleichen? Schreib mir – am besten vor dem nächsten Aufguss.