Hilfe zum Script "Toggle Switch für Dimmer"

Hallo,

ich habe mir nun auch IPSView geleistet um meine Steueroberfläche zu verschönern :slight_smile:

Zur Einarbeitung habe ich mir via MetaManager einen View zum Testen generiert und meinen Dimmer im Wohnzimmer eingebunden.
Nun wollte ich analog wie ich es im Webfront habe einen Butten für An/Aus generieren und bin auf das vorgefertigte Script gestossen.
Leider gibt es bei mir folgende Fehlermeldung:

<br />
<b>Notice</b>:  Undefined index: VARIABLE in <b>/var/lib/symcon/scripts/10986.ips.php</b> on line <b>50</b><br />
<br />
<b>Notice</b>:  Undefined index: VALUE in <b>/var/lib/symcon/scripts/10986.ips.php</b> on line <b>51</b><br />


Hier das Script, das ja bekannt sein dürfte. Ich habe lediglich die beiden Variabeln von mir eingetragen:

<?

/**
	 * @file          IPSView_DimmerSynced.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2015-04-12 brownson: Initiale Version<br/>
	 *
	 * Skript um eine Switch Variable für einen Dimmer zu realisieren
	 *
	 * Konfiguration Einstellungen:
	 *   DEVICE_DIMMER_ID        ... ID der LEVEL Variable zum Setzen des Dimmer
	 *                               Wertes
	 *   DEVICE_WORKING_ID       ... ID der WORKING Variable, diese steuert die
	 *                               Synchronisierung des Wertes
	 *
	 */
 
	/*
	 * Konfiguration:
	 * -------------------------------------------------------------------------
	 */
 
	define ('DEVICE_DIMMER_ID', 53490 /*[Obergeschoss\Wohnzimmer\og_wz_deckendim:1\LEVEL]*/);
	define ('DEVICE_WORKING_ID',26596 /*[Obergeschoss\Wohnzimmer\og_wz_deckendim:1\WORKING]*/);
 
	/*
	 * Programmlogik:
	 * -------------------------------------------------------------------------
	 */
	$scriptID     = $_IPS['SELF'];
	$sender       = $_IPS['SENDER'];
	$parentID     = IPS_GetParent($scriptID);
 
	$variableIDSwitch  = CreateVariable('IPSView_Switch',  0, $parentID, 10,
	                                    '~Switch', $scriptID);
	$variableIDDimmer  = CreateVariable('IPSView_Dimmer',  2, $parentID, 20, '',
	                                    $scriptID, DEVICE_DIMMER_ID);
 
	if ($sender=='Execute') {
		CreateEvent ('IPSView_DimmerSync', DEVICE_DIMMER_ID,  $scriptID);
		CreateEvent ('IPSView_WorkingSync', DEVICE_WORKING_ID, $scriptID);
	} else if ($sender=='Variable') {
		$value        = GetValue(DEVICE_DIMMER_ID);
	   if (DEVICE_WORKING_ID==0 or !GetValue(DEVICE_WORKING_ID)) {
			SetValue($variableIDSwitch, ($value > 0));
			SetValue($variableIDDimmer, $value);
		}
	} else {
		$variableId   = $_IPS['VARIABLE'];
		$value        = $_IPS['VALUE'];
		switch ($variableId) {
			case $variableIDDimmer:
			   Dimmer_SetDeviceValue($value);
			   SetValue($variableIDSwitch, ($value > 0));
			   SetValue($variableIDDimmer, $value);
		      break;
			case $variableIDSwitch:
			   if ($value)
			   	Dimmer_SetDeviceValue(GetValue($variableIDDimmer));
				else
			   	Dimmer_SetDeviceValue(0);
			   SetValue($variableId, $value);
		      break;
			default:
		      break;
		}
	}
	/*
	 * Funktionen:
	 * -------------------------------------------------------------------------
	 */
 
	function Dimmer_SetDeviceValue($value) {
		$instanceID = IPS_GetParent(DEVICE_DIMMER_ID);
		$ident      = IPS_GetObject(DEVICE_DIMMER_ID)['ObjectIdent'];
		IPS_RequestAction($instanceID, $ident, $value);
	}
 
	function CreateVariable ($name, $type, $parentId, $position=0, $profile="",
	                         $action=null, $referenceID=null) {
		$variableId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($variableId === false) {
 			$variableId = IPS_CreateVariable($type);
			IPS_SetParent($variableId, $parentId);
			IPS_SetName($variableId, $name);
			IPS_SetIdent($variableId, $name);
			IPS_SetPosition($variableId, $position);
  			if ($referenceID != null) {
  			   $variable = IPS_GetVariable($referenceID);
  			   $profile  = $variable['VariableProfile'];
			}
  			IPS_SetVariableCustomProfile($variableId, $profile);
 			IPS_SetVariableCustomAction($variableId, $action);
		}
		return $variableId;
	}
 
	function CreateEvent ($name, $variableId, $scriptId) {
		$eventId = @IPS_GetObjectIDByIdent($name, $scriptId);
		if ($eventId === false) {
			$eventId = IPS_CreateEvent(0);
			IPS_SetParent($eventId, $scriptId);
			IPS_SetName($eventId, $name);
			IPS_SetIdent($eventId, $name);
			IPS_SetEventTrigger($eventId, 1/*ByChange*/, $variableId);
			IPS_SetEventActive($eventId, true);
  		}
		return $eventId;
	}

?>

Meine PHP kenntnisse wachsen zwar immer mehr, aber mit grösseren Scripten bin ich überfordert und finde den Fehler nicht :frowning:

Sieht alles in Ordnung aus - wann kommt diese Fehlermeldung?

Das sieht so aus, als würdest Du das Skript im Editor ausführen. Das geht nicht. $_IPS[‚VALUE‘] und $_IPS[‚VARIABLE‘] gibt es dann nicht.

Hallo,

ich versuche mich gerade an diesem Script (für HomeMatic-User).

Script in der Instanz angelegt, Inhalt rein kopiert und die beiden Variablen-ID’s angegeben.

Wenn ich nun die BOOL-Variable ein schalte, passiert erstmal gar nichts, da beide Variablen (LEVEL und IPSView_Dimmer) auf 0 stehen. Also Schieberegler von „IPSView_Dimmer“ aufdrehen und die BOOL-Variable geht auf „AN“. Rauf / Runter dimmen, solang das Licht an ist funktioniert. AN / AUS funktioniert ebenfalls, WENN kurz hintereinander umgeschalten wird. Schalte ich AUS und warte eine Zeit lang (mehrere Sekunden), wird der Dimmwert für beide Variablen (LEVEL und IPSView_Dimmer) wieder 0 und ein EIN-Schalten mittels der BOOL-Variable (z.B. mit Toggle-Button) funktioniert nicht mehr, da auf 0 gedimmt werden soll und das ist ja eigentlich AUS.

Ein zusätzlicher Toggle Switch für einen Dimmer hat den Vorteil, dass der eingestellte Dimmer Wert erhalten bleibt und nach dem Einschalten des Lichtes, sofort auf den letzten gewählten Wert gedimmt wird.

Hmm, irgendwie wird der letzte Wert aber nirgends gespeichert ??? :confused:

Mache ich selber irgendwo einen Fehler, oder ist da ein Fehler im Script ???

<?
    /**
     * @file          IPSView_DimmerSynced.ips.php
     * @author        brownson
     * @version
     *   Version 1.0, 2015-04-12 brownson: Initiale Version<br/>
     *
     * Skript um eine Switch Variable für einen Dimmer zu realisieren
     *
     * Konfiguration Einstellungen:
     *   DEVICE_DIMMER_ID        ... ID der LEVEL Variable zum Setzen des Dimmer
     *                               Wertes
     *   DEVICE_WORKING_ID       ... ID der WORKING Variable, diese steuert die
     *                               Synchronisierung des Wertes
     *
     */
 
    /*
     * Konfiguration:
     * -------------------------------------------------------------------------
     */
 
    define ('DEVICE_DIMMER_ID', 13446 /*[Hardware\HomeMatic\DIM Arbeiten Decke\LEVEL]*/);
    define ('DEVICE_WORKING_ID',26326 /*[Hardware\HomeMatic\DIM Arbeiten Decke\WORKING]*/);
 
    /*
     * Programmlogik:
     * -------------------------------------------------------------------------
     */
    $scriptID     = $_IPS['SELF'];
    $sender       = $_IPS['SENDER'];
    $parentID     = IPS_GetParent($scriptID);
 
    $variableIDSwitch  = CreateVariable('IPSView_Switch',  0, $parentID, 10,
                                        '~Switch', $scriptID);
    $variableIDDimmer  = CreateVariable('IPSView_Dimmer',  2, $parentID, 20, '',
                                        $scriptID, DEVICE_DIMMER_ID);
 
    if ($sender=='Execute') {
        CreateEvent ('IPSView_DimmerSync', DEVICE_DIMMER_ID,  $scriptID);
        CreateEvent ('IPSView_WorkingSync', DEVICE_WORKING_ID, $scriptID);
    } else if ($sender=='Variable') {
        $value        = GetValue(DEVICE_DIMMER_ID);
       if (DEVICE_WORKING_ID==0 or !GetValue(DEVICE_WORKING_ID)) {
            SetValue($variableIDSwitch, ($value > 0));
            SetValue($variableIDDimmer, $value);
        }
    } else {
        $variableId   = $_IPS['VARIABLE'];
        $value        = $_IPS['VALUE'];
        switch ($variableId) {
            case $variableIDDimmer:
               Dimmer_SetDeviceValue($value);
               SetValue($variableIDSwitch, ($value > 0));
               SetValue($variableIDDimmer, $value);
              break;
            case $variableIDSwitch:
               if ($value)
                   Dimmer_SetDeviceValue(GetValue($variableIDDimmer));
                else
                   Dimmer_SetDeviceValue(0);
               SetValue($variableId, $value);
              break;
            default:
              break;
        }
    }
    /*
     * Funktionen:
     * -------------------------------------------------------------------------
     */
 
    function Dimmer_SetDeviceValue($value) {
        $instanceID = IPS_GetParent(DEVICE_DIMMER_ID);
        $ident      = IPS_GetObject(DEVICE_DIMMER_ID)['ObjectIdent'];
        IPS_RequestAction($instanceID, $ident, $value);
    }
 
    function CreateVariable ($name, $type, $parentId, $position=0, $profile="",
                             $action=null, $referenceID=null) {
        $variableId = @IPS_GetObjectIDByIdent($name, $parentId);
        if ($variableId === false) {
             $variableId = IPS_CreateVariable($type);
            IPS_SetParent($variableId, $parentId);
            IPS_SetName($variableId, $name);
            IPS_SetIdent($variableId, $name);
            IPS_SetPosition($variableId, $position);
              if ($referenceID != null) {
                 $variable = IPS_GetVariable($referenceID);
                 $profile  = $variable['VariableProfile'];
            }
              IPS_SetVariableCustomProfile($variableId, $profile);
             IPS_SetVariableCustomAction($variableId, $action);
        }
        return $variableId;
    }
 
    function CreateEvent ($name, $variableId, $scriptId) {
        $eventId = @IPS_GetObjectIDByIdent($name, $scriptId);
        if ($eventId === false) {
            $eventId = IPS_CreateEvent(0);
            IPS_SetParent($eventId, $scriptId);
            IPS_SetName($eventId, $name);
            IPS_SetIdent($eventId, $name);
            IPS_SetEventTrigger($eventId, 1/*ByChange*/, $variableId);
            IPS_SetEventActive($eventId, true);
          }
        return $eventId;
    }
 
?>

Gruß Proxima

Kommentiere mal folgende Zeilen für die Rückmeldung von Homematic aus:


       if (DEVICE_WORKING_ID==0 or !GetValue(DEVICE_WORKING_ID)) {
            SetValue($variableIDSwitch, ($value > 0));
            SetValue($variableIDDimmer, $value);
        }

Ich würde jetzt mal vermuten, dass bei Dir der Wert immer durch die Rückmeldung überschrieben wird. Bei meinem Dimmer habe ich eine Rampe von 1 Sekunde eingestellt und da hat das mit der Working Variable funktioniert.

Letztendlich habe ich auch bei IPSLight genau aus diesem Grund nie die Rückmeldung des Dimmers zum Modul implementiert, da ich es nicht sauber hinbekommen habe.

Hallo,

was würde denn ein korrektes Verhalten der Rückmeldung verbessern ??? Eine höhere oder niedrigere Rampenzeit ???

Was müsste ich wo in das Script ändern/einfügen, um die Rampenzeit anzugeben ??? (fürs hoch- und runterdimmen)

Gruß Proxima

Rampenzeit definiert mit direkt bei den Homematic Settings für den entsprechenden Aktor. Bin mir aber nicht mehr sicher, ob das das Problem ist/war.

Eventuell kannst Du das Problem durch eine zusätzliche Abfrage lösen:


       if (DEVICE_WORKING_ID==0 or !GetValue(DEVICE_WORKING_ID)) {
            SetValue($variableIDSwitch, ($value > 0));
			if (GetValue($variableIDSwitch)) {
				SetValue($variableIDDimmer, $value);
			}
        }

Hallo Andreas,

werde ich morgen versuchen.

Bzgl. der Rampzeit: Diese habe ich in der CCU2 auf jeweils 2 Sekunden eingestellt, jedoch wird die beim Ein/Ausschalten nicht benutzt, sondern es wird sofort auf die eingestellte Helligkeit geschalten. Daher dachte ich, es wäre vielleicht sinnvoll, in Dein Script eine „Default-Rampen-Zeit“ via globaler Variable einzubauen, um ein langsames dimmen auf die Zielhelligkeit beim Schalten via Floorplan, zu ermöglichen.

Leider weis ich nicht wie und wo das einzubauen ist. Hättest Du mir vielleicht einen Codeschnipsel ???

Gruß Proxima

Bei mir wird die Rampenzeit immer verwendet, auch wenn ich den Dimmer über IP-Symcon steuere :confused:

Moin,

habe das Script auch mal versucht. Er legt alles korrekt an, aber wenn ich die Funktionen schalte kommt folgende Meldung:

Warning: Keine Aktion für VariablenIdent ‚Value‘ gefunden in /var/lib/scripts/39885.php on line 69

Nutze aber auch knx…

Poste mal Dein Skript - bei mir ist Zeile 69 ein Kommentar…


<?
	/**
	 * @file          IPSView_DimmerSwitch.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2015-04-12 brownson: Initiale Version<br/>
	 *
	 * Skript um eine Switch Variable für einen Dimmer zu realisieren
	 *
	 * Konfiguration Einstellungen:
	 *   DEVICE_DIMMER_ID        ... ID der Variable zum Setzen des Dimmer Wertes
	 *
	 */
 
	/*
	 * Konfiguration:
	 * -------------------------------------------------------------------------
	 */
 
	define ('DEVICE_DIMMER_ID',	 42735 /*[Erdgeschoss\Beleuchtung\DL Couch Dimmen abs\Wert]*/);
 
	/*
	 * Programmlogik:
	 * -------------------------------------------------------------------------
	 */
	$scriptID     = $_IPS['SELF'];
	$sender       = $_IPS['SENDER'];
	$parentID     = IPS_GetParent($scriptID);
 
	$variableIDSwitch  = CreateVariable('IPSView_Switch',  0, $parentID, 10, 
                                            '~Switch', $scriptID);
	$variableIDDimmer  = CreateVariable('IPSView_Dimmer',  2, $parentID, 20, '', 
                                            $scriptID, DEVICE_DIMMER_ID);
 
	if ($sender=='Execute') {
	   // Only create Variables in manuell Mode
	} else {
		$variableId   = $_IPS['VARIABLE'];
		$value        = $_IPS['VALUE'];
		switch ($variableId) {
			case $variableIDDimmer:
			   Dimmer_SetDeviceValue($value);
			   SetValue($variableIDSwitch, ($value > 0));
			   SetValue($variableIDDimmer, $value);
		      break;
			case $variableIDSwitch:
			   if ($value)
			   	Dimmer_SetDeviceValue(GetValue($variableIDDimmer));
				else
			   	Dimmer_SetDeviceValue(0);
			   SetValue($variableId, $value);
		      break;
			default:
		      break;
		}
	}
	/*
	 * Funktionen:
	 * -------------------------------------------------------------------------
	 */
 
	function Dimmer_SetDeviceValue($value) {
		// Schalten der Instanz (ACHTUNG: hier wurden undokumentierte
		// Befehle zum allgemeinen Ansteuern einer Instanz verwendet.
		// Alternativ kann man auch normale Instanz Funktionen wie zum
		// Beispiel HM_WriteValueBoolean verwenden.
		$instanceID = IPS_GetParent(DEVICE_DIMMER_ID);
		$ident      = IPS_GetObject(DEVICE_DIMMER_ID)['ObjectIdent'];
		IPS_RequestAction($instanceID, $ident, $value);
	}
 
	function CreateVariable ($name, $type, $parentId, $position=0, $profile="", 
                                 $action=null, $referenceID=null) {
		$variableId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($variableId === false) {
 			$variableId = IPS_CreateVariable($type);
			IPS_SetParent($variableId, $parentId);
			IPS_SetName($variableId, $name);
			IPS_SetIdent($variableId, $name);
			IPS_SetPosition($variableId, $position);
  			if ($referenceID != null) {
  			   $variable = IPS_GetVariable($referenceID);
  			   $profile  = $variable['VariableProfile'];
			}
  			IPS_SetVariableCustomProfile($variableId, $profile);
 			IPS_SetVariableCustomAction($variableId, $action);
		}
		return $variableId;
	}
 
?>

Kann Dir leider nicht genau sagen, wo das Problem liegt, da die Ansteuerung bei KNX etwas anderes läuft.

Entweder Du versuchtst mal die folgenden Zeilen mit Deinen KNX Befehle für die Ansteuerung zu ersetzen:


        $instanceID = IPS_GetParent(DEVICE_DIMMER_ID);
        $ident      = IPS_GetObject(DEVICE_DIMMER_ID)['ObjectIdent'];
        IPS_RequestAction($instanceID, $ident, $value);

oder Du erstellst Dir einfach einen Workflow für diese Aufgabe, als Anleitung kannst Du folgenden Beitrag nehmen:

http://ipsview.brownson.at/?p=817

Mein Aktor bring eine Adresse zum schalten mit. Mein Problem ist eher, dass ich keinen Status bekomme, ob die Lampe an ist wenn ich den Slider vom Dimmer nutze.

Ich stelle die Helligkeit auf 100% aber die Schaltvariable bleibt aus. Ist ja auch richtig so, keine Frage…

Aber es wäre schön die Lampe in der Visu mit einem Klick ausschalten zu können. Aber da fällt mir sicher noch ein Workaround ein… Leider sind die meisten Anleitung immer auf Homematic geeicht. HM nutz ich nur für die Fenster… :slight_smile:

Über den Winter werde ich bei meinem Vater einige KNX Komponenten verbauen, insofern kommen in Zukunft sicher auch einige Beispiele mit KNX :wink: