NEWS
Script zum Laden/Entladen von Zendure Solarflow
-
@martin_1705
Grundlast ist bei dir ja echt niedrig. Respekt!
Ist natürlich sinnvoll einen für dich passenden Wert für Hysterese zu finden.
Aber das System mit einer etwas großzügigeren Hysterese zu schonen schont auf lange Sicht deinen Geldbeutel.Für den Wechsel zwischen Lade- und Entlademodus solltest du einen Stop von mehreren Sekunden programmieren und einen toten Bereich bevor geschaltet wird. Das Relais wird es dir danken.
Über Erfahrungen wegen Verschleiß ist mir nichts bekannt.
Rechner nachts ausschalten - nicht wirklich, oder 🤪
Cronjob zum ausschalten geht ja, aber nicht das einschalten 😉 -
@martin_1705
Grundlast ist bei dir ja echt niedrig. Respekt!
Ist natürlich sinnvoll einen für dich passenden Wert für Hysterese zu finden.
Aber das System mit einer etwas großzügigeren Hysterese zu schonen schont auf lange Sicht deinen Geldbeutel.Für den Wechsel zwischen Lade- und Entlademodus solltest du einen Stop von mehreren Sekunden programmieren und einen toten Bereich bevor geschaltet wird. Das Relais wird es dir danken.
Über Erfahrungen wegen Verschleiß ist mir nichts bekannt.
Rechner nachts ausschalten - nicht wirklich, oder 🤪
Cronjob zum ausschalten geht ja, aber nicht das einschalten 😉@Murphy-0 Vorweg, wo jetzt iobroker nicht mehr wirklich auf meinem Raspberry PI mit eben nur 1GB RAM läuft, ist das Einschalten jetzt tatsächlich ein Thema, nach dem PI ausschalten am Abend mit Cronjob. Jetzt läuft iobroker auf einen MINI PC mit Schalter (und scheinbar geht der Neustart schon mit WakeonLAN aber eben scheinbar auch nicht wenn vielleicht auch die Fritzbox über Nacht im Standby ist)
Ich habe das Thema aber bisher gut lösen können, weil ich das Balkonkraftwerk über Tuya mit einer WLAN-Steckdose immer gemessen habe, und in Tuya, oder auch in meinem Fall mit der Smarlife APP lässt sich ja gut eine Szene erstellen, um dann das PI, an einer anderen WLAN Steckdose mit Dose ->Ein, wenn beim Balkonkraftwerk über z.b. 60W eingehen, zu starten.
Und zum Wechsel zwischen Lade- und Entlademodus habe ich ein Durchschnittsskript für die letzten 10 gemessenen "Steuerwerte" laufen, da muss aktuell der Durchschnitt bei +-10W bei mir liegen um jeweils umzuschalten.
Es ist ja erst in den ersten Tagen bei mir, das Speichersystem, und so wähle ich auch manchmal wenn ich die Situation passend einschätze einfach Lade- Entladeautomatik per iQontrol Schalter, oder auch nur Laden untertags, oder nur Entladen zu einem gewissen Zeitpunkt und Nachts, dann wechselt da auch nichts mehr. Ich lade dann eben mit 6W mindestens damit kein Wechsel in den Standbymodus passiert, was auch wieder das Relais auslöst. Und Entlade mit 2W, was bisher bei mir dann nur auf 1W schwankt, und nicht in den Standby wechselt.
Was mich auch noch interessiert ist wegen einem Offline-Betrieb mit Bluetooth, Shelly pro 3EM kann das ja und der Solarflow 800 Plus auch. Könnte klappen, und wäre eben Nachts ein Vorteil wenn das läuft, mal sehen.
-
Ja ein PI ist wohl umgänglicher, ich teste gerade rtcwake auf meinem Linux-System, in iobroker, das ist etwas widerständig bislang.
Heute ist der Solarflow von 51 direkt auf 100% gegangen, wenn ich nicht irre waren das 3,34-3,36V i(n etwa), SOC Level des Akkus 100%. Das ganze, nachdem der Akku einige Tage nicht auf 100% geladen hat, und ich ihn öfters sanft auf 10% entladen habe, allerdings wurde mir dort auch "Volt minimal: 3,26V" zuletzt angezeigt. Bei der ersten Vollladung vor ein paar Wochen, ging der Akku von 72 auf 100%, und wurde dann immer besser die nächsten 4 Vollladungen, am Ende von 96 direkt auf 100%. Jetzt dieser Rückschlag, kann ich da etwas verändern? Oder muss ich auf eine neue Kalibrierung hoffen, durch entladen wieder auf 10% und dann erneut Vollladen?
-
Die 100% Soc sollten erst bei 3,55 bis 3,6 maxVol erreicht sein. Allerdings nur so lange geladen wird, also unter Last. Wird das Laden beendet geht maxVol auf etwa 3,3 Volt zurück wenn der Akku voll ist.
Das Gleiche passiert beim Einspeisen. Unter Last fällt minVol bei 15 % SOC auf etwa 3,17 Volt.
Je höher die Last desto weiter fällt der minVol. Wird das Entladen beendet sind es bei 20% SOC etwas 3,22 bis 3,23 Volt.Diese Angaben sind aber von Akku zu Akku und je nach Last leicht unterschiedlich.
Diese Sprünge hoch auf 100 hatte ich bei meinem Hyper noch nie.
Siehe hier im thread 225 meine Ladekurve mit Ruhephase danach und bei Thread 238 Entladekurve mit Ruhephase danach.
-
Die 100% Soc sollten erst bei 3,55 bis 3,6 maxVol erreicht sein. Allerdings nur so lange geladen wird, also unter Last. Wird das Laden beendet geht maxVol auf etwa 3,3 Volt zurück wenn der Akku voll ist.
Das Gleiche passiert beim Einspeisen. Unter Last fällt minVol bei 15 % SOC auf etwa 3,17 Volt.
Je höher die Last desto weiter fällt der minVol. Wird das Entladen beendet sind es bei 20% SOC etwas 3,22 bis 3,23 Volt.Diese Angaben sind aber von Akku zu Akku und je nach Last leicht unterschiedlich.
Diese Sprünge hoch auf 100 hatte ich bei meinem Hyper noch nie.
Siehe hier im thread 225 meine Ladekurve mit Ruhephase danach und bei Thread 238 Entladekurve mit Ruhephase danach.
@Murphy-0 Danke, ich werde jetzt auch einmal das Entladen bei MaxVol 3,16V beenden, weil ich festgestellt habe dass, auch mit MinVol 3,15V noch weiter mit dem Entladen fortgefahren wird, und wenn ich das Entladen da aber mit Standby beende, auch der Speicherlevel von 11 auf 10% gesetzt wird, und somit nicht mehr weiter entladen wird. Wenn dieser Punkt erreicht ist lassen sich denke ich auch wieder auch wieder 2kWh in den Akku laden. Als schon wie letztens beschrieben bei 3,26V abgeschaltet wurde, und dann bei 51% mit "Voll" auch wieder Ende war, da war es gerade einmal ein bisschen mehr als 1kWh was reinging. Muss mal sehen wie ich das am besten in den Griff bekomme. 3,55 bis 3,6maxVol werde ich auch mal beobachten ob das bei mir auftaucht... Das System dürfte etwas anfällig sein bei mir, sich selbst so weit zu verstellen.
-
@Murphy-0 Danke, ich werde jetzt auch einmal das Entladen bei MaxVol 3,16V beenden, weil ich festgestellt habe dass, auch mit MinVol 3,15V noch weiter mit dem Entladen fortgefahren wird, und wenn ich das Entladen da aber mit Standby beende, auch der Speicherlevel von 11 auf 10% gesetzt wird, und somit nicht mehr weiter entladen wird. Wenn dieser Punkt erreicht ist lassen sich denke ich auch wieder auch wieder 2kWh in den Akku laden. Als schon wie letztens beschrieben bei 3,26V abgeschaltet wurde, und dann bei 51% mit "Voll" auch wieder Ende war, da war es gerade einmal ein bisschen mehr als 1kWh was reinging. Muss mal sehen wie ich das am besten in den Griff bekomme. 3,55 bis 3,6maxVol werde ich auch mal beobachten ob das bei mir auftaucht... Das System dürfte etwas anfällig sein bei mir, sich selbst so weit zu verstellen.
-
Gestern war bei VolMax 3,54V Ladeende 100%, das Entladen stoppt halt dann doch relativ bald wenn ich bei Volmin 3,16V stoppe, aber wird wohl Sinn machen. Damit es ein bisschen hinausgezögert wird habe ich aber aktuell schon von 40% (500W) bis 10% verlaufend das Entladelimmit bis zu nur noch maximal 200W runtergesetzt.
-
Nachdem mein Blockly zum Steuern meines Hyper 2000 seit Monaten perfekt läuft habe ich mich mal dem Problem mit meinem Elektroherd angenommen.
Wen der Herd eingeschaltet ist und die Vorwärmphase beendet ist fängt er an zu pulsen.
Das heist er schaltet alle ca. 30 Sekunden die Last ab und dann wieder nach ca, 30 Skunden die Last aus.Das ist für meinen Hyper suboptimal da der dann wenn die Sonne scheint dauernd zwischen Laden und Einspeisen hin und her schaltet. Auch Abends ohne Sonne schaltet er ständig das Einspeisen ein und aus.
Dafür habe ich jetzt mal ein JS erstellt. Wärend dem Pulsen des Herdes hört der Hyper auf zu Laden oder Einzuspeißen.
/************************************************************
- Elektroherd - Pulserkennung über Hausverbrauch
- ioBroker JavaScript
************************************************************/
// ============================================================
// EINSTELLUNGEN
// ============================================================const HERD_LEISTUNG_W = 2000;
const SCHWELLWERT_W = 1000;// Zeit nach dem letzten Puls bis zum Ende des Pulsens
const ZEIT_NACHLAUF_SEKUNDEN = 15;// Anzahl notwendiger Wechsel
const MIN_PULSE_WECHSEL = 4;// Zeit ohne Wechsel -> vollständiger Reset
const ZEIT_OHNE_WECHSEL_SEKUNDEN = 60;// ============================================================
// OBJEKTE
// ============================================================const HAUSVERBRAUCH =
'0_userdata.0.Hausverbrauch';const AKKU =
'0_userdata.0.Laden_Schalter';const EINSPEISEN =
'0_userdata.0.Einspeisen_Schalter';// ============================================================
// VARIABLEN
// ============================================================let letzterStatus = 'start';
let pulseWechsel = 0;
// Pulserkennung aktuell aktiv?
let herdPulst = false;// Timer für das Ende des Pulsens
let nachlaufTimer = null;// Timer für 60-Sekunden-Reset
let wechselResetTimer = null;// Ursprüngliche Schalterzustände
let urspruenglicherAkkuZustand = null;let urspruenglicherEinspeisenZustand = null;
// ============================================================
// AUSGANGSSTELLUNG WIEDERHERSTELLEN
// ============================================================function ausgangsstellungWiederherstellen() {
// Nur wenn vorher tatsächlich ein Pulsbetrieb // aktiviert wurde if (!herdPulst) { return; } // -------------------------------------------------------- // AKKU // -------------------------------------------------------- if (urspruenglicherAkkuZustand !== null) { setState( AKKU, urspruenglicherAkkuZustand ); } // -------------------------------------------------------- // EINSPEISEN // -------------------------------------------------------- if (urspruenglicherEinspeisenZustand !== null) { setState( EINSPEISEN, urspruenglicherEinspeisenZustand ); } log( 'Ausgangsstellung wiederhergestellt: ' + 'Laden=' + urspruenglicherAkkuZustand + ', Einspeisen=' + urspruenglicherEinspeisenZustand, 'warn' ); // Pulserkennung AUS herdPulst = false; // Gespeicherte Zustände löschen urspruenglicherAkkuZustand = null; urspruenglicherEinspeisenZustand = null;}
// ============================================================
// VOLLSTÄNDIGER RESET
// ============================================================function vollstaendigerReset() {
log( '60 Sekunden kein neuer Wechsel -> ' + 'vollständiger Reset', 'warn' ); // -------------------------------------------------------- // TIMER LÖSCHEN // -------------------------------------------------------- if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); nachlaufTimer = null; } // -------------------------------------------------------- // AUSGANGSSTELLUNG WIEDERHERSTELLEN // -------------------------------------------------------- if (herdPulst) { ausgangsstellungWiederherstellen(); } // -------------------------------------------------------- // PULSZÄHLER ZURÜCKSETZEN // -------------------------------------------------------- pulseWechsel = 0; // -------------------------------------------------------- // STATUS ZURÜCKSETZEN // -------------------------------------------------------- letzterStatus = 'start'; log( 'Pulserkennung AUS / Wechselzähler = 0', 'warn' );}
// ============================================================
// PULSEN STARTEN
// ============================================================function pulsenStarten() {
if (herdPulst) { return; } // -------------------------------------------------------- // AUSGANGSSTELLUNG SPEICHERN // -------------------------------------------------------- urspruenglicherAkkuZustand = getState(AKKU).val; urspruenglicherEinspeisenZustand = getState(EINSPEISEN).val; log( 'Pulsen erkannt -> Ausgangsstellung gespeichert: ' + 'Laden=' + urspruenglicherAkkuZustand + ', Einspeisen=' + urspruenglicherEinspeisenZustand, 'warn' ); // -------------------------------------------------------- // PULSERKENNUNG EIN // -------------------------------------------------------- herdPulst = true; // Während des Pulsens beide AUS setState(AKKU, false); setState(EINSPEISEN, false); log( 'HERD PULST -> Laden_Schalter AUS / Einspeisen AUS', 'warn' );}
// ============================================================
// PULSEN NORMAL BEENDEN
// ============================================================function pulsenBeenden() {
if (!herdPulst) { return; } log( 'Herdpulsen beendet', 'warn' ); // Ausgangsstellung wiederherstellen ausgangsstellungWiederherstellen(); // Zähler zurücksetzen pulseWechsel = 0; letzterStatus = 'start'; // Reset-Timer löschen if (wechselResetTimer !== null) { clearTimeout(wechselResetTimer); wechselResetTimer = null; }}
// ============================================================
// 60-SEKUNDEN-RESET-TIMER
// ============================================================function wechselResetTimerStarten() {
// Alten Timer löschen if (wechselResetTimer !== null) { clearTimeout(wechselResetTimer); } // Neuen Timer starten wechselResetTimer = setTimeout(function () { wechselResetTimer = null; // Nur wenn tatsächlich Wechsel gezählt wurden if (pulseWechsel > 0) { vollstaendigerReset(); } }, ZEIT_OHNE_WECHSEL_SEKUNDEN * 1000);}
// ============================================================
// NACHLAUF-TIMER
// ============================================================function nachlaufTimerStarten() {
if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); } nachlaufTimer = setTimeout(function () { nachlaufTimer = null; const aktuell = Number( getState(HAUSVERBRAUCH).val ); if (aktuell <= SCHWELLWERT_W) { pulsenBeenden(); } }, ZEIT_NACHLAUF_SEKUNDEN * 1000);}
// ============================================================
// HAUSVERBRAUCH ÜBERWACHEN
// ============================================================on(
{
id: HAUSVERBRAUCH,
change: 'ne'
},
function (obj) {const leistung = Number(obj.state.val); if (isNaN(leistung)) { log( 'Ungültiger Hausverbrauch: ' + obj.state.val, 'warn' ); return; } // ==================================================== // HOHER VERBRAUCH // ==================================================== if (leistung >= HERD_LEISTUNG_W) { // Wechsel NIEDRIG -> HOCH if (letzterStatus === 'niedrig') { pulseWechsel++; log( 'Puls HOCH: ' + leistung.toFixed(0) + ' W | Wechsel=' + pulseWechsel, 'warn' ); // 60-Sekunden-Timer neu starten wechselResetTimerStarten(); } letzterStatus = 'hoch'; // Nachlauf abbrechen if (nachlaufTimer !== null) { clearTimeout(nachlaufTimer); nachlaufTimer = null; } // ================================================= // 4 WECHSEL ERREICHT // ================================================= if ( pulseWechsel >= MIN_PULSE_WECHSEL && !herdPulst ) { pulsenStarten(); } return; } // ==================================================== // NIEDRIGER VERBRAUCH // ==================================================== if (leistung <= SCHWELLWERT_W) { // Wechsel HOCH -> NIEDRIG if (letzterStatus === 'hoch') { pulseWechsel++; log( 'Puls NIEDRIG: ' + leistung.toFixed(0) + ' W | Wechsel=' + pulseWechsel, 'warn' ); // 60-Sekunden-Timer neu starten wechselResetTimerStarten(); } letzterStatus = 'niedrig'; // Wenn Herd bereits pulst, // Nachlauf starten if (herdPulst) { nachlaufTimerStarten(); } return; } });
// ============================================================
// STARTMELDUNG
// ============================================================log(
'============================================',
'warn'
);log(
'Elektroherd-Pulserkennung gestartet',
'warn'
);log(
'Herdleistung: ' +
HERD_LEISTUNG_W +
' W',
'warn'
);log(
'Schwellwert: ' +
SCHWELLWERT_W +
' W',
'warn'
);log(
'Nachlauf: ' +
ZEIT_NACHLAUF_SEKUNDEN +
' Sekunden',
'warn'
);log(
'Benötigte Wechsel: ' +
MIN_PULSE_WECHSEL,
'warn'
);log(
'Reset nach ' +
ZEIT_OHNE_WECHSEL_SEKUNDEN +
' Sekunden ohne Wechsel',
'warn'
);log(
'============================================',
'warn'
);
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden