NEWS
AC ELWA-E mit iobroker
-
steuern heißt ja letzt endlich dem AC ELWA-E ein Command zu senden.
Die reine Anzeige im Adapter bringt dann nichts. Gesteuert kann ja per my-PV Power Meter sein.
Also mal den Hersteller antackern ob er dir die Commands und das Protokoll mitteilt. -
@ralla66 Danke. Das heißt, dass der Adapter lediglich für die Anzeige dient und nicht zur Steuerung?
-
-
@drakal
Hi!Ich habe auch einen Elwa-E im Einsatz, bisher gesteuert von meinem E3DC-Speicher, jetzt per ioBroker-Skript über den Modbus-Adapter.
Wie ist Dein Stand?
Ich versuche aktuell in Kombination mit dem "Charge Control" Skript eine Steuerung für ausschließlich PV-Überschuss per Skript zu realisieren.
Das Skript übernimmt die Steuerung zum Laden des Speichers (schön langsam über Tag), macht dadurch aber die Speicher-seitige My-PV-Ansteuerung obsolet, die erst dann den Heizstab ansteuert, wenn der Speicher 100% gefüllt ist. Also wird schön eingespeist ohne Heizstab-Nutzung => Daher selbst machen.
Jetzt klickert der Heizstab die ganze Zeit sehr intensiv bei "Steuern" des Wertes "Power (R/W)". Ich habe vorher nicht so drauf geachtet, ob das auch bei der E3DC-Steuerung so war - hast Du da eine Info?
Wenn Du schon steuerst - in welchen Zeitintervallen aktualisierst Du die zu nutzende Watt-Zahl?
-
@jans_ios
Hi,
ich würde gerne kurz diesen Thread nochmal aktivieren.
Da SolarEdge leider nur einen Master für Modbus-TCP kann, würde ich gerne die notwendigen Daten via ioBroker dem ELWA-E per Modbus-TCP anbieten. Sofern ich Dich richtig verstanden habe, hast Du das so gelöst, richtig?
Der Adapter kann ja auch als Slave konfiguriert werden.
Mein Plan wäre die Werte mit einer ModbusAdapter-Instanz von Solaredge abzuholen und durch eine weitere Modbus-Adapter-Instanz wieder als Slave für ELWA-E zur Verfügung zu stellen. Machst Du das auch so?
Stand heute würde ich gerne die Steuerung der Überschussladung vom ELWA-E übernehmen lassen.
Oder?
Sonnige Grüße und Danke -
@seasender said in AC ELWA-E mit iobroker:
@jans_ios
Hi,
ich würde gerne kurz diesen Thread nochmal aktivieren.
Da SolarEdge leider nur einen Master für Modbus-TCP kann, würde ich gerne die notwendigen Daten via ioBroker dem ELWA-E per Modbus-TCP anbieten. Sofern ich Dich richtig verstanden habe, hast Du das so gelöst, richtig?
Der Adapter kann ja auch als Slave konfiguriert werden.
Mein Plan wäre die Werte mit einer ModbusAdapter-Instanz von Solaredge abzuholen und durch eine weitere Modbus-Adapter-Instanz wieder als Slave für ELWA-E zur Verfügung zu stellen. Machst Du das auch so?
Stand heute würde ich gerne die Steuerung der Überschussladung vom ELWA-E übernehmen lassen.
Oder?
Sonnige Grüße und DankeIch bin auch gerade dabei meine zwei neuen AC-ELWA-E im ioBroker sichtbar zu machen.
Gesteuert mit reinem PV Überschuss werden sie über den SMA Sunny Homemanager 2.0, was auch super funktioniert, nur leider kann ich dadurch nicht die Daten im Heizstab per Modbus abholen, da dieser bei der Auswahl der Kommunikation ja auf "Sunny Homemanager" eingestellt ist.Hat hierzu Jemand eine Idee?
THX
Timee -
@timee
Hallo Timee,der Elwa-E kann nur von einer Quelle aus gesteuert werden - in Deinem Fall der Sunny Homemanager. Den müsstest Du umstellen auf Modbus TCP und dann die Steuerung komplett per ioBroker über den Modbus-Adapter machen.
Viele Grüße,
Jan -
@seasender
Moin Seasender!Ich habe den Elwa-E umgestellt auf "Modbus TCP" und eine ioBroker-Modbus-Instanz gegen den Elwa-E laufen lassen. Darüber kann ich Werte auslesen und auch schreiben. Für das Schreiben arbeite ich an einem Skript, um nur den Überschuss meines E3DC Hauskraftwerks zu nutzen, welches ich auch durch den ioBroker auslesen lasse.
Die E3DC-eigene Steuerung eines Heizstabs sieht leider nur vor, den Heizstab zu aktivieren, sobald der Akku voll ist - ich lasse den jedoch per Script nur langsam den Tag über aufladen um den Akku zu schonen. Das beißt sich dann
Viele Grüße,
Jan -
@jans_ios sagte in AC ELWA-E mit iobroker:
Ich habe den Elwa-E umgestellt auf "Modbus TCP" und eine ioBroker-Modbus-Instanz gegen den Elwa-E laufen lassen. Darüber kann ich Werte auslesen und auch schreiben. Für das Schreiben arbeite ich an einem Skript, um nur den Überschuss meines E3DC Hauskraftwerks zu nutzen, welches ich auch durch den ioBroker auslesen lasse.
Was meinst du damit dass du eine iobbroker-Modbus-Instanz GEGEN den Elwa-E laufen lässt?
Ich möchte gerne den ELWA-E über ein Blockly mitteilen, mit wievielen Watt er aufheizen darf.
-
@manfredhi
Sorry für die seeehr späte Antwort. Ich habe den Heizstab am E3DC abgemeldet und im ioBroker eine Modbus-Instanz so eingerichtet, dass sie meinen Heizstab abfragt:
Zur Akkusteuerung nutze ich ChargeControl von ArnoD (https://github.com/ArnoD15/iobroker_E3DC und https://forum.iobroker.net/topic/32976/e3dc-hauskraftwerk-steuern). Dieses schreibt den errechneten benötigten sinnvollen Ladestrom für das HKW in einen Wert, den ich in einem Skript weiter verarbeite, um den zur Heizstabnutzung echten Überschuss zu berechnen.
Hier mein aktueller Stand des Skripts, an dem @ArnoD auch mitgewirkt hat:
const sID_LeistungHeizstab_W = 'modbus.2.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.Variablen.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.2.holdingRegisters.1000_Power' // Soll Leistung Heizstab an Schnittstelle const sID_IstTempHeizstab = 'modbus.2.holdingRegisters.1002_WW1_Temp_max' // Aktuelle Temperatur am Heizstab const sID_MaxTempHeizstab = 'modbus.2.holdingRegisters.1001_Temp1' // Maximal-Temperatur lt. Drehregler am Heizstab, Skript peilt 5 Grad weniger an, da Heizstab sonst selbst abregelt und sich Skript und Heizstab streiten 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_MaxTempHeizstab)).val; let MaxTempHeizstab = (await getStateAsync(sID_IstTempHeizstab)).val; let Wallbox_Leistung_W = (await getStateAsync(sID_Wallbox_Leistung)).val; 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}; MaxTempHeizstab=${MaxTempHeizstab}`);; //if (M_Power_W = 9000){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})`); });
Geht sicherlich noch schöner, tat aber den Sommer über das, was es sollte.
Viele Grüße, Jan
-
@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_EHoffe, das hilft allen wie mir, die neu mit dem AC ELWA-E und Modbus anfangen.
Gruss Oliver - Im AC Elwa E - Anpassung der Zeitablauf Ansteuerung:
-
@oliverr-0
Hey Oliver,danke, dass Du meinen Pfusch großzügig als Logikfehler bezeichnet hast. Ernsthaft - die aktuelle Temperatur und die maximal-Temperatur beim Einlesen zu verwechseln ist kein Logikfehler, das ist schlicht Pfusch
Es fiel mir wie Schuppen von den Augen, als ich Deine und meine Version verglich... Hab's jetzt auch selbst übernommen.
Danke!
Gruß, Jan
-
@oliverr-0
Hey Oliver,ich habe bei dem Skript jetzt eine etwas merkwürdige Log-Ausgabe, die ich mir so nicht erklären kann. Hast Du eine Idee?
2.3.2024, 12:39:01.570 [info ]: javascript.0 (18751) Start javascript script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:39:01.806 [info ]: javascript.0 (18751) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 2.3.2024, 12:39:02.891 [info ]: javascript.0 (18751) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:39:02.993 [warn ]: javascript.0 (18751) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:39:03.384 [info ]: javascript.0 (18751) Stop script script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:40:16.547 [info ]: javascript.0 (6282) Start javascript script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:40:16.553 [info ]: javascript.0 (6282) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 2.3.2024, 12:40:24.417 [info ]: javascript.0 (6282) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:40:24.435 [warn ]: javascript.0 (6282) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:40:24.555 [info ]: javascript.0 (6282) Stop script script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:40:24.559 [info ]: javascript.0 (6282) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:40:24.562 [warn ]: javascript.0 (6282) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:40:24.643 [info ]: javascript.0 (6282) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:40:24.647 [warn ]: javascript.0 (6282) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:40:25.845 [info ]: javascript.0 (6282) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:40:25.849 [warn ]: javascript.0 (6282) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:40:28.714 [error]: host.iobroker Caught by controller[5]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:22:70) 2.3.2024, 12:40:28.715 [error]: host.iobroker Caught by controller[6]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:22:70) 2.3.2024, 12:40:28.716 [error]: host.iobroker Caught by controller[6]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:24:74) 2.3.2024, 12:41:17.699 [info ]: javascript.0 (7481) Start javascript script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:41:17.707 [info ]: javascript.0 (7481) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 2.3.2024, 12:41:25.924 [info ]: javascript.0 (7481) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:41:25.931 [warn ]: javascript.0 (7481) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:41:26.017 [info ]: javascript.0 (7481) Stop script script.js.Eigene_Skripte.Heizung.Heizstabsteuerung 2.3.2024, 12:41:26.062 [info ]: javascript.0 (7481) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:41:26.065 [warn ]: javascript.0 (7481) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:41:26.250 [info ]: javascript.0 (7481) script.js.Eigene_Skripte.Heizung.Heizstabsteuerung: Ist-Temperatur am Heizstab: 63.5°C, Maximal-Temperatur am Heizstab: 80.1°C 2.3.2024, 12:41:26.252 [warn ]: javascript.0 (7481) at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:29:11) 2.3.2024, 12:41:29.614 [error]: host.iobroker Caught by controller[4]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:23:70) 2.3.2024, 12:41:29.616 [error]: host.iobroker Caught by controller[4]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:21:67) 2.3.2024, 12:41:29.618 [error]: host.iobroker Caught by controller[6]: at Object.<anonymous> (script.js.Eigene_Skripte.Heizung.Heizstabsteuerung:24:74)
Danke!
-
@OliverR-0
Ich habe es gefunden, Du hast den Heizverbrauch ohne Heizstab an einer anderen Stelle als Objekt. Habe oben den Pfad für mich angepasst und es läuft.