Anfangsschwirigkeiten beim Script

Hallo,

hab hier paar Schwierigkeiten beim Scripten.
Und zwar wie kann ich ( und, und ,und) etc aufbauen?

Möchte das bei mehreren PIR´s eine Lampe eingeschaltet wird,
diese aber wenn alle Pir´s aus sind gewisse Zeit an bleibt.

Hier meine kleine Versuche:

<?

$bm1=16412 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür]*/;
$bm2=19212 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus]*/;
$bm3=34904 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad]*/;

if ($var == 33461 /*[Location\Ist es Tag]*/ and $value==true)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

if (($var == $bm1 or $var == $bm2 or $var == $bm3) and ($var == 33461 /*[Location\Ist es Tag]*/ and $value==false))
{
		$wert=500;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
		IPS_SetScriptTimer(_IPS['SELF'],30); // Sekunden 
}

?>

Einfache Scripte laufen an sich.


{
		$wert=510;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}
?>

Danke schon mal

Hallo,

bei dieser Passage übersehe ich da etwas.:

if ($bm3 and $value==false and $bm2 and $value==false and $bm1 and $value==false)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

Nur eine geht aus macht dann aus die Beleuchtung. Möchte das wenn alles auf false steht, dann
erst wird ein Befehl gesendet.

Einschalten geht:

if ($bm3 and $value==false and $bm2 and $value==false and $bm1 and $value==false)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

if ($bm3 and $value==true or $bm2 and $value==true or $bm1 and $value==true)
{
		$wert=510;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
		IPS_SetScriptTimer(_IPS['SELF'],30); // Sekunden 
}

Was übersehe ich da? Danke schon mal für nen Tipp.

Gruß

was soll das denn sein? $bm3 ist doch die ID eines Bewegungsmelders und die fragst du auf „true“ ab? genauso die anderen, da liegt irgendwo ein Denkfehler vor. Was sollte die Zeile denn bewirken?

Danke für die Antwort,

ja sind Bewegungsmelder.

Möchte ja nur das was drunter steht erst augefürt wird wenn alle 3 auf false stehen:

if ($bm3 and $value==false and $bm2 and $value==false and $bm1 and $value==false)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

mit (or) dazwischen ging es ja. Mit else oder elseif, wird trotzdem ausgeführt wenn auch nur
einer auf false geht.

Gruß

Ich kann ja nur grob vermuten was Du machen willst, Du willst ja den Wert eines Geräts vergleichen. Dazu musst Du aber auch den Wert abholen mit GetValue

Der obere Teil muss also lauten:


$bm1=GetValue(16412 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür]*/);
$bm2=GetValue(19212 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus]*/);
$bm3=GetValue(34904 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad]*/);

dann hast Du den Wert der Variable, mit diesem Wert kannst Du jetzt auch arbeiten oder vergleichen.

Hier gilt das Gleiche


if (Getvalue(33461 /*[Location\Ist es Tag]*/))
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

Wenn der Inhalt der Varibale mit der Objekt ID 33461 true ist dann mache …

Das Gleiche dann hier:


if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/))
{
		$wert=500;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
		IPS_SetScriptTimer(_IPS['SELF'],30); // Sekunden 
}

wenn Bewegungsmelder 1, 2, oder 3 den Wert true haben und gleichzeitig der Inhalt der Varibale 33461 true ist, es ist also Tag, dann mache …

if ( (getvalue($bm3) == false)  && (getvalue($bm2) ==  false) && (getvalue( $bm1) == false))
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

Ich glaube du hast mit PHP noch grundsätzliche Anfangsschwierigkeiten oder?
Vielleicht hilft: PHP: PHP-Handbuch - Manual

Danke euch für die Tipps!!!

Ja diese habe ich! Werde mir das Buch vornehmen.

Und Deine Tipps Fonzo probiere ich gleich auch aus, Danke Dir dafür :slight_smile:
Dir auch danke Hagbard235!

Gruß

oder hier
PHP Einfach

Hallo,

ausprobieren konnte ich nicht er meckert: (beim ersten if)
Es ist Tag sollte auf false stehen, dann erst alles erlauben. Da Licht am Tag wäre nicht so sinnvoll.

Parse error:  syntax error, unexpected ';' in /var/lib/symcon/scripts/34747.ips.php on line 14
<?

$bm1=GetValue(24711 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür\Status]*/);
$bm1=GetValue(43814 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus\Status]*/);
$bm1=GetValue(40604 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad\Status]*/);

if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/))
{
        $wert=500;
        $jsontemp="PWM,15,$wert,1000"; 
        mqttsenden($remoteabo,$jsontemp);
        IPS_SetScriptTimer(_IPS['SELF'],30); // Sekunden 
}  

if ( (getvalue($bm3) == false)  && (getvalue($bm2) ==  false) && (getvalue( $bm1) == false))
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}
?>

Gruß

Jetzt hast du meine und Fonzos Änderungen wohl durcheinander geworfen…

[QUOTE=power dodge;356522]Hallo,

<?

$bm1=GetValue(24711 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür\Status]*/);
$bm1=GetValue(43814 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus\Status]*/);
$bm1=GetValue(40604 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad\Status]*/);

und das hier


if ( (getvalue($bm3) == false)  && (getvalue($bm2) ==  false) && (getvalue( $bm1) == false))
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}
?>

passen nicht mehr zusammen… finde den Fehler :wink: (sollst ja auch was dabei lernen)

Stimmt habs zusammengeschustert ohne genauer hin zu schauen…

In der gleichen Zeile ist da immer noch irgendwas faul:

$bm1=GetValue(24711 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür\Status]*/);
$bm2=GetValue(43814 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus\Status]*/);
$bm3=GetValue(40604 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad\Status]*/);


if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/ === false))
{
        $wert=500;
        $jsontemp="PWM,15,$wert,1000"; 
        mqttsenden($remoteabo,$jsontemp);
        IPS_SetScriptTimer(_IPS['SELF'],30); // Sekunden 
}

an den ; oder den Klammern liegt es nicht

Tipp: Doch es ist eine Klammer im IF :rolleyes:

Hallo,

ja Dankeschön fehlte eine dritte am Ende. Hab auch gleich ein paar Tests gemacht.
Soweit funktioniert es so:

$bm1=GetValue(24711 /*[Erdgeschoß\Treppenhaus\PIR am Eingangstür\Status]*/);
$bm2=GetValue(43814 /*[Erdgeschoß\Treppenhaus\PIR Oben Treppenhaus\Status]*/);
$bm3=GetValue(40604 /*[Erdgeschoß\Treppenhaus\PIR unten am Bad\Status]*/);


if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/)))
{
        $wert=500;
        $jsontemp="PWM,15,$wert,1000"; 
        mqttsenden($remoteabo,$jsontemp);
        IPS_SetScriptTimer(_IPS['SELF'],10); // Sekunden 
}

if ($bm1 === false && $bm2 === false && $bm3 === false)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
}

Aber nur wenn Tag auf true steht.
So ging es nicht:

if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/ === false)))

Ist dieser Timer eigentlich aus der Funktion?:

IPS_SetScriptTimer(_IPS['SELF'],10); // Sekunden 

Danke euch für die Tipps!!! :o

Zur Not könnte ich die Pirs in den Ereignissen sperren, das diese eben aktiv werden bei Tag false. Das wäre ja noch machbar.

Gruß

Tipp wenn Du im Skript Editor auf eine Klammer drückst wird diese blau markiert und gleichzeitig auch die zweite Klammer die zu dieser Klammer gehört, sollte da keine Markierung sein, hast Du wohl eine Klammer vergessen.

Na guck dir die Position deiner klammer nochmal an

Vielleicht hilft es ja für den Anfang sich das auf PHP <-> „Deutsch“ selber vor zu lesen dann stolpert man auch eher über Fehler, die man dann nicht mehr macht. So was wie „hole Wert aus 33461 ist false“, da war doch was. :eek: Eine böse Klammer vergessen. Und nicht vergessen die Klammer zu markieren dann wird diese blau, dann siehst Du wo die Klammer zu geht bzw. wo etwas vergessen wurde, wenn Du zwei Klammern auf machst müssen diese auch wieder mit zwei Klammern geschlossen werden.


(GetValue(33461 /*[Location\Ist es Tag]*/) === false)

Danke euch,

ich musste über mich selbst erst lachen :smiley:
Schauen aber gleich.

Für euch sind viele Sachen selbstverständlich, für einen Anfänger ist es schon nicht ohne
da durchblicken.

Aber danke euch sehr das Ihr auf so doofe Fragen auch mal antwortet.

EDIT:

Danke Dir Fonzo, … oh man. Danke läuft!!!

Kann den der Timer dort funktionieren? Oder muss ich ein Ereignis dazu erstellen?


        IPS_SetScriptTimer(_IPS['SELF'],10); // Sekunden 

Gruß

Das kommt ja drauf an was da genau funktionieren soll bzw. was Du machen willst.
So wie das da steht wird ein Timer gesetzt der dann alle 10 Sekunden ausgeführt wird, ist es das was Du willst?
Siehe auch IPS_SetScriptTimer

Wenn Du irgendwas an und dann wieder ausschalten willst dann geht das so.

P.S.: PHP Code solltest Du im Forum in den PHP Tag setzten, dann ist dieser besser lesbar.

Ah danke werde weiter Deine Tipps gleich anschauen.

Eigentlich wollte ich das nach letztem PIR 10sec vergehen bevor 0 geschrieben wird,
wenn ich den 10 Sec erneut ausgelöst wird dann eben laufen die 10 Sec von neu ab.

Danke für die Tipps!

Gruß

Denke das ist ja ganz falsch war?

Muss die Time Zeile noch in die If Zeile rein?

if (($bm1 === true or $bm2 === true or $bm3 === true) and (GetValue(33461 /*[Location\Ist es Tag]*/) === false))
{
		($_IPS['SENDER'] == "TimerEvent");
        $wert=310;
        $jsontemp="PWM,15,$wert,1000"; 
        mqttsenden($remoteabo,$jsontemp);
        IPS_SetScriptTimer(_IPS['SELF'],10); // Sekunden 
}

if ($bm1 === false && $bm2 === false && $bm3 === false)
{
		$wert=0;
		$jsontemp="PWM,15,$wert,1000"; 
		mqttsenden($remoteabo,$jsontemp);
		IPS_SetScriptTimer($_IPS['SELF'], 0);
}