Frage zur Auswertung eines Arrays

Hallo,

ich habe es bereits hinbekommen, dass ich meine Terxon Alarmanlage per Relais und IPS aktivieren bzw. deaktivieren kann :slight_smile:

Hierzu verwende ich dieses Script:

<?

switch($_IPS['SENDER'])
{
    case "WebFront":
        SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    switch($_IPS['VALUE'])
    {
       case 0: // Wert Assoziation
				file_get_contents("http://192.168.10.100/?Password=&oC1=1", false, NULL, 0,0);
				IPS_Sleep(3000); //5sek warten
				file_get_contents("http://192.168.10.100/?Password=&oC1=0", false, NULL, 0,0);
       break;
       case 1:
        	   file_get_contents("http://192.168.10.100/?Password=&oC1=1", false, NULL, 0,0);
				IPS_Sleep(3000); //5sek warten
				file_get_contents("http://192.168.10.100/?Password=&oC1=0", false, NULL, 0,0);
       break;
     }
    break;
}

?>

Soweit so gut, nun möchte ich aber auch wissen, ob die Anlage auch wirklich scharf ist. Hierzu konnte ich mittels Relaisausgang an der Alarmanlage selbst, einen Input-Kontakt von meinem SG.1 IpSwitch ansteuern.

Dieser schaltet bei aktiverter Alarmanlage von OFF auf ON (0 auf 1).

Dieser Wert kann ich auch auslesen und steht mir in einer Variable zur Verfügung:

$ip = "192.168.10.100";
$data = file_get_contents("http://$ip/csv.html");
$lines = explode(",", strip_tags($data));

Für mich ist eigentlich nur $lines[1] interessant, da dort die Werte 0 oder 1 stehen.

Nun meine eigentlich Frage - wie müsste ich nun an die Sache ran gehen, dass wenn ich meine Boolean Variable betätige, diese erst dann „true“ anzeigt, wenn der Wert aus Line[1] auch wikrlich den Wert 1 enthält?

Da stehe ich im Moment noch vor einem kleinen Rätsel wie ich das in mein oberes Script einbaue…

Habe mal mit meinem gefährlichen Halbwissen angefangen etwas zu „verbessern“

Hier das Ergebnis:

<?
$ip = "192.168.10.100";
$data = file_get_contents("http://$ip/csv.html");
//$data = file_get_contents("http://$ip/csv.html/?Password=Pass&sb.html");

$lines = explode(",", strip_tags($data));

//print_r($lines); //zeigt in welchen Zeilen was steht.
//$Terxon_Status = '1';
$Terxon_Status = $lines[1];


switch($_IPS['SENDER'])
{
    case "WebFront":
        SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    switch($_IPS['VALUE'])
    {
       case 0: // Wert Assoziation
				file_get_contents("http://192.168.10.100/?Password=&oC1=1", false, NULL, 0,0);
				IPS_Sleep(2000); //2sek warten
				file_get_contents("http://192.168.10.100/?Password=&oC1=0", false, NULL, 0,0);

								if ($Terxon_Status == 0)
								{

SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, true);
								}
								else
								{
				SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, false);
								}


       break;
       case 1:
        	  file_get_contents("http://192.168.10.100/?Password=&oC1=1", false, NULL, 0,0);
			  IPS_Sleep(2000); //2sek warten
			file_get_contents("http://192.168.10.100/?Password=&oC1=0", false, NULL, 0,0);

								if ($Terxon_Status == 1)
								{
SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, false);
								}
								else
								{
					SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, true);
								}
			
				
							
       break;
     }
    break;
}



?>




Was sagen die Profis? Ist das völliger Murks? Die Tests haben funktioniert :wink:

Dann habe ich noch ein Statusscript angelegt, welches die Anlage unabhängig alle 5 Minuten abfragt. Es kann ja immer mal sein, dass jemand die Anlage per Hand aktiviert/deaktiviert…


<?
$ip = "192.168.10.100";
$data = file_get_contents("http://$ip/csv.html");
//$data = file_get_contents("http://$ip/csv.html/?Password=Pass&sb.html");

$lines = explode(",", strip_tags($data));

//print_r($lines); //zeigt in welchen Zeilen was steht.
$Terxon_Status = $lines[1];



								if ($Terxon_Status == 0)
								{

SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, false);
								}
								else
								{
				SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, true);
								}

?>

Ich würde da evtl. etwas anders vorgehen:

  1. aus der Bool eine Integer machen,
    Assoziationen: 0= unscharf, 1= wait 2= scharf (oder so ähnlich)

Dann würde ich 2 Scripte bauen:
das erste Script sendet den Scharfschalt-Befehl an die Alarmanlage ab, setzt einen Abfragetimer (Event, zyklisch) auf xSec und setzt die Integer-var auf „wait“. Das 2. Script wird vom Abfragetimer getriggert und fragt den Zustand des Relais ab. Ist dieser true, setzt es den Wert der Integer-Var auf „scharf“ und dsiabled den Abfragetimer. Das Ganze muss natürlich so gebaut werden, dass es auch revers (von scharf -> unscharf) funktioniert.

Hintergrund der Überlegung:
gerade bei so empfindlichen Themen wie Alarmanlage sollte jeder Status transparent sein, um Fehlinterpretationen im Betrieb zu vermeiden. Je nach Fehlerhäufigkeit könnte man och einen 4. Status in die Integer einbauen: „Fehler“, nämlich dann, wenn innerhalb von xSec keine korrekte Rückmeldung von der Alarmanlage kommt.

PS: ein Script in den Schlafzustand zu versetzen ist nicht gut, gar nicht gut. Statt dessen -wenn es geht - zyklische Events verwenden

Hi,

hört sich plausibel an…

Puhhh aber mit meinem PHP-Können aktuell wahrscheinlich etwas schwierig umzusetzen… Obwohl ich ja bereit bin Eigeninitative zu ergreifen :wink:

Code-Schnipsel oder so etwas schlummern in dem Forum diesbezüglich nicht zufällig herum? Meine Suche hat leider nichts gebracht.

Nachtrag:

Es gibt nur die Werte 0 oder 1. Dazwischen gibt es nichts.

Über Lösungsansätze würde ich mich freuen. Meine scheinen nicht prof. Genug zu sein. ;(

Wobei ich fürs erste zufrieden bin

ich hab den Sinn des Scripts noch nicht ganz verstanden, aber so wie es aussieht, wird das Script bei jeden Run immer nur


SetValueBoolean(49220 /*[Alarmanlage\Alarmanlage Status]*/, true);

ausführen. Warum dann die If-Bedingung?

Verstehe warum es nicht aussagekräftig genug ist…

//$Terxon_Status = '1';
$Terxon_Status = $lines[1];

Hatte mit einem festen Wert in der Variable getestet. Habe es oben im Beitrag korrgiert, damit es keine Missverständnisse gibt.

Natürlich muss ich diese wieder auskommentieren. So ist es nun richtig.

Wie gesagt, der ausgegebene Wert ist entweder 1 oder 0 bei echo $lines[1];

Ablauf zur Veranschaulichung

Alarmanlage scharf schalten:

  1. Alarmanlage wird über Skript 1 scharf geschaltet
  2. Wenn Alarmanlage scharf, dann erfolgt eine Relaiansteuerung
  3. Wert aus Variable $lines[1] ist dann „1“
  4. Status der Boolean müsste dann true sein

Alarmanlage unscharf schalten:

  1. Alarmanlage wird über Skript 1 scharf geschaltet
  2. Wenn Alarmanlage unscharf, dann erfolgt eine Relaiansteuerung
  3. Wert aus Variable $lines[1] ist dann „0“
  4. Status der Boolean müsste dann false sein

Über das Statusskript frage ich zur Sicherheit nochmal den Anlagenstatus ab und setze bzw korrigiere die Boolean Variable.

Dies kann ich sicherlich auch alles in einem Skript machen, ohne dass ich das 2. Skript alle 5 Minuten ausführen muss… Das ist quasi einfach eine Art „ich geh mal auf Nummer sicher und prüfe den Status nochmal“ …

Hoffe damit ist es etwas verständlicher geworden.

Grüße