Also, dann beginne ich mal:
Ich habe einen Client Socket angelegt. In den Einstellungen des Client Socket habe ich nur die IP Nummer der Steckdose eingetragen und die Portnummer 1234.
Dann habe ich eine Register Variable angelegt. Als übergeordnete Instanz habe ich den Client Socket angegeben. Als Zielscript zu dieser Register Variable habe ich folgendes hinzugefügt:
<?
if ($IPS_SENDER == "RegisterVariable")
{
$IPS_INSTANCE = 28503 /*[NETIO230B\Register Variable]*/;
$datasets = str_split($IPS_VALUE, 4);
if ($datasets[0] == "250 ");
{
SetValue(58318 /*[Testbereich\NetIO 230B\NETIO Port 1\STATE]*/,substr($datasets[1],0,1));
SetValue(53697 /*[Testbereich\NetIO 230B\NETIO Port 2\STATE]*/,substr($datasets[1],1,1));
SetValue(38358 /*[Testbereich\NetIO 230B\NETIO Port 3\STATE]*/,substr($datasets[1],2,1));
SetValue(38492 /*[Testbereich\NetIO 230B\NETIO Port 4\STATE]*/,substr($datasets[1],3,1));
}
}
?>
Es ist zu erkennen dass ich den Status der 4 Ports in 4 Variablen jeweils mit dem Namen STATE hinein schreibe. Dieses ist die Analyse der von der Steckdose erhaltenen daten, wenn ich eine Abfrage starte. Das Ergebis von der Steckdose sieht so aus: 250 1010
250= OK
1010 sind bereits die Zustände der 4 ports. Ausgelöst wird die Antwort mit folgendem :
Ich der Register Variable ein Zyklisches Ereignis hinzugefügt mit folgendem PHP Code:
$username=getvalue(34497 /*[Testbereich\NetIO 230B\Logindaten\Username]*/);
$password=getvalue(51387 /*[Testbereich\NetIO 230B\Logindaten\Password]*/);
RegVar_SendText($IPS_TARGET, "login ".$username." ".$password.chr(13));
RegVar_SendText($IPS_TARGET, "port list".chr(13));
An diesem ist bereits zu erkennen, dass ich Username und Passwort aus zwei manuell erzeugten Variablen auslese. Dieses Script lasse ich alle 5 Sekunden laufen, um die Antwort z.B. „250 1010“ zu erhalten.
Die Erkennung und Aktualisierung der 4 Status Variablen funktioniert damit schon. Nun kommen die Befehle um die Steckdosen ein- und auszuschalten:
Port 1 einschalten:
<?
error_reporting(0);
$username=getvalue(34497 /*[Testbereich\NetIO 230B\Logindaten\Username]*/);
$password=getvalue(51387 /*[Testbereich\NetIO 230B\Logindaten\Password]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
IPS_ApplyChanges(13596 /*[NETIO230B]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
echo "<FONT SIZE='+3' COLOR=red><br>STECKDOSENLEISTE REAGIERT NICHT</FONT>";
die();
}
}
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "login ".$username." ".$password.chr(13));
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "port 1 1".chr(13));
setvalue(58318 /*[Testbereich\NetIO 230B\NETIO Port 1\STATE]*/, true);
?>
Port 1 ausschalten:
<?
error_reporting(0);
$username=getvalue(34497 /*[Testbereich\NetIO 230B\Logindaten\Username]*/);
$password=getvalue(51387 /*[Testbereich\NetIO 230B\Logindaten\Password]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
IPS_ApplyChanges(13596 /*[NETIO230B]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
echo "<FONT SIZE='+3' COLOR=red><br>STECKDOSENLEISTE REAGIERT NICHT</FONT>";
die();
}
}
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "login ".$username." ".$password.chr(13));
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "port 1 0".chr(13));
setvalue(58318 /*[Testbereich\NetIO 230B\NETIO Port 1\STATE]*/, false);
?>
Zuerst wird getestet ob die IO Instanz als fehlerhaft markiert ist weil z.B. die Steckdosenleiste nicht angesteckt / nicht online ist.
Dann wird eingeloggt und der Text „port 1 1“ gesendet, was bedeutet Port 1 auf 1 (einschalten)
Dann setze ich meine Statusvariable für Port1 gleich auch auf 1(true) oder 0(false), damit ich den richtigen Status nicht erst nach 5 Sekunden sehe, wenn die zyklische Abfrage kommt.
Wollt Ihr alle 4 Ports gleichzeitig senden, dann kommt dieser Befehl zum einsatz:
Alle Ports aus:
<?
error_reporting(0);
$username=getvalue(34497 /*[Testbereich\NetIO 230B\Logindaten\Username]*/);
$password=getvalue(51387 /*[Testbereich\NetIO 230B\Logindaten\Password]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
IPS_ApplyChanges(13596 /*[NETIO230B]*/);
$netio_status = IPS_GetInstance(13596 /*[NETIO230B]*/);
if ($netio_status['InstanceStatus']>102){
echo "<FONT SIZE='+3' COLOR=red><br>STECKDOSENLEISTE REAGIERT NICHT</FONT>";
die();
}
}
CSCK_SetOpen(13596 /*[NETIO230B]*/, true);
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "login ".$username." ".$password.chr(13));
RegVar_SendText(28503 /*[NETIO230B\Register Variable]*/, "port list 0000".chr(13));
setvalue(58318 /*[Testbereich\NetIO 230B\NETIO Port 1\STATE]*/, false);
setvalue(53697 /*[Testbereich\NetIO 230B\NETIO Port 2\STATE]*/, false);
setvalue(38358 /*[Testbereich\NetIO 230B\NETIO Port 3\STATE]*/, false);
setvalue(38492 /*[Testbereich\NetIO 230B\NETIO Port 4\STATE]*/, false);
?>
der große Unterschied ist die Zeile, in der der Text „port list 0000“ zur Steckdose gesendet wird, und ich aktualisiere danach alle 4 Statusvariablen einzeln.
Ich weiss nicht ob es eine schönere Lösung gibt. Diese Kombination ist das Ergebnis aus einer Lernphase, die vor ca 1 Monat mit IPS begonnen hat. Und die Register Variable habe ich erst heute Nacht zum laufen gebracht :c)
Wenn Ihr einen Verschönerungsvorschlag habt, dann bin ich um alles dankbar, ich lerne ja immer noch