SolarEdge Speichersteuerung

Fragen zur Nutzung, Features, usw..
ChristophR
Beiträge: 984
Registriert: So Okt 30, 2022 8:07 am
Has thanked: 28 times
Been thanked: 67 times

Re: SolarEdge Speichersteuerung

Beitrag von ChristophR »

snoerenberg hat geschrieben: Sa Mär 22, 2025 7:27 pm Hi,

mit dem Register 40036 bekomme ich auch die korrekte Firmware Version zurückgeliefert.
Das sollte wohl laut Sunspec Protokoll das richtige Register sein.

Code: Alles auswählen

from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('192.168.1.199', port=502)
client.connect()
response = client.read_holding_registers(address=40036, count=16, unit=1)

print("Read register: 40036")
if response.isError():
    print("Error reading registers")
else:
    firmware = ''.join([chr(x >> 8) + chr(x & 0xFF) for x in response.registers]).strip()
    print("Firmware Version:", firmware)
client.close()
Read register: 40036
Firmware Version: 0004.0022.0044

Bild

Gruß Stephan
In der Doku ist es aber als 40044 gelistet, da würde ich nicht einfach andere Register ausprobieren:
https://knowledge-center.solaredge.com/ ... l-note.pdf

Jetzt bleibt nur noch die Frage, wie wir es aus der bat.py hinbekommen, ohne dass eine 2. Modbus-Verbindung aufgebaut wird.
openWB Series 2 Standard+, SW-Version 2
SolarEdge SE10K-RWS, BYD LVS 8, 16,8 kWp.
CUPRA Born
Basti
Beiträge: 106
Registriert: Di Feb 21, 2023 3:28 pm
Has thanked: 1 time
Been thanked: 12 times

Re: SolarEdge Speichersteuerung

Beitrag von Basti »

Code: Alles auswählen

#!/usr/bin/env python3
import logging
from typing import Dict, Union, Optional

from pymodbus.constants import Endian

from control import data
from dataclass_utils import dataclass_from_dict
from modules.common import modbus
from modules.common.abstract_device import AbstractBat
from modules.common.component_state import BatState
from modules.common.component_type import ComponentDescriptor
from modules.common.fault_state import ComponentInfo, FaultState
from modules.common.modbus import ModbusDataType
from modules.common.simcount import SimCounter
from modules.common.store import get_bat_value_store
from modules.devices.solaredge.solaredge.config import SolaredgeBatSetup
import pymodbus

log = logging.getLogger(__name__)

FLOAT32_UNSUPPORTED = -0xffffff00000000000000000000000000


class SolaredgeBat(AbstractBat):
    # Define all possible registers with their data types
    REGISTERS = {
        "Battery1StateOfEnergy": (0xf584, ModbusDataType.FLOAT_32,),  # Dezimal 62852
        "Battery1InstantaneousPower": (0xf574, ModbusDataType.FLOAT_32,),  # Dezimal 62836
        "StorageControlMode": (0xe004, ModbusDataType.UINT_16,),
        "StorageChargeDischargeDefaultMode": (0xe00a, ModbusDataType.UINT_16,),
        "RemoteControlCommandMode": (0xe00d, ModbusDataType.UINT_16,),
        "RemoteControlCommandDischargeLimit": (0xe010, ModbusDataType.FLOAT_32,),
    }

    def __init__(self,
                 device_id: int,
                 component_config: Union[Dict, SolaredgeBatSetup],
                 tcp_client: modbus.ModbusTcpClient_) -> None:
        self.__device_id = device_id
        self.component_config = dataclass_from_dict(SolaredgeBatSetup, component_config)
        self.__tcp_client = tcp_client
        self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher")
        self.store = get_bat_value_store(self.component_config.id)
        self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
        self.last_mode = 'undefined'
        self._cached_firmware: Optional[str] = None

    def update(self) -> None:
        self.store.set(self.read_state())

    def read_state(self) -> BatState:
        unit = self.component_config.configuration.modbus_id

        registers_to_read = [
            "Battery1InstantaneousPower",
            "Battery1StateOfEnergy",
        ]
        values = self._read_registers(registers_to_read, unit)

        if values["Battery1InstantaneousPower"] == FLOAT32_UNSUPPORTED:
            values["Battery1InstantaneousPower"] = 0

        imported, exported = self.sim_counter.sim_count(values["Battery1InstantaneousPower"])

        bat_state = BatState(
            power=values["Battery1InstantaneousPower"],
            soc=values["Battery1StateOfEnergy"],
            imported=imported,
            exported=exported
        )
        log.debug(f"Bat {self.__tcp_client.address}: {bat_state}")
        return bat_state

    def set_power_limit(self, power_limit: Optional[int]) -> None:
        unit = self.component_config.configuration.modbus_id
        PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode

        if PowerLimitMode == 'no_limit':
            return

        if power_limit is None:
            if self.last_mode is not None:
                log.debug("Keine Speichersteuerung gefordert, Steuerung deaktivieren.")
                firmware = self._read_firmware_version(unit)
                if firmware and self._cached_firmware is None:
                    log.info(f"SolarEdge Firmware-Version (Unit {unit}): {firmware}")
                elif firmware is None:
                    log.warning("Firmware konnte nicht gelesen werden, nehme Standardwert für ControlMode = 2.")

                # Default Mode: Time of Use (2), bei alter Firmware: Max. Eigenverbrauch (7)
                if firmware and self._firmware_older_than(firmware, "4.20.36"):
                    control_mode = 7
                    log.info("Firmware < 4.20.36 erkannt – setze StorageControlMode = 7 (Max. Eigenverbrauch)")
                else:
                    control_mode = 2

                values_to_write = {
                    "RemoteControlCommandDischargeLimit": 5000,
                    "StorageChargeDischargeDefaultMode": 0,
                    "RemoteControlCommandMode": 0,
                    "StorageControlMode": control_mode,
                }
                self._write_registers(values_to_write, unit)
                self.last_mode = None
            else:
                return

        elif power_limit >= 0 and self.last_mode != 'stop':
            log.debug("Speichersteuerung aktivieren. Speicher-Entladung sperren.")
            values_to_write = {
                "StorageControlMode": 4,
                "StorageChargeDischargeDefaultMode": 1,
                "RemoteControlCommandMode": 1,
            }
            self._write_registers(values_to_write, unit)
            self.last_mode = 'stop'

    def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]:
        values = {}
        for key in register_names:
            address, data_type = self.REGISTERS[key]
            values[key] = self.__tcp_client.read_holding_registers(
                address, data_type, wordorder=Endian.Little, unit=unit
            )
        log.debug(f"Bat raw values {self.__tcp_client.address}: {values}")
        return values

    def _write_registers(self, values_to_write: Dict[str, Union[int, float]], unit: int) -> None:
        for key, value in values_to_write.items():
            address, data_type = self.REGISTERS[key]
            encoded_value = self._encode_value(value, data_type)
            self.__tcp_client.write_registers(address, encoded_value, unit=unit)
            log.debug(f"Neuer Wert {encoded_value} in Register {address} geschrieben.")

    def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> list:
        builder = pymodbus.payload.BinaryPayloadBuilder(
                byteorder=pymodbus.constants.Endian.Big,
                wordorder=pymodbus.constants.Endian.Little
            )
        encode_methods = {
            ModbusDataType.UINT_32: builder.add_32bit_uint,
            ModbusDataType.INT_32: builder.add_32bit_int,
            ModbusDataType.UINT_16: builder.add_16bit_uint,
            ModbusDataType.INT_16: builder.add_16bit_int,
            ModbusDataType.FLOAT_32: builder.add_32bit_float,
        }

        if data_type == ModbusDataType.FLOAT_32:
            encode_methods[data_type](float(value))
        else:
            encode_methods[data_type](int(value))

        return builder.to_registers()

    def _read_firmware_version(self, unit: int) -> Optional[str]:
        if self._cached_firmware is not None:
            return self._cached_firmware

        try:
            address = 43  # 40044 - 40001 = 43
            length = 8
            result = self.__tcp_client.client.read_holding_registers(address=address, count=length, unit=unit)
            if result.isError():
                log.warning(f"Fehler beim Lesen der Firmware-Version von Unit {unit}")
                return None

            from pymodbus.payload import BinaryPayloadDecoder
            decoder = BinaryPayloadDecoder.fromRegisters(
                result.registers, byteorder=Endian.Big, wordorder=Endian.Big
            )
            firmware = decoder.decode_string(length * 2).decode('ascii').strip('\x00')
            self._cached_firmware = firmware
            return firmware
        except Exception as e:
            log.warning(f"Fehler beim Lesen der Firmware: {e}")
            return None

    @staticmethod
    def _firmware_older_than(current: str, compare_to: str) -> bool:
        try:
            def to_tuple(version_str):
                return tuple(map(int, version_str.strip().split(".")))
            return to_tuple(current) < to_tuple(compare_to)
        except Exception as e:
            log.warning(f"Fehler beim Vergleichen der Firmware-Versionen: {e}")
            return False


component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup)
Firmware wird nur einmal gelesen dann im Cache für die Verbindung , ansonsten habe ich seine Firmware Abfrage eingebaut . Kann es nur nicht live testen da ich unterwegs bin . Jetzt sollte nur noch eine Verbindung aufgebaut werden
Basti
Beiträge: 106
Registriert: Di Feb 21, 2023 3:28 pm
Has thanked: 1 time
Been thanked: 12 times

Re: SolarEdge Speichersteuerung

Beitrag von Basti »

Was du aber bedenken musst ist, wenn einer mehrere Wechselrichter hat mir Batterie dann sind es keine 5000 mehr sondern 10000 Watt discharge
ChristophR
Beiträge: 984
Registriert: So Okt 30, 2022 8:07 am
Has thanked: 28 times
Been thanked: 67 times

Re: SolarEdge Speichersteuerung

Beitrag von ChristophR »

Basti hat geschrieben: Sa Mär 22, 2025 7:39 pm Was du aber bedenken musst ist, wenn einer mehrere Wechselrichter hat mir Batterie dann sind es keine 5000 mehr sondern 10000 Watt discharge
Die Abfrage läuft aus dem Speichermodul heraus, daher spricht es nur den Wechselrichter an, an dem der jeweilige Speicher hängt.
Im Datenblatt von SolarEdge steht als max. Wert für das Register 5000, die anderen 5000 müssten dann doch in dem anderen WR stehen, oder?

Allerdings schreiben wir im Steuerungsfall den Hausverbrauch als DischargeLimit dann ggf. in beide WR, so dass dann der doppelte Hausverbrauch aus den Speichern kommen könnte.

Gibt wohl noch einiges zu beachten...
openWB Series 2 Standard+, SW-Version 2
SolarEdge SE10K-RWS, BYD LVS 8, 16,8 kWp.
CUPRA Born
ChristophR
Beiträge: 984
Registriert: So Okt 30, 2022 8:07 am
Has thanked: 28 times
Been thanked: 67 times

Re: SolarEdge Speichersteuerung

Beitrag von ChristophR »

Basti hat geschrieben: Sa Mär 22, 2025 7:38 pm

Code: Alles auswählen

#!/usr/bin/env python3
import logging
from typing import Dict, Union, Optional

from pymodbus.constants import Endian

from control import data
from dataclass_utils import dataclass_from_dict
from modules.common import modbus
from modules.common.abstract_device import AbstractBat
from modules.common.component_state import BatState
from modules.common.component_type import ComponentDescriptor
from modules.common.fault_state import ComponentInfo, FaultState
from modules.common.modbus import ModbusDataType
from modules.common.simcount import SimCounter
from modules.common.store import get_bat_value_store
from modules.devices.solaredge.solaredge.config import SolaredgeBatSetup
import pymodbus

log = logging.getLogger(__name__)

FLOAT32_UNSUPPORTED = -0xffffff00000000000000000000000000


class SolaredgeBat(AbstractBat):
    # Define all possible registers with their data types
    REGISTERS = {
        "Battery1StateOfEnergy": (0xf584, ModbusDataType.FLOAT_32,),  # Dezimal 62852
        "Battery1InstantaneousPower": (0xf574, ModbusDataType.FLOAT_32,),  # Dezimal 62836
        "StorageControlMode": (0xe004, ModbusDataType.UINT_16,),
        "StorageChargeDischargeDefaultMode": (0xe00a, ModbusDataType.UINT_16,),
        "RemoteControlCommandMode": (0xe00d, ModbusDataType.UINT_16,),
        "RemoteControlCommandDischargeLimit": (0xe010, ModbusDataType.FLOAT_32,),
    }

    def __init__(self,
                 device_id: int,
                 component_config: Union[Dict, SolaredgeBatSetup],
                 tcp_client: modbus.ModbusTcpClient_) -> None:
        self.__device_id = device_id
        self.component_config = dataclass_from_dict(SolaredgeBatSetup, component_config)
        self.__tcp_client = tcp_client
        self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher")
        self.store = get_bat_value_store(self.component_config.id)
        self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
        self.last_mode = 'undefined'
        self._cached_firmware: Optional[str] = None

    def update(self) -> None:
        self.store.set(self.read_state())

    def read_state(self) -> BatState:
        unit = self.component_config.configuration.modbus_id

        registers_to_read = [
            "Battery1InstantaneousPower",
            "Battery1StateOfEnergy",
        ]
        values = self._read_registers(registers_to_read, unit)

        if values["Battery1InstantaneousPower"] == FLOAT32_UNSUPPORTED:
            values["Battery1InstantaneousPower"] = 0

        imported, exported = self.sim_counter.sim_count(values["Battery1InstantaneousPower"])

        bat_state = BatState(
            power=values["Battery1InstantaneousPower"],
            soc=values["Battery1StateOfEnergy"],
            imported=imported,
            exported=exported
        )
        log.debug(f"Bat {self.__tcp_client.address}: {bat_state}")
        return bat_state

    def set_power_limit(self, power_limit: Optional[int]) -> None:
        unit = self.component_config.configuration.modbus_id
        PowerLimitMode = data.data.bat_all_data.data.config.power_limit_mode

        if PowerLimitMode == 'no_limit':
            return

        if power_limit is None:
            if self.last_mode is not None:
                log.debug("Keine Speichersteuerung gefordert, Steuerung deaktivieren.")
                firmware = self._read_firmware_version(unit)
                if firmware and self._cached_firmware is None:
                    log.info(f"SolarEdge Firmware-Version (Unit {unit}): {firmware}")
                elif firmware is None:
                    log.warning("Firmware konnte nicht gelesen werden, nehme Standardwert für ControlMode = 2.")

                # Default Mode: Time of Use (2), bei alter Firmware: Max. Eigenverbrauch (7)
                if firmware and self._firmware_older_than(firmware, "4.20.36"):
                    control_mode = 7
                    log.info("Firmware < 4.20.36 erkannt – setze StorageControlMode = 7 (Max. Eigenverbrauch)")
                else:
                    control_mode = 2

                values_to_write = {
                    "RemoteControlCommandDischargeLimit": 5000,
                    "StorageChargeDischargeDefaultMode": 0,
                    "RemoteControlCommandMode": 0,
                    "StorageControlMode": control_mode,
                }
                self._write_registers(values_to_write, unit)
                self.last_mode = None
            else:
                return

        elif power_limit >= 0 and self.last_mode != 'stop':
            log.debug("Speichersteuerung aktivieren. Speicher-Entladung sperren.")
            values_to_write = {
                "StorageControlMode": 4,
                "StorageChargeDischargeDefaultMode": 1,
                "RemoteControlCommandMode": 1,
            }
            self._write_registers(values_to_write, unit)
            self.last_mode = 'stop'

    def _read_registers(self, register_names: list, unit: int) -> Dict[str, Union[int, float]]:
        values = {}
        for key in register_names:
            address, data_type = self.REGISTERS[key]
            values[key] = self.__tcp_client.read_holding_registers(
                address, data_type, wordorder=Endian.Little, unit=unit
            )
        log.debug(f"Bat raw values {self.__tcp_client.address}: {values}")
        return values

    def _write_registers(self, values_to_write: Dict[str, Union[int, float]], unit: int) -> None:
        for key, value in values_to_write.items():
            address, data_type = self.REGISTERS[key]
            encoded_value = self._encode_value(value, data_type)
            self.__tcp_client.write_registers(address, encoded_value, unit=unit)
            log.debug(f"Neuer Wert {encoded_value} in Register {address} geschrieben.")

    def _encode_value(self, value: Union[int, float], data_type: ModbusDataType) -> list:
        builder = pymodbus.payload.BinaryPayloadBuilder(
                byteorder=pymodbus.constants.Endian.Big,
                wordorder=pymodbus.constants.Endian.Little
            )
        encode_methods = {
            ModbusDataType.UINT_32: builder.add_32bit_uint,
            ModbusDataType.INT_32: builder.add_32bit_int,
            ModbusDataType.UINT_16: builder.add_16bit_uint,
            ModbusDataType.INT_16: builder.add_16bit_int,
            ModbusDataType.FLOAT_32: builder.add_32bit_float,
        }

        if data_type == ModbusDataType.FLOAT_32:
            encode_methods[data_type](float(value))
        else:
            encode_methods[data_type](int(value))

        return builder.to_registers()

    def _read_firmware_version(self, unit: int) -> Optional[str]:
        if self._cached_firmware is not None:
            return self._cached_firmware

        try:
            address = 43  # 40044 - 40001 = 43
            length = 8
            result = self.__tcp_client.client.read_holding_registers(address=address, count=length, unit=unit)
            if result.isError():
                log.warning(f"Fehler beim Lesen der Firmware-Version von Unit {unit}")
                return None

            from pymodbus.payload import BinaryPayloadDecoder
            decoder = BinaryPayloadDecoder.fromRegisters(
                result.registers, byteorder=Endian.Big, wordorder=Endian.Big
            )
            firmware = decoder.decode_string(length * 2).decode('ascii').strip('\x00')
            self._cached_firmware = firmware
            return firmware
        except Exception as e:
            log.warning(f"Fehler beim Lesen der Firmware: {e}")
            return None

    @staticmethod
    def _firmware_older_than(current: str, compare_to: str) -> bool:
        try:
            def to_tuple(version_str):
                return tuple(map(int, version_str.strip().split(".")))
            return to_tuple(current) < to_tuple(compare_to)
        except Exception as e:
            log.warning(f"Fehler beim Vergleichen der Firmware-Versionen: {e}")
            return False


component_descriptor = ComponentDescriptor(configuration_factory=SolaredgeBatSetup)
Firmware wird nur einmal gelesen dann im Cache für die Verbindung , ansonsten habe ich seine Firmware Abfrage eingebaut . Kann es nur nicht live testen da ich unterwegs bin . Jetzt sollte nur noch eine Verbindung aufgebaut werden
Ich scheitere weiter kläglich. :(

Hier kommt der Fehler:
Fehler beim Lesen der Firmware: 'ModbusTcpClient_' object has no attribute 'client'

Daher habe ich versucht, .client hier zu entfernen:
result = self.__tcp_client.client.read_holding_registers(address=address, count=length, unit=unit)
Dann kam der beschriebene Fehler, dass er type als Parameter haben will.

Der Aufruf verweist ja irgendwie auf die Datei common/modbus.py.
Da gibt es String nicht als Datatype.
Das habe ich auch mal versucht hinzuzufügen, dann kam bei mir aber nur:
b '0'
als Ergebnis zurück.

Ich weiß aber nicht, ob eine Änderung in der modbus.py openWB überhaupt so lustig findet, das ist ja eine zentrale Anlaufstelle.
openWB Series 2 Standard+, SW-Version 2
SolarEdge SE10K-RWS, BYD LVS 8, 16,8 kWp.
CUPRA Born
Basti
Beiträge: 106
Registriert: Di Feb 21, 2023 3:28 pm
Has thanked: 1 time
Been thanked: 12 times

Re: SolarEdge Speichersteuerung

Beitrag von Basti »

Die Ausgabe kann der modbus Client im Moment nicht .

Ja wir müssten die modbus.py ändern bzw. Erweitern mit z.b.

Code: Alles auswählen

from pymodbus.payload import BinaryPayloadDecoder

    def read_string(self, address: int, length: int, unit: int,
                    byteorder: Endian = Endian.Big,
                    wordorder: Endian = Endian.Big) -> Optional[str]:
        """
        Liest einen ASCII-String aus `length` Registern (2 Bytes pro Register) und dekodiert ihn.
        """
        if not self.is_socket_open():
            self.connect()
        try:
            response = self._delegate.read_holding_registers(address=address, count=length, unit=unit)
            if response.isError():
                raise Exception(f"Modbus-Fehler beim Lesen eines Strings von Adresse {address}")

            decoder = BinaryPayloadDecoder.fromRegisters(response.registers, byteorder, wordorder)
            raw_string = decoder.decode_string(length * 2)  # 2 Bytes pro Register
            return raw_string.decode('ascii').strip('\x00')
        except Exception as e:
            log.warning(f"Fehler beim Lesen eines Strings von Adresse {address}: {e}")
            return None
Dan könnten wir über die bat abfragen ohne tricks :

Code: Alles auswählen

def _read_firmware_version(self, unit: int) -> Optional[str]:
    if self._cached_firmware is not None:
        return self._cached_firmware

    address = 43  # 40044 - 40001 = 43
    length = 8    # 8 Register = 16 Zeichen (ASCII)

    firmware = self.__tcp_client.read_string(address=address, length=length, unit=unit)
    if firmware:
        log.info(f"Firmware-Version gelesen: {firmware}")
        self._cached_firmware = firmware
    else:
        log.warning(f"Fehler beim Lesen der Firmware-Version von Unit {unit}")
    return firmware
Zumindest wäre das ein Ansatz in die Richtung .
ChristophR
Beiträge: 984
Registriert: So Okt 30, 2022 8:07 am
Has thanked: 28 times
Been thanked: 67 times

Re: SolarEdge Speichersteuerung

Beitrag von ChristophR »

Ich dachte, man könnte ggf. die Datatypes erweitern, damit es bei der vorhandenen Struktur bleibt?

Code: Alles auswählen

class ModbusDataType(Enum):
    UINT_8 = 8, "decode_8bit_uint"
    UINT_16 = 16, "decode_16bit_uint"
    UINT_32 = 32, "decode_32bit_uint"
    UINT_64 = 64, "decode_64bit_uint"
    INT_8 = 8, "decode_8bit_int"
    INT_16 = 16, "decode_16bit_int"
    INT_32 = 32, "decode_32bit_int"
    INT_64 = 64, "decode_64bit_int"
    FLOAT_16 = 16, "decode_16bit_float"
    FLOAT_32 = 32, "decode_32bit_float"
    FLOAT_64 = 64, "decode_64bit_float"
...
STRING_16 = 16, "decode_string(16)"
...
oder so ähnlich?

In der bat.py brauchen wir dann vermutlich auch noch passende Einträge unten beim encode und decode.

Das übersteigt aber etwas meine Copy und Paste Fähigkeiten. :P

Ich probiere Deine Lösung aber erstmal aus.

P.S: Deine Lösung funzt schonmal !!! :mrgreen:
openWB Series 2 Standard+, SW-Version 2
SolarEdge SE10K-RWS, BYD LVS 8, 16,8 kWp.
CUPRA Born
ChristophR
Beiträge: 984
Registriert: So Okt 30, 2022 8:07 am
Has thanked: 28 times
Been thanked: 67 times

Re: SolarEdge Speichersteuerung

Beitrag von ChristophR »

Ich brauche mal Rückmeldungen von Euch zu der (ich nenne es) SoC-Reserve.
SolarEdge entlädt den Speicher immer nur bis zu einem bestimmten SoC-Wert, bei dem er dann im Standby bleibt.
Bei mir sind das 10% mit einem BYD Akku.
Bei snoerenberg, mit 2x LG RESU Akkus sind es wohl 5%.

Nun hatte ich noch die Idee, dass wir den Hersteller der Batterie (Nicht den Typ) auslesen und anhand dessen die SoC-Reserve setzen, dann brauchen wir das nicht in die Konfiguration aufnehmen.

Daher meine Umfrage:
Sind es bei BYD immer 10%? Der Hersteller String lautet bei mir 48V_BYD.
Sind es bei LG Speichern immer 5% und wie lautet der Hersteller-String?
Wie ist das bei der Home Battery von SolarEdge, und wie lautet der Hersteller-String?

Die Hersteller-Strings stehen in der mySolarEdge App unter dem Batterie-Symbol und dort unter Informationen zur Batterie.

Ich sammle also mal:
48V_BYD = 10%
openWB Series 2 Standard+, SW-Version 2
SolarEdge SE10K-RWS, BYD LVS 8, 16,8 kWp.
CUPRA Born
knotzchef
Beiträge: 84
Registriert: Mo Feb 05, 2024 3:49 pm
Has thanked: 1 time
Been thanked: 1 time

Re: SolarEdge Speichersteuerung

Beitrag von knotzchef »

ChristophR hat geschrieben: So Mär 30, 2025 7:45 am Ich brauche mal Rückmeldungen von Euch zu der (ich nenne es) SoC-Reserve.
SolarEdge entlädt den Speicher immer nur bis zu einem bestimmten SoC-Wert, bei dem er dann im Standby bleibt.
Bei mir sind das 10% mit einem BYD Akku.
Bei snoerenberg, mit 2x LG RESU Akkus sind es wohl 5%.

Nun hatte ich noch die Idee, dass wir den Hersteller der Batterie (Nicht den Typ) auslesen und anhand dessen die SoC-Reserve setzen, dann brauchen wir das nicht in die Konfiguration aufnehmen.

Daher meine Umfrage:
Sind es bei BYD immer 10%? Der Hersteller String lautet bei mir 48V_BYD.
Sind es bei LG Speichern immer 5% und wie lautet der Hersteller-String?
Wie ist das bei der Home Battery von SolarEdge, und wie lautet der Hersteller-String?

Die Hersteller-Strings stehen in der mySolarEdge App unter dem Batterie-Symbol und dort unter Informationen zur Batterie.

Ich sammle also mal:
48V_BYD = 10%
Ich habe die Solaredge Homebattery die wird laut App und ModBusPlugin (solaredge_b1_state_of_energy) HA auf 0% gezogen, wobei voll je nach SOH bei mir zwischen 98 + 99% schwankt.. meine Homebattery hat auch laut Diagnose schon ca 100Wh verloren... aber sie wird bis auf 0% gezogen
Screenshot 2025-03-30 095134.png
Screenshot 2025-03-30 095134.png (23.98 KiB) 197 mal betrachtet
knotzchef:
PV: 19.12 kWp, 1x SE10SEK + 13,8 SE Homebattery, 1x SE10SEK, 1x Hoymiles HMS-800W-2T, ACThor9s + 1x 3kW Heizstab, OpenWB Series 2 standard
Fahrzeug: VW ID3 Pro 11kW Lader VW OS. 3.7
Basti
Beiträge: 106
Registriert: Di Feb 21, 2023 3:28 pm
Has thanked: 1 time
Been thanked: 12 times

Re: SolarEdge Speichersteuerung

Beitrag von Basti »

Dann hast du aber keine Reserve eingestellt . Normal wird die 48 Batterie nicht auf null gezogen .
Antworten