Victron MultiPlus II

ok, Danke!

Hast du vielleicht noch ein paar Screenshots wie du den ausliest bzw. dem Wechselrichter mitteilst wieviel Watt er ins Netz oder Batterie schieben soll?

Das würde mir viel Nerven sparen, da du das schon gelöst hast. :wink:

ModBus ist noch Neuland und ich bin mir bei der Configuration / Einbindung in Symcon komplett unsicher 😵‍💫

Eilt nicht. Es würde nur mir und vielleicht ein paar anderen Usern helfen. Danke!

@Doctor_Snuggles :slight_smile:
wenn du mal Zeit findest wäre das Mega.

Du musst dich generell etwas mit Modbus in IPS beschäftigen um zu verstehen, wie einfach das geht :wink:

Schau mal, das du erstmal die HW bekommst und installierst, das andere ergibt sich dann schon.

Du brauchst eigentlich nur die Modbus Adressen aus der Excel Liste vom Inverter zu nehmen und die Daten abzufragen oder zusetzen.

Mein Script ist aber so individuell, das du verm. damit so nichts anfangen kannst.
Vielleicht hilft es dir ja, um eins für deine Bedürfnisse zu erstellen.


// ---------- Konfiguration ----------
$IDArchiveHandler = 10204;
$ID_Gesamtleistung = 42236;
$ID_Leistung_Mittelwert = 29827;                            // Werte zur Berechnung des möglichen Leistungsdurchschnitt
$ID_Sekunden = 27931;                                       // ID Sekundenzähler für Netzteil zum Einschalten

$ID_Instanz_ESS_SOLL = 21696;
$ID_ESS_SOLL = 12332;

$ID_Instanz_Relais1 = 16100;
$ID_Status_Relais1 = 52086;
$ID_Instanz_Steckdose = 32438;                              // Steckdose Heizungsraum für Netzteil (Treppenlicht 15min.)
$ID_Steckdose_Status = 52398;

$ID_Instanz_Enable_Charger = 13532;                         // Modbus Instanz Charger
$ID_Instanz_Enable_Inverter = 43112;                        // Modbus Instanz Inverter
$Status_Charger = GetValue(21531);                          // aktueller Status Lader (aus = 0, ein = 100)
$Status_Inverter = GetValue(37530);                         // aktueller Status Inverter (aus = 0, ein = 100)
$SoC = GetValue(12410);                                     // aktueller SoC Pylontech (Victron)
$ID_SoC_dyn = 16223;                                        // ID des dynamischen SoC
$ID_SoC_100 = 34342;                                        // ID des 0-100% SoC

$Laden_Offset = 100;                                        // Vorgabe Offset zur Nullausregelung in W
$Entladen_Offset = -20;
$Laden_Max = 2200;                                          // Ladeleistung Victron maximal in W
$Einspeisen_Max = -2400;                                    // Einspeisleistung Victron maximal in W (max. 2400W)
$SoC_min = GetValue(47773);                                 // minimum SoC bis abschalten des Inverters
$SoC_max = 95;                                              // maximaler SoC beim Laden (Victron)
$Soc_max_Netzteil = 88;                                     // maximaler SoC fürs Laden mit dem Netzteil
$SoC_Offset = 5;                                            // Inverter wiedereinschalt SoC über min. SoC
$Sekunden_Offset = 60;                                     // Offsetzeit zum Zuschalten des Netzteils

$Sonnenstunden_morgen = GetValue(30733);                    // Sonnenstunden von morgen
$BatteryLife = GetValue(52279);                             // BatteryLife Status abfragen

$Leistung_Netzteil = 1420;                                  // max. Leistung in W des zus. Ladenetzteils (aktiviert über Relais1)
$Leistung_Heizstab = GetValue(53870);                       // aktuelle Leistung der Heizstäbe

$Bezug = round(GetValue(36301),0);                          // aktueller Bezug vom eHz in W
$Leistungssteller_aktuell = GetValueInteger(35077);         // aktueller Wert vom ESS in W

// ===================================================================================================================================

// Steuerung Einspeisleistung nach Batteriestatus (SoC)
if ($SoC < 20) {$Einspeisen_Max = -1000;}                                                               // Einspeisleistung bei niedriegen SoC begrenzen
if ($SoC < 15) {$Einspeisen_Max = -500;}


// ---------- BatteryLife - Steuerung dynamischer SoC_min (mit Sonnenstunden des nächsten Tages um 13:05) ----------

// einmal tägl. prüfen (13:05)
if (($_IPS['SENDER'] == "TimerEvent") and ($BatteryLife == true)) {
    if ($_IPS['EVENT'] == 40077) {
        $SoC_min = 10;
        if ($Sonnenstunden_morgen <= 5) {$SoC_min = 20;}
        if ($Sonnenstunden_morgen <= 4) {$SoC_min = 25;}
        if ($Sonnenstunden_morgen <= 2) {$SoC_min = 40;}
        if ($Sonnenstunden_morgen <= 1) {$SoC_min = 60;}
        SetValue(47773, $SoC_min);
        return;
    }
}    

// beim Umschalten prüfen
if ($_IPS['SENDER'] == "Variable") {
    if ($_IPS['VARIABLE'] == 52279) {
        if ($BatteryLife == false) {
            $SoC_min = 10;
        } else {
            $SoC_min = 10;
            if ($Sonnenstunden_morgen <= 5) {$SoC_min = 20;}
            if ($Sonnenstunden_morgen <= 4) {$SoC_min = 25;}
            if ($Sonnenstunden_morgen <= 2) {$SoC_min = 40;}
            if ($Sonnenstunden_morgen <= 1) {$SoC_min = 60;}
        }
        SetValue(47773, $SoC_min);
        return;
    }
}

// ---------------- Berechnung des dynamischen SoC ----------------------------

$SoC_dyn = ($SoC - $SoC_min) * 100 / ($SoC_max - $SoC_min);                                             // Berechnung dynamischer Soc (zur Anzeige von 0-100% der verfügbaren Kapazität)
if (($SoC_dyn < 0) or ($Status_Inverter == 0)) {$SoC_dyn = 0;}
if ($SoC_dyn > 100) {$SoC_dyn = 100;}

SetValueInteger($ID_SoC_dyn, $SoC_dyn);

// ---------------- Berechnung des 0-100% SoC (10-95%)----------------------------

$min_SoC = 10;
$SoC_100 = ($SoC - $min_SoC) * 100 / ($SoC_max - $min_SoC);                                             // Berechnung 0-100% Soc (zur Anzeige von 0-100% der Gesamt-Kapazität)
if ($SoC_100 < 0) {$SoC_100 = 0;}
if ($SoC_100 > 100) {$SoC_100 = 100;}

SetValueInteger($ID_SoC_100, $SoC_100);


// ---------- Steuerung des Inverters (ein/aus) ----------
if ($SoC <= $SoC_min) {                                                                                 // Wenn SoC < SoC_min Inverter ausschalten
    if ($Status_Inverter > 0) {
        ModBus_WriteRegisterShort($ID_Instanz_Enable_Inverter, 0);
    }
}
if ($SoC >= ($SoC_min + $SoC_Offset)) {                                                                 // Wenn SoC über (SoC_min. + Offset) Inverter einschalten
    if ($Status_Inverter < 100) {
        ModBus_WriteRegisterShort($ID_Instanz_Enable_Inverter, 100);
    }
}
            
// ---------- Steuerung des zusätzlichen Netzteils zum Laden (über Relais 1 Venus GX) ----------
if ($_IPS['SENDER'] == "Variable") {
    if ($_IPS['VARIABLE'] == 36301) {
        $Netzteil_aktuell = GetValue($ID_Status_Relais1) * $Leistung_Netzteil;                          // aktuelle Leistung Netzteil
        $Power_gesamt = $Leistungssteller_aktuell + $Netzteil_aktuell + ($Bezug * -1);                  // Gesamtleistung ermitteln
        SetValue($ID_Gesamtleistung, $Power_gesamt);                                                    // mögliche Gesamtleistung in Variable schreiben
        
        $Mittelwert = getMean ($IDArchiveHandler,$ID_Gesamtleistung,120,0);                             // Mittelwert mögliche Gesamtleistung über 2 min.
        SetValue($ID_Leistung_Mittelwert, $Mittelwert);        

        // *** Sekundenzähler für Freigabe des Netzteils ***
        if (($Power_gesamt + $Leistung_Heizstab) >= 2000) {
            $Restzeit = (GetValue($ID_Sekunden) - (time() - (IPS_GetVariable($ID_Sekunden)['VariableUpdated'])));
            if ($Restzeit < 0) {
                $Restzeit = 0;
                }
            SetValue($ID_Sekunden, $Restzeit);
        }
        if (($Power_gesamt + $Leistung_Heizstab) < 2000) SetValue($ID_Sekunden, $Sekunden_Offset);      // Sekundenzähler für Freigabe NT hochzählen oder löschen  

        // *** Netzteil zuschalten ***
        if (($Power_gesamt > 2000) and ($SoC <= $Soc_max_Netzteil)) {
            KNX_WriteDPT1($ID_Instanz_Steckdose, true);                                                 // Steckdose Heizungsraum ein (15 min. Treppenlicht)
        }

        // *** Netzteilausgang einschalten ***
        if (($Power_gesamt > 2500) and (GetValue($ID_Sekunden) <= 0) and ($SoC <= $Soc_max_Netzteil)) { // Bedingungen für Netzteil einschalten (5 min.)            
            if (GetValue($ID_Status_Relais1) == 0){                                                     // wenn Netzteil aus war, Netzteileinschaltzähler hochzählen
                SetValueInteger(54069, (GetValueInteger(54069) + 1));
            }
            ModBus_WriteRegisterShort($ID_Instanz_Relais1, 1);                                          // NT ein (Relais 1) wenn > 2500W und SoC < max.
            SetValueBoolean(37354, true);
        }

        // *** Netzteil ausschalten ***
        if ((($Power_gesamt + $Leistung_Heizstab) < 1500) or ($SoC > $Soc_max_Netzteil)) {              // NT aus (Relais 1) wenn < 1500W oder SoC > max.
            ModBus_WriteRegisterShort($ID_Instanz_Relais1, 0);
            SetValueBoolean(37354, false);                                                              // Netzteil-Variable schalten
        }

        // *** Leistungen schreiben ***
        SetValue(47589, $Netzteil_aktuell);                                                             // testweise Leistung Netzteil in Variable schreiben
        SetValue(19925, ($Netzteil_aktuell + $Leistungssteller_aktuell));                               // Gesamt ESS-Leistung in Variable schreiben
    }
}

// --------------- Steuerung des ESS Sollwertes (Victron GX) -------------------
if ($_IPS['SENDER'] == "Variable") {
    if ($_IPS['VARIABLE'] == 36301) {
        $Power = $Leistungssteller_aktuell + ($Bezug * -1);                                             // Leistung ESS festlegen
        if (($Power > $Entladen_Offset) and ($Power < $Laden_Offset)) { $Power = 0;}                    // Offset zum Laden/Entladen
        if ($Power > $Laden_Max) {$Power = $Laden_Max;}                                                 // Ladeleistung begrenzen
        if ($Power < $Einspeisen_Max) {$Power = $Einspeisen_Max;}                                       // WR Leistung begrenzen
        if (($Power > 0) and ($SoC >= $SoC_max)) {$Power = 0;}                                          // Laden abschalten wenn SoC über Soc max.        
//      ModBus_WriteRegisterShort($ID_Instanz_ESS_SOLL, $Power);                                        // neuen Wert in Soll Instanz schreiben (ESS_Soll)
        SetValueInteger($ID_ESS_SOLL, $Power);                                                          // neuen Wert in Soll Variable schreiben
//        return;
    }
}            

// ------------------ Status Inverter / Lader / Netzteil in Variable (für MDT GT2) ------------------
if ((GetValue(47589) + $Leistungssteller_aktuell) > 100) {                                              // bei laden > 100W Variable setzen
    SetValue(23656, true);
    } else {
    SetValue(23656, false);
}

if ((GetValue(47589) + $Leistungssteller_aktuell) < -100) {                                             // bei entladen < -100W Variable setzen
    SetValue(16828, true);
    } else {
    SetValue(16828, false);
}

if ($Bezug > 100) {                                                                                     // Bezug > 100W Variable setzen
    SetValue(13025, true);
    } else {
    SetValue(13025, false);        
}

if ($Bezug < -100) {                                                                                    // Bezug < -100W Variable setzen
    SetValue(12883, true);
    } else {
    SetValue(12883, false);        
}
// ---------------------------- Funktionen --------------------------------------------

function getMean ($IDArchivehandler,$varId,$log_interval,$default) {
    $logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()- $log_interval,time(),-1);
    if (count($logData) <1) return $default;
        foreach ($logData as $key => $data)
    {
    $value[$key] = $data['Value'];
    }
    return array_sum($value)/count($value);
}

function getMedian ($IDArchivehandler,$varId,$log_interval,$default) {
    $logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()-$log_interval,time(),-1);
    if (count($logData) <1) return $default;
        foreach ($logData as $key => $data)
    {
    $value[$key] = $data['Value'];
    }
    asort($value);
    return $value[count($value)/2];
}

1 „Gefällt mir“

du hast schon recht, wenn die Hardware da ist, ist vieles einfacher.

Ich wollte nur sicherstellen, ob ich alles richtig verstanden habe?!?
Mit deiner Info hast du mir sehr geholfen! - Vielen Dank dafür!
Hardware ist bestellt. :wink:

Sonnige Grüße und nochmal Danke!
Martin

Hi Doctor_Snuggles,

wie ermittelst Du die Sonnenscheinstunden für morgen?

Den Ansatz finde ich gut.

MFG
MCS-51

Das Thema zu den Sonnenstunden findest du hier.
Da steht eigentlich alles, was du dafür benötigst.

VG,
Doc

hey!

ich habe auch einen Multiplus II GX und bereits eine Strommessung am Netzübergabepunkt zum Energieanbieter.

Die Strommessung erfolgt mit: SmartPi - nD-enerserve GmbH

Die Datensende ich 1x in der Sekunde mittels MQTT an IP Symcon. → läuft alles perfekt.

Gibt es eine Möglichkeit mitteld IP Symcon für den Victron Multiplus II GX Zähler zu spielen?
Im Prinzip würde ich gerne meine beretis vorhandenen Messwerte verwenden und nicht einen extra EM24 einbauen müssen.

Gibt es eine Möglichkeit mittels Modbus oder MQTT Victron mit den Messwerten zu füttern?
Danke und LG,
Martin

Ja gibt es.
Kannst deine „Wunschwerte“ über Modbus TCP direkt an den Wechselrichter senden, wenn er mit im Netz hängt, bzw. du gibst ihm vor, was er machen soll.
Aber mit deiner Strommessung wirst du verm. nicht viel Freude haben, gerade wenn es dir um eine Nullausregelung am Übergabepunkt kommt um einen Akku zu laden oder entladen.
Ich habe festgestellt, das diese Spulen gerade bei kleinen Strömen sehr ungenau werden und lese deshalb jetzt den eHz direkt aus und nur wenn dieser nicht mehr liefert, nutze ich diese Stromspulen.

Hi Leute, ich bin gerade auch am überlegen den MultiPlus II im Set bei mir Zuhause zu installieren.
Ich finde das Set von GreenAkku ganz gut. Link

Ich habe aktuell noch eine PV Anlage mit 10,5Kw mit ABB Wechselrichter am laufen sowie einen SMD630 Stromzähler installiert der mit Modbus über IPS ausgelesen wird. Würdet ihr zwingend die GX Version kaufen ??? Vielleicht liege ich gerade mit meiner Einkaufsplanung auch ganz falsch.

Grüße Daniel

Also bei deinem Angebot ist das GX Device ja extern und nicht intern im MPII.
Ich bilde mir ein, das man mit einem externe GX etwas flexibler ist auch wenn mal mehrere MPII angebunden werden.
Aber ich weiss nicht, ob man wirklich ein ext. Display benötigt, das hat man doch schon bestimmt mit IPS?

Ich mache das mit einem ausgedienten Handy, der GX hat ja einen USB Ausgang nur Strom.

Loerdy

Wenn ich das richtig sehe ist der nur 1Phasig?
Dann müsste man auch auf einer Phase die 9,6kWh Nachts verbrauchen? Oder habe ich einen Denkfehler?

Ja ich bin gerade auch ein wenig am forschen welche Kombination die richtige für mein Vorhaben ist.
Cerbo GX ist ja im Endeffekt nur das Gerät das über IPS ausgelesen wird. GX gleich im Multiplus oder Extern keine Ahnung. ???

Der Victron Interface MK3-USB (VE.Bus zu USB) muss ja sein um das MultiPlus II programmieren zu können oder ??

Wenn ich das richtig sehe ist der nur 1Phasig?
Dann müsste man auch auf einer Phase die 9,6kWh Nachts verbrauchen? Oder habe ich einen Denkfehler?

Genau nur eine Phase, das ist für mein Vorhaben ausreichend. Der große Multiplus II schafft ja 5kva und das sollte ja ausreichend sein um ein Null Verbrauch am Zähler zu bekommen. Die paar kleinen Spitzen decke ich über das normale Komfort Netz.

Ja du hast einen kleinen Denkfehler, wenn zb Nachts Phase 1 + 500watt / Phase 2 + 1000 / Phase 3 +200 Watt verbraucht werden, speist der Multiplus auf einer Phase 1700 watt ein was dann am Zähler eine Nullung gibt.

1 „Gefällt mir“

In meinem Fall wäre das dann diese Variante mit bereits installierter PV

Für den Notfall würde ich mir dann noch eine Doppelsteckdose am Multiplus anbringen, quasi als Notstrom wenn man es mal braucht.

1 „Gefällt mir“

Evtl. auch ein Venus GX extern? Das macht mehr als nur die Kommunikation mit IPS, das steuert den WR, der ja selber erst einmal dumm ist.

Ich weiss aber nicht, ob dir nicht auch der kleine MPII reichen würde mit 2,5kW Leistung.
Wie oft hat man nachts Spitzen über diesen Bereich und tagsüber fängt den Mehrverbrauch die PV auf.

Vergiss nicht, der WR ist nicht trafolos. Beim großen WR wird auch ein deutlich größerer Ringkern drin sein der ggf. bei kleineren Strömen den Wirkungsgrad verschlechtert.

Ich glaube der Preis zur Großen 5kva Variante ist nicht die Welt. Zudem wenn man es im blödesten Fall mal brauchen sollte würde sich mit einem Frequenzumrichter die Wärmepumpe mit Wechselstrom starten lassen. Natürlich als absolute Notlösung… oder habe ich einen Denkfehler ?
Sonst hast natürlich mit der kleinen Variante rein rechnerisch in Sachen Kosten Nutzen recht.


Was hast du nachts denn da für hohe Leistungen?
Läuft da die WP noch?

Und ist das wirklich der Gesamtzähler Verbrauch oder ist das Netzbezug?

Ja vielleicht nur ein Ausschnitt der nicht so passend ist. Ja auf dem einen Trend sieht man das ca. 10KWh über das Netz pro Tag bezogen werde. Also ja Bezugszähler. Ich denke das die großen Ausschläge vom Plastik Whirlpool kommen der seit ca. 2 Wochen in Betrieb ist. Wird aber bald auf einen richtigen mit Wärmepumpe umgebaut. Das ist aber ein ganz anderes Thema. Wärmepumpe ist nicht im Trend, läuft über separaten Zähler und Tarif.
Hier nochmal ein besserer Ausschnitt vom Verbrauch. An diesen Daten mache ich auch ungefähr die Größe des Batteriespeichers von ca 10 KWh fest.

Ja das sieht schon anders aus, ähnlich wie bei uns.
Aber genau da passt doch der 3000er MPII?

Was feiert ihr denn über eine ganze Woche nachts für Whirlpoolorgien?

Eigentlich geht es mir bei dem 5000er wirklich nur um den Fall meinen Wärmepumpen Kompressor starten zu können (THZ 403) er hat einen hohen Anlaufstrom, läuft aber dann stabil bei ca. 2000w.

Ich merke das bei mir in der Firma in letzter Zeit immer öfter Minuten Reserve oder Abschaltbare Lasten von den Stadtwerken angefordert werden um das Netzt Stabil zu halten. Da werden bei uns innerhalb 15min mehrere MW Leistung frei. Im Winter wird es spannend werden mit Netzstabilität und Co. Naja, es ist eigentlich nur der Notfallgedanke für alles was gerade auf der Welt los ist.

Ich gebe dir vollkommen Recht das wahrscheinlich der 3000er MPII rechnerisch (Wirkungsgrad, Kosten, Leistung) besser da steht. Boahh echt schwer wer das Rennen macht.
Hier mal ein kleiner Plan was wie geplant ist.

Die rote Umrandung zeigt was dazu kommt.
Ist die neue DC seitige PV Anlage eigentlich beim Netzbetreiber zu melden oder reicht nur die Größe des Stromspeichers ??? Marktstammdatenregister muss eine Meldung erfolgen ist klar.
Dankeschön !!!

p.s. die Whirlpoolorgien gehen dich gar nichts an :rofl: :rofl: :rofl: