<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Huawei Sun2000 &amp; ioBroker via JS script funktioniert]]></title><description><![CDATA[<p dir="auto">Die Modbus-Ansteuerung vom Huawei Sun2000 Wechselrichter ist über TCP etwas speziell, da nach öffnen des TCP-Ports noch eine Pause eingehalten werden muss, da sonst keine Daten zurück geliefert werden. Auch wird nicht jede Modbus-TCP-Anfrage mit den angeforderten Registern beantwortet. Daher funktioniert die Kommunikation über den normalen Modbus-Adapter im ioBroker nicht.</p>
<p dir="auto">Um die verfügbaren Register in den ioBroker zu bekommen hab ich ein js-script geschrieben, dass die Abfrage der Register über TCP macht und die Daten entsprechend parsed. Man braucht dafür im IOBroker nur die ScriptEngine und muss in deren Settings noch die modbus-serial hinzufügen. Danach legt das Script einen großen Satz an Objekten an und aktualisiert die regelmäßig (ca. 2x die Minute). Es werden nur Register gelesen - das Schreiben von Registern ist nicht eingebaut (und bei mir gerade auch nicht nötig). Damit die Netzwerkpakete möglichst groß sind werden die Registern in Blöcken abgefragt.</p>
<p dir="auto">Wer möchte kann das Script gerne nutzen. . Einfach IP, Batteriekonfiguration und die Modbus-IDs eintragen und ausführen. Wer es ändern möchte darf dies auch gerne tun - es freut aber sicher alle ioBroker-Nutzer wenn ihr Änderungen auch wieder veröffentlicht.</p>
<p dir="auto">Falls jemand noch eine Idee hat, wie man den Huawei File-transfer über Modbus implementieren kann (mit deren speziellem function-code 0x41), würde ich mich freuen. Der fehlt leider damit die Optimierer ihre Echtzeit-Daten in den IOBroker liefern können...</p>
<p dir="auto">der Kachel</p>
<pre><code>// License: Beerware! Do what ever you like with this, but I'm not liable for anything that you do with it.
// If you like this code, feel free to buy me a beer ...
// Have fun with it! der Kachel
var ModbusRTU = require("modbus-serial");
var client = new ModbusRTU();

var modbusErrorMessages = [
    "Unknown error",
    "Illegal function (device does not support this read/write function)",
    "Illegal data address (register not supported by device)",
    "Illegal data value (value cannot be written to this register)",
    "Slave device failure (device reports internal error)",
    "Acknowledge (requested data will be available later)",
    "Slave device busy (retry request again later)"
];

// open connection to a tcp line
client.setTimeout(10000);

// Enter your inverter modbus IP and port here:
client.connectTCP("$$$ADD.YOUR.IP.HERE$$$", { port: 502 });
// Enter the Modbus-IDs of your Sun2000 inverters here:
const ModBusIDs = [16, 1];
// On which Modbus-ID can we reach the power meter? (via Sun2000!)
const PowerMeterID = 0;
// Enter your battery stack setup. 2 dimensional array. 
// e.g. [[3, 2], [3, 0]] means:
// First inverter has two battery stacks with 3 + 2 battery modules
// while second inverter has only one battery stack with 3 battery modules
const BatteryUnits = [[3, 0], [3, 0]];

// These register spaces need to be read:
const RegisterSpacesToReadContinuously = [[30000, 81], [37100, 114], [32000, 116], [37000, 68],  [37700, 100], [37800, 100], [38200, 100], [38300, 100], [38400, 100], [35300, 40]];
var RegisterSpacesToReadContinuouslyPtr = 0;

var GlobalDataBuffer = new Array(2);
for(var i=0; i&lt;ModBusIDs.length; i++) {
    GlobalDataBuffer[i] = new Array(50000); // not optimized....
}

// ---------------------------------------------------------------
// Some helper functions:
function readUnsignedInt16(array) {
    var value = array[0];    
    return value;
}

function readUnsignedInt32(array) {
    var value = array[0] * 256 * 256 + array[1];    
    return value;
}

function readSignedInt16(array) {
    var value = 0;
    if (array[0] &gt; 32767)
        value = array[0] - 65535; 
    else
        value = array[0];

    return value;
}
function readSignedInt32(array) {
    var value = 0;
    for (var i = 0; i &lt; 2; i++) {
        value = (value &lt;&lt; 16) | array[i];
    }
    return value;
}
function getU16(dataarray, index) {
    var value = readUnsignedInt16(dataarray.slice(index, index+1));
    return value;
}

function getU32(dataarray, index) {
    var value = readUnsignedInt32(dataarray.slice(index, index+2));
    return value;
}

function getI16(dataarray, index) {
    var value = readSignedInt16(dataarray.slice(index, index+1));
    return value;
}

function getI32(dataarray, index) {
    var value = readSignedInt32(dataarray.slice(index, index+2));
    return value;
}

function getString(dataarray, index, length) {
    var shortarray = dataarray.slice(index, index+length);
    var bytearray = [];
    for(var i = 0; i &lt; length; i++) {
        bytearray.push(dataarray[index+i] &gt;&gt; 8);
        bytearray.push(dataarray[index+i] &amp; 0xff);
    }       
    var value =  String.fromCharCode.apply(null, bytearray);    
    return value;
}

function getZeroTerminatedString(dataarray, index, length) {
    var shortarray = dataarray.slice(index, index+length);
    var bytearray = [];
    for(var i = 0; i &lt; length; i++) {
        bytearray.push(dataarray[index+i] &gt;&gt; 8);
        bytearray.push(dataarray[index+i] &amp; 0xff);
    }       
    var value =  String.fromCharCode.apply(null, bytearray);    
    var value2 = new String(value).trim();
    return value2;
}

function forcesetState(objectname, value, options) {
    if(!existsState(objectname)) {
        createState(objectname, value, options);        
    }
    else {
        setState(objectname, value);
    }
}  
// ---------------------------------------------------------------
// Functions to map registers into ioBreaker objects:
function processOptimizers(id) {
    forcesetState("Solarpower.Huawei.Inverter." + id + ".OptimizerTotalNumber",     getU16(GlobalDataBuffer[id-1], 35200), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".OptimizerOnlineNumber",    getU16(GlobalDataBuffer[id-1], 35201), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".OptimizerFeatureData",     getU16(GlobalDataBuffer[id-1], 35202), {name: "", unit: ""});
}

function processInverterPowerAdjustments(id) {
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ActiveAdjustementMode",     getU16(GlobalDataBuffer[id-1], 35300), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ActiveAdjustementValue",    getU32(GlobalDataBuffer[id-1], 35301), {name: "", unit: ""}); // Note: This might be an error in the manual. It says register 35302 with quantity 2, but on 35303 is already the next value.
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ActiveAdjustementCommand",  getU16(GlobalDataBuffer[id-1], 35303), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementMode",   getU16(GlobalDataBuffer[id-1], 35304), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementValue",  getU32(GlobalDataBuffer[id-1], 35305), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementCommand",getU16(GlobalDataBuffer[id-1], 35307), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActiveAdjustement.PowerMeterActivePower",     getI32(GlobalDataBuffer[id-1], 35313), {name: "", unit: ""});
}

function processBattery(id) {
    // Battery registers 1-15 (Stack 1 related)
    if(BatteryUnits[id-1][0] &gt; 0) {
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.RunningStatus",          getU16(GlobalDataBuffer[id-1], 37000), {name: "", unit: ""});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.ChargeAndDischargePower",getI32(GlobalDataBuffer[id-1], 37001), {name: "Charge and Discharge Power", unit: "W"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.BusVoltage",             getU16(GlobalDataBuffer[id-1], 37003) / 10, {name: "Busvoltage", unit: "V"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.BatterySOC",             getU16(GlobalDataBuffer[id-1], 37004) / 10, {name: "Battery SOC", unit: "%"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.WorkingMode",            getU16(GlobalDataBuffer[id-1], 37006), {name: "Working Mode", unit: ""});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.RatedChargePower",       getU32(GlobalDataBuffer[id-1], 37007), {name: "", unit: "W"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.RatedDischargePower",    getU32(GlobalDataBuffer[id-1], 37009), {name: "", unit: "W"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.FaultID",                getU16(GlobalDataBuffer[id-1], 37014), {name: "", unit: ""});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.CurrentDayChargeCapacity",    getU32(GlobalDataBuffer[id-1], 37015) / 100, {name: "", unit: "kWh"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.CurrentDayDischargeCapacity", getU32(GlobalDataBuffer[id-1], 37017) / 100, {name: "", unit: "kWh"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.BusCurrent",             getI16(GlobalDataBuffer[id-1], 37021) / 10, {name: "Buscurrent", unit: "A"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.BatteryTemperature",     getI16(GlobalDataBuffer[id-1], 37022) / 10, {name: "Battery Temperatue", unit: "°C"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.RemainingChargeDischargeTime", getU16(GlobalDataBuffer[id-1], 37025), {name: "", unit: "mins"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.DCDCversion",            getZeroTerminatedString(GlobalDataBuffer[id-1], 37026, 10), {name: "", unit: ""});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.BMSversion",             getZeroTerminatedString(GlobalDataBuffer[id-1], 37036, 10), {name: "", unit: ""});
    }
    // Battery registers 16+17 (Storage-related)
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.MaximumChargePower",                getU32(GlobalDataBuffer[id-1], 37046), {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.MaximumDischargePower",             getU32(GlobalDataBuffer[id-1], 37048), {name: "", unit: "W"});

    // Battery register 18-20 (Stack 1 related)
    if(BatteryUnits[id-1][0] &gt; 0) {
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.SN",                         getZeroTerminatedString(GlobalDataBuffer[id-1], 37052, 10), {name: "Serialnumber", unit: ""});       
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.TotalCharge",                getU32(GlobalDataBuffer[id-1], 37066) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.TotalDischarge",             getU32(GlobalDataBuffer[id-1], 37068) / 100, {name: "", unit: "kWh"});
    }
    // Battery register 21-31 (Stack 2 related)
    if(BatteryUnits[id-1][1] &gt; 0) {
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.SN",                     getZeroTerminatedString(GlobalDataBuffer[id-1], 37700, 10), {name: "Serialnumber", unit: ""});        
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.BatterySOC",             getU16(GlobalDataBuffer[id-1], 37738) / 10, {name: "", unit: "%"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.RunningStatus",          getU16(GlobalDataBuffer[id-1], 37741), {name: "", unit: ""});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.ChargeAndDischargePower",getI32(GlobalDataBuffer[id-1], 37743), {name: "", unit: "W"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.CurrentDayChargeCapacity",    getU32(GlobalDataBuffer[id-1], 37746) / 100, {name: "", unit: "kWh"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.CurrentDayDischargeCapacity", getU32(GlobalDataBuffer[id-1], 37748) / 100, {name: "", unit: "kWh"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.BusVoltage",             getU16(GlobalDataBuffer[id-1], 37750) / 10, {name: "", unit: "V"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.BusCurrent",             getI16(GlobalDataBuffer[id-1], 37751) / 10, {name: "", unit: "A"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.BatteryTemperature",     getI16(GlobalDataBuffer[id-1], 37752) / 10, {name: "", unit: "°C"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.TotalCharge",                 getU32(GlobalDataBuffer[id-1], 37753) / 100, {name: "", unit: "kWh"});
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.TotalDischarge",              getU32(GlobalDataBuffer[id-1], 37755) / 100, {name: "", unit: "kWh"});
    }
    // Battery register 32-41 (Storage related)
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.RatedCapacity", getU32(GlobalDataBuffer[id-1], 37758) / 1, {name: "", unit: "Wh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.SOC", getU16(GlobalDataBuffer[id-1], 37760) / 10, {name: "", unit: "%"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.RunningStatus", getU16(GlobalDataBuffer[id-1], 37762) / 1, {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.BusVoltage", getU16(GlobalDataBuffer[id-1], 37763) / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.BusCurrent", getI16(GlobalDataBuffer[id-1], 37764) / 10, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.ChargeAndDischargePower", getI32(GlobalDataBuffer[id-1], 37765) / 1, {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.TotalCharge", getU32(GlobalDataBuffer[id-1], 37780) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.TotalDischarge", getU32(GlobalDataBuffer[id-1], 37782) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.CurrentDayChargeCapacity", getU32(GlobalDataBuffer[id-1], 37784) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Battery.CurrentDayDischargeCapacity", getU32(GlobalDataBuffer[id-1], 37786) / 100, {name: "Current DayDiscarge ", unit: "kWh"});

    // Battery registers 42+43 (Battery stack related)   
    if(BatteryUnits[id-1][1] &gt; 0) {
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.2.SoftwareVersion",    getZeroTerminatedString(GlobalDataBuffer[id-1], 37814, 8), {name: "Softwareversion", unit: ""});
    }
    if(BatteryUnits[id-1][0] &gt; 0) {
        forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack.1.SoftwareVersion",    getZeroTerminatedString(GlobalDataBuffer[id-1], 37799, 8), {name: "Softwareversion", unit: ""});
    }

    // Registers 44 to 98: (Battery pack related)
    for(var i = 1; i &lt;= 2; i++){        
        if(BatteryUnits[id-1][i-1] &gt;= 0) {            
            for(var j = 1; j &lt;= BatteryUnits[id-1][i-1]; j++) {
                //[[38200, 38242, 38284] [38326, 38368, 38410]]; (+42 for each battery pack, +126 for each stack)
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".SN",                getZeroTerminatedString(GlobalDataBuffer[id-1], 38200+(i-1)*126+(j-1)*42, 6), {name: "", unit: ""});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".FirmwareVersion",   getZeroTerminatedString(GlobalDataBuffer[id-1], 38210+(i-1)*126+(j-1)*42, 8), {name: "", unit: ""});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".WorkingStatus",     getU16(GlobalDataBuffer[id-1], 38228+(i-1)*126+(j-1)*42), {name: "", unit: ""});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".BatterySOC",        getU16(GlobalDataBuffer[id-1], 38229+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "%"});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".ChargeAndDischargePower", getI32(GlobalDataBuffer[id-1], 38233+(i-1)*126+(j-1)*42) / 1000, {name: "", unit: "kW"});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".Voltage",           getU16(GlobalDataBuffer[id-1], 38235+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "V"});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".Current",           getI16(GlobalDataBuffer[id-1], 38236+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "A"});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".TotalCharge",       getU32(GlobalDataBuffer[id-1], 38238+(i-1)*126+(j-1)*42) / 100, {name: "", unit: "kWh"});
                forcesetState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".TotalDischarge",    getU32(GlobalDataBuffer[id-1], 38240+(i-1)*126+(j-1)*42) / 100, {name: "", unit: "kWh"});

                // [[38452, 38454, 38456][38458, 38460, 38462]] ( +2 for each pack, +6 for each stack)
                createState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".MaxTemperature", getI16(GlobalDataBuffer[id-1], 38452+(i-1)*6+(j-1)*2) / 10, {name: "", unit: "°C"});
                createState("Solarpower.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".MinTemperature", getI16(GlobalDataBuffer[id-1], 38453+(i-1)*6+(j-1)*2) / 10, {name: "", unit: "°C"});
            }
        }        
    }

    // Battery registers 110-141 are not supported by this script yet!
}

function ProcessPowerMeterStatus() {       
    forcesetState("Solarpower.Huawei.Meter.Status",          getU16(GlobalDataBuffer[PowerMeterID], 37100), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Meter.VoltageL1",        getI32(GlobalDataBuffer[PowerMeterID], 37101)  / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.VoltageL2",        getI32(GlobalDataBuffer[PowerMeterID], 37103)  / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.VoltageL3",        getI32(GlobalDataBuffer[PowerMeterID], 37105)  / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.CurrentL1",        getI32(GlobalDataBuffer[PowerMeterID], 37107)  / 100, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Meter.CurrentL2",        getI32(GlobalDataBuffer[PowerMeterID], 37109)  / 100, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Meter.CurrentL3",        getI32(GlobalDataBuffer[PowerMeterID], 37111) / 100, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Meter.ActivePower",     getI32(GlobalDataBuffer[PowerMeterID], 37113) / 1, {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Meter.ReactivePower",   getI32(GlobalDataBuffer[PowerMeterID], 37115) / 1, {name: "", unit: "Var"});
    forcesetState("Solarpower.Huawei.Meter.PowerFactor",     getI16(GlobalDataBuffer[PowerMeterID], 37117) / 1000, {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Meter.GridFrequency",   getI16(GlobalDataBuffer[PowerMeterID], 37118) / 100, {name: "", unit: "Hz"});
    forcesetState("Solarpower.Huawei.Meter.PositiveActiveEnergy",     getI32(GlobalDataBuffer[PowerMeterID], 37119) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Meter.ReverseActiveEnergy",      getI32(GlobalDataBuffer[PowerMeterID], 37121) / 100, {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Meter.AccumulatedReactivePower", getI32(GlobalDataBuffer[PowerMeterID], 37123) / 100, {name: "", unit: "kVarh"});
    forcesetState("Solarpower.Huawei.Meter.MeterType",       getU16(GlobalDataBuffer[PowerMeterID], 37125), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Meter.VoltageL1-L2",       getI32(GlobalDataBuffer[PowerMeterID], 37126) / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.VoltageL2-L3",       getI32(GlobalDataBuffer[PowerMeterID], 37128) / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.VoltageL3-L1",       getI32(GlobalDataBuffer[PowerMeterID], 37130) / 10, {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Meter.ActivePowerL1",    getI32(GlobalDataBuffer[PowerMeterID], 37132) / 1, {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Meter.ActivePowerL2",    getI32(GlobalDataBuffer[PowerMeterID], 37134) / 1, {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Meter.ActivePowerL3",    getI32(GlobalDataBuffer[PowerMeterID], 37136) / 1, {name: "", unit: "W"});
    forcesetState("Solarpower.Huawei.Meter.MeterModel",      getU16(GlobalDataBuffer[PowerMeterID], 37138), {name: "", unit: ""});
}

function processInverterStatus(id) {
    forcesetState("Solarpower.Huawei.Inverter." + id + ".State1", getU16(GlobalDataBuffer[id-1], 32000), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".State2", getU16(GlobalDataBuffer[id-1], 32001), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".State3", getU16(GlobalDataBuffer[id-1], 32002), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Alarm1", getU16(GlobalDataBuffer[id-1], 32008), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Alarm2", getU16(GlobalDataBuffer[id-1], 32009), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Alarm3", getU16(GlobalDataBuffer[id-1], 32010), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".String.1_Voltage",       getI16(GlobalDataBuffer[id-1], 32016) / 10  , {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".String.1_Current",       getI16(GlobalDataBuffer[id-1], 32017) / 100 , {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".String.2_Voltage",       getI16(GlobalDataBuffer[id-1], 32018) / 10  , {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".String.2_Current",       getI16(GlobalDataBuffer[id-1], 32019) / 100 , {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".InputPower",             getI32(GlobalDataBuffer[id-1], 32064) / 1000, {name: "", unit: "kW"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1-L2_Voltage",           getU16(GlobalDataBuffer[id-1], 32066) / 10  , {name: "", unit: "V"});      
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2-L3_Voltage",           getU16(GlobalDataBuffer[id-1], 32067) / 10  , {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3-L1_Voltage",           getU16(GlobalDataBuffer[id-1], 32068) / 10  , {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Voltage",            getU16(GlobalDataBuffer[id-1], 32069) / 10  , {name: "", unit: "V"});                              
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Voltage",            getU16(GlobalDataBuffer[id-1], 32070) / 10  , {name: "", unit: "V"});                                                  
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Voltage",            getU16(GlobalDataBuffer[id-1], 32071) / 10  , {name: "", unit: "V"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L1_Current",         getI32(GlobalDataBuffer[id-1], 32072) / 1000, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L2_Current",         getI32(GlobalDataBuffer[id-1], 32074) / 1000, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Grid.L3_Current",         getI32(GlobalDataBuffer[id-1], 32076) / 1000, {name: "", unit: "A"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".PeakActivePowerDay",     getI32(GlobalDataBuffer[id-1], 32078) / 1000, {name: "", unit: "kW"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ActivePower",            getI32(GlobalDataBuffer[id-1], 32080) / 1000, {name: "", unit: "kW"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ReactivePower",          getI32(GlobalDataBuffer[id-1], 32082) / 1000, {name: "", unit: "kVar"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".PowerFactor",            getI16(GlobalDataBuffer[id-1], 32084) / 1000, {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".GridFrequency",          getU16(GlobalDataBuffer[id-1], 32085) / 100 , {name: "", unit: "Hz"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Efficiency",             getU16(GlobalDataBuffer[id-1], 32086) / 100 , {name: "", unit: "%"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".InternalTemperature",    getI16(GlobalDataBuffer[id-1], 32087) / 10  , {name: "", unit: "°C"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".InsulationResistance",   getU16(GlobalDataBuffer[id-1], 32088) / 1000, {name: "", unit: "MOhm"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".DeviceStatus",              getU16(GlobalDataBuffer[id-1], 32089), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".FaultCode",                 getU16(GlobalDataBuffer[id-1], 32090), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".StartupTime",               getU16(GlobalDataBuffer[id-1], 32091), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ShutdownTime",              getU16(GlobalDataBuffer[id-1], 32093), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".AccomulatedEnergyYield",    getU16(GlobalDataBuffer[id-1], 32106), {name: "", unit: "kWh"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".DailyEnergyYield",          getU16(GlobalDataBuffer[id-1], 32114), {name: "", unit: "kWh"});
}

function ProcessDeviceInfo(id) {      
    // Note: Manual says its quantitiy is 15, but that is the number (+1) of 8bit characters
    forcesetState("Solarpower.Huawei.Inverter." + id + ".Model",  getZeroTerminatedString(GlobalDataBuffer[id-1], 30000, 8), {name: "", unit: ""}); 
    forcesetState("Solarpower.Huawei.Inverter." + id + ".SN",     getZeroTerminatedString(GlobalDataBuffer[id-1], 30015, 6), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".PN",     getZeroTerminatedString(GlobalDataBuffer[id-1], 30025, 6), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".ModelID",           getU16(GlobalDataBuffer[id-1], 30070), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".PVStrings",         getU16(GlobalDataBuffer[id-1], 30071), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MPPTrackers",       getU16(GlobalDataBuffer[id-1], 30072), {name: "", unit: ""});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MaxRatedPower",     getU32(GlobalDataBuffer[id-1], 30073) / 1000, {name: "", unit: "kW"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MaxActivePower",    getU32(GlobalDataBuffer[id-1], 30075) / 1000, {name: "", unit: "kW"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MaxApparentPower",  getU32(GlobalDataBuffer[id-1], 30077) / 1000, {name: "", unit: "kVA"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MaxReactivePowerToGrid",        getI32(GlobalDataBuffer[id-1], 30079) / 1000, {name: "", unit: "kVAr"});
    forcesetState("Solarpower.Huawei.Inverter." + id + ".MaxReactivePowerFromGrid",      getI32(GlobalDataBuffer[id-1], 30081) / 1000, {name: "", unit: "kVAr"});
}

function readRegisterSpace(id, address, length) {
    client.setID(ModBusIDs[id-1]);
    client.readHoldingRegisters(address, length, function(err, data) {
        if (err) {
            console.warn("Error received reading address " + address + " from id: " + ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode]);            
        }
        else
        {   
            console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data.data);
            for(var i = 0; i &lt; length; i++)  {
                GlobalDataBuffer[id-1][address+i] = data.data[i];
            } 
        }
    });
}

function processData() {
    console.log("Processing new data...");
    for(var i = 1; i &lt;= ModBusIDs.length; i++) {
        ProcessDeviceInfo(i);
        processInverterStatus(i);
        processBattery(i);
        processInverterPowerAdjustments(i);
        processOptimizers(i); 
    }    
    ProcessPowerMeterStatus();
    console.log("Processing done!");
}


// -------------------------------------------------------------------
// This is the main function triggering a  read via modbus-tcp every two seconds.
// Processing of data is triggered as soon as one complete set of registers is copied.
var triggerprocessing = 0; 
var currentinverter = 1;


setInterval(function() {
    if(triggerprocessing == 1) {
        triggerprocessing = 0;
        processData();        
    }      
   
    console.log("Triggering read of inverter " + currentinverter + " at address " + RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][0] + " with length " +  RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][1]);
    readRegisterSpace(currentinverter, RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][0], RegisterSpacesToReadContinuously[RegisterSpacesToReadContinuouslyPtr][1]); 
    RegisterSpacesToReadContinuouslyPtr++;               
    if(RegisterSpacesToReadContinuouslyPtr &gt;= RegisterSpacesToReadContinuously.length) {
        RegisterSpacesToReadContinuouslyPtr = 0;
        currentinverter++
        if(currentinverter &gt; ModBusIDs.length){
            currentinverter = 1;  
            triggerprocessing = 1;                    
        }
    }     
}, 2000);
</code></pre>
]]></description><link>https://forum.iobroker.net/topic/53005/huawei-sun2000-iobroker-via-js-script-funktioniert</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 19:56:03 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/53005.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Mar 2022 21:03:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sun, 26 Oct 2025 22:17:59 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/samson71" aria-label="Profile: samson71">@<bdi>samson71</bdi></a> erwarten mich denn da noch mehr Überraschungen? <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /></p>
]]></description><link>https://forum.iobroker.net/post/1303170</link><guid isPermaLink="true">https://forum.iobroker.net/post/1303170</guid><dc:creator><![CDATA[Triumphator]]></dc:creator><pubDate>Sun, 26 Oct 2025 22:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sun, 26 Oct 2025 07:04:33 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/mcm1957" aria-label="Profile: mcm1957">@<bdi>mcm1957</bdi></a> sagte in <a href="/post/1302855">Huawei Sun2000 &amp; ioBroker via JS script funktioniert</a>:</p>
<blockquote>
<p dir="auto">Topic wurden anscheinend gemerged</p>
</blockquote>
<p dir="auto">Ich war so frei....</p>
]]></description><link>https://forum.iobroker.net/post/1302856</link><guid isPermaLink="true">https://forum.iobroker.net/post/1302856</guid><dc:creator><![CDATA[Samson71]]></dc:creator><pubDate>Sun, 26 Oct 2025 07:04:33 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sun, 26 Oct 2025 07:04:00 GMT]]></title><description><![CDATA[<p dir="auto">-- deleted --<br />
Topic wurden anscheinend gemerged</p>
]]></description><link>https://forum.iobroker.net/post/1302855</link><guid isPermaLink="true">https://forum.iobroker.net/post/1302855</guid><dc:creator><![CDATA[mcm1957]]></dc:creator><pubDate>Sun, 26 Oct 2025 07:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sun, 26 Oct 2025 06:49:00 GMT]]></title><description><![CDATA[<p dir="auto">Re: <a href="/topic/53005/huawei-sun2000-iobroker-via-js-script-funktioniert">Huawei Sun2000 &amp; ioBroker via JS script funktioniert</a></p>
<p dir="auto">Die beiden Datenpunkte für maximumDischargePower und maximumChargePower wurden umbenannt in maximumDischargingPower bzw. maximumChargingPower</p>
<p dir="auto">Dadurch funktionierte mein Blockly nicht mehr und ich bekam wirres Zeug in meiner Vis angezeigt.</p>
]]></description><link>https://forum.iobroker.net/post/1302854</link><guid isPermaLink="true">https://forum.iobroker.net/post/1302854</guid><dc:creator><![CDATA[Triumphator]]></dc:creator><pubDate>Sun, 26 Oct 2025 06:49:00 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 12:35:27 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/samson71" aria-label="Profile: samson71">@<bdi>samson71</bdi></a><br />
Danke, ich probier es aus.</p>
<p dir="auto">Habe halt mit Script alles schon umgesetzt. Und dabei zahlreiche DP, sql, etc. laufen.</p>
]]></description><link>https://forum.iobroker.net/post/1276532</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276532</guid><dc:creator><![CDATA[bahnuhr]]></dc:creator><pubDate>Sat, 07 Jun 2025 12:35:27 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 12:34:15 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bahnuhr" aria-label="Profile: bahnuhr">@<bdi>bahnuhr</bdi></a><br />
Ich kann den Adapter von <a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> empfehlen.</p>
]]></description><link>https://forum.iobroker.net/post/1276531</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276531</guid><dc:creator><![CDATA[Samson71]]></dc:creator><pubDate>Sat, 07 Jun 2025 12:34:15 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 12:30:49 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bahnuhr" aria-label="Profile: bahnuhr">@<bdi>bahnuhr</bdi></a> so weit ich weiß, nein kann es nicht.</p>
]]></description><link>https://forum.iobroker.net/post/1276528</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276528</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Sat, 07 Jun 2025 12:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 12:30:27 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a><br />
Ok, danke für die Info.</p>
<p dir="auto">Muss ich mal schauen.</p>
]]></description><link>https://forum.iobroker.net/post/1276527</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276527</guid><dc:creator><![CDATA[bahnuhr]]></dc:creator><pubDate>Sat, 07 Jun 2025 12:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 12:29:28 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bahnuhr" aria-label="Profile: bahnuhr">@<bdi>bahnuhr</bdi></a> nein. Aber dieser Adapter funkt mit der emma.<br />
<a href="https://github.com/bolliy/ioBroker.sun2000/wiki/Emma" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000/wiki/Emma</a></p>
<p dir="auto">LG Stephan</p>
]]></description><link>https://forum.iobroker.net/post/1276526</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276526</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Sat, 07 Jun 2025 12:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Sat, 07 Jun 2025 11:55:26 GMT]]></title><description><![CDATA[<p dir="auto">Hallo,<br />
habe auch diese Script im Einsatz.<br />
Funktioniert mit dongle einwandfrei.</p>
<p dir="auto">Nun bin ich am überlegen ob ich mir eine "Emma" einbauen soll/will.</p>
<p dir="auto">Funktioniert das Script auch mit der Emma ?</p>
<p dir="auto">Bitte mal kurze Rückinfo ob dies jemand im Einsatz hat.</p>
]]></description><link>https://forum.iobroker.net/post/1276522</link><guid isPermaLink="true">https://forum.iobroker.net/post/1276522</guid><dc:creator><![CDATA[bahnuhr]]></dc:creator><pubDate>Sat, 07 Jun 2025 11:55:26 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 31 Jan 2024 13:06:49 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> gern</p>
]]></description><link>https://forum.iobroker.net/post/1122098</link><guid isPermaLink="true">https://forum.iobroker.net/post/1122098</guid><dc:creator><![CDATA[lcars]]></dc:creator><pubDate>Wed, 31 Jan 2024 13:06:49 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 31 Jan 2024 12:45:48 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lcars" aria-label="Profile: lcars">@<bdi>lcars</bdi></a> ich würde die Diskussion gerne in das Forum meines Adapters verlegen.<br />
<a href="https://forum.iobroker.net/topic/71768/test-adapter-sun2000-v0-1-x-huawei-wechselrichter">https://forum.iobroker.net/topic/71768/test-adapter-sun2000-v0-1-x-huawei-wechselrichter</a></p>
<p dir="auto">Dann können auch andere Nutzer des Adapters sich beteiligen. Vielleicht kannst du dein Setup und das Problem dort kurz umreißen.<br />
Stephan</p>
]]></description><link>https://forum.iobroker.net/post/1122091</link><guid isPermaLink="true">https://forum.iobroker.net/post/1122091</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Wed, 31 Jan 2024 12:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 31 Jan 2024 09:27:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> Danke für den Hinweis. Ich habe das eben mal probiert aber auch da kamen Fehler: script.js.Huawei: Error received reading address 37700 from id: 1 with error: undefined<br />
bzw. sind keine Daten in den erstellten Datenpunkten drin. Das war aber ein guter Hinweis, dass nur ein Client die Daten abfragen kann. Das würde erklären, warum meine Wallbox (NRGKick) da kurz durchkommt und dann abbricht.</p>
<p dir="auto">Hast du vielleicht noch ein Hinweis, wie man ggf. so ein Proxy realisieren kann? Ansonsten müsste ich der Wallbox wohl dann den Vorrang geben.</p>
]]></description><link>https://forum.iobroker.net/post/1121990</link><guid isPermaLink="true">https://forum.iobroker.net/post/1121990</guid><dc:creator><![CDATA[lcars]]></dc:creator><pubDate>Wed, 31 Jan 2024 09:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 31 Jan 2024 08:08:13 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lcars" aria-label="Profile: lcars">@<bdi>lcars</bdi></a> hast du auch die Fehlermeldungen mit dem script  <a href="https://github.com/ChrisBCH/SunLuna2000_iobroker" rel="nofollow ugc">https://github.com/ChrisBCH/SunLuna2000_iobroker</a>?<br />
Du darfst auch nur mit einem Client auf den modbus zugreifen, da mobus nur seriell angesprochen werden darf. Ansonsten muss du ein proxy verwenden.<br />
Stephan</p>
]]></description><link>https://forum.iobroker.net/post/1121975</link><guid isPermaLink="true">https://forum.iobroker.net/post/1121975</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Wed, 31 Jan 2024 08:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 31 Jan 2024 07:52:36 GMT]]></title><description><![CDATA[<p dir="auto">Hallo bolliy,</p>
<p dir="auto">danke für das Plugin. Ich habe das bei mir laufen aber renne immer wieder in Probleme so, dass ich z.T. Timeouts bekomme. Ich habe zwei Wechselrichter und habe deren IDs (1,2) auch korrekt eingegeben. Den Intervall habe ich schon auf 60s gesetzt! Trotzdem bekomme ich sogar bei diesem Intervall vereinzelt folgende Meldungen im Protokoll:</p>
<p dir="auto">Error while reading from 192.168.1.x: [37000|68] id: 2 '' with : Modbus exception 6: Slave device busy (retry request again later)<br />
...<br />
Error while reading from 192.168.1.x: [47081|8] id: 2 '' with : Port Not Open<br />
...<br />
Error while reading from 192.168.1.x: [37765|2] id: 1 '' with : Timed out<br />
...</p>
<p dir="auto">Habt ihr bei euch auch dieses Problem oder gibt es ein Tipp wie man es lösen kann? Der Effekt tritt auch auf wenn ich das mit dem anderem SUN2000_modbus Plugin teste und ich sehe Verbindungsabbrüche wenn ich z.B. mit der NRGKick App drauf zugreifen will. Das Netzwerk ist aber ok, die Error Meldungen z.B. mit "Slave device busy" kommt ja auch direkt vom Wechselrichter.</p>
<p dir="auto">Danke falls jemand einen Tipp hat.</p>
<p dir="auto">Gruß<br />
lcars</p>
]]></description><link>https://forum.iobroker.net/post/1121970</link><guid isPermaLink="true">https://forum.iobroker.net/post/1121970</guid><dc:creator><![CDATA[lcars]]></dc:creator><pubDate>Wed, 31 Jan 2024 07:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 24 Jan 2024 14:03:48 GMT]]></title><description><![CDATA[<p dir="auto">Ich habe gerade den Adapter <strong>sun2000</strong> in der <strong>Version 0.2.0</strong> hier <a href="https://github.com/bolliy/ioBroker.sun2000" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000</a> veröffentlicht. Der Adapter wurde ebenfalls auch auf <a href="https://www.npmjs.com/package/iobroker.sun2000" rel="nofollow ugc">https://www.npmjs.com/package/iobroker.sun2000</a> deployed.<br />
Bitte den Adapter über <strong>npm installieren</strong>, damit keine unfertige Version in ioBroker eingespielt wird!</p>
<p dir="auto">Changelog:</p>
<ul>
<li>Add sun2000 to latest (<a href="https://github.com/ioBroker/ioBroker.repositories/pull/3219" rel="nofollow ugc">https://github.com/ioBroker/ioBroker.repositories/pull/3219</a>)</li>
<li>improve error handling (#34)</li>
<li>add simple optimizer info</li>
<li>Riemann sum of input power with energy loss for new state <code>dailySolarYield</code></li>
<li>try to recreate the "yield today" from the fusion portal in state <code>dailyInputYield</code></li>
</ul>
<p dir="auto">Über Tests und euer Feedback freue mich sehr.</p>
]]></description><link>https://forum.iobroker.net/post/1118332</link><guid isPermaLink="true">https://forum.iobroker.net/post/1118332</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Wed, 24 Jan 2024 14:03:48 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 17 Jan 2024 19:06:06 GMT]]></title><description><![CDATA[<p dir="auto">Ich habe gerade den Adapter sun2000 in der Version 0.1.3 hier <a href="https://github.com/bolliy/ioBroker.sun2000" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000</a> veröffentlicht. Der Adapter ist ebenfalls auch auf <a href="https://www.npmjs.com/package/iobroker.sun2000" rel="nofollow ugc">https://www.npmjs.com/package/iobroker.sun2000</a> deployed.<br />
Kann mit max. <strong>5 Wechselrichtern</strong> betrieben werden!</p>
<p dir="auto">Changelog:<br />
• display the data from PV strings (#27)<br />
• optimize the timing of interval loop<br />
• improved handling of read timeouts from more then 2 inverters</p>
<p dir="auto">Über Tests und euer Feedback freue mich sehr freuen.<br />
Eure Anmerkungen könnt ihr auch gerne hier <a href="https://forum.iobroker.net/topic/71768/test-adapter-sun2000-huawei-wechselrichter-per-modbus">https://forum.iobroker.net/topic/71768/test-adapter-sun2000-huawei-wechselrichter-per-modbus</a> oder <a href="https://github.com/bolliy/ioBroker.sun2000/issues" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000/issues</a> posten.<br />
LG Stephan</p>
]]></description><link>https://forum.iobroker.net/post/1114517</link><guid isPermaLink="true">https://forum.iobroker.net/post/1114517</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Wed, 17 Jan 2024 19:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Thu, 11 Jan 2024 19:36:09 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> Ich habe gerade den Adapter 0.1.2-alpha.1 hier <a href="https://github.com/bolliy/ioBroker.sun2000" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000</a> veröffentlicht. Ich hoffe, dass dieser nun auch bei mehreren WR funktioniert. Der Adapter ist ebenfalls auch auf <a href="https://www.npmjs.com/package/iobroker.sun2000" rel="nofollow ugc">https://www.npmjs.com/package/iobroker.sun2000</a> deployed.</p>
<p dir="auto">Achtung: Die Konfiguration der "modbus IDs" hat sich geändert. (siehe readme)</p>
<ul>
<li>modbusIds: inverter IDs, separated with "," (default: 1, max. 5 inverters)</li>
</ul>
<p dir="auto">Über ein Feedback würde ich mich freuen ;)<br />
Wenn möglich bitte auf <a href="https://forum.iobroker.net/top%E2%80%A61-x-huawei-wechselrichter">https://forum.iobroker.net/top…1-x-huawei-wechselrichter</a> posten.</p>
]]></description><link>https://forum.iobroker.net/post/1111225</link><guid isPermaLink="true">https://forum.iobroker.net/post/1111225</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Thu, 11 Jan 2024 19:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Mon, 08 Jan 2024 17:47:19 GMT]]></title><description><![CDATA[<p dir="auto">Ich habe eine neue Version 0.1.1 von dem ioBroker.sun2000 Test-Adapter veröffentlicht.<br />
<a href="https://github.com/bolliy/ioBroker.sun2000" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000</a></p>
<p dir="auto">Würde mich über Tests und Feedback freuen. Eure Anmerkungen könnt ihr auch gerne hier <a href="https://forum.iobroker.net/topic/71768/test-adapter-sun2000-huawei-wechselrichter-per-modbus">https://forum.iobroker.net/topic/71768/test-adapter-sun2000-huawei-wechselrichter-per-modbus</a> oder <a href="https://github.com/bolliy/ioBroker.sun2000/issues" rel="nofollow ugc">https://github.com/bolliy/ioBroker.sun2000/issues</a> posten.</p>
<p dir="auto">LG Stephan</p>
]]></description><link>https://forum.iobroker.net/post/1109075</link><guid isPermaLink="true">https://forum.iobroker.net/post/1109075</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Mon, 08 Jan 2024 17:47:19 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Tue, 02 Jan 2024 15:28:01 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/atzeackermann" aria-label="Profile: atzeackermann">@<bdi>atzeackermann</bdi></a> danke für deinen Hinweis. Ich habe den Entwickler bereits angesprochen. Mal sehen was daraus wird...</p>
]]></description><link>https://forum.iobroker.net/post/1105330</link><guid isPermaLink="true">https://forum.iobroker.net/post/1105330</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Tue, 02 Jan 2024 15:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Tue, 02 Jan 2024 08:06:18 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> Ich bin noch über diesen Adapter gestolpert....<br />
<a href="https://github.com/daolis/ioBroker.sun2000-modbus" rel="nofollow ugc">https://github.com/daolis/ioBroker.sun2000-modbus</a><br />
Ich denke ihr solltet euch zusammen schließen 😉</p>
]]></description><link>https://forum.iobroker.net/post/1105071</link><guid isPermaLink="true">https://forum.iobroker.net/post/1105071</guid><dc:creator><![CDATA[AtzeAckermann]]></dc:creator><pubDate>Tue, 02 Jan 2024 08:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Thu, 28 Dec 2023 20:42:30 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/atzeackermann" aria-label="Profile: atzeackermann">@<bdi>atzeackermann</bdi></a> das freut mich <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /> . Grundsätzlich funktioniert der ioBroker.sun2000 Adapter schon. Ich habe allerdings noch etliche Issues, die ich behandeln möchte.</p>
<ul>
<li>mehr Register Daten darstellen</li>
<li>Abgeleitete Werte wie Hausverbrauch (consumptions), Erträge (yields) berechnen</li>
<li>Kumulierte Werte bei der Nutzung von mehren Wechselrichtern ermitteln<br />
usw…</li>
</ul>
<p dir="auto">Vielleicht hat der eine oder andere Lust mich dabei zu unterstützen. Darüber hinaus suche ich jemanden der 2 Wechselrichter mit mehr als einer LUNA2000 Batterie. Diese Konstellation ist eher selten – sollte aber dennoch korrekt dargestellt werden.</p>
]]></description><link>https://forum.iobroker.net/post/1102292</link><guid isPermaLink="true">https://forum.iobroker.net/post/1102292</guid><dc:creator><![CDATA[bolliy]]></dc:creator><pubDate>Thu, 28 Dec 2023 20:42:30 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Thu, 28 Dec 2023 11:18:42 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a> hab den Adpater installiert. Auf ersten Blick tut alles 😀</p>
]]></description><link>https://forum.iobroker.net/post/1101693</link><guid isPermaLink="true">https://forum.iobroker.net/post/1101693</guid><dc:creator><![CDATA[AtzeAckermann]]></dc:creator><pubDate>Thu, 28 Dec 2023 11:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Huawei Sun2000 &amp; ioBroker via JS script funktioniert on Wed, 27 Dec 2023 13:12:07 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/bolliy" aria-label="Profile: bolliy">@<bdi>bolliy</bdi></a>, vielen lieben fürs puschen auf github. :-)<br />
Gutes gelingen beim Entwickeln des Adapters. <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44d.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--+1" style="height:23px;width:auto;vertical-align:middle" title=":+1:" alt="👍" /></p>
]]></description><link>https://forum.iobroker.net/post/1101085</link><guid isPermaLink="true">https://forum.iobroker.net/post/1101085</guid><dc:creator><![CDATA[MaGe]]></dc:creator><pubDate>Wed, 27 Dec 2023 13:12:07 GMT</pubDate></item></channel></rss>