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;
}