Esphome heizstab 3x1000watt ohne Home Assistant

hi ich hab mir über gemini (lange Diskussionen) diesen code erstellen lassen
aber er lauft nicht kann mir jemand helfen ?

esphome:
  name: sml
  friendly_name: SML # Angezeigter Name in ESPHome/HA Integration

esp32:
  board: nodemcu-32s

# Enable logging
logger:
  # Optional: Erhöhe das Log-Level zum Debuggen, falls nötig
  level: DEBUG # Kann helfen, das Lambda zu debuggen

# Enable Home Assistant API (Wird benötigt, damit HA die Werte sieht und schalten KÖNNTE)
api:
  encryption:
    key: "XXXXXXXXXX" # Dein API-Schlüssel

ota:
  platform: esphome
  password: "XXXXXXXXXX" # Dein OTA-Passwort

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Optional: Feste IP für bessere Erreichbarkeit
  # manual_ip:
  #   static_ip: 192.168.1.100 # Beispiel-IP anpassen
  #   gateway: 192.168.1.1    # Beispiel-Gateway anpassen
  #   subnet: 255.255.255.0

web_server:
  port: 80
  auth:
    username: admin
    password: admin

# Enable fallback hotspot (captive portal) in case wifi connection fails
captive_portal:

one_wire:
  - platform: gpio
    pin: GPIO23

uart:
  id: uart_bus
  rx_pin: GPIO16
  baud_rate: 9600
  data_bits: 8
  parity: NONE
  stop_bits: 1

sml:
  id: OA014954520003497C1E # Deine SML Zähler ID
  uart_id: uart_bus

sensor:
  # SML Sensoren (für Energie und Leistung)
  - platform: sml
    name: "Wirkarbeit Bezug Gesamt"
    id: wirkarbeit_bezug_gesamt
    sml_id: OA014954520003497C1E
    obis_code: "1-0:1.8.0"
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing
    filters:
      - multiply: 0.0001
  - platform: sml
    name: "Wirkarbeit Lieferung Gesamt"
    id: wirkarbeit_lieferung_gesamt
    sml_id: OA014954520003497C1E
    obis_code: "1-0:2.8.0"
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing
    filters:
      - multiply: 0.0001
  - platform: sml
    # ACHTUNG: Dieser Sensor wird für die Steuerung im Lambda verwendet!
    name: "Wirkleistung Aktuell"
    id: wirkleistung_bezug_w # Interne ID für Lambda Zugriff
    sml_id: OA014954520003497C1E
    obis_code: "1-0:16.7.0" # OBIS Code für aktuelle Leistung (negativ=Einspeisung)
    unit_of_measurement: W
    accuracy_decimals: 0
    device_class: power
    state_class: measurement
    # Optional: Glättung direkt im ESP
    # filters:
    #   - sliding_window_moving_average:
    #       window_size: 6
    #       send_every: 3

  # Dallas Temperatursensoren
  - platform: dallas_temp
    address: 0xfe3ce1d458d42b28
    name: "Temperatur Holzofen"
  - platform: dallas_temp
    address: 0x383ce1d458c65328
    name: "Temperatur Puffer Oben"
  - platform: dallas_temp
    address: 0xd93ce1e380e84028
    name: "Temperatur Puffer Mitte"
  - platform: dallas_temp
    address: 0x253ce1d458fb1328
    name: "Temperatur Puffer Unten"
  - platform: dallas_temp
    address: 0x493ce1e3804a6928
    name: "Temperatur Heizung Unterstützung"

  # --- KEIN Template Sensor mehr benötigt ---
  # (Der ursprüngliche war redundant zur Lambda-Logik)

switch:
  # GPIO Schalter für die Heizstäbe
  - platform: gpio
    name: "Heizstab 1 PV Ueberschuss"
    id: pv_ueberschuss # Interne ID für Lambda Zugriff
    pin: GPIO12
  - platform: gpio
    name: "Heizstab 2"
    id: heizstab_2
    pin: GPIO13
  - platform: gpio
    name: "Heizstab 3"
    id: heizstab_3
    pin: GPIO14
  - platform: gpio
    name: "Heizstab 4"
    id: heizstab_4
    pin: GPIO26

# Globale Variablen zum Speichern des Zustands direkt auf dem ESP
globals:
  - id: heizstab_zustand # Welche Stufe ist aktuell aktiv (0-4)
    type: int
    restore_value: yes # Zustand nach Neustart wiederherstellen
    initial_value: '0'
  - id: letzter_ueberschuss # Letzter gelesener Leistungswert für Stabilitätsprüfung
    type: float
    restore_value: yes
    initial_value: '0'
  - id: zaehler # Zähler für stabile Messungen
    type: int
    restore_value: yes
    initial_value: '0'

# Intervall-Timer, der die Lambda-Funktion alle 10 Sekunden ausführt
interval:
  - interval: 10s
    then:
      lambda: |-
        #// Aktuelle Leistung holen (Negativ = Überschuss/Einspeisung, Positiv = Bezug)
       loat aktuelle_leistung = id(wirkleistung_bezug_w).state;

        #// --- Schwellwerte definieren (als positive Werte) ---
       const int schwelle_stufe1_an = 1000;
       const int schwelle_stufe2_an = 2000;
       const int schwelle_stufe3_an = 3000;
       const int schwelle_stufe4_an = 4000;

       # // --- Hysterese / Ausschaltschwelle (als positiver Wert) ---
        const int schwelle_alle_aus_unter = 800;

        #// --- Stabilitätsprüfung ---
        const float stabilitaets_delta = 50.0;
        const int zaehler_ziel = 3;

        #// Stabilitätsprüfung verbessern (Zähler begrenzen)
        if (abs(aktuelle_leistung - id(letzter_ueberschuss)) < stabilitaets_delta) {
          if (id(zaehler) < zaehler_ziel) { // Zähler auf Ziel begrenzen
            id(zaehler)++;
          }
        } else {
          id(zaehler) = 0;
        }
        id(letzter_ueberschuss) = aktuelle_leistung;

        #// Nur schalten, wenn der Wert für eine bestimmte Zeit stabil war
        if (id(zaehler) >= zaehler_ziel) {
         # // --- Einschaltlogik (höhere Stufen zuerst prüfen) ---
          if (aktuelle_leistung <= -schwelle_stufe4_an && id(heizstab_zustand) < 4) {
            id(pv_ueberschuss).turn_on();
            id(heizstab_2).turn_on();
            id(heizstab_3).turn_on();
            id(heizstab_4).turn_on();
            id(heizstab_zustand) = 4;
            ESP_LOGD("heizstab_ctrl", "STUFE 4 EIN (Leistung: %.0fW)", aktuelle_leistung);
          } else if (aktuelle_leistung <= -schwelle_stufe3_an && id(heizstab_zustand) < 3) {
            id(pv_ueberschuss).turn_on();
            id(heizstab_2).turn_on();
            id(heizstab_3).turn_on();
            id(heizstab_4).turn_off();
            id(heizstab_zustand) = 3;
            ESP_LOGD("heizstab_ctrl", "STUFE 3 EIN (Leistung: %.0fW)", aktuelle_leistung);
          } else if (aktuelle_leistung <= -schwelle_stufe2_an && id(heizstab_zustand) < 2) {
            id(pv_ueberschuss).turn_on();
            id(heizstab_2).turn_on();
            id(heizstab_3).turn_off();
            id(heizstab_4).turn_off();
            id(heizstab_zustand) = 2;
            ESP_LOGD("heizstab_ctrl", "STUFE 2 EIN (Leistung: %.0fW)", aktuelle_leistung);
          } else if (aktuelle_leistung <= -schwelle_stufe1_an && id(heizstab_zustand) < 1) {
            id(pv_ueberschuss).turn_on();
            id(heizstab_2).turn_off();
            id(heizstab_3).turn_off();
            id(heizstab_4).turn_off();
            id(heizstab_zustand) = 1;
            ESP_LOGD("heizstab_ctrl", "STUFE 1 EIN (Leistung: %.0fW)", aktuelle_leistung);
          }
          #// --- Ausschaltlogik ---
          else if (aktuelle_leistung > -schwelle_alle_aus_unter && id(heizstab_zustand) > 0) {
            id(pv_ueberschuss).turn_off();
            id(heizstab_2).turn_off();
            id(heizstab_3).turn_off();
            id(heizstab_4).turn_off();
            id(heizstab_zustand) = 0;
            ESP_LOGD("heizstab_ctrl", "ALLE STUFEN AUS (Leistung: %.0fW)", aktuelle_leistung);
          }
          #// Kein else hier: Wenn keine Bedingung zutrifft, bleibt der aktuelle Zustand erhalten.
        } else {
          #// Loggen, dass auf stabilen Wert gewartet wird (optional, aber nützlich)
          #// ESP_LOGD("heizstab_ctrl", "Warte auf stabilen Wert (Leistung: %.0fW, Zähler: %d)", aktuelle_leistung, (int)id(zaehler));
        }

SML für einen Heizstab? Interessant. Genauso die dallas Temperatursensoren. Frag doch mal Gemini, Copilot und ChatGPT was da nicht passt. Hintergrundinfos sollte man aber schon dazugeben

Danke für deine Antwort. Entschuldige, ich war gestern Abend sehr genervt und die Frau war auch sauer, weil ich so lange daran herumgemacht habe :wink:! Zur Erklärung: Ich lese meinen Zähler über eine IR-Diode aus (dafür SML). Derselbe ESP überwacht meinen Pufferspeicher zwecks manueller Feuerung durch einen Schwedenofen.
Nun möchte ich einen Heizstab mit 3 * 1000 Watt schalten, wenn ich PV-Überschuss habe. Der Heizstab befindet sich in einem separaten System mit Pumpe, STB und Fühler.
Damit alles auch ohne Home Assistant funktioniert, hätte ich gerne alles im ESP. Dieser soll zusätzlich alle 10/15 Sekunden überwachen, ob sich meine Einspeisung ändert (um vorzubeugen, falls der Lesekopf verrutscht oder entfernt wird). Wenn sich die Einspeisung nicht ändert, sollen alle Heizstäbe ausgeschaltet werden!
Zusätzlich wird ein Pseudo-Heizstab als erstes aktiviert, der meine Wärmepumpe (WP) vom Pool freigibt. Diese wird manuell eingeschaltet und schaltet bei Netzausfall dauerhaft aus (das ist besser für die WP). Dieser Strom wird nicht gezählt, und wenn die WP nicht eingeschaltet ist, ist genug Leistung für Heizstab 2 vorhanden. Die Heizstäbe sollen dann automatisch zu- und abschalten.

Ki hilft mir gerade nicht weiter! :pensive: