Warum schalten meine Lampen nicht?

Hallo!
Habe mal wieder ein komisches Problem!
Bin seit einiger Zeit am Designern. Will alles über ein Touchscreen bedienen könne.
Habe jetzt alles Fertig, um Automatische Schaltaufgaben zu steuern. (Über Scripte)
Läuft alles Super!
Nun wollte ich mich an die einzelnen Komponenten machen, um auch mal eine Lampe oder so alleine schalten zu können.
Da ist auch schon mein Problem:
Ich hoffe ich kann verständlich erklären.
Ich habe z.B. einen FS20 Dimm Steckdose, die an einem Lichtschlauch angeschlossen ist.
Für diese Steckdose habe ich eine Variable „Lichtschlauch“ und eine Intensity „Lichtschlauch_intens“ angelegt.
Nun gehe ich im Test center auf
ON = Lichtschlauch Brennt!
OFF = Aus!
Intens = Dimm!
Also alles OK!
Über die Scripte läuft auch alles.

Habe nun ein Image im Designer geladen, (Glühbirne).
Bei False & True nun die dazugehörigen Bilder! und die Variable „Lichtschlauch“ gewählt.
Unter „Events“ dann „OnClickToggle“ ausgewählt und auch hier die Variable „Lichtschlauch“ vergeben.
Test:
Klick auf die Glühbirne = Leuchtet
Noch ein klick = Aus
Aber der Lichtschlauch tut nichts :confused:
Im IPS Configuration Panel auf Variable geschaut:
Wieder Test:
Klick auf „Glühbirne“ = Variable „Lichtschlauch“ springt von „False“ auf „True“
Nochmal Klick = Variable „Lichtschlauch“ springt von „True“ auf „False“.
Aber der lichtschlauch bleibt tot.

Nochmal ins Test Center:
ON = Lichtschlauch Brennt und „Glühbirne im Designer“ auch
OFF = Lichtschlauch aus und „Glühbirne im Designer“ auch
Klicke ich aber im Designer auf die Glühbirne ändert sich zwar die Variable, aber der Lichtschlauch und der Status im Test Center bleibt aus.

Hat jemand eine Ahnung woran das liegen könnte?

Hoffe ihr seid mitgekommen!

Danke!
Gruß
Xanon

Es genügt nicht, per ‚Toggle‘, die Variable ‚Lichtschlauch‘ zu verändern.
Das ist schon ein wenig komplizierter.

Du musst zu allererst, in deinem Skript, dem Button im Designer folgendermassen konfigurieren:

OnClickToggle: Variable ‚Lichtschlauch‘
OnClick : Skript des auzuführenden Skriptes

Dann musst du deinem Button auch unbedingt ein IPSYMID geben, damit du das nachher wieder im Skript wieder finden kannst, sagen wir IPSYMID ist ‚Button_Lichtschlauch‘. (Das brauchst du zwar nicht, wenn du ein Skript machst, was AUSSCHLIESSLICH’ für den Lichschlauch gedacht ist.

Im OnClick des Designers trägst du nun eben dieses Skript ein.

Im Skript muss nachher dann folgendes stehen:

if (IPS_COMPONENT == 'Button_Lichtschlauch')
           {
            GetValueBoolean('Deinen Softbutton ON/Off');
            if  (Dein Softbutton ON/OFF == TRUE) FS20_SwitchMode (ID, TRUE);
            else FS20_SwitchMode (ID, FALSE);
            }
                       

So ist das Prinzip auf jedenfall. Du musst es nur noch richtig schreiben usw. Es ist noch früh am Morgen, deshalb waren meine Augen noch zu klein, um hier schon auf den rohen Magen PHP Skripte zu schreiben !

Falls du es noch nicht so richtig verstanden hast, dann werde ich späterhin es nochmal genauer schreiben !

Bei mir sieht sowas dann ungefähr so aus:

if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case $room."_CEIL_LIGHT_ON"    : FS20_SwitchMode($FS20_SU_CEIL, True);
                                               break;

              case $room."_CEIL_LIGHT_OFF"   : FS20_SwitchMode($FS20_SU_CEIL, False);
                                               break;

             }
      }

ermm, diese Weise wäre dann eher die Alternative zu dem, was ich dir als beispiel gegeben habe, funktionniert aber auch !

Upss…das ist ja nicht dasselbe Prinzip ??
Mann, bin ich so dusselig heute morgen…

mfG Franz

Hallo Xanon,

Du hast die Variable „Lichtschlauch“ als Status-Variable für die FS20-Instanz angelegt. Sie zeigt den Zustand der Instanz an. Wenn Du sie änderst, hat das natürlich keinen Schaltbefehl zur Folge. Das ist ungefähr so, als wolltest Du einen FHT dadurch bedienen, indem Du dessen Temperatur-Variable änderst. Das funktioniert natürlich nicht.

Eine saubere Lösung sieht so aus:

  1. eine Instanz für ein FS20-Modul anlegen
  2. die Instanz mit einer Status-Variablen verknüpfen (Lichtschlauch)

Hinweis zur Status-Variablen:
Diese Variable ist eine ReadOnly-Variable. Sie darf von Scripts und vom Designer nur gelesen werden!
Sie wird ausschließlich von der FS20-Instanz geschrieben.

  1. im Designer einen Button einrichten
  2. den OnClick-Event mit einem Script verknüpfen
  3. das Script fragt den Zustand der Statusvariablen ab und sendet den gegenteiligen Befehl an die FS20-Instanz; wenn also der Zustand „AUS“ ist, wird ein Einschaltbefehl (z.B. FS20_SwitchMode(…)) gesendet und umgekehrt;

Die FS20-Instanz setzt die Status-Variable entsprechend. Sie kann dann nach Bedarf vom Designer angezeigt werden.

Grundsätzlich gilt:
Finger weg von Status-Variablen für Instanzen! Die Instanzen regeln das selbst!

Gruß
HJH

@guyabano
@HJH
Danke für euer Hilfe.
Das soll einer wissen, das ich noch ein Script schreiben muß, nur um es über den Designer umzustellen. Steht das auch igendwo?

Mein Scipt sieht nun so aus:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Button_Lichtschlauch.ips.php
Trigger  : 
Interval : 
*/
if (IPS_COMPONENT == 'Button_Lichtschlauch') // Habe den IPSYMID Auch "Button_Lichtschlauch" genannt
           {
            GetValueBoolean('Lichtschlauch'); //"Lichtschlauch" ist meine Variable
            if  (Lichtschlauch== TRUE) FS20_SwitchMode (59840, TRUE);
            else FS20_SwitchMode (59840, FALSE);
            }

?>

Habe auch im Designer unter OnClick das Script „Button_Lichtschlauch“ eingetragen und unter OnClichToogle, die Variable „Lichtschlauch“ eingetragen.
Nun sollte doch eigntlich beim drücken des Button im Designer ein Befehl an IPS gesendet werden.
Dieser sagt:
Hallo IPS!
Es wurde der Button „Button_Lichtschlauch“ gedrückt, und nun sollst du das Script abspielen.
Im Script steht wiederrum:
Wird „Button_Lichtschlauch“ gedrückt, siehe nach wie der Status von der Variable „Lichtschlauch“ ist.
Wenn die Variable auf True gesetzt wurde, wechsel die Steckdose „59840“ auch auf True.
Ansonsten auf False.
Habe ich das sowiet richtig verstanden?
Habe ich trotzdem noch einen Fehler gemacht?
Denn wenn ich auf Execute in IPS klicke, bekomme ich folgenede Fehlermeldung:

<br />
<b>Notice</b>: Use of undefined constant IPS_COMPONENT - assumed ‚IPS_COMPONENT‘ in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>10</b><br />

In Zeile 10 Steht „if (IPS_COMPONENT == ‚Button_Lichtschlauch‘)“
Habe mir nun gedacht, das er dies nicht ausführen kann, da der Befehl nicht vom Designer kam.
Bin also in den Designer gegangen und habe es dort probiert.
Leider auch da „Ohne Erfolg.“:confused:

Seht ihr den Fehler?
Gruß
Xanon

Ja klar, weil beim Execute die Variable IPS_COMPONENT nicht ‚gefüllt‘ wird, da die nur einen Wert aus dem Designer raus erhält.

mfG Franz

Aber warum funktioniert es auch im Designer nicht?

Bin mir zwar nicht sicher, aber muss da kein Dollarzeichen vor die Variable?

Hallo Xanon,

gehe die Sache bitte so einfach an, wie möglich.

Aus diesem Grunde lass die Abfrage von $IPS_COMPONENT erst einmal weg.
Du kannst Dein Skript später immer noch erweitern.

Verwende bitte für den Anfang dieses simple Skript:

$Lichtschlauch = GetValueBoolean("Lichtschlauch"); //"Lichtschlauch" ist meine Variable
if ($Lichtschlauch == TRUE)
  FS20_SwitchMode(59840, FALSE);
else
  FS20_SwitchMode(59840, TRUE);

Dir wird (hoffentlich) auffallen, dass alle internen (also im Skript verwendeten) Variablen mit einem $-Zeichen eingeleitet werden. Andernfalls werden sie nicht als solche erkannt.

Die externen Variablen (Lichtschlauch) können nur über die IPS-Spezialfunktionen erreicht werden (Get/SetValueXXX).

Zur weiteren Verarbeitung müssen die externen Variablen erst an eine interne Variable zugewiesen werden. Man kann sie nicht direkt verwenden.

Des weiteren muss ich Dich bitten, die Hilfe, die Dir hier im Forum angeboten wird, auch wirklich gründlich zu lesen.

Ich muss mich daher hier selbst zitieren:

Grundsätzlich gilt:
Finger weg von Status-Variablen für Instanzen! Die Instanzen regeln das selbst!

Die externe Variable Lichtschlauch hast Du Deiner FS20-Instanz als Status-Variable bereitgestellt.

Obwohl auf solche Variablen nur lesend zugegriffen werden soll, hast Du trotzdem im Designer den OnClickToggle-Event dieser Variablen zugeordnet.

Das ist im besten Falle doppelt gemoppelt, im schlimmsten Falle funktioniert gar nichts. Auf jeden Fall ist es schlechter Programmierstil, da es jetzt mehrere Ursachen für die Änderung dieser Variablen gibt und damit die Suche nach Fehlern weiter erschwert wird. Was nicht benötigt wird, sollte weggelassen werden.

Ich habe in meinem letzten Beitrag nur davon gesprochen, den OnClick-Event einem Skript zuzuordnen. Den OnClickToggle-Event brauchst Du nicht!

Nun zum Ablauf:

  1. der Button im Designer wird gedrückt
  2. das dem OnClick-Event zugeordnete Skript wird gestartet
  3. das Skript lädt die Status-Variable „Lichtschlauch“ und weist sie einer internen Variablen $Lichtschlauch zu
  4. die interne Variable $Lichtschlauch wird auf TRUE oder FALSE geprüft
  5. ist sie TRUE wird ein AUS-Schaltbefehl übermittelt
  6. ist sie FALSE wird ein EIN-Schaltbefehl übermittelt
  7. die FS20-Instanz setzt die Status-Variable „Lichtschlauch“ auf den in Punkt 5. oder 6. ermittelten neuen Zustand; dieser Punkt wird wohlgemerkt von der Instanz selbst erledigt! Also nicht vom Skript und auch nicht vom Designer!

Ich hoffe, dass es hiermit nun um einiges klarer geworden ist.

Gruß und viel Erfolg
HJH

…wenn du die Funktionsweise wie von HJH beschrieben so verstanden hast, kannst evtl. den o.g. Code noch weiter abkürzen um dein Script noch schlanker zu halten.


FS20_SwitchMode(59840, !GetValueBoolean("Lichtschlauch"));

… soll nur mal zum überlegen anregen… :slight_smile:

Gruß,
Doc

@ HJH
Habe es dank deiner Hilfe nun geschafft!
Danke!

Des weiteren muss ich Dich bitten, die Hilfe, die Dir hier im Forum angeboten wird, auch wirklich gründlich zu lesen.

Ich muss mich daher hier selbst zitieren:

Zitat:
Grundsätzlich gilt:
Finger weg von Status-Variablen für Instanzen! Die Instanzen regeln das selbst!

Natürlich lese ich gründlich, aber der erst der mir versucht hat zu helfen, war guyabano.
Er scheint es anders zu machen.
Er hat mir geschrieben

OnClickToggle: Variable ‚Lichtschlauch‘
OnClick : Skript des auzuführenden Skriptes

Daher habe ich auch bei OnCklick meine Variable „Lichschlauch“ benutzt!
OK, hat so nicht geklappt! und ich lasse nun die Finger von den Variablen.
„Trotzdem danke an guyabano. Bin wirklich froh über jede hilfe!“
Auch der Tip von „Doctor Snuggles“ ist scheinbar gut, denn es Funktioniert genau so.
Ist an dem Script etwas anders als an dem von dir? (Außer das er kürzer ist)?
Wenn ich mir den Code so ansehe, fällt mir nur auf, das nicht geprüft wird, ob True oder False. Sonst aber alles gleich.
Naja, jetzt funktioniert es und ich kann endlich meine ganzen Instanzen einzeld eintragen und schalten.
Vielen dank nochmal an euch, für eure Hilfe.

Eine Frage hätte ich allerdings noch, um meinen Designer noch ein bischen zu Perfektionieren.
Ich sehe ganz oft, das ihr die Dimmbaren Steckdosen oder so auch mit in den Desiger integriert.
„Meistens mit Pfeilen nach Oben oder nach Unten“
Wie kann ich den Designer nun dazu bekommen, das er bei mir auch die intens ändert?
Gruß
Xanon

Du hast recht. Ich benutze die OnToggle Funktion auch nicht. Es war nur halt sehr früh am Morgen.
Ich persönlich benutze auch nie Toogle Funktionen. Deshalb habe ich auch überall Variante B im Einsatz, d.h. mit 2 Tastern, also ein klarer ON Button und eben ein klarer OFF Button ! Deshalb muss ich auch IPS_COMPONENT abfragen, da hier das gleiche Skript , aber mit verschiedenem IPS_COMPONENT Variablen Inhalt getriggert wird.
Somit ist das Mini-Skript fast universell einsetzar für alle Lampen im Haus. Ich muss vor der Ausführung dem Skript nur mitteilen, um welchen Raum es sich handelt !

Hier das ganze Skript, das ich für jeden Raum benutze:

Kinderzimmer I

// include the Globaldefines
include_once("KID1_GLOBDEF.ips.php");


if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case $room."_CEIL_LIGHT_ON"    : FS20_SwitchMode($FS20_SU_CEIL, True);
                                               break;

              case $room."_CEIL_LIGHT_OFF"   : FS20_SwitchMode($FS20_SU_CEIL, False);
                                               break;

             }
      }

Kinderzimmer II

// include the Globaldefines
include_once("KID2_GLOBDEF.ips.php");


if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case $room."_CEIL_LIGHT_ON"    : FS20_SwitchMode($FS20_SU_CEIL, True);
                                               break;

              case $room."_CEIL_LIGHT_OFF"   : FS20_SwitchMode($FS20_SU_CEIL, False);
                                               break;

             }
      }

Du wirst schnell merken, dass das Skript das gleiche ist, nur werden andere Variableninhalte ‚gefüttert‘

mfG Franz