Huawei Wechselrichter (Modbus Fragen)

Hallo Zusammen,

bin Anfänger im Modbus Bereich und hätte da ein paar Fragen.
Ich möchte meine Huawei Wechselrichter auslesen und habe mir dafür einen RS485 zu USB Adapter gekauft. Dieser hängt am Server von Symcon und zur anderen Seite am RS485 Bus der Wechselrichter.

Bisher habe ich ein Modbus Gateway Angelegt und die dafür benötigte Schnittstelle, in meinem Fall Com 4 angewählt. Konfiguration des Gateways ist wie folgt.

Modbus RTU
Geräte ID 1 (Dies ist auch die Adresse des WR)
Swap aktiv.

Verbindung steht.

Nun habe ich ein Modbus Device angelegt und jetzt weis ich nicht weiter. Habe mir vom Hersteller die Modbus definitions geladen.

Beispiel Frequenz:

SN:32 / Signal Name : Frequency / Read/Write : RO / Type: U16/ Unit Hz/ Gain : 100 / Adress : 32085/Quantity : 1.

Wie gebe ich das in die Maske ein und was muss ich beachten?

Hi Dromik,

hier ein Beispiel von meiner Wago SPS

modbus

In deinem Fall:
Einheit: 16Bit
Adresse (Lesen): 32085

Gruß

Moin Moin,

Ein Freund von mir bekommt nun auch einen Huawei Wechselrichter und möchte ihn (ggf. über Symcon) überwachen und Heizung etc. steuern.

Ich lese, dass das auslesen der Daten wohl über die RS485 Schnittstelle und Modbus-Gateway funktioniert.

Kann mir jemand sagen, was für Daten der Huawei WR dann liefert.

Gruß Michael

Ich habe den Huawei SUN2000-5KTL-M1 und kann Ihn wunderbar über WLAn Dongle auslesen…

Wichtig zuerst am Gerät folgendes aktivieren:

image

image

Mein Installer Script:

<?
#include('globalfunction.ips.php');
$cat=41311 /*[Stromzähler]*/;

#$name="Gesamt Stromverbrauch";

$catname="PV 2";

$modbussplitterid=32757 ;

$catid1=GetorCreatcategory($catname,$cat);
$catid=GetorCreatcategory("modbus",$catid1);
IPS_Sethidden($catid, true);


$ac_spannungen_anzeigen=true;
$dc_spannungen_anzeigen=true;
$ac_strom_anzeigen=true;
$dc_strom_anzeigen=true;
$ac_leistung_anzeigen=true;
$dc_leistung_anzeigen=true;

$zaehlerstand_anzeigen=true;




/*
#*************************************************************  Modus Splitter anlegen ************************************************************* 

$modbussplitterid=IPS_CreateInstance("{A5F663AB-C400-4FE5-B207-4D67CC030564}");
IPS_SetName($modbussplitterid, "Huawei PV2 Modus"); // Instanz benennen
IPS_SetConfiguration($modbussplitterid, '{"GatewayMode":0,"DeviceID":1,"SwapWords":false,"DelayTimeTCP":10,"DelayTimeRTU":20,"DataBlocks":"[]"}');
IPS_ApplyChanges($modbussplitterid);

$serialportidtemp=IPS_GetInstance($modbussplitterid);
$serialportid=$serialportidtemp['ConnectionID'];


#*************************************************************  Serial Port konfig ************************************************************* 

#$serialportid=IPS_CreateInstance("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}");
IPS_SetName($serialportid, "Stromzaehler Serial Port"); // Instanz benennen
IPS_SetConfiguration($serialportid, '{"Open":true,"Port":"/dev/ttyUSB0","BaudRate":"9600","DataBits":"8","StopBits":"1","Parity":"None"}');
IPS_ApplyChanges($serialportid);
*/


# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="Ampere";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," A");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="KWh";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," KWh");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *************************************************************  Cat anlegen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{

$spannungl1id=create_modbusdevice("Spannung L1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32069,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$spannungl2id=create_modbusdevice("Spannung L2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32070,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L2");

$spannungl3id=create_modbusdevice("Spannung L3", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32071,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($ac_strom_anzeigen===true)
{
$stroml1id=create_modbusdevice("Strom L1", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32072,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$stroml2id=create_modbusdevice("Strom L2", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32074,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L2");

$stroml3id=create_modbusdevice("Strom L3", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32076,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($dc_spannungen_anzeigen===true)
{

$pv_volt1=create_modbusdevice("PV 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32016,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$pv_volt2=create_modbusdevice("PV 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32018,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($dc_strom_anzeigen===true)
{
$pv_strom1=create_modbusdevice("PV Strom 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32017,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$pv_strom2=create_modbusdevice("PV Strom 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32019,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung=create_modbusdevice("Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32080,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung=create_modbusdevice("PV Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32064,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}


if ($zaehlerstand_anzeigen===true) 
{ 
    $day=create_modbusdevice("Am Tag", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32114,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");
    $total=create_modbusdevice("Gesamtenergieertrag (seit 15.09.22)", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32106,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");

}


#************************************************************* Verlinkungen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{
$spannungen_instanceid=GetOrCreateInstanz("Spannungen" , "dummy",$catid1 ); 
IPS_SetPosition($spannungen_instanceid,0);
GetorCreateLink("L1",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L1", $spannungl1id), 0);
GetorCreateLink("L2",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L2", $spannungl2id), 1);
GetorCreateLink("L3",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L3", $spannungl3id), 2);
}

if ($ac_strom_anzeigen===true)
{
$strom_instanceid=GetOrCreateInstanz("Strom" , "dummy",$catid1 ); 
IPS_SetPosition($strom_instanceid,1);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$strom_instanceid,IPS_GetVariableIDByName("Strom L1", $stroml1id), 0);
GetorCreateLink("L2",$strom_instanceid,IPS_GetVariableIDByName("Strom L2", $stroml2id), 1);
GetorCreateLink("L3",$strom_instanceid,IPS_GetVariableIDByName("Strom L3", $stroml3id), 2);
}

if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung_instance_id=GetOrCreateInstanz("Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($ac_gesamtleistung_instance_id,2);
GetorCreateLink("Gesamtleistung ",$ac_gesamtleistung_instance_id,IPS_GetVariableIDByName("Gesamtleistung", $ac_gesamtleistung), 0);
}


if ($dc_spannungen_anzeigen===true)
{
$pv_spannungen_instanceid=GetOrCreateInstanz("PV Sapnnungen" , "dummy",$catid1 ); 
IPS_SetPosition($pv_spannungen_instanceid,3);
GetorCreateLink("PV 1",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 1", $pv_volt1), 0);
GetorCreateLink("PV 2",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 2", $pv_volt2), 1);
}



if ($dc_strom_anzeigen===true)
{
$dc_strom_instanceid=GetOrCreateInstanz("PV Strom" , "dummy",$catid1 ); 
IPS_SetPosition($dc_strom_instanceid,4);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 1", $pv_strom1), 0);
GetorCreateLink("L2",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 2", $pv_strom2), 1);
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung_instance_id=GetOrCreateInstanz("PV Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($dc_gesamtleistung_instance_id,5);
GetorCreateLink("Gesamtleistung ",$dc_gesamtleistung_instance_id,IPS_GetVariableIDByName("PV Gesamtleistung", $dc_gesamtleistung), 0);
}



if ($zaehlerstand_anzeigen===true) 
{
    $erzeugnis_id=GetOrCreateInstanz("Energieertrag" , "dummy",$catid1 ); 
    IPS_SetPosition($erzeugnis_id,6);
    GetorCreateLink("Am Tag ",$erzeugnis_id,IPS_GetVariableIDByName("Am Tag", $day), 0);
    GetorCreateLink("Gesamtenergieertrag (seit 15.09.22) ",$erzeugnis_id,IPS_GetVariableIDByName("Gesamtenergieertrag (seit 15.09.22)", $total), 1);
}

function GetOrCreateInstanz($name , $ityp, $parent ) // erstellt eine Variable, wenn es noch nicht exestiert
// Erstellt eine Variable, Wert 1 = Name , Wert 2 ist der Typ der Variable, Wert 3, Variabel-Ident, Wert 4 Provil, Wert 5 ScriptID , Wert 6 ist die Übergeordnete Instanz, wo die Variable angelegt werden soll
{
    $ObjId = @IPS_GetObjectIDByName($name , $parent);
    if ($ObjId === false)
    {

    if ($ityp=="dummy") $ityp='{485D0419-BE97-4548-AA9C-C083EB82E61E}';

	     $ObjId = IPS_CreateInstance($ityp);
        IPS_SetName($ObjId, $name); // Namer vergeben

        IPS_SetParent($ObjId,$parent ); //  Variable unter die Instantz verschieben
		  }
     $position=instance_pos($name);
     IPS_SetPosition($ObjId,$position);     
    return $ObjId;
} //Ende der Funktion GetOrCreateInstanz

function GetorCreateLink($name,$parent,$id, $position)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
$linkziel=@IPS_GetLink($LinkID);
$linkzielid=@$linkziel[TargetID];
$exziel=IPS_ObjectExists($id);
#IPS_SetPosition($LinkID,$position); //Position festlegen
if (@$linkzielid != $id or  $exziel===false )  @IPS_DeleteLink(@$LinkID);

if ($linkzielid != $id && $exziel===true ) 
 {
$LinkID = IPS_CreateLink();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
IPS_SetLinkTargetID($LinkID, $id);    // Link verknüpfen
IPS_SetPosition($LinkID,$position); //Position festlegen
}
IPS_SetPosition($LinkID,$position); //Position festlegen
return $LinkID;
}

function GetorCreatcategory($name,$parent, $position=0, $hidden=false)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
    if ($LinkID === false)
    {
$LinkID = IPS_CreateCategory();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
if ($hidden ===true) IPS_SetHidden($LinkID,true);
$position=room_pos($name);
IPS_SetPosition($LinkID,$position); //Position festlegen
}
$position=room_pos($name);
IPS_SetPosition($LinkID,$position);
return $LinkID;
}


function create_modbusdevice($name, $config,$modbussplitterid, $profil, $catid,$ident)
{
$modbusdevice='{CB197E50-273D-4535-8C91-BB35273E3CA5}';
$modbusinstanceid=IPS_CreateInstance($modbusdevice);
IPS_SetName($modbusinstanceid,$name);
IPS_SetConfiguration($modbusinstanceid, $config);
IPS_SetParent($modbusinstanceid, $catid);
IPS_ApplyChanges($modbusinstanceid);
$valueid=IPS_GetVariableIDByName("Wert",$modbusinstanceid);
IPS_SetName($valueid,$name);
IPS_SetVariableCustomProfile($valueid,$profil);
IPS_DisconnectInstance($modbusinstanceid);
IPS_ConnectInstance($modbusinstanceid,$modbussplitterid);
#IPS_SetIdent($valueid,$ident);
// Archive Control ID herrausfinden
foreach(IPS_GetInstanceList ( ) as $m_id)// Durchsucht alle Instanzen und gibt die INstanzid an $i_id weiter
{
$typ=IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; // Fragt die Instanzen nach den Modulnamen ab....
if ($typ=="Archive Control") $modul_id=$m_id; // Wenn die INstanz den Modulnamen "Archive Control" hat, dann schreibe die ID in $modul_id
}

AC_SetLoggingStatus($modul_id,$valueid,true);
AC_SetAggregationType($modul_id,$valueid,1);
AC_ReAggregateVariable($modul_id,$valueid);
return $modbusinstanceid;
}

Hier die Doku:

Modbus Adressen

hallo

ich habe auch meinen Huawei sun2000 6kwp angeschlossen, bekomme die Modbus Verbindung
zusammen aber leider komme ich nicht weiter.

Dein angehängtes Skript beinhaltet eine ID mit Stromzähler welche soll das sein,? Habe heir eine Kategorie angegeben und darunter wird nach ausführen eine weitere mit PV
2 angelegt die leer ist.

als Fehler im Script kommt:


Fatal error: Uncaught Error: Call to undefined function room_pos() in C:\ProgramData\Symcon\scripts\34724.ips.php:246
Stack trace:
#0 C:\ProgramData\Symcon\scripts\34724.ips.php(11): GetorCreatcategory('PV 2', 14738)
#1 {main}
  thrown in C:\ProgramData\Symcon\scripts\34724.ips.php on line 246

Danke
Alex :slight_smile:

Hi ich schaue es mir morgen an, der meckert rum, weil eine Funktion von mir fehlt…

Ich teste es morgen nochmals :wink:

Hast du auch einen Speicher ?

super Danke

nein noch nicht, aber denke schon an eine zweite Anlage :slight_smile:

Hier mein überarbeitetes Script:

<?

$cat=41311 /*[Stromzähler]*/;

#$name="Gesamt Stromverbrauch";

$catname="PV 1";

$modbussplitterid=56137 ;

$catid1=GetorCreatcategory($catname,$cat);
$catid=GetorCreatcategory("modbus",$catid1);
IPS_Sethidden($catid, true);


$ac_spannungen_anzeigen=false;
$dc_spannungen_anzeigen=true;
$ac_strom_anzeigen=false;
$dc_strom_anzeigen=true;
$ac_leistung_anzeigen=true;
$dc_leistung_anzeigen=false;

$zaehlerstand_anzeigen=true;




/*
#*************************************************************  Modus Splitter anlegen ************************************************************* 

$modbussplitterid=IPS_CreateInstance("{A5F663AB-C400-4FE5-B207-4D67CC030564}");
IPS_SetName($modbussplitterid, "Huawei PV2 Modus"); // Instanz benennen
IPS_SetConfiguration($modbussplitterid, '{"GatewayMode":0,"DeviceID":1,"SwapWords":false,"DelayTimeTCP":10,"DelayTimeRTU":20,"DataBlocks":"[]"}');
IPS_ApplyChanges($modbussplitterid);

$serialportidtemp=IPS_GetInstance($modbussplitterid);
$serialportid=$serialportidtemp['ConnectionID'];


#*************************************************************  Serial Port konfig ************************************************************* 

#$serialportid=IPS_CreateInstance("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}");
IPS_SetName($serialportid, "Stromzaehler Serial Port"); // Instanz benennen
IPS_SetConfiguration($serialportid, '{"Open":true,"Port":"/dev/ttyUSB0","BaudRate":"9600","DataBits":"8","StopBits":"1","Parity":"None"}');
IPS_ApplyChanges($serialportid);
*/


# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="Ampere";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," A");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="KWh";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," KWh");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *************************************************************  Cat anlegen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{

$spannungl1id=create_modbusdevice("Spannung L1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32069,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$spannungl2id=create_modbusdevice("Spannung L2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32070,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L2");

$spannungl3id=create_modbusdevice("Spannung L3", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32071,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($ac_strom_anzeigen===true)
{
$stroml1id=create_modbusdevice("Strom L1", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32072,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$stroml2id=create_modbusdevice("Strom L2", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32074,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L2");

$stroml3id=create_modbusdevice("Strom L3", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32076,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($dc_spannungen_anzeigen===true)
{

$pv_volt1=create_modbusdevice("PV 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32016,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$pv_volt2=create_modbusdevice("PV 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32018,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($dc_strom_anzeigen===true)
{
$pv_strom1=create_modbusdevice("PV Strom 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32017,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$pv_strom2=create_modbusdevice("PV Strom 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32019,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung=create_modbusdevice("Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32080,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung=create_modbusdevice("PV Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32064,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}


if ($zaehlerstand_anzeigen===true) 
{ 
    $day=create_modbusdevice("Am Tag", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32114,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");
    $total=create_modbusdevice("Gesamtenergieertrag (seit 13.10.22)", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32106,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");

}


#************************************************************* Verlinkungen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{
$spannungen_instanceid=GetOrCreateInstanz("Spannungen" , "dummy",$catid1 ); 
IPS_SetPosition($spannungen_instanceid,0);
GetorCreateLink("L1",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L1", $spannungl1id), 0);
GetorCreateLink("L2",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L2", $spannungl2id), 1);
GetorCreateLink("L3",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L3", $spannungl3id), 2);
}

if ($ac_strom_anzeigen===true)
{
$strom_instanceid=GetOrCreateInstanz("Strom" , "dummy",$catid1 ); 
IPS_SetPosition($strom_instanceid,1);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$strom_instanceid,IPS_GetVariableIDByName("Strom L1", $stroml1id), 0);
GetorCreateLink("L2",$strom_instanceid,IPS_GetVariableIDByName("Strom L2", $stroml2id), 1);
GetorCreateLink("L3",$strom_instanceid,IPS_GetVariableIDByName("Strom L3", $stroml3id), 2);
}

if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung_instance_id=GetOrCreateInstanz("Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($ac_gesamtleistung_instance_id,2);
GetorCreateLink("Gesamtleistung ",$ac_gesamtleistung_instance_id,IPS_GetVariableIDByName("Gesamtleistung", $ac_gesamtleistung), 0);
}


if ($dc_spannungen_anzeigen===true)
{
$pv_spannungen_instanceid=GetOrCreateInstanz("PV Sapnnungen" , "dummy",$catid1 ); 
IPS_SetPosition($pv_spannungen_instanceid,3);
GetorCreateLink("PV 1",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 1", $pv_volt1), 0);
GetorCreateLink("PV 2",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 2", $pv_volt2), 1);
}



if ($dc_strom_anzeigen===true)
{
$dc_strom_instanceid=GetOrCreateInstanz("PV Strom" , "dummy",$catid1 ); 
IPS_SetPosition($dc_strom_instanceid,4);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 1", $pv_strom1), 0);
GetorCreateLink("L2",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 2", $pv_strom2), 1);
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung_instance_id=GetOrCreateInstanz("PV Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($dc_gesamtleistung_instance_id,5);
GetorCreateLink("Gesamtleistung ",$dc_gesamtleistung_instance_id,IPS_GetVariableIDByName("PV Gesamtleistung", $dc_gesamtleistung), 0);
}



if ($zaehlerstand_anzeigen===true) 
{
    $erzeugnis_id=GetOrCreateInstanz("Energieertrag" , "dummy",$catid1 ); 
    IPS_SetPosition($erzeugnis_id,6);
    GetorCreateLink("Am Tag ",$erzeugnis_id,IPS_GetVariableIDByName("Am Tag", $day), 0);
    GetorCreateLink("Gesamtenergieertrag (seit 13.10.22)",$erzeugnis_id,IPS_GetVariableIDByName("Gesamtenergieertrag (seit 13.10.22)", $total), 1);
}

function GetOrCreateInstanz($name , $ityp, $parent ) // erstellt eine Variable, wenn es noch nicht exestiert
// Erstellt eine Variable, Wert 1 = Name , Wert 2 ist der Typ der Variable, Wert 3, Variabel-Ident, Wert 4 Provil, Wert 5 ScriptID , Wert 6 ist die Übergeordnete Instanz, wo die Variable angelegt werden soll
{
    $ObjId = @IPS_GetObjectIDByName($name , $parent);
    if ($ObjId === false)
    {

    if ($ityp=="dummy") $ityp='{485D0419-BE97-4548-AA9C-C083EB82E61E}';

	     $ObjId = IPS_CreateInstance($ityp);
        IPS_SetName($ObjId, $name); // Namer vergeben

        IPS_SetParent($ObjId,$parent ); //  Variable unter die Instantz verschieben
		  }   
    return $ObjId;
} //Ende der Funktion GetOrCreateInstanz

function GetorCreateLink($name,$parent,$id, $position)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
$linkziel=@IPS_GetLink($LinkID);
$linkzielid=@$linkziel[TargetID];
$exziel=IPS_ObjectExists($id);
#IPS_SetPosition($LinkID,$position); //Position festlegen
if (@$linkzielid != $id or  $exziel===false )  @IPS_DeleteLink(@$LinkID);

if ($linkzielid != $id && $exziel===true ) 
 {
$LinkID = IPS_CreateLink();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
IPS_SetLinkTargetID($LinkID, $id);    // Link verknüpfen
IPS_SetPosition($LinkID,$position); //Position festlegen
}
IPS_SetPosition($LinkID,$position); //Position festlegen
return $LinkID;
}

function GetorCreatcategory($name,$parent, $position=0, $hidden=false)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
    if ($LinkID === false)
    {
$LinkID = IPS_CreateCategory();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
if ($hidden ===true) IPS_SetHidden($LinkID,true);
IPS_SetPosition($LinkID,$position); //Position festlegen
}
IPS_SetPosition($LinkID,$position);
return $LinkID;
}



function create_modbusdevice($name, $config,$modbussplitterid, $profil, $catid,$ident)
{
$modbusinstanceid = @IPS_GetObjectIDByName($name , $catid);
if ($modbusinstanceid === false)
{
$modbusdevice='{CB197E50-273D-4535-8C91-BB35273E3CA5}';
$modbusinstanceid=IPS_CreateInstance($modbusdevice);
IPS_SetName($modbusinstanceid,$name);
IPS_SetConfiguration($modbusinstanceid, $config);
IPS_SetParent($modbusinstanceid, $catid);
IPS_ApplyChanges($modbusinstanceid);
$valueid=IPS_GetVariableIDByName("Wert",$modbusinstanceid);
IPS_SetName($valueid,$name);
IPS_SetVariableCustomProfile($valueid,$profil);
IPS_DisconnectInstance($modbusinstanceid);
IPS_ConnectInstance($modbusinstanceid,$modbussplitterid);
#IPS_SetIdent($valueid,$ident);
// Archive Control ID herrausfinden
foreach(IPS_GetInstanceList ( ) as $m_id)// Durchsucht alle Instanzen und gibt die INstanzid an $i_id weiter
{
$typ=IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; // Fragt die Instanzen nach den Modulnamen ab....
if ($typ=="Archive Control") $modul_id=$m_id; // Wenn die INstanz den Modulnamen "Archive Control" hat, dann schreibe die ID in $modul_id
}

AC_SetLoggingStatus($modul_id,$valueid,true);
AC_SetAggregationType($modul_id,$valueid,1);
AC_ReAggregateVariable($modul_id,$valueid);
return $modbusinstanceid;
}
return $modbusinstanceid;
}

so habs reinkopiert :slight_smile: jedoch eine

Fehlermeldung:

Warning: include(globalfunction.ips.php): failed to open stream: No such file or directory in C:\ProgramData\Symcon\scripts\34724.ips.php on line 2

Warning: include(): Failed opening 'globalfunction.ips.php' for inclusion (include_path='.:C:\ProgramData\Symcon\scripts') in C:\ProgramData\Symcon\scripts\34724.ips.php on line 2

hab die Modbuss Splitter ID angegeben und bei $cat= eine Kategorie Ortner, stimmt das?

Daten kommen aber eben die Meldungen im Skript. Wie oft Fragt er die Daten dann ab? bei jeder Änderung?

Danke schonmal :slight_smile:

Hi so habe das nochmal angepasst, das Script braucht man ja nur 1 x ausführen :wink:

Alle 5000ms werden die Werte abgefragt…

Bitte schön, wünsche und fragen werden gerne beantwortet :slight_smile:

Super danke für :slight_smile:

mir ist bei dem Skript aufgefallen das hier was steht von L1-L3, sollte das auch ausgegeben werden?
der Gesamte Stromverbrauch des SmartMeters wird ja nicht wo angezeigt oder?

Das bekomme ich alles und das ist schon das wichtigste :slight_smile:

danke Alex :slight_smile:

Im Script, hat hiermit:

$ac_spannungen_anzeigen=false;
$dc_spannungen_anzeigen=false;
$ac_strom_anzeigen=false;
$dc_strom_anzeigen=false;
$ac_leistung_anzeigen=true;
$dc_leistung_anzeigen=false;
$energieertrag_anzeige=true;

$akku_prozent_anzeige=true;
$aktuelle_entladekapazitaet=true;
$aktuelle_ladekapazitaet=true;

die Möglichkeit, Werte Anzeigen zulassen (true) der nicht Anzeigen / wieder entfernen zu lassen (false)…

Was meinst du mit : der Gesamte Stromverbrauch des SmartMeters wird ja nicht wo angezeigt oder?

Wir lesen hier nur den Wechselrichter aus, nicht das SmartMeter :wink:

Ich warte immer noch auf mein Smartmeter, daher habe ich das noch nicht eingebunden. Aber wenn mir jemand die Modbusadressen nennen kann für die Einzelnen Werte (kein Verweis auf eine Doku!) kann ich dafür auch ein Script schreiben…

Wow, cool, danke für die Skripte. Hier wäre ein Modul natürlich genial :slight_smile:

Super danke, ja stimmt die Daten in der Fusion App mit Netzbezug kommen ja aus dem SmartMeter, hast du hier auch einen DTSU666 bestellt?

Danke nochmals für das tolle script :slight_smile:

Ja Danke @drapple für das Script, enorm geholfen auf den ersten Schritten das Monitoring auf die richtige Bahn zu bringen. Wir haben neben dem WR und Akku auch den DTSU666H als Meter installiert. Folgende Modbusadressen Nr. 1-8 sowie 12&13, 19-21 haben sich als nützlich erwiesen,…

1 „Gefällt mir“

Gerne, kleine frage, wie liest Ihr das Smartmeter aus ? Über Modbus TCP über den Wechselrichter oder habt Ihr per 485 Modbus direkt am Smartmeter z.B. einen raspberry pi + R485 Adapter angeschlossen ?

über Dongle per Modbus/TCP. Ich habe aktuell eine ganz besondere Konstellation :wink: da zwei WR nur über das Portal kaskadiert und der Slave nicht über RS485 verbunden, d.h. zwei Dongle und somit zweimal unterschiedliche IP’s zum Abfragen per Modbus, wobei eben nur beim Master WR mit Meter und Speicher Daten.

Willkommen im CLub:

Ich habe 2 Wechselrichter und 1 10kWh Akku Speicher, die 2 W.R. sind über WLAN Modbus
TCP angebunden. Der Akku hängt per Modbus R485 direkt an einem W.R.

Das Smartmeter wird dann an beide Wechselrichter angebuden, somit auch kaskadiert.

Wusste gar nicht, das die Wechselrichter sich auch über TCP Modbus kaskadieren ? Also meine sehen sich so nicht, nur wenn eine R485 Kabel Modbusverbindung besteht zwischen den beiden Wechselrichtern, nur dann sehen die sich gegenseitig.

meiner auch über Modbus TCP IP via Cat Kabel am Dongle, hab die Testhalber die Software BOPVInfo installiert wenn die wer kennt, die lesen die Daten via API aus wenn das was hilft, hab ja keine Ahnung von dem Programmier zeug :wink:

Aber wär Cool auch die Daten des Smart Meters auszulesen.

Danke
Alex

Danke fürs Willkommen @drapple. Tatsächlich ähnliche Komponenten wie Du. Der Master WR ist über RS485 mit Batterie und Smartmeter verbunden, nur der zweite WR ist per eigenen Dongle direkt mit dem Portal verbunden, daher meine Bezeichnung, über das Portal kaskadiert ;-).

Vermutlich und ohne bisher den genauen Grund zu kennen, hat der Elektriker bei der Installation die RS485 Verbindung des Slaves WR nicht zum laufen gebracht -mittlerweile gesehen, pin’s vertauscht- und daher hat er „einfach & schnell“ den beiliegenden Dongle als Workaround für die Einbindung benutzte. Definitiv nicht wie es vorgesehen, aber noch keine Info vom Solarteur, eventuell sogar Vorteile :wink: Was meint Ihr? Ich werde aber den Fehler erst korrigieren wenn die Anlage abgenommen.

Denn ich habe auch noch andere Themen, könnte sogar mit dieser Konstellation zusammenhängen, z.B. Last Anzeige im Portal nimmt bei PV Produktion ab oder geht gegen null,…

Aber zum Punkt zu kommen, die eigentliche Abfrage mit Deinem Script funzt hervorragend für WR, Batterie und SmartMeter. Sowie mit weiteren Modbus Instanz für den zweiten WR. Habe mittlerweile auch geschafft über MQTT einer weiteren App evcc, diese daten von Symcon zur Verfügung zu stellen,… macht Spaß dieses PV,…

@zonex, kenne die BOPVInfo, leider momentan noch nicht zum laufen gebracht, da der Elektriker den API Account nicht aufgesetzt bekommt, ich leider (noch) nicht die Rechte im Portal habe. Mittlerweile hat Roland der Entwickler sogar die Modbus TCP Abfrage ermöglicht, allerdings würde es meine Symcon Abfrage stören, und man kann zwar einen zweiten WR abfragen mit einer zweiten Modbus ID aber nicht zwei IP’s wie bei meiner Konstellation gefordert. Allerdings Lob und Anerkennung, klasse Entwicklung,…