Fox ESS Hybrid- /AC-Wechselrichter Modbus Anbindung

Das Dilema wird sein dass wir beide nicht tief genug in der Materie sind als dass wir uns selbst etwas stricken können. Wenn es fertige Lösungen gibt dann wohl für Homeassistant. Wie schnell man sowas für IPS umstricken könnte - ebenfalls keine Ahnung. Vielleicht ist es am Ende auch einfacher HA in IPS einzubinden.

Aber:
Wenn ich aus IPS den H3 Steuern kann (über Cloud oder Modbus) dann kann ich mir in IPS auch (hoffentlich) etwas zusammenklicken was funktionieren könnte. Module für Tibber und auch für eine Solarprognose gibt es ja schon, somit nur eine Frage wie man die Auswerten kann. Relevant ist es eigentlich nur im Winter, wo mein Speicher auf keinen Fall relevante Füllstände erreicht. Im Sommer ist er dank PV eigentlich abends immer 100% gewesen - somit wäre eine Kombination mit PV-Prognose für mich eher marginal).

Die Fox Ess Hybridwechselrichter sind nur teilweise mit den IPS-Modbusmodul kompatibel. Einzelne Register lassen sich problemlos auslesen, und einige Register können auch beschrieben werden.
Die Ladefenster gehören leider nicht dazu. Deren Werte können nur per Script geändert werden, weil dabei immer alle 6 zusammenhängenden Register mit Werten versehen werden müssen.
Wenn man das aber erst einmal herausgefunden hat, ist der Rest einfach:


$MachineAdress = "2E"; //Modbus-ID
$Functioncode = "10";
$StartRegister = "A029";
$NumberRegisters = "0006";
$LengthData = "0C";
$Time1Flag = "0001"; //Zeitfenster1 an/aus
$Time1Start = "0002"; //Ladebeginn StundeMinute
$Time1End = "0207"; //Ladeende StundeMinute
$Time2Flag = "0000";
$Time2Start = "0000";
$Time2End = "0000";
$Data = $Time1Flag .$Time1Start.$Time1End.$Time2Flag .$Time2Start.$Time2End;
$ConvertedValue =  $MachineAdress.$Functioncode.$StartRegister.$NumberRegisters.$LengthData.$Data;
$pruefsumme = crc16_modbus($ConvertedValue);
$Returnstr = FinalizeReturnStr($ConvertedValue . $pruefsumme);

SPRT_SendText(ID-Comport, $Returnstr);

function FinalizeReturnStr($Input) {
    $ReturnStr = "";
    $Input = strtoupper($Input);
    $tmpArray = str_split ($Input, 2);
    foreach($tmpArray as $result) {
        $ReturnStr .= chr(hexdec($result));
    } 
    return$ReturnStr;
}

function ConvertValue2Hex($value) {
    $ar = unpack("c*", pack("f", $value));
    $ReturnStr = "";
    $ReturnStr .= byte2hex($ar[4]);
    $ReturnStr .= byte2hex($ar[3]);
    $ReturnStr .= byte2hex($ar[2]);
    $ReturnStr .= byte2hex($ar[1]);
    return $ReturnStr;
}

function crc16_modbus($msg) {
    $data = pack('H*',$msg);
    $crc = 0xFFFF;
    for ($i = 0; $i < strlen($data); $i++)   {
        $crc ^=ord($data[$i]);
        for ($j = 8; $j !=0; $j--)  {
            if (($crc & 0x0001) !=0)    {
                $crc >>= 1;
                $crc ^= 0xA001;
            }
            else $crc >>= 1;
        }
    }   
    $crc_semi_inverted = sprintf('%04X', $crc);
    $crc_modbus = substr($crc_semi_inverted,2,2).substr($crc_semi_inverted,0,2);
    return $crc_modbus;
}

function byte2hex($value){
    $h = dechex(($value >> 4) & 0x0F);
    $l = dechex($value & 0x0F);
    return "$h$l";
}

Aber der wichtigste Lifehack bei diesen Modellen ist der lange Tastendruck auf den Eingabebutton am Bedienpanel.

@robi Betrifft das nur den H1 oder geht Modbus „ForceCharge“ jetzt doch auch mit den H3/AIO Wechselrichtern?

weil ich nämlich immernoch versuche mir die Ladebefehle über die Foxcloud API zugänglich zu machen. Allerdings hat Fox da gerade alles über den Haufen geschmissen und die vielen Projekte auf Github wieder zurückgeworfen. Wenn das lokal über Modubus auch mit den H3 ginge wäre natürlich geil…

Ich habe mich an diese Doku gehalten, die scheint allgemeingültig zu sein:
https://github.com/nathanmarlor/foxess_modbus/files/11511264/Energy.Storage.Inverter.Modbus.TCP.Communication.protocols.for.FOXESS-1.pdf

Der Weg über die Cloud scheint nicht mehr zu funktionieren, diese Möglichkeit wurde vom Hersteller abgeschaltet. Ich lehne diese Cloud-Lösungen kategorisch ab, meine Daten bleiben im Haus!

Und natürlich verwende ich Modbus RTU, über einen kleinen 4 Euro USB-RS485-Wandler. Mit Modbus TCP funktionieren nur wenige Register im Lesemodus. Eigentlich schade, denn so ergibt die Ethernetschnittstelle am Inverter keinen Sinn, das Kabel hätte ich mir sparen können…

Nein, leider nicht alle Modelle. Quelle ist dieselbe die Du benutzt. Deshalb nochmal meine Nachfrage welchen Wechslerichter Du benutzt?

Ich habe zwei H1.
Wenn man am H3 weder BMS noch Ladezeiten automatisiert verändern kann, wäre das in meinen Augen ein grober Mangel. Beide Funktionen sind essentiell für die Energiewende, insbesondere natürlich im Zusammenhang mit dynamischen Stromtarifen und großen Batteriespeichern.

Volle Zustimmung. Ich hoffe da tut sich auch noch irgendwas - weil nachvollziehbar ist das was FoxEss da tut für mich nicht. Es sei denn sie wollen irgendwann wirklich alle lokalen Zugriffe abstellen.
Einziger Workaround aktuell bei H3 Usern daher die Cloud API Ansätze auf Github