Hallo zusammen,
ausgehend vom Beitrag Einbinden Netzwerksteckdosen Netio 230a habe ich ein Script geschrieben, welches die benötigten Variablen und Scripte anlegt.
Es gibt:
[ul]
[li]für jeden Port eine Statusvariable[/li][li]für jeden Port ein „An-Script“[/li][li]für jeden Port ein „Aus-Script“[/li][li]für jeden Port ein „Umschalt-Script“[/li][li]ein Script, welches alle Ports ausschaltet[/li][li]ein Script, welches den Status aller Ports abfragt[/li][/ul]
Die An- und Aus-Scripte schalten, wie der Name schon sagt, den jeweiligen Port an oder aus. Nach dem Schalten wird noch einmal der Status abgefragt, um so sicherzugehen, dass der Schaltvorgang angekommen ist. Erst danach wird die Statusvariable entsprechend gesetzt.
Das Script, welches alle Ports ausschaltet, sollte selbsterklärend sein.
Das Umschalt-Script toggelt, d.h. ist der Port an, wird er ausgeschaltet und umgekehrt.
Das Script, welches den Status aller Ports abfragt, kann man nach Belieben ausführen oder z.B. timergesteuert laufen lassen. Sofern man am Gerät auch manuell schaltet, sollte man es timergesteuert z.B. alle 60 Sekunden laufen lassen. Ich lasse es hier nur nach dem Start von IPS laufen, damit IPS die Zustände der Ports kennt, denn ich schalte nicht direkt am Gerät.
Zur Installation einfach in den ersten Zeilen des Scriptes die Variablen anpassen und Script ausführen.
Die Logindaten und die IP-Adresse werden in Variablen geschrieben. Beim Ändern der Logindaten oder der IP müssen somit nur diese Variablen angefasst werden, anstatt 14 Scripte zu editieren.
Ich habe mich bewusst für die Abfrage des Status des zu schaltenden Ports in den jeweiligen Scripten entschieden, denn so wird nur der Timestamp des zu schaltenden Ports aktualisiert, anstatt alle Variablen.
Ich habe das Script nach bestem Wissen und Gewissen geschrieben. Ich habe es hier ausführlich getestet und konnte keine Fehler feststellen. Ich habe es so geschrieben, wie es mir meine beschränkten PHP-Grundkenntnisse erlauben und bin mir sicher, dass man vieles besser, einfacher und eleganter lösen kann. Trotzdem habe ich mich dazu entschieden, es zur Verfügung zu stellen, denn vielleicht haben andere noch was davon. Ich übernehme keine Haftung für evtl. kaputtgeschossene IPS Installationen
Dank an dieser Stelle an Raketenschnecke für das Grundgerüst der Scripte und an Ferengi-Master, aus dessen Wecker-Script ich mir angeschaut habe, wie man IPS dazu bringt, Kategorien, Scripte und Variablen per Script anzulegen. Ich hoffe, es ist okay, dass ich mir ein wenig abgekupfert habe.
Freue mich über Feedback!
Grüße,
Christoph
Script:
<?
// Hier Werte eintragen
$IP = "192.168.126.13";
$USERNAME = "user";
$PASSWORD = "user";
$NAME = "NetIO Wohnzimmer";
// ab hier nichts mehr ändern
//--------------------------- Kategorien anlegen --------------------------
// Hauptkategorie anlegen
$ID_Category = IPS_CreateCategory();
IPS_SetName($ID_Category, $NAME);
IPS_SetHidden($ID_Category, true); // Kategorie verstecken
// Unterkategorie anlegen
$ID_CategoryLogin = IPS_CreateCategory();
IPS_SetName($ID_CategoryLogin, "Logindaten");
IPS_SetParent($ID_CategoryLogin, $ID_Category);
//--------------------------- Variablen anlegen ---------------------------
// Variablen für IP, Username und Password anlegen
$VarIP = IPS_CreateVariable(3);
IPS_SetName($VarIP, "IP-Address");
IPS_SetParent($VarIP,$ID_CategoryLogin);
SetValueString($VarIP, $IP);
$VarUser = IPS_CreateVariable(3);
IPS_SetName($VarUser, "Username");
IPS_SetParent($VarUser,$ID_CategoryLogin);
SetValueString($VarUser, $USERNAME);
$VarPass = IPS_CreateVariable(3);
IPS_SetName($VarPass, "Password");
IPS_SetParent($VarPass,$ID_CategoryLogin);
SetValueString($VarPass, $PASSWORD);
//--------------------------- Scripte anlegen -----------------------------
// Pro Port ein Script anlegen
$PortScripts = array
('Port 1','Port 2','Port 3','Port 4');
// Array für Statusvariablen
$StatusVarIDs = array();
$length = count($PortScripts); // Länge auslesen
for ($x=0; $x<=$length-1; $x++)
{
$VarPort = IPS_CreateVariable(0);
$StatusVarIDs[$x] = $VarPort;
$y = $x + 1; // Variable, welcher Port gerade behandelt wird
IPS_SetName($VarPort, $PortScripts[$x]);
IPS_SetParent($VarPort,$ID_Category);
// Kommandos für jedes einzelne Script erzeugen
switch($x){
case 0:
$SwitchOnCommand = "1uuu";
$SwitchOffCommand = "0uuu";
$PortStatus = "\$Port1Status = substr(\$PortStatus,6,1);";
break;
case 1:
$SwitchOnCommand = "u1uu";
$SwitchOffCommand = "u0uu";
$PortStatus = "\$Port2Status = substr(\$PortStatus,8,1);";
break;
case 2:
$SwitchOnCommand = "uu1u";
$SwitchOffCommand = "uu0u";
$PortStatus = "\$Port3Status = substr(\$PortStatus,10,1);";
break;
case 3:
$SwitchOnCommand = "uuu1";
$SwitchOffCommand = "uuu0";
$PortStatus = "\$Port4Status = substr(\$PortStatus,12,1);"."
";
break;
}
// Einschaltscript
$newScriptON = IPS_CreateScript(0);
$ScriptPath = $newScriptON . ".ips.php";
IPS_SetParent($newScriptON, $VarPort);
IPS_SetName($newScriptON, $PortScripts[$x] . " - ON");
// Script erzeugen
$Script1="<?"."
";
$Script1.="/*"."
";
$Script1.="// Script zum Einschalten von " . $PortScripts[$x] ."
";
$Script1.="*/"."
";
$Script1.="\$IPAddress = GetValueString(". $VarIP .");" . "
";
$Script1.="\$Username = GetValueString(". $VarUser .");" . "
";
$Script1.="\$Password = GetValueString(". $VarPass .");" . "
";
$Script1.="
";
$Script1.="// Kommandos definieren " . "
";
$Script1.="\$Login = \"http://\$IPAddress/tgi/control.tgi?login=p:\$Username:\$Password\";" . "
";
$Script1.="\$Switch = \"http://\$IPAddress/tgi/control.tgi?p=" . $SwitchOnCommand . "\";" ."
";
$Script1.="\$GetStatus = \"http://\$IPAddress/tgi/control.tgi?p=l\";" ."
";
$Script1.="\$Logout = \"http://\$IPAddress/tgi/control.tgi?quit=quit\";" ."
";
$Script1.="\$DoLogin = Sys_GetURLContent(\$Login);" ."
";
$Script1.="\$DoSwitch = Sys_GetURLContent(\$Switch);" ."
";
$Script1.="\$PortStatus = Sys_GetURLContent(\$GetStatus);"."
";
$Script1.="\$DoLogout = Sys_GetURLContent(\$Logout);"."
";
$Script1.="
";
$Script1.="// Statusvariable für Port aktualisieren: " . "
";
$Script1.=$PortStatus ."
";
$Script1.="SetValue(" . $StatusVarIDs[$x] . ",\$Port" . $y . "Status)";
$Script1.="
";
$Script1.="
" . "?>"."
";
$fn = IPS_GetKernelDir()."scripts\\".$newScriptON.".ips.php";
$handle=fopen($fn,"w");
fwrite($handle,$Script1);
fclose($handle);
IPS_SetScriptFile($newScriptON, $ScriptPath);
// Ausschaltscript
$newScriptOFF = IPS_CreateScript(0);
$ScriptPath = $newScriptOFF . ".ips.php";
IPS_SetParent($newScriptOFF, $VarPort);
IPS_SetName($newScriptOFF, $PortScripts[$x] . " - OFF");
// Script erzeugen
$Script2="<?"."
";
$Script2.="/*"."
";
$Script2.="// Script zum Ausschalten von " . $PortScripts[$x] ."
";
$Script2.="*/"."
";
$Script2.="\$IPAddress = GetValueString(". $VarIP .");" . "
";
$Script2.="\$Username = GetValueString(". $VarUser .");" . "
";
$Script2.="\$Password = GetValueString(". $VarPass .");" . "
";
$Script2.="
";
$Script2.="// Kommandos definieren " . "
";
$Script2.="\$Login = \"http://\$IPAddress/tgi/control.tgi?login=p:\$Username:\$Password\";" . "
";
$Script2.="\$Switch = \"http://\$IPAddress/tgi/control.tgi?p=" . $SwitchOffCommand . "\";" ."
";
$Script2.="\$GetStatus = \"http://\$IPAddress/tgi/control.tgi?p=l\";" ."
";
$Script2.="\$Logout = \"http://\$IPAddress/tgi/control.tgi?quit=quit\";" ."
";
$Script2.="
";
$Script2.="\$DoLogin = Sys_GetURLContent(\$Login);"."
";
$Script2.="\$DoSwitch = Sys_GetURLContent(\$Switch);"."
";
$Script2.="\$PortStatus = Sys_GetURLContent(\$GetStatus);"."
";
$Script2.="\$DoLogout = Sys_GetURLContent(\$Logout);"."
";
$Script2.="
";
$Script2.="// Statusvariable für Port aktualisieren: " . "
";
$Script2.=$PortStatus ."
";
$Script2.="SetValue(" . $StatusVarIDs[$x] . ",\$Port" . $y . "Status)";
$Script2.="
";
$Script2.="
" . "?>"."
";
$fn = IPS_GetKernelDir()."scripts\\".$newScriptOFF.".ips.php";
$handle=fopen($fn,"w");
fwrite($handle,$Script2);
fclose($handle);
IPS_SetScriptFile($newScriptOFF, $ScriptPath);
// Umschaltscript
$newScriptToggle = IPS_CreateScript(0);
$ScriptPath = $newScriptToggle . ".ips.php";
IPS_SetParent($newScriptToggle, $VarPort);
IPS_SetName($newScriptToggle, $PortScripts[$x] . " - Toggle");
$Script3="<?"."
";
$Script3.="/*"."
";
$Script3.="// Script zum Umschalten von " . $PortScripts[$x] ."
";
$Script3.="*/"."
";
$Script3.="\$PortStatus = GetValueBoolean(". $StatusVarIDs[$x] .");". "
";
$Script3.="if (\$PortStatus){ " . "
";
$Script3.=" IPS_RunScript(". $newScriptOFF .");" . "
";
$Script3.="}" . "
";
$Script3.="else {" . "
";
$Script3.=" IPS_RunScript(". $newScriptON .");" . "
";
$Script3.="}" . "
";
$fn = IPS_GetKernelDir()."scripts\\".$newScriptToggle.".ips.php";
$handle=fopen($fn,"w");
fwrite($handle,$Script3);
fclose($handle);
IPS_SetScriptFile($newScriptToggle, $ScriptPath);
}
// Script zur Abfrage der Ports
$newScriptStatus = IPS_CreateScript(0);
$ScriptPath = $newScriptStatus . ".ips.php";
IPS_SetParent($newScriptStatus, $ID_Category);
IPS_SetName($newScriptStatus, $NAME . " - Status");
// Script erzeugen
$Script4="<?"."
";
$Script4.="/*"."
";
$Script4.="// Script zur Abfrage von allen Ports." . "
";
$Script4.="*/"."
";
$Script4.="\$IPAddress = GetValueString(". $VarIP .");" . "
";
$Script4.="\$Username = GetValueString(". $VarUser .");" . "
";
$Script4.="\$Password = GetValueString(". $VarPass .");" . "
";
$Script4.="
";
$Script4.="// Kommandos definieren " . "
";
$Script4.="\$Login = \"http://\$IPAddress/tgi/control.tgi?login=p:\$Username:\$Password\";" . "
";
$Script4.="\$GetStatus = \"http://\$IPAddress/tgi/control.tgi?p=l\";" ."
";
$Script4.="\$Logout = \"http://\$IPAddress/tgi/control.tgi?quit=quit\";" ."
";
$Script4.="\$DoLogin = Sys_GetURLContent(\$Login);"."
";
$Script4.="\$Portstatus = Sys_GetURLContent(\$GetStatus);"."
";
$Script4.="\$DoLogout = Sys_GetURLContent(\$Logout);"."
";
$Script4.="
";
$Script4.="\$Port1Status = substr(\$Portstatus,6,1);"."
";
$Script4.="\$Port2Status = substr(\$Portstatus,8,1);"."
";
$Script4.="\$Port3Status = substr(\$Portstatus,10,1);"."
";
$Script4.="\$Port4Status = substr(\$Portstatus,12,1);"."
";
$Script4.="
";
$Script4.="SetValue(" . $StatusVarIDs[0] . ",\$Port1Status);"."
";
$Script4.="SetValue(" . $StatusVarIDs[1] . ",\$Port2Status);"."
";
$Script4.="SetValue(" . $StatusVarIDs[2] . ",\$Port3Status);"."
";
$Script4.="SetValue(" . $StatusVarIDs[3] . ",\$Port4Status);"."
";
$Script4.="
" . "?>"."
";
$fn = IPS_GetKernelDir()."scripts\\".$newScriptStatus.".ips.php";
$handle=fopen($fn,"w");
fwrite($handle,$Script4);
fclose($handle);
IPS_SetScriptFile($newScriptStatus, $ScriptPath);
// Script um alle Ports gleichzeitig auszuschalten
$newScriptAllOFF = IPS_CreateScript(0);
$ScriptPath = $newScriptAllOFF . ".ips.php";
IPS_SetParent($newScriptAllOFF, $ID_Category);
IPS_SetName($newScriptAllOFF, $NAME . " - alle aus");
// Script erzeugen
$Script5="<?"."
";
$Script5.="/*"."
";
$Script5.="// Script zum Ausschalten von allen Ports gleichzeitig
";
$Script5.="*/"."
";
$Script5.="\$IPAddress = GetValueString(". $VarIP .");" . "
";
$Script5.="\$Username = GetValueString(". $VarUser .");" . "
";
$Script5.="\$Password = GetValueString(". $VarPass .");" . "
";
$Script5.="
";
$Script5.="// Kommandos definieren " . "
";
$Script5.="\$Login = \"http://\$IPAddress/tgi/control.tgi?login=p:\$Username:\$Password\";" . "
";
$Script5.="\$Switch = \"http://\$IPAddress/tgi/control.tgi?p=0000\";" ."
";
$Script5.="\$GetStatus = \"http://\$IPAddress/tgi/control.tgi?p=l\";" ."
";
$Script5.="\$Logout = \"http://\$IPAddress/tgi/control.tgi?quit=quit\";" ."
";
$Script5.="
";
$Script5.="\$DoLogin = Sys_GetURLContent(\$Login);" ."
";
$Script5.="\$DoSwitch = Sys_GetURLContent(\$Switch);"."
";
$Script5.="\$PortStatus = Sys_GetURLContent(\$GetStatus);"."
";
$Script5.="\$DoLogout = Sys_GetURLContent(\$Logout);"."
";
$Script5.="
";
$Script5.="// Statusvariable für alle Ports aktualisieren: " . "
";
$Script5.="\$Port1Status = substr(\$PortStatus,6,1);"."
";
$Script5.="\$Port2Status = substr(\$PortStatus,8,1);"."
";
$Script5.="\$Port3Status = substr(\$PortStatus,10,1);"."
";
$Script5.="\$Port4Status = substr(\$PortStatus,12,1);"."
";
$Script5.="
";
$Script5.="SetValue(" . $StatusVarIDs[0] . ",\$Port1Status);"."
";
$Script5.="SetValue(" . $StatusVarIDs[1] . ",\$Port2Status);"."
";
$Script5.="SetValue(" . $StatusVarIDs[2] . ",\$Port3Status);"."
";
$Script5.="SetValue(" . $StatusVarIDs[3] . ",\$Port4Status);"."
";
$Script5.="
" . "?>"."
";
$fn = IPS_GetKernelDir()."scripts\\".$newScriptAllOFF.".ips.php";
$handle=fopen($fn,"w");
fwrite($handle,$Script5);
fclose($handle);
IPS_SetScriptFile($newScriptAllOFF, $ScriptPath);
?>