Script per Script erstellen, aber wie ?

Ich habe mir ein Script geschrieben und wurde gerne das Ergebniss in ein Script schreiben, aber ich komme nicht drauf wie das gehen soll:

<?

foreach(IPS_GetInstanceList() as $i_id)
{
//echo $i_id;
$i_name=IPS_GetName($i_id);

$Zustand_ID = @IPS_GetObjectIDByName("Zustand", $i_id);
$Steuerung_ID = @IPS_GetObjectIDByName("Steuerung", $i_id);
$Level_ID = @IPS_GetObjectIDByName("Level", $i_id);
$Temperatur_ID=@IPS_GetObjectIDByName("Temperatur", $i_id);
$Luftfeuchte_ID=@IPS_GetObjectIDByName("Luftfeuchte", $i_id);
$Soll_Temperatur_ID=@IPS_GetObjectIDByName("Soll Temperatur", $i_id);
$Ventiloeffnung_ID=@IPS_GetObjectIDByName("Ventiloeffnung", $i_id);

//print "Name: $i_name Zustand ID: $Zustand_ID Steuerung ID : $Steuerung_ID $ Level ID: $Level_ID  Temperatur ID: $Temperatur_ID Luftfeuchte : $Luftfeuchte_ID Soll Temp: $Soll_Temperatur_ID Ventiloeffnung_ID : $Ventiloeffnung_ID";

$instanz_id_text="$".$i_name."_ID=".$i_id."
";
$Zustand_ID_text= "$".$i_name."Zustand_ID=".$Zustand_ID."
";
$Steuerung_ID_text= "$".$i_name."Steuerung_ID=".$Steuerung_ID."
";
$Level_ID_text= "$".$i_name."Level_ID=".$Level_ID."
";
$Temperatur_ID_text= "$".$i_name."Temperatur_ID=".$Temperatur_ID."
";
$Luftfeuchte_ID_text= "$".$i_name."Luftfeuchte_ID=".$Luftfeuchte_ID."
";
$Soll_Temperatur_ID_text= "$".$i_name."Soll_Temperatur_ID=".$Soll_Temperatur_ID."
";
$Ventiloeffnung_ID_text= "$".$i_name."Ventiloeffnung_ID=".$Ventiloeffnung_ID."
";



}


?>

Kann mir jemand helfen :rolleyes:

Hast eine PN

Hi!

Schreib doch für alle die Lösung hin, dann muss nicht jeder neu fragen :slight_smile:

Beispiel aus dem Installer von meiner AktorSteuerung:

function Script_TimerEvents_Erstellen($ParentID) {
$Script_TimerEvents_ID = @IPS_GetScriptIDByName("AktorSteuerung_TimerEvents", $ParentID);
if ($Script_TimerEvents_ID === false) {
	fopen("AktorSteuerung_TimerEvents.ips.php","w");
	$Script_TimerEvents_Path = "AktorSteuerung_TimerEvents.ips.php";
	$Script_TimerEvents_ID = IPS_CreateScript(0);
	$Script_TimerEvents = IPS_GetScript($Script_TimerEvents_ID);
	unlink(IPS_GetKernelDir() . "/scripts/" . $Script_TimerEvents["ScriptFile"]);
	IPS_SetScriptFile($Script_TimerEvents_ID, $Script_TimerEvents_Path);
	IPS_SetName($Script_TimerEvents_ID, "AktorSteuerung_TimerEvents");
   IPS_SetParent($Script_TimerEvents_ID, $ParentID);
	$Script_TimerEvents_Content =
'<?
include "AktorSteuerung.ips.php";
if ($_IPS["SENDER"] == "TimerEvent") {
	$EventID = $_IPS["EVENT"];
	IPS_SetEventActive($EventID, false);
	$Aktor = IPS_GetName($EventID);

	// Spezialteil für Leinwand-2xSchalter
	if ($Aktor == "Heimkino_Leinwand") {
	   AktorSteuerung($Aktor, "SPERRE", "AUS");
	   AktorSteuerung($Aktor, "STOP");
	   return;
	}
	AktorSteuerung($Aktor, "AUS", "OnTimeCheckWert");
}
?>';
   IPS_SetScriptContent($Script_TimerEvents_ID, $Script_TimerEvents_Content);
}}

$Script_TimerEvents_Content >> Der Teil wird in das neue Script-File geschrieben

Grüße,
Chris

$Script = IPS_CreateScript(0); 
$ScriptPath = $Script . ".ips.php"; 
IPS_SetParent($Script, $Parent); 
IPS_SetName($Script, "Name"); 

$scriptinhalt = ""; //Text des scriptes
$FileName = IPS_GetKernelDir()."scripts\\".Name".ips.php"; 
$FileHandle = fopen($FileName,"w"); 
fwrite($FileHandle,$scriptinhalt); 
fclose($FileHandle); 
IPS_SetScriptFile($Script, $ScriptPath); 

oder so ähnlich.

PN hat schon einen Grund

Darf man fragen warum nicht SetScriptContent ?
Haben beide Wege irgendwelche vor/Nachteile ?
Bei letzterem Beispiel sehe ich nur dass es eventuell bei nicht Windows IPS zu Problemen kommt.
Michael

Ich nutze doch IPS_SetScriptContent !? :confused: Vorletzte Zeile in der function :slight_smile:

Vorteile/Nachteile? Kein Plan, es funktioniert gut und ich kann alles festlegen was ich will :smiley:

Grüße,
Chris

Chris, ich habe nicht auf deinen Post geantwortet oder ?
Ich meinte audi2010 Script.
Michael

Dachte war auf beide bezogen wegen „haben beide Wege irgendwelche …“

…zu heiß…dachte du hast es überlesen…falsch verstanden :smiley:

Weitermachen :smiley:

Grüße,
Chris

Danke für euer tolle Hilfe :smiley:

Jetzt klappt das schon mal, das alles schön in ein Script geschrieben wird… :slight_smile:

Jetzt muss ich nich rausfinden, wenn eine Variable leer ist das er dann diese nicht schreiben soll und Leerzeichen sollen gegen „-“ ausgetauscht werden :wink:

Dann weis ich noch nicht wie ich es hinbekommen kann, das er nur einmal in dem erzeugtem Script :

&lt;?

?&gt;

einsetzt ?

Jetzt echt? Über 1000 Beiträge und dann solche Fragen? :rolleyes: :smiley: Irgendwas läuft hier falsch :smiley:

Wenn Variable leer > wie leer? if ($var == „“) if ($var == false) ??

" " durch „-“ ersetzen > $BLA = str_replace(" „,“-",$BLA);

Den letzten Teil mit <? ?> verstehe ich nicht… Der schreibt das in dein Script, was in Content steht…

Grüße,
Chris

Weil ich nicht so der grosse ProgrammierGuru bin.

Habs jetzt nochmal versucht:

<?
// Erstellen eines Scriptes per Script in der selben Kategorie
// 06.07.2015
$ScriptName = "Example4.ips.php"; //Skriptdatei

$Parent = IPS_GetParent($_IPS['SELF']);
$ScriptID = IPS_CreateScript(0);
IPS_SetParent($ScriptID, $Parent);
IPS_SetName($ScriptID, $ScriptName);

$content="<?"."
";
$content.="/*" . "
";
$content.="Irgendwas: 
";
$content.="*/";
$content.="

";
$content.="//Script erstellt am " . date('d.m.Y') . " um " . date('H:i:s') . "
";
$content.="echo('Script erstellt am ' . date('d.m.Y') . ' um ' . date('H:i:s') . '
');";
$content.="

";
$content.="?>";

IPS_SetScriptContent($ScriptID, $content);

echo"Die Skript-ID lautet: ". $ScriptID . "
";
echo"Der Name lautet     : ". IPS_GetName($ScriptID);
?>

Vielen Dank, mit eueren Tips habt ihr mich fast zur kompletten Lösung gebracht :wink:

Ich verstehe nur folgende Sache nicht:

Wenn ich es so mache

$i_name0 = IPS_GetName(44667  /*[Räume\Küche\Küche Licht 2]*/);

$i_name1 = str_replace(" ","_",$i_name0);
$i_name2 = str_replace("ü","ue",$i_name1);

print $i_name2;

Dann spuckt er das aus : Küche_Licht_2
Also ersetzt er die Leerzeichen brav mit _ :slight_smile:

Aber warum ersetzt er das ü nicht gegeb ue ?

Wenn ich es so mache :

$i_name0 = "Küche Licht 2"; 

$i_name1 = str_replace(" ","_",$i_name0);
$i_name2 = str_replace("ü","ue",$i_name1);

print $i_name2;

Dann macht es alles richtig : Kueche_Licht_2

Warum wo liegt der Unterschied ?

IPS auf Windows ? Oder 4.x auf non-Windows ?
Dort gibt es noch Probleme mit dem Zeichensatz (in Skripten).
Michael

Linux (ras Pi 2)…

Meno liegt es daran ?

Jup. Ist halt nicht für Produktiv gedacht :wink:
Das ist einer der Bugs warum ich noch nicht mit meinen Projekten weiter mache.
Michael

O. k. dann mache ich unter Windows halt weiter [emoji37], aber vielen Dank für den Hinweis

Auf Windows klappt es, das Script ist soweit fertig, bis auf einen kleinen Fehler, es legt leider alles mehrmals an, wie kann ich das verhindern ?

Hier das Script:

<?
$Script = IPS_CreateScript(0);
//$Script = "20083";
$ScriptPath =$Script.".ips.php";
//IPS_SetParent($Script, $Parent);
IPS_SetName($Script, "Variablen");




$scriptinhalt = "<?"."
"; //Text des scriptes

$FileName = IPS_GetKernelDir()."scripts/".$Script.".ips.php";
print $FileName;
$FileHandle = fopen($FileName,"w");
fwrite($FileHandle,$scriptinhalt);
fclose($FileHandle);
//IPS_SetScriptFile($Script, $ScriptPath);

foreach(IPS_GetInstanceList() as $i_id)
{
//echo $i_id;
$i_name0 = IPS_GetName($i_id);
$i_name1 = str_replace(" ","_",$i_name0);
$i_name2 = str_replace("ü","ue",$i_name1);
$i_name3 = str_replace("ä","ae",$i_name2);
$i_name4 = str_replace("ö","oe",$i_name3);
$i_name5 = str_replace("Ü","Ue",$i_name4);
$i_name6 = str_replace("Ä","Ae",$i_name5);
$i_name7 = str_replace("Ö","Oe",$i_name6);

//print $i_name7;

$Zustand_ID = @IPS_GetObjectIDByName("Zustand", $i_id);
$Steuerung_ID = @IPS_GetObjectIDByName("Steuerung", $i_id);
$Level_ID = @IPS_GetObjectIDByName("Level", $i_id);
$Temperatur_ID=@IPS_GetObjectIDByName("Temperatur", $i_id);
$Luftfeuchte_ID=@IPS_GetObjectIDByName("Luftfeuchte", $i_id);
$Soll_Temperatur_ID=@IPS_GetObjectIDByName("Soll Temperatur", $i_id);
$Ventiloeffnung_ID=@IPS_GetObjectIDByName("Ventiloeffnung", $i_id);

//print "Name: $i_name Zustand ID: $Zustand_ID Steuerung ID : $Steuerung_ID $ Level ID: $Level_ID  Temperatur ID: $Temperatur_ID Luftfeuchte : $Luftfeuchte_ID Soll Temp: $Soll_Temperatur_ID Ventiloeffnung_ID : $Ventiloeffnung_ID";


    

$instanz_id_text="$".$i_name7."_ID=".$i_id.";"."
";
if ($Zustand_ID !="")$Zustand_ID_text="$".$i_name7."_Zustand_ID=".$Zustand_ID.";"."
";
if ($Steuerung_ID !="")$Steuerung_ID_text= "$".$i_name7."_Steuerung_ID=".$Steuerung_ID.";"."
";
if ($Level_ID !="")$Level_ID_text= "$".$i_name7."_Level_ID=".$Level_ID.";"."
";
if ($Temperatur_ID !="")$Temperatur_ID_text= "$".$i_name7."_Temperatur_ID=".$Temperatur_ID.";"."
";
if ($Luftfeuchte_ID !="")$Luftfeuchte_ID_text= "$".$i_name7."_Luftfeuchte_ID=".$Luftfeuchte_ID.";"."
";
if ($Soll_Temperatur_ID !="")$Soll_Temperatur_ID_text= "$".$i_name7."_Soll_Temperatur_ID=".$Soll_Temperatur_ID.";"."
";
if ($Ventiloeffnung_ID !="")$Ventiloeffnung_ID_text= "$".$i_name7."_Zustand_ID=".$Ventiloeffnung_ID.";"."
";



$text=("$instanz_id_text
$Zustand_ID_text
$Steuerung_ID_text
$Level_ID_text
$Temperatur_ID_text
$Luftfeuchte_ID_text
$Soll_Temperatur_ID_text
$Ventiloeffnung_ID_text");

//$Script = "20083";
$scriptinhalt = "$text"; //Text des scriptes

//$FileName = IPS_GetKernelDir()."scripts/".$Script.".ips.php";
$FileHandle = fopen($FileName,"a");
fwrite($FileHandle,$scriptinhalt);
fclose($FileHandle);
IPS_SetScriptFile($Script, $ScriptPath);

}



$scriptinhalt = "?>"; //Text des scriptes

//$FileName = IPS_GetKernelDir()."scripts/".$Script.".ips.php";
$FileHandle = fopen($FileName,"a");
fwrite($FileHandle,$scriptinhalt);
fclose($FileHandle);
IPS_SetScriptFile($Script, $ScriptPath);

?>

Es wird ein Script ins IPS angelegt mit dem Namen " variablen", in dieses Script werden dann die einzelnen Variablen angelegt:

$Wohnzimmer_Ventil_ID=40315;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Wohnzimmer_Soll_Temperatur_ID=54873;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Wohnzimmer_Heizung_ID=18371;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Wohnzimmer_Licht_4_ID=45897;
$Wohnzimmer_Licht_4_Steuerung_ID=50825;
$Wohnzimmer_Licht_4_Level_ID=36616;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;$Wohnzimmer_Licht_3_ID=32799;
$Wohnzimmer_Licht_3_Steuerung_ID=52132;
$Wohnzimmer_Licht_3_Level_ID=16913;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Wohnzimmer_Licht_1_ID=46722;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Waschmaschine_2_ID=55158;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Waschmaschine_1_ID=13027;
$Waschmaschine_1_Zustand_ID=46007;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Taster_Erkenner_3_NB_ID=48959;
$Waschmaschine_1_Zustand_ID=46007;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Taster_Erkenner_NB_ID=12169;
$Waschmaschine_1_Zustand_ID=46007;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Mark_Klingel_ID=45028;
$Waschmaschine_1_Zustand_ID=46007;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;
$Wohnzimmer_Heizung_Luftfeuchte_ID=30375;
$Wohnzimmer_Soll_Temperatur_Soll_Temperatur_ID=41276;
$Wohnzimmer_Ventil_Zustand_ID=25801;
$Spuelmaschine_Verbrauch_ID=26282;
$Waschmaschine_1_Zustand_ID=46007;
$Wohnzimmer_Licht_1_Steuerung_ID=43323;
$Wohnzimmer_Licht_1_Level_ID=22111;
$Wohnzimmer_Heizung_Temperatur_ID=34932;

Warum werden die x mal die selben Variablen eingetragen ?

Weil du in der Schleife und am Ende nochmal alles in die Datei schreibst. Zumindest so auf den ersten Blick eher schlecht.
Michael

? Ne am Ende (nach der Schleife) schreibe ich nur „?>“ in Script…

Es muss an der Schleife liegen, weil was vor und nach der Schleife schreibe, schreibt er auch nur 1 x…

Hi!

Ich würde erst den ganzen Script-Kram machen. Also Instanzen/Variablen auslesen, in irgendwelche Variablen/Arrays zwischenlagern und dann am Ende die Daten aufbereitet in das extra Script schreiben lassen. Und nicht immer wieder mal hier und da was reinschreiben lassen, das wird sonst arg unübersichtlich.

Ich verwende allerdings auch IPS_SetScriptContent. Ob da vlt. noch ein Unterschied ist, keine Ahnung?!

Grüße,
Chris