Home-Assistant-Integration zur Steuerung eines Heizstabs, der über einen
Schneider Altivar ATV320 Frequenzumrichter (FU) per Modbus TCP angebunden ist.
Ersetzt die Steuerung über Helfer (input_boolean / input_number) und
Node-RED durch native Entities.
Nicht mit Schneider Electric affiliiert. Die Register-Adressen stammen aus der öffentlich dokumentierten ATV320-Kommunikationsparameter-Referenz; die Hersteller-Dokumente selbst sind nicht Teil dieses Repositories.
- HACS → ⋮ → Benutzerdefinierte Repositories → diese URL als Typ Integration hinzufügen.
- „Heizstab" installieren, Home Assistant neu starten.
- Einstellungen → Geräte & Dienste → Integration hinzufügen → „Heizstab".
- Ordner
custom_components/heizstabnachconfig/custom_components/kopieren. - Home Assistant neu starten und die Integration hinzufügen.
| Feld | Bedeutung | Standard |
|---|---|---|
| Name | Anzeigename des Geräts | Heizstab |
| IP-Adresse | Host des Modbus-TCP-Gateways | – |
| Port | TCP-Port (Gateway, z. B. 4196) | 502 |
| Unit-ID | Modbus-Adresse des FU (Param ADD) | 1 |
| Maximalleistung Heizstab (W) | Bezugsleistung (100 %) | 6000 |
| Timeout (s) | Antwort-Timeout pro Anfrage | 5 |
| Reconnect-Timeout (s) | Wartezeit vor Reconnect | 2 |
Über Konfigurieren (Optionen) lassen sich nachträglich anpassen:
Abfrageintervall (Standard 5 s, muss < FU-Timeout TTO = 30 s sein),
Frequenz bei Maximalleistung (f_max, Regelungs-Kalibrierung),
Spannung bei Maximalleistung (U_max, Anzeige-Kalibrierung), Leistungen
und Timeouts.
| Entity (Beispiel) | Typ | Register | Beschreibung |
|---|---|---|---|
select.heizstab_betriebsart |
select | 8501 | Aus / Manuell / Automatik |
number.heizstab_soll_leistung |
number | 8502 | Soll-Leistung in W |
button.heizstab_fehler_quittieren |
button | 8501 | Störung quittieren |
sensor.heizstab_ist_leistung |
sensor | 3208 (UOP) | Ist-Leistung in W (aus Spannung) |
sensor.heizstab_spannung_heizstab |
sensor | 3208 (UOP) | Spannung in V |
sensor.heizstab_ausgangsfrequenz |
sensor | 3202 (RFR) | Frequenz in Hz (alle 30 s) |
sensor.heizstab_soll_frequenz |
sensor | — | kommandierter Sollwert in Hz |
sensor.heizstab_netzspannung |
sensor | 3207 (ULN) | Netzspannung (Diagnose) |
sensor.heizstab_thermischer_zustand_fu |
sensor | 3209 (THD) | Thermik % (Diagnose) |
binary_sensor.heizstab_heizt |
binary_sensor | 3201 Bit 2 | Betrieb freigegeben |
binary_sensor.heizstab_storung |
binary_sensor | 3201 Bit 3 | Störung |
binary_sensor.heizstab_einschaltbereit |
binary_sensor | 3201 Bit 0 | Einschaltbereit (Diagnose) |
binary_sensor.heizstab_eingeschaltet |
binary_sensor | 3201 Bit 1 | Eingeschaltet (Diagnose) |
binary_sensor.heizstab_einschaltsperre |
binary_sensor | 3201 Bit 6 | Einschaltsperre (Diagnose) |
Die genauen entity_ids leiten sich aus dem vergebenen Gerätenamen ab.
- Aus – FU wird gestoppt (Steuerwort 6 = einschaltbereit, Sollwert 0).
- Manuell – FU folgt der
Soll-Leistung, die du selbst (UI) setzt. - Automatik – FU folgt ebenfalls der
Soll-Leistung; diese wird von einer externen Automation aus dem PV-Überschuss gesetzt.
Die Integration übernimmt die komplette CiA402-Steuersequenz (6 → 15 zum Starten, 128 = Fehler-Reset) und schreibt Steuerwort + Sollwert in jedem Schreib-Zyklus – das hält auch den Modbus-Watchdog des FU am Leben.
Die Überschuss-Berechnung bleibt bewusst außerhalb der Integration. Beispiel- Automation, die den Netzbezug ausregelt:
alias: Heizstab PV-Überschuss
trigger:
- platform: state
entity_id: sensor.solarnet_leistung_vom_netz
condition:
- condition: state
entity_id: select.heizstab_betriebsart
state: automatik
action:
- variables:
ueberschuss: "{{ (0 - states('sensor.solarnet_leistung_vom_netz') | float(0)) - 300 }}"
soll: "{{ [[ueberschuss, 0] | max, 6000] | min }}"
- service: number.set_value
target:
entity_id: number.heizstab_soll_leistung
data:
value: "{{ soll }}"
mode: single- FU-Profil CHCF = SEP (CiA402, Steuerung + Sollwert über Modbus).
- Sollwert-Register 8502: 1000 = 100,0 Hz.
- Soll-Leistung wird per Vorsteuerung (open-loop) gestellt:
Register = √(P/Pmax) × f_max × 10(Leistung ~ U² ~ Register²), nur per Slew-Rate (CONTROL_MAX_RATE) sanft nachgeführt. Bewusst ohne Rückführung: Die Spannungsmessung kommt über die EMI-gestörte Modbus-Strecke verfälscht/verzögert an → jede echte Regelung schwingt auf. Vorsteuerung kann prinzipiell nicht schwingen. Genauigkeit überf_maxkalibrieren:f_max_neu = f_max × √(P_soll / P_real). Im Automatikbetrieb schließt Node-RED die Schleife auf das zuverlässige Smart-Meter-Signal (Netzeinspeisung). - Zwei Abtastraten (spart Modbus-Last auf der EMI-Strecke):
- Jeden Zyklus (
scan_interval, Standard 5 s): Block 3207–3209 (Netz-/Heizstabspannung, Thermik) lesen + Steuerwort/Sollwert schreiben. - Alle 30 s (
STATUS_INTERVAL): Block 3201–3202 (ETA-Status + Ausgangsfrequenz). ETA ist für die Vorsteuerung unkritisch → Status-Sensoren und Fehler-/Starterkennung aktualisieren im 30-s-Takt. - Strom (LCR), Drehmoment (OTR) und Motorleistung (OPR) werden nicht gelesen (der FU liefert sie bei diesem Aufbau konstant 0).
- Jeden Zyklus (
- Ist-Leistung =
Pmax × (U / U_max)²aus der Heizstabspannung (UOP, Reg 3208), geglättet (ZeitkonstantePOWER_SMOOTHING_TAU).U_maxkalibrieren über eine isolierte Messung (Last mit Heizstab minus Grundlast). - Timeout kurz halten (Standard 5 s): Bei laufendem Heizstab gehen über EMI sporadisch Modbus-Antworten verloren; das Steuerwort wird pro Zyklus zuerst geschrieben, damit der FU-Watchdog (TTO 30 s) gefüttert bleibt.
- Registerquelle: ATV320-Kommunikationsparameter-Referenz (Schneider Electric).
MIT — siehe LICENSE.