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));
}