Benötige Hilfe für Skript mit if-Funktion

Hallo,

ich möchte per Skript ein Rollladen fahren wenn das Fenster geschlossen ist. Leider komme ich mit php nicht wirklich zurecht:/

So sollte es in etwa aussehen:
wenn
EIB_Switch(43213, false);
dann
EIB_Position(28433, 100);

Ich habe schon ein wenig probiert, leider ohne Erfolg:(

Grüße

Dann zeig mal was du schon hast, dann sehen wir wo es hapert :slight_smile:

Ich sehe das Problem hier nicht bei Deinen PHP Kenntnissen, sondern eher beim Grundverständnis von IP-Symcon.

EIB_Switch() ist ein Befehl. Wenn dieser korrekt ausgeführt wurde, dann liefert er TRUE zurück. Das heißt, dass Dein Konstrukt nur sehr sehr selten ein FALSE zurückliefern wird. Darüber hinaus macht der Befehl im Kontext eines Fensterkontaktes auch keinen Sinn, denn diesen kannst Du ja nicht aus IP-Symcon heraus „ausschalten“.

Du möchtest die Variable abfragen, welche Dir den Fensterzustand anzeigt. Dazu benötigst Du keine Befehle.

Aber, wie mein Vorredner schon richtig sagte: Zeig doch erstmal, was Du schon probiert hast. Wenn Du meinen Tipp mit einfließen lässt, dann solltest Du schnell zum Ziel kommen.

Genau. Was du hier suchst ist die Variable unterhalb dieser EIB-Instanz. Und deren Wert bekommst du mit GetValue()

Im Beispiel unten also

if (GetValue(24227)==FALSE)
{
  EIB_Position(12345, 100);
}

ipsvar.png

Oder - vielleicht leichter verständlich mit einem Zwischenschritt:

$Fenster = GetValue(12345);

if (!$Fenster){
    EIB_Position(54331, 100);
}

Übrigens: Volker hat für sen Screenshot eine Instanz vom Typ KNX DPT 1 erstellt, aber oberhalb von „EIB-Instanz“ gesprochen. Hier wird alt und neu vermischt, aber das gleiche gemeint.

Falls du ein bisschen PHP lernen möchtest, kannst du das sicher gut mit solchen Konstrukten machen. In einem Produktivsystem würde ich allerdings kein Skript für so etwas verwenden, da du es viel einfacher direkt als Ereignis umsetzen kannst.

Ich würde es auch im Produktivsystem genau so machen. Ich finde Code innerhalb von Ereignissen unübersichtlich. Mag auch sein, dass es nach knapp 11 Jahren IP-Symcon einfach so drin ist, denn damals konnte man innerhalb von Ereignissen noch keinen Code ausführen.

Gar kein Code im Ereignis, einfach den Schalter auf „Aktiv“ als Auslöser und „Auf Wert schalten“ als Aktion.

Ich weiß, dass gerade ihr Profis eure Skripte liebt, aber für die meisten Fälle braucht man die überhaupt nicht mehr, weder im Ereignis noch als Skript-Objekt :wink:

Trotzdem unübersichtlich. Ich benötige einen Mausklick, um ein Skript zu öffnen und sehe sofort, was es macht. Bis ich im Ereignisdialog alles ausgeklappt habe und mir eine Übersicht verschafft habe, was da genau passiert, ist viel Zeit vergangen. Zumal in diesem Dialog unter Variable meistens nur „Wert“ steht und der Pfad dahinter sich niemals so erweitern lässt, dass man ihn komplett sieht. Von daher finde ich die Möglichkeit, alles in den Ereignissen machen zu können „nett“, aber niemals praxistauglich. Für Anfänger, okay. Für den Anwender, der nur seine Installation hat und diese in- und auswendig kennt, auch okay. Aber nicht für diejenigen, die viele Installationen betreuen. Ich weiß doch heute nicht mehr, was ich vor 2 Jahren in einer Kundeninstallation gemacht habe. Und da dann erstmal zig Ereignisse durchklicken, um zu schauen, was sie machen? Nee … Lieber in die entsprechende Kategorie navigiert, Skript geöffnet und schon sehe ich sofort, was dort passiert. Allein schon, weil ich durch die „Kommentarfunktion“ sofort sehe, was sich hinter einer Variablen verbirgt. Ist das Skript dann auch noch vernünftig kommentiert, sehe ich innerhalb von 10 Sekunden, was passiert. Im Ereignisfenster rate ich dann immer noch, wo genau die Bedingungsvariable sitzt. Der Einwand, dass man die Skripte nicht braucht, ist berechtigt, aber das Weglassen würde alles viel komplizierter machen.

Ich muss hier Christoph uneingeschränkt zustimmen, die Wartbarbeit ist mit den „klicky-bunty“ Sachen an den Objekten nicht wirklich vorhanden.

@Niels wie willst du solche „Code-Fragmente“ (eigentlich ja nur „unsichtbare“ Script) jemals finden, wenn etwas nicht funktioniert?

Ja gar nicht.
Wenn es nicht funktioniert, Niels auf die Finger hauen, das er den Bug in der Console beseitigt :wink:
Bin zwar ‚erst‘ 8 Jahre dabei, aber ich habe das schon in der legacy Konsole benutzt für einfache Sachen.
Instanz geöffnet, Ereignis hinzugefügt, Quelle und Ziel-Aktion, fertig.
Und wenn man dann dem Ereignis einen sinnvollen Namen gegeben hat, sieht man sofort was passieren soll :slight_smile:
Hier Tastendruck-Variable, dort Licht an… alles klar fertig.
Klar überlegt man sich Konzepte wenn so etwas überhand nimmt und man nur minimal mehr braucht, aber für einfache Sachen völlig okay.

Werde ich jetzt beim ONVIF Modul auch als Beispiel Dokumentieren. Hier Variable vom MoitionSensor, dort Ziel und bitte Bild aktualisieren.
Für eine Handvoll Objekte kein Problem.
Wenn ich jetzt aber 135 Auslöser habe und 16 Kameras… Äh, ne. Dann doch Script :wink:
Michael

Rein konzeptionell macht es für mich auch keinen Sinn. Ich habe pro Raum beispielsweise Kategorien „Beleuchtung“, „Fensterkontakte“, … , „Automatiken“. In letzterer sind dann Unterkategorien, in welchen die Skripte sind. Schön übersichtlich.
Innerhalb der Ereignisse irgendwas zu machen, kommt nicht in Frage. Meistens gibt es ja auch mehrere Automatiken, die auf ein Objekt reagieren. Wird zu schnell zu unübersichtlich. Für eine durchschnittliche Installation verbrauche ich um die 800 Instanzen. Das wäre viel zu unübersichtlich…

Hallo,

danke für die zahlreichen Antworten:)
Ich arbeite sonst auch viel mit Ereignissen, das wird aber irgendwann ziemlich unübersichtlich. Wollte es daher etwas mehr mit Skripten probieren. Habe auch paar Skripte die mehrere Sachen schalten, sind aber alles absolute Grundlagen.

Hier mal das Skript was ich eben gebastelt habe:
if (GetValue(59684)==FALSE)
{
EIB_Position(57601, 50);
}
Kommt aber leider eine Fehlermeldung.

GetValue braucht die ObjektID der Variable und nicht der Instanz.
Nächster Schritt ist dann, das GetValue wegzulassen und direkt if($_IPS[‚VALUE‘] == false) zu benutzen.
Die Variable $_IPS wird durch das Ereignis befüllt und ist hier dokumentiert:
https://www.symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/
Michael

Alles klar, wurde korrigiert;)

if (GetValue(29188)==FALSE)
{
EIB_Position(28433, 50);

Es kommt keine Fehlermeldung mehr und es funktioniert nun wie es sollte:)

Besten Dank!

Der Thread offenbar auch, das mit GetValue auf die Variable anstatt Instanz hatten Christoph und ich doch ausführlich thematisiert. :frowning: