Einfaches Wenn, Dann, Sonst Script??

Hallo liebe Forengemeinschaft.

Dies ist mein erster Beitrag hier, denn ich benötige Eure Hilfe. Für diejenigen von Euch mit PHP Kenntnissen ist es warscheinlich kein Problem, da ich aber gerade erst angefangen habe, muss ich noch ein bischen (mehr) lernen.

Habe mir vor kurzen IP-Symcon in der Basisversion „geleistet“ um eine Visu, sowie ein paar Verknüpfungen für KNX zu haben. Ich bin allerdings von dieser Software nun so überzeugt, dass ich es Schade finde, nicht gleich die Prof. Edition gekauft zu haben. :mad: Aber zu meinem Problem;

Ich habe unter der KNX Adresse 1/1/17 meine Treppenbeleuchtung für den Flur. Unter 1/2/10 die Beleuchtung für den Flur im OG wo ausserdem ein Präsenzmelder hängt, der mir derzeit Abends das Licht im Flur einschaltet. Nun ist meiner „Regierung“ das Licht Abends/Nachts zu Hell und es soll ab 22:00 Uhr das Treppenlicht (1/1/17) statt das Flur Licht (1/2/10) im OG eingeschaltet werden, bis 22.00 Uhr allerdings das Flurlicht.

Eigentlich ein einfaches Wenn,dann, sonst Script (glaube ich), dass ich aber nicht hinbekomme. Ich hoffe, ihr könnt mir helfen und freue mich auf jede Antwort.

Hallo und herzlich willkommen !

Im Prinzip hast Du Recht, schwierig ist es nicht, aber als Anfänger steht man oft vor kleinen Problemen und weiss cniht weiter - hier mal ein Ansatz:

Ich hab kein KNX, aber den Schaltbefehl kennst Du wohl selber…

$time = date("H:i");
if(($time > "22:00") || ($time <= "08:00"))

{
//hier Schaltbefehl rein
}
else
{
//hier anderen Schaltbefehl rein
}

Also, wenn es nach 22 Uhr ODER vor 8 Uhr morgens (es soll ja nicht den ganzen Tag geschaltet werden, oder ?) ist, dann führe einen Befehl aus, ansonsten führe den anderen Befehl aus…

Achso, das ganze Skript hängst Du dann als ausgelöstes Event an die Variable Deines Präsenzmelders.

Fragen ? Fragen !

Viele Grüße
Martin

Wow, das geht ja schnell hier. Vielen Dank für die Antwort.

Ja, den Schaltbefehl kenne ich nur mit der Zeit habe ich das bisher nicht hinbekommen. was bedeutet denn „H:i“? und warum ist time = date?

Und muss ich die Variable „DES“ Präsenzmelders oder die Adresse nehmen, die geschaltet werden muss? Und muss ich als Aktion „Script starten“ oder Gerät ausführen" wählen? Und was als Ziel?

Vielen Dank,
Grüße Andy

$time ist eine Variable und date liefert dir eine formatierte Uhrzeit mit Stunde (H) und Minute (i).
http://http://php.net/manual/de/function.date.php

Hi Andy,

da ich auch mit KNX arbeite und weiß das der Anfang echt schwer ist, möchte ich auch versuchen zu helfen.

Vorab eine Frage: hast du dein KNX selbst programmiert? Bzw. hast du die ETS-Software? Denn ohne Programmierung des KNX kommst hier nicht weiter.

Jetzt ist es ja so, das du mit dem Präsenzmelder direkt den Aktor für das Licht per „einer Gruppenadresse“ ansprichst. Das darf ja dann nicht mehr sein, denn du willst mit dem Präsenzmelder ja das Skript von oben starten und das skript spricht dann den Aktor an.

Somit braucht der Präsenzmelder eine eigene (zusätzliche) Gruppenadresse. Auf diese Gruppenadresse legst du dann in IPS ein KNX Gerät an. Dann machst du bei deinem Skript ein Ereigniss welches das Skript startet, wenn sich die Variable des angelegten KNX Geräts (Präsenzmelder) ändert. Das skipt schaltet dann nach 22 Uhr die eine Gruppenadrese für dein Licht und davor die fürs andere Licht…

Um dir noch mehr Mut zu machen… wenn du das erfolgreich umgesetzt hast, dann kannst du mit diesem Vorgehen fast alles in deinem KNX System möglich machen. Es wird sich lohnen hier etwas Zeit und Geduld aufzubringen.

Gruß Helmut

Danke für die Info. Das Manual ist auch gut.

Das Script funktioniert, nur leider geht das Licht nun nicht mehr aus. Kann mir da noch jemand helfen?

Grüße Andy

@ Helmut,

danke für´s Mut machen. :smiley: !

Ich hab es selber verbaut und programiert. Autodidaktisch! Naja teilweise. Bin Elektromeister. Die Hälfte der Info´s war schon da. Hab im Moment nur Leider kaum Zeit. :slight_smile:

Hab die Gruppenadresse schon neu vergeben. Und es funktioniert dank dem Script von Martin (ausser die AUS Funktion). Mir fehlen noch die PHP Kenntnisse, die ich mir noch aneignen muss. Die Beispiele hier helfen mir aber und ich bin froh über jede (Anfangs-)Hilfe.

Das einzig blöde ist, das wenn der PC ausfällt „unsere“ KNX Anlage nicht mehr so funktioniert, wie sie soll.

Gruß Andy

Zu AUS Funktion - bei HM und FS20 (und einigen anderen Systemen) kann man einen Aktor für eine bestimme Zeit einschalten (vllt. kann nochmal einer der KNX Spezis was dazu sagen).

Falls KNX das nicht unterstützt:

Ein zweites skript mit dem Ausschaltbefehl erstellen. An dieses hängst Du ein zyklisches Event, welches einmalig ausgeführt wird, mit der Zeit, die der Aktor an sein soll.

Das obige Skrpit änderst DU wie folgt:

$time = date("H:i");
if(($time > "22:00") || ($time <= "08:00"))

{
//hier Schaltbefehl rein
}
else
{
//hier anderen Schaltbefehl rein
} 

IPS_SetEventActive (12345,true); //12345 ist die ID des zyklischen Events


in das Ausschatskript schreibst Du am Ende ein

IPS_SetEventActive (12345,false); //12345 ist die ID des zyklischen Events

ist zwar von-hinten-durch-die-Brust-ins-Auge, sollte aber funktionieren.

Zum Hintergrund:
mit dem ersten Skript schaltest Du das Ereignis aktiv - dieses führt nach X Sekunden ein Skript aus, welches den Aktor wieder ausschaltet und das Skript wieder deaktiviert. Eigentlich ganz einfach, oder :smiley:

Gruß
Martin

Hallo Martin,

der Präsenzmelder erledigt das Ausschalten ja von alleine. Ich muss nur die Änderung auswerten. Ich wollte dies mit dem Elseif Befehl erledigen und dachte an folgendes (was nicht funktioniert):

$time = date("H:i");
$StatusTreppenlicht = GetValue(20503);
$StatusDeckenlichtFlurOG = GetValue(30739);

if ($StatusTreppenlicht = "true")
{
EIB_Switch(20503 /*[Treppenlicht]*/, false);
}

elseif ($StatusDeckenlichtFlurOG = "true")
{
EIB_Switch(30739 /*[Flur Deckenlicht OG]*/, false);
}

elseif(($time > "22:00") || ($time <= "08:00"))
{
EIB_Switch(20503 /*[Treppenlicht]*/, true);
}

else
{
EIB_Switch(30739 /*[Flur Deckenlicht OG]*/, true);
}


Evtl. hab ich ja noch nen Denkfehler. Beide Befehle (Licht ausschalten und Einschalten ab 22:00) funktionieren, wenn sie nicht zusammen (so wie hier) in einem Script stehen. Villeicht seht ihr ja was ich falsch mache…

Vielen Dank und Gute Nacht,
Andy

Hallo Andy,
bin kein PHP-Könner, aber ich denke ein Vergleich geht mit zwei Gleichheitszeichen „==“.
Probiermal.

Gruß Helmut

Hallo Andy,

in deinem Skript mußt du die if Abfrage wie folgt stellen:

if ($StatusTreppenlicht == 1) 

Also 2 gleich Zeichen für den Vergleich und dann wenn du den Status des Treppenlicht holst ist die Variable „$StatusTreppenlicht“ ein Boolean Wert also 1 oder 0.

Dann sollte dein Skript grundsätzlich laufen.

Zu deiner Aussage

Das einzig blöde ist, das wenn der PC ausfällt „unsere“ KNX Anlage nicht mehr so funktioniert, wie sie soll.

wollte ich noch sagen, natürlich muß der PC immer funktionieren und gehört damit zum funktionierenden Haus dazu. Sonst kann das System ja nicht intelligent sein bzw. du bräuchtest ja kein IPS.

Und da es leider diese Situation dass der PC mal nicht geht und dann in dieser Zeit jemand durch dein Treppenhaus laufen wird, kommen kann, wird es ggf. zum Problem kommen. Denn dann werden in IPS diene Infos über Statis durcheinander kommen und du mußt manuell eingreifen um das zu korrigieren.

Um das zu verhindern würde ich 2 Skripte machen eins zum einschalten und eins zum ausschalten. Wenn der Präsenzmelder dann den Einschaltbefehl sendet wird per Ereignis mit dem Auslöser „bei bestimmtem Wert“ „true“. Das Einschaltskript gestartet.
Irgendwann schickt der Präsenzmelder dann den aus Befehl und dein Ausschaltskrippt schaltet einfach direkt beide Lichter aus. Damit wird sich dann der ggf. falsche Status des Lichts in IPS von selbst korrigieren.

Ich hoffe ich habe das einigermaßen verständlich mitteilen können, sonst gerne noch mal fragen.

Gruß Helmut

So, ich habe es seit vorgestern hinbekommen, nur bis jetzt leider keine Zeit gehabt. Möchte die Lösung aber hier aufzeigen, falls ein Newbie (so wie ich) ähnliches Problem hat.

Ich habe eine neue Instanz angelegt, und dieser die schaltende Gruppenadresse des Präsenzmelders gegeben. Man sah in der IPS den Status (bei Value) von AUS auf EIN immer wenn man sich bewegte. Funktionierte also. Dann legte ich ein Ereignis für diese Variable an. „Bei Variablenänderung“ -> Gerät ausführen. In dem Feld „Code“ habe ich das Script reingeschrieben und als Ziel die Variable „Value“ des Präsenzmelders genommen. Und so fingen die Fehler an. Ich habe herausgefunden, das es immer besser ist, ein Script anzulegen, da dieses auch Fehlermeldungen ausgibt.

Ein weiterer Fehler war, dass die Abfrage ob eines der Lichter an ist, nicht auf die Instanz, sondern auf die Variable abgefragt werden muss. Somit hatte ich auch falsche Objekt-Id´s genommen. Der Schaltbefehl muss allerdings auf die Variable erfolgen (was viele sicher wissen und ich jetzt auch). Ich habe also jetzt die Instanz mit dem Präsenzmelder, darunter das Script und auf dem Script ein Ereignis angelegt, „Bei Variablenänderung“ „Script starten“.

Hier noch das Script, mit dem es nun funktioniert:


$time = date("H:i"); 
$StatusTreppenlicht = GetValueBoolean(27303); 
$StatusDeckenlichtFlurOG = GetValueBoolean(38330); 

if ($StatusTreppenlicht == 1) 
{ 
EIB_Switch(20503 /*[Treppenlicht]*/, false); 
} 

elseif ($StatusDeckenlichtFlurOG == 1) 
{ 
EIB_Switch(30739 /*[Flur Deckenlicht OG]*/, false); 
} 

elseif(($time > "22:00") || ($time <= "08:00")) 
{ 
EIB_Switch(20503 /*[Treppenlicht]*/, true); 
} 

else 
{ 
EIB_Switch(30739 /*[Flur Deckenlicht OG]*/, true); 

@ helmut
Danke für den Tipp mit dem Boolean Wert. Ich habe es zwar nicht ausprobiert, aber ich denke, dass meine Abfrage mit:

if ($StatusTreppenlicht = "true"

auch funktioniert hätte. Aber die Abfrage mit Boolean ist sicherer und besser wie ich finde. Der Befehl dafür ist allerdings
GetValueBoolean und nicht GetValue.

$StatusTreppenlicht = GetValueBoolean(12345);

Ist auch nur zur Info und keine rechthaberische Kritik! Im Gegenteil, ich danke Dir, dem anderen Helmut, Martin und „1007“ für die nützlichen Tipps und der Hilfe! Macht weiter so und vielen Dank.

Grüße Andy

Der wäre bestimmt nicht gegangen.

if ($StatusTreppenlicht = "true"

Genau und der hier:

stimmt auch nicht.

Ferner ist Deine beschriebene Sortierung zwar nett aber relativ unwichtig, wenn Du entsprechend die Tipps liest und für die Anzeige im WebFront Links benutzt. :slight_smile:

Da auch bei gelöstem Thread noch Kommentare abgegeben werden, erlaube ich mir dies auch zu tun um mich zu erklären; :stuck_out_tongue:

Meine Meinung kam nur durch Transferleistung zu stande, da der Schaltbefehl so heisst. Aber danke für die Aufklärung. Das hätte ich früher wissen müssen! :frowning:

[quote=„Boui,post:14,topic:32417“]
Genau und der hier:

stimmt auch nicht.

Ferner ist Deine beschriebene Sortierung zwar nett aber relativ unwichtig, wenn Du entsprechend die Tipps liest und für die Anzeige im WebFront Links benutzt. :slight_smile: [/QUOTE]

Sortierung hin oder her. Ich habe mir überlegt ob ich es so deteiliert schreibe oder nicht, aber das ist nun einmal mein „Hergang zu Lösung“. Und deswegen habe ich es mit aufgenommen. Tipps habe ich natürlich gelesen und verwende auch Links. Diese sind wesentlich besser, da sie (auch optisch) besser aufzubereiten sind.

Grüße Andy :slight_smile:

Na es geht einfach darum, dass Du Basics als Lösung darstellst und dazu noch falsche Aussagen triffst. Da ist es doch auch völlig egal, ob das Copy&paste Fehler sind oder nicht.
Die Aussagen sind einfach falsch und Du wirst Anfänger damit verwirren. Punkt.

Aber ich BIN Anfänger. Und meine „Aussagen“ sind Thesen die so gekennzeichnet sind. Ich schrieb ja, das ich denke dass meine Aussage funktioniert hätte.

Außer, dass es ein doppeltes Gleichheitszeichen sein muss, bin ich auch immernoch der Meinung. Siehe der Dokumentation hier.
Da EIN/AUS bei mir, wie bei anderen warscheinlich auch, als Boolean Variable angelegt wurde, gibt sie true oder false zurück, wenn ich es richtig lese. :confused:

Die „Nummer sicher“ Lösung, wenn man weiß, das es eine Boolean Variable ist, ist:

$StatusTreppenlicht = GetValueBoolean(12345);

Auch hier müsste man statt „0“ und „1“, „true“ oder „false“ als Auswertung nehmen können. Lese ich so in der Dokumentation.

Villeicht weißt du aus Erfahrung mehr. Dann klär mich bitte auf

Grüße Andy :slight_smile:

Ob das jemand auf die Schnelle liest … wenn Du schon „denkst“ und den Code vor Dir hast, warum probierst Du es nicht einfach erst aus und schreibst dann die Tatsachen auf? Langsam wird es hier Kindergarten … :confused:

Gruß
Bruno

Habe im Moment keine Zeit es auszuprobieren und wollte nur kurz „meine“ Lösung hier aufzeigen. Für den Fall, dass mir hier noch jemand konstruktive Vorschläge machen würde. Das wäre dann nämlich nicht mehr nötig und ich wollte anderen Helfen, die evtl. das gleiche Problem haben.

Und ja, wenn man so ein (ähnliches) Problem hat, liest die- oder derjenige sich das sicherlich genau durch.

Hätte ich gewußt, dass das hier „so“ ausartet, und es tatsächlich Kindergarten wird (weil es ab jetzt gar nichts mehr mit dem eigentlichen Problem zu tun hat), hätte ich sicherlich noch länger gewartet um die „ausgefeilte“ Lösung darzubieten (obwohl ich sicher bin, das sich in diesem Forum auch da jemand „ausgelassen“ hätte).

Ich dachte immer, das so ein Forum in erster Linie für den „Problemsteller“ da ist und ihm geholfen wird; und dass sich andere mit ähnlichem Problem (nach benutzen der SuFu) einige Ideen abholen können. Das man als Threadsteller (und IPS Anfänger) erst an zweiter Stelle kommt und sich für seine Meinung/Lösung rechtfertigen muss und der Thread als „Kindergarten“ dargestellt wird (obwohl das nichts zum Thema beiträgt), finde ich nicht gut. Mir jedenfalls ist geholfen. Villeicht löscht ein Moderator ja den Thread und die „Elite“ gibt Frieden.

Grüße Andy :frowning: