@jans_ios danke für das Script. Ich habe es um eine Logausgabe und den Logikfehler in der Ist und Max Temperatur erweitert und bereinigt. Für alle die, die ebenfalls einen AC Elwa E einsetzen folgende Zusatzinformationen, wo ich meine Probleme hatte :
- Im AC Elwa E - Anpassung der Zeitablauf Ansteuerung:
Hintergrund ist, dass sonst nach 10 Sekunden der Modbus Wert überschrieben wird und die Leistung vor einem neuen Wert wieder auf 0 Watt gesetzt wird. Somit gäbe es ein flapping im AC Elwa von AN / AUS / AN
- aktualisiertes Script
const sID_LeistungHeizstab_W = 'modbus.1.holdingRegisters.1000_Power' // Aktueller Verbrauch Heizstab in W
const sID_PV_Leistung = 'e3dc-rscp.0.EMS.POWER_PV'; // PV_Leistung
const sID_Eigenverbrauch = 'e3dc-rscp.0.EMS.POWER_HOME'; // Hausverbrauch_Leistung
const sID_Hausverbrauch_ohne_Heizstab = '0_userdata.0.Heizung.E3DC.Hausverbrauch'; // Hausverbrauch_Leistung ohne Heizstab
const sID_Netz_Leistung = 'e3dc-rscp.0.EMS.POWER_GRID'; // Einspeiseleistung
const sID_Wallbox_Leistung = 'e3dc-rscp.0.EMS.POWER_WB_ALL'; // Wallbox-Leistung
const sID_Batterie_Leistung = 'e3dc-rscp.0.EMS.POWER_BAT'; // Batterie_Leistung
const sID_M_Power_W = '0_userdata.0.Charge_Control.Allgemein.Akt_Berechnete_Ladeleistung_W';// errechnete benötigte Ladeleistung von ChargeControl
const sID_Soll_LeistungHeizstab_W = 'modbus.1.holdingRegisters.1000_Power'; // Soll Leistung Heizstab an Schnittstelle
const sID_IstTempHeizstab = 'modbus.1.holdingRegisters.1001_Temp1'; // Aktuelle Temperatur am Heizstab
const sID_MaxTempHeizstab = 'modbus.1.holdingRegisters.1002_WW1_Temp_max'; // Maximal-Temperatur lt. Drehregler am Heizstab
on({id: sID_PV_Leistung, change: "ne"}, async function (obj) {
let BatterieLeistung_W = (await getStateAsync(sID_Batterie_Leistung)).val;
let PV_Leistung_W = (await getStateAsync(sID_PV_Leistung)).val;
let LeistungHeizstab_W = (await getStateAsync(sID_LeistungHeizstab_W)).val;
let Hausverbrauch_W = (await getStateAsync(sID_Eigenverbrauch)).val;
let M_Power_W = (await getStateAsync(sID_M_Power_W)).val;
let HeizstabLadeleistung_W = 0;
let NetzLeistung_W = (await getStateAsync(sID_Netz_Leistung)).val;
let IstTempHeizstab = (await getStateAsync(sID_IstTempHeizstab)).val;
let MaxTempHeizstab = (await getStateAsync(sID_MaxTempHeizstab)).val;
let Wallbox_Leistung_W = (await getStateAsync(sID_Wallbox_Leistung)).val;
// Log-Ausgabe für die Temperaturen
log(`Ist-Temperatur am Heizstab: ${IstTempHeizstab}°C, Maximal-Temperatur am Heizstab: ${MaxTempHeizstab}°C`);
let Gesamtverbrauch_W = Hausverbrauch_W + Wallbox_Leistung_W - LeistungHeizstab_W; // Gesamtverbrauch ohne Leistung Heizstab
await setStateAsync(sID_Hausverbrauch_ohne_Heizstab, Hausverbrauch_W - LeistungHeizstab_W);
HeizstabLadeleistung_W = (PV_Leistung_W - Gesamtverbrauch_W) - M_Power_W - 100;
// Prüfen ob HeizstabLadeleistung_W > 3000W ist;
if (HeizstabLadeleistung_W > 3000) { HeizstabLadeleistung_W = 3000; }
// Prüfen ob HeizstabLadeleistung_W < 0W ist;
if (HeizstabLadeleistung_W <= 0) { HeizstabLadeleistung_W = 0; }
// Prüfen ob MaxTempHeizstab - 5 Grad Reserve erreicht sind;
if (IstTempHeizstab >= MaxTempHeizstab - 5) { HeizstabLadeleistung_W = 0; }
// Vorgabe Heizleistung an Schnittstelle übermitteln
await setStateAsync(sID_Soll_LeistungHeizstab_W, HeizstabLadeleistung_W);
log(`Heizstab_W=${HeizstabLadeleistung_W} / PV_Leistung (${PV_Leistung_W}) - Gesamtverbrauch (${Gesamtverbrauch_W}) - M_Power (${M_Power_W}) ---- Hausverbrauch (${Hausverbrauch_W}) / Batterieleistung (${BatterieLeistung_W}) / Netzleistung (${NetzLeistung_W}) / Wallbox (${Wallbox_Leistung_W})`);
});
- Modbus Register als TSV und Modbus Einstellungen
Das Statuswerte sind auslesbar über http://IP-AC-ELWA-E/data.jsn
Register habe ich von hier verwendet.
https://github.com/DrBing/ioBroker.AC-ELWA_E
Hoffe, das hilft allen wie mir, die neu mit dem AC ELWA-E und Modbus anfangen.
Gruss Oliver