NetIO 230A - Installationsscript

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 :loveips:

3.png

5.png

Respekt … nach einem Monat IPS hatte ich die Registervariable noch nicht verstanden :slight_smile:

Ich werde den Code hier bei Gelegenheit mal testen.

Ich hätte folgendes anders gelöst:
Ich setze bei mir den Status nicht einfach so, sondern frage das Gerät noch mal gezielt nach dem Status des Ports, den ich gerade geschaltet habe. So kann ich sichergehen, dass meine IPS-Variable auch exakt den Status hat, den das NetIO hat. So umgehe ich die Abfrage alle 5 Sekunden. Dadurch, dass Du alle 5 Sekunden fragst, sollte das aber bei Dir auch ausgeschlossen sein, dass die IPS-Variable einen falschen Status haben könnte.
Ich glaube aber, das ist Geschmacksache!?

Mich würde noch eins interessieren:
Wenn Du den CGI-Befehl, so wie ich ihn in meinen Scripten verwende, über den Browser abfeuerst, braucht das NetIO dann auch 2 Sekunden, bis es reagiert?

Wenn allgemeiner Bedarf besteht, würde ich ein Install-Script für die Register-Variablen-Variante schreiben…!?

Gruß,
Christoph

Ich frage alle 5 Sekunden aus folgendem Grund ab:

Wenn jemand an der Steckdosenleiste direkt ein Gerät einschaltet, dann sendet das Gerät selbstständig leider kein Status zum IPS.

Ich setze die Statusvariable aus folgendem Grund manuell:
Wenn ich im iFront den Switch betätige, dann springt dieser zurück, bis über die Abfrage ein Ergebnis zurück kommen würde. Danach springt der Switch wieder auf das gewünschte Ergebnis. Ich mag diese herumspringerei nicht. Deswegen setze ich die Statusvariable manuell, da es bisher nie vorkam, dass der Befehl nicht akzeptiert wurde. Sollte es aus irgendeinem Grund trotzdem nicht klappen, dann springt der Switch im iFront spätestens nach 5 Sekunden auf den realen Wert zurück, weil die Abfrage zugeschlagen hat. Aber Du hast recht: Nach jedem Portänderungsbefehl könnte ich die Statusabfrage hinterher senden, so weiss ich nicht erst nach 5 Sekunden den echten Status, aber die herumspringerei im iFront bleibt trotzdem.

Das mit dem CGI kann ich erst wieder testen, wenn ich zurück bin. Aber wenn Du es über Telnet / Client Socket machst, dann brauchst Du ja die CGI Befehle nicht mehr, oder?

Okay, verstanden.

Ich habe mal quick & dirty Deine Client-Socket Lösung zusammengebaut --> funktioniert! Werde in den nächsten Tagen mal ein bißchen daran rumbasteln.

Richtig, wenn die Lösung funktioniert, brauche ich die CGI-Befele nicht mehr. Bin trotzdem gespannt auf Dein Ergebnis, wie das Ding auf CGI aus dem Browser reagiert.

Danke erstmal!

Gruß,
Christoph

Hallo,

habe bei mir jetzt eine NETIO230B installiert und alles so eingerichtet wie beschreiben.
Das Ereignis auf die Register Variable lasse ich jede Minute laufen, dann ist mit dem Client Socket alles OK.
Ändere ich die Zeit auf größer 1 Minute fällt der Client Socket aus, nach einer gewissen Zeit ist dieser wieder OK.
Deaktiviere ich das Ereignis fällt der Client Socket auch aus.
Im LOG steht folgendes:


Der Server läuft unter Ubuntu.
Könntes eventuell Probleme geben mit dem Client Socket unter Ubuntu?

Gruß Ralf

Hallo,

der Tread ist zwar schon uralt, ich habe aber zwei Netio 230b, die ich gerne einbinden möchte.
Ich habe es zwar geschafft, das Script von Seite einzubauen, aber die Ports stehen alle vier auf False und der „Anleitung“ von Simba69 kann ich nicht folgen. Kann mir jemand helfen, was ich tun muss?

Gruß

Oliver

Ja, mehr Informationen liefern, so dass Dir geholfen werden kann.

Das alle Ports auf False stehen muss ja kein Fehler sein, wenn alle 4 Steckdosen aus sind.

Hi,

ich habe das Script übernommen, da ich einen anderen Port verwende, diesen angehängt.
User und Passswort. Ergebnis siehe Anhänge. im Webfront erscheint nichts.

Gruß

Oliver

Was passiert, wenn Du 50308 ausführst?

hi,

Script ist leer

<?

//Start writing your scripts between the brackets

?>

Dann ist beim Ausführen des Scripts aus dem 1. Beitrag irgendwas schiefgegangen.

Sind die anderen Skripte auch alle leer? Kannst Du denn aus IPS heraus schalten?

Hallo,

die sind alle leer. ???

an was kann das liegen?

Fehler wurde keiner gemeldet und alles was angezeigt wurde ist automatisch erzeugt worden

Oliver

muss ich die Teilscripte manuell in die Unterpunkte eintragen?

Ganz sicher, dass es beim Ausführen des Skripts aus dem 1. Beitrag keine Meldung im Meldungsfenster gab?

Das Skript habe ich damals unter IPS 3.4 geschrieben. Ich sehe spontan nichts, was unter einer aktuellen Version nicht mehr läuft. Werde das bei Gelegenheit testen.

unten steht nur Laufzeit 51ms Scriptausgabe Text

wo könnte da noch was stehen?

Wenn da im Text nichts steht, dann wirft das Skript tatsächlich keine Fehler.

Werde es bei Gelegenheit testen.

Das Skript wirft unter 4.4 tatsächlich keine Fehler beim Ausführen. Die Skripte der einzelnen Ports bleiben aber leer. Im IPS haben sich seit 2011 unter der Haube ein paar Dinge geändert. Das Install Skript müsste diesbezüglich angepasst werden. Oder man macht gleich ein Modus draus …

Ich setze die NetIO nicht mehr ein …