@bolliy Der Adapter ist Mega und funktioniert sehr gut. Meine Frage: besteht die Möglichkeit den Intervall von den PV Strings auf 5 oder 10 Sek zu setzen ?
VG Dennis
@bolliy Der Adapter ist Mega und funktioniert sehr gut. Meine Frage: besteht die Möglichkeit den Intervall von den PV Strings auf 5 oder 10 Sek zu setzen ?
VG Dennis
@alex-warkentin Oh man ja die 0 ist es !!! Danke dir Jetzt funktioniert alles
@alex-warkentin ja mir kam das auch komisch vor mit der ID11 aber schau ...... oder verstehe ich da was falsch? WR mit 16 und 1 mein fehler 16 ist gelöscht natürlich.
Log_PV.txt
Hallo zusammen
ich brauche mal eure Hilfe. Das Script scheint soweit zu funktionieren, aber es werden leider die Werte des PowerMeters nicht aktualisiert, das erste mal hat es funktioniert. Was habe ich falsch gemacht ?
VG Dennis
// 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("192.168.178.95", { 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 = 11;
// 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<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] > 32767)
value = array[0] - 65535;
else
value = array[0];
return value;
}
function readSignedInt32(array) {
var value = 0;
for (var i = 0; i < 2; i++) {
value = (value << 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 < length; i++) {
bytearray.push(dataarray[index+i] >> 8);
bytearray.push(dataarray[index+i] & 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 < length; i++) {
bytearray.push(dataarray[index+i] >> 8);
bytearray.push(dataarray[index+i] & 0xff);
}
var value = String.fromCharCode.apply(null, bytearray);
var value2 = new String(value).trim();
return value2;
}
function forcesetState(objectname, value, options) {
if(!existsState("javascript.0." + objectname)) {
createState(objectname, value, options);
console.log("createstate " + objectname + " to value " + value);
}
setState(objectname, value);
}
// ---------------------------------------------------------------
// Functions to map registers into ioBreaker objects:
function processOptimizers(id) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".OptimizerTotalNumber", getU16(GlobalDataBuffer[id-1], 35200), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".OptimizerOnlineNumber", getU16(GlobalDataBuffer[id-1], 35201), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".OptimizerFeatureData", getU16(GlobalDataBuffer[id-1], 35202), {name: "", unit: ""});
}
function processInverterPowerAdjustments(id) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ActiveAdjustement.ActiveAdjustementMode", getU16(GlobalDataBuffer[id-1], 35300), {name: "", unit: ""});
forcesetState("Solarpower2.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("Solarpower2.Huawei.Inverter." + id + ".ActiveAdjustement.ActiveAdjustementCommand", getU16(GlobalDataBuffer[id-1], 35303), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementMode", getU16(GlobalDataBuffer[id-1], 35304), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementValue", getU32(GlobalDataBuffer[id-1], 35305), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ActiveAdjustement.ReactiveAdjustementCommand",getU16(GlobalDataBuffer[id-1], 35307), {name: "", unit: ""});
forcesetState("Solarpower2.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] > 0) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.RunningStatus", getU16(GlobalDataBuffer[id-1], 37000), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.ChargeAndDischargePower",getI32(GlobalDataBuffer[id-1], 37001), {name: "Charge and Discharge Power", unit: "W"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.BusVoltage", getU16(GlobalDataBuffer[id-1], 37003) / 10, {name: "Busvoltage", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.BatterySOC", getU16(GlobalDataBuffer[id-1], 37004) / 10, {name: "Battery SOC", unit: "%"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.WorkingMode", getU16(GlobalDataBuffer[id-1], 37006), {name: "Working Mode", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.RatedChargePower", getU32(GlobalDataBuffer[id-1], 37007), {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.RatedDischargePower", getU32(GlobalDataBuffer[id-1], 37009), {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.FaultID", getU16(GlobalDataBuffer[id-1], 37014), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.CurrentDayChargeCapacity", getU32(GlobalDataBuffer[id-1], 37015) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.CurrentDayDischargeCapacity", getU32(GlobalDataBuffer[id-1], 37017) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.BusCurrent", getI16(GlobalDataBuffer[id-1], 37021) / 10, {name: "Buscurrent", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.BatteryTemperature", getI16(GlobalDataBuffer[id-1], 37022) / 10, {name: "Battery Temperatue", unit: "°C"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.RemainingChargeDischargeTime", getU16(GlobalDataBuffer[id-1], 37025), {name: "", unit: "mins"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.DCDCversion", getZeroTerminatedString(GlobalDataBuffer[id-1], 37026, 10), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.BMSversion", getZeroTerminatedString(GlobalDataBuffer[id-1], 37036, 10), {name: "", unit: ""});
}
// Battery registers 16+17 (Storage-related)
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.MaximumChargePower", getU32(GlobalDataBuffer[id-1], 37046), {name: "", unit: "W"});
forcesetState("Solarpower2.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] > 0) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.SN", getZeroTerminatedString(GlobalDataBuffer[id-1], 37052, 10), {name: "Serialnumber", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.1.TotalCharge", getU32(GlobalDataBuffer[id-1], 37066) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.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] > 0) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.SN", getZeroTerminatedString(GlobalDataBuffer[id-1], 37700, 10), {name: "Serialnumber", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.BatterySOC", getU16(GlobalDataBuffer[id-1], 37738) / 10, {name: "", unit: "%"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.RunningStatus", getU16(GlobalDataBuffer[id-1], 37741), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.ChargeAndDischargePower",getI32(GlobalDataBuffer[id-1], 37743), {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.CurrentDayChargeCapacity", getU32(GlobalDataBuffer[id-1], 37746) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.CurrentDayDischargeCapacity", getU32(GlobalDataBuffer[id-1], 37748) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.BusVoltage", getU16(GlobalDataBuffer[id-1], 37750) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.BusCurrent", getI16(GlobalDataBuffer[id-1], 37751) / 10, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.BatteryTemperature", getI16(GlobalDataBuffer[id-1], 37752) / 10, {name: "", unit: "°C"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.TotalCharge", getU32(GlobalDataBuffer[id-1], 37753) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.TotalDischarge", getU32(GlobalDataBuffer[id-1], 37755) / 100, {name: "", unit: "kWh"});
}
// Battery register 32-41 (Storage related)
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.RatedCapacity", getU32(GlobalDataBuffer[id-1], 37758) / 1, {name: "", unit: "Wh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.SOC", getU16(GlobalDataBuffer[id-1], 37760) / 10, {name: "", unit: "%"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.RunningStatus", getU16(GlobalDataBuffer[id-1], 37762) / 1, {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.BusVoltage", getU16(GlobalDataBuffer[id-1], 37763) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.BusCurrent", getI16(GlobalDataBuffer[id-1], 37764) / 10, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.ChargeAndDischargePower", getI32(GlobalDataBuffer[id-1], 37765) / 1, {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.TotalCharge", getU32(GlobalDataBuffer[id-1], 37780) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.TotalDischarge", getU32(GlobalDataBuffer[id-1], 37782) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Battery.CurrentDayChargeCapacity", getU32(GlobalDataBuffer[id-1], 37784) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.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] > 0) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack.2.SoftwareVersion", getZeroTerminatedString(GlobalDataBuffer[id-1], 37814, 8), {name: "Softwareversion", unit: ""});
}
if(BatteryUnits[id-1][0] > 0) {
forcesetState("Solarpower2.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 <= 2; i++){
if(BatteryUnits[id-1][i-1] >= 0) {
for(var j = 1; j <= BatteryUnits[id-1][i-1]; j++) {
//[[38200, 38242, 38284] [38326, 38368, 38410]]; (+42 for each battery pack, +126 for each stack)
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".SN", getZeroTerminatedString(GlobalDataBuffer[id-1], 38200+(i-1)*126+(j-1)*42, 6), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".FirmwareVersion", getZeroTerminatedString(GlobalDataBuffer[id-1], 38210+(i-1)*126+(j-1)*42, 8), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".WorkingStatus", getU16(GlobalDataBuffer[id-1], 38228+(i-1)*126+(j-1)*42), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".BatterySOC", getU16(GlobalDataBuffer[id-1], 38229+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "%"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".ChargeAndDischargePower", getI32(GlobalDataBuffer[id-1], 38233+(i-1)*126+(j-1)*42) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".Voltage", getU16(GlobalDataBuffer[id-1], 38235+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".Current", getI16(GlobalDataBuffer[id-1], 38236+(i-1)*126+(j-1)*42) / 10, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".TotalCharge", getU32(GlobalDataBuffer[id-1], 38238+(i-1)*126+(j-1)*42) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.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("Solarpower2.Huawei.Inverter." + id + ".Batterystack." + i + ".Battery" + j + ".MaxTemperature", getI16(GlobalDataBuffer[id-1], 38452+(i-1)*6+(j-1)*2) / 10, {name: "", unit: "°C"});
createState("Solarpower2.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("Solarpower2.Huawei.Meter.Status", getU16(GlobalDataBuffer[PowerMeterID], 37100), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Meter.VoltageL1", getI32(GlobalDataBuffer[PowerMeterID], 37101) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.VoltageL2", getI32(GlobalDataBuffer[PowerMeterID], 37103) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.VoltageL3", getI32(GlobalDataBuffer[PowerMeterID], 37105) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.CurrentL1", getI32(GlobalDataBuffer[PowerMeterID], 37107) / 100, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Meter.CurrentL2", getI32(GlobalDataBuffer[PowerMeterID], 37109) / 100, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Meter.CurrentL3", getI32(GlobalDataBuffer[PowerMeterID], 37111) / 100, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Meter.ActivePower", getI32(GlobalDataBuffer[PowerMeterID], 37113) / 1, {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Meter.ReactivePower", getI32(GlobalDataBuffer[PowerMeterID], 37115) / 1, {name: "", unit: "Var"});
forcesetState("Solarpower2.Huawei.Meter.PowerFactor", getI16(GlobalDataBuffer[PowerMeterID], 37117) / 1000, {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Meter.GridFrequency", getI16(GlobalDataBuffer[PowerMeterID], 37118) / 100, {name: "", unit: "Hz"});
forcesetState("Solarpower2.Huawei.Meter.PositiveActiveEnergy", getI32(GlobalDataBuffer[PowerMeterID], 37119) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Meter.ReverseActiveEnergy", getI32(GlobalDataBuffer[PowerMeterID], 37121) / 100, {name: "", unit: "kWh"});
forcesetState("Solarpower2.Huawei.Meter.AccumulatedReactivePower", getI32(GlobalDataBuffer[PowerMeterID], 37123) / 100, {name: "", unit: "kVarh"});
forcesetState("Solarpower2.Huawei.Meter.MeterType", getU16(GlobalDataBuffer[PowerMeterID], 37125), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Meter.VoltageL1-L2", getI32(GlobalDataBuffer[PowerMeterID], 37126) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.VoltageL2-L3", getI32(GlobalDataBuffer[PowerMeterID], 37128) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.VoltageL3-L1", getI32(GlobalDataBuffer[PowerMeterID], 37130) / 10, {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Meter.ActivePowerL1", getI32(GlobalDataBuffer[PowerMeterID], 37132) / 1, {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Meter.ActivePowerL2", getI32(GlobalDataBuffer[PowerMeterID], 37134) / 1, {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Meter.ActivePowerL3", getI32(GlobalDataBuffer[PowerMeterID], 37136) / 1, {name: "", unit: "W"});
forcesetState("Solarpower2.Huawei.Meter.MeterModel", getU16(GlobalDataBuffer[PowerMeterID], 37138), {name: "", unit: ""});
}
function processInverterStatus(id) {
forcesetState("Solarpower2.Huawei.Inverter." + id + ".State1", getU16(GlobalDataBuffer[id-1], 32000), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".State2", getU16(GlobalDataBuffer[id-1], 32001), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".State3", getU16(GlobalDataBuffer[id-1], 32002), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Alarm1", getU16(GlobalDataBuffer[id-1], 32008), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Alarm2", getU16(GlobalDataBuffer[id-1], 32009), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Alarm3", getU16(GlobalDataBuffer[id-1], 32010), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".String.1_Voltage", getI16(GlobalDataBuffer[id-1], 32016) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".String.1_Current", getI16(GlobalDataBuffer[id-1], 32017) / 100 , {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".String.2_Voltage", getI16(GlobalDataBuffer[id-1], 32018) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".String.2_Current", getI16(GlobalDataBuffer[id-1], 32019) / 100 , {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".InputPower", getI32(GlobalDataBuffer[id-1], 32064) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L1-L2_Voltage", getU16(GlobalDataBuffer[id-1], 32066) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L2-L3_Voltage", getU16(GlobalDataBuffer[id-1], 32067) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L3-L1_Voltage", getU16(GlobalDataBuffer[id-1], 32068) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L1_Voltage", getU16(GlobalDataBuffer[id-1], 32069) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L2_Voltage", getU16(GlobalDataBuffer[id-1], 32070) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L3_Voltage", getU16(GlobalDataBuffer[id-1], 32071) / 10 , {name: "", unit: "V"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L1_Current", getI32(GlobalDataBuffer[id-1], 32072) / 1000, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L2_Current", getI32(GlobalDataBuffer[id-1], 32074) / 1000, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Grid.L3_Current", getI32(GlobalDataBuffer[id-1], 32076) / 1000, {name: "", unit: "A"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".PeakActivePowerDay", getI32(GlobalDataBuffer[id-1], 32078) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ActivePower", getI32(GlobalDataBuffer[id-1], 32080) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ReactivePower", getI32(GlobalDataBuffer[id-1], 32082) / 1000, {name: "", unit: "kVar"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".PowerFactor", getI16(GlobalDataBuffer[id-1], 32084) / 1000, {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".GridFrequency", getU16(GlobalDataBuffer[id-1], 32085) / 100 , {name: "", unit: "Hz"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".Efficiency", getU16(GlobalDataBuffer[id-1], 32086) / 100 , {name: "", unit: "%"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".InternalTemperature", getI16(GlobalDataBuffer[id-1], 32087) / 10 , {name: "", unit: "°C"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".InsulationResistance", getU16(GlobalDataBuffer[id-1], 32088) / 1000, {name: "", unit: "MOhm"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".DeviceStatus", getU16(GlobalDataBuffer[id-1], 32089), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".FaultCode", getU16(GlobalDataBuffer[id-1], 32090), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".StartupTime", getU16(GlobalDataBuffer[id-1], 32091), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ShutdownTime", getU16(GlobalDataBuffer[id-1], 32093), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".AccomulatedEnergyYield", getU16(GlobalDataBuffer[id-1], 32106), {name: "", unit: "kWh"});
forcesetState("Solarpower2.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("Solarpower2.Huawei.Inverter." + id + ".Model", getZeroTerminatedString(GlobalDataBuffer[id-1], 30000, 8), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".SN", getZeroTerminatedString(GlobalDataBuffer[id-1], 30015, 6), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".PN", getZeroTerminatedString(GlobalDataBuffer[id-1], 30025, 6), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".ModelID", getU16(GlobalDataBuffer[id-1], 30070), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".PVStrings", getU16(GlobalDataBuffer[id-1], 30071), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".MPPTrackers", getU16(GlobalDataBuffer[id-1], 30072), {name: "", unit: ""});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".MaxRatedPower", getU32(GlobalDataBuffer[id-1], 30073) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".MaxActivePower", getU32(GlobalDataBuffer[id-1], 30075) / 1000, {name: "", unit: "kW"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".MaxApparentPower", getU32(GlobalDataBuffer[id-1], 30077) / 1000, {name: "", unit: "kVA"});
forcesetState("Solarpower2.Huawei.Inverter." + id + ".MaxReactivePowerToGrid", getI32(GlobalDataBuffer[id-1], 30079) / 1000, {name: "", unit: "kVAr"});
forcesetState("Solarpower2.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 < length; i++) {
GlobalDataBuffer[id-1][address+i] = data.data[i];
}
}
});
}
function processData() {
console.log("Processing new data...");
for(var i = 1; i <= 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 >= RegisterSpacesToReadContinuously.length) {
RegisterSpacesToReadContinuouslyPtr = 0;
currentinverter++
if(currentinverter > ModBusIDs.length){
currentinverter = 1;
triggerprocessing = 1;
}
}
}, 2000);
@striegel26 sagte in VIS -> keine gültige Lizenz gefunden:
Hallo bei mir seit gestern Abend das gleiche Problem. Wäre echt schade wenn das nicht bald gefixed wird. Habe da echt sehr viel Arbeit rein gesteckt.
VG
Dennis
AAAAH es GEHT wieder !!!!!!
Vielen DANK !!!!
Hallo bei mir seit gestern Abend das gleiche Problem. Wäre echt schade wenn das nicht bald gefixed wird. Habe da echt sehr viel Arbeit rein gesteckt.
VG
Dennis