Skript Hilfe

Hallo liebe Leute :slight_smile:

Vielleicht kann mir einer ja bei meinem Problem helfen:

Ich habe von hier:
http://ipsview.brownson.at/?p=494http://

folgendes Skript zum dimmen meiner Homematic genutzt:

<?

 		/**
	 * @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', 41674 /*[Räume\Schlafzimmer\Dimmer\LEVEL]*/);
	define ('DEVICE_WORKING_ID',56659 /*[Räume\Schlafzimmer\Dimmer\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;
	}

?>

Es klappt auch alles Super. Nur wenn der Level auf 0% steht und ich den Switch betätige zum einschalten, passiert nichts. Schön wäre wenn dann das licht auf 100% angeht oder auf den letzten Wert, der aber nicht 0 ist. Einen Schalter zu betätigen, und nichts passiert, ist nicht so schön.

Vielen Dank.

P.S. Kleine Frage noch nebendran. Wie kann ich in IPS View ein Feld erzeugen, um z.B. den Sollwert mittels Texteingabe einzustellen. (Keine Slider)

… das kannst Du im case Teil des Dimmer Switches handlen:
zB wenn Dimmer Wert unter 10% beim Einschalten, dann automatisch auf 80% setzen.


          case $variableIDSwitch:
               if ($value) {
				   if (GetValue($variableIDDimmer) <= 10)
				      SetValue($variableIDDimmer, 80);
                   Dimmer_SetDeviceValue(GetValue($variableIDDimmer));
               } else {}
                   Dimmer_SetDeviceValue(0);
			   }
               SetValue($variableId, $value);
               break;

Es stellt sich mir aber die Frage wieso der Dimmerwert bei Dir immer auf 0 ist ??

Danke für den Hinweis, werde das nachher mal probieren. Zu deiner Frage: sobald ich aufwelchen Wege din Lampe ausschalte springe bei mir der Level immer auf 0%. Ich habe das als richtig angesehen, da mir das ja auch anzeigt das die Lampe aus ist.

Rückmeldung: Hat funktioniert. Vielen Dank dafür.

Kannst du mir noch sagen, wie ich über IPS View eine Variable beschreiben kann? Ich möchte in ein Textfelder drücken können und dann den Wert 15 eingeben können, damit das Licht direkt auf 15% angeht.

Gruß
Tobias

Einfach eine TextBox in der View platzieren und die ID der Dimmer Variable eintragen. Alternativ kannst Du auch ValueButton oder RangeButtons für das Anpassten des Levels verwenden.

Also ich habe jetzt eine TextBox eingefügt und die ID der LEVEL Variable eingetragen.
Bekomme leider folgende Fehlermeldung:

-32603 - boost::bad_get: failed value get using boost::get

Wo kommt diese Fehlermeldung :confused:

Die kommt in meiner IPS View App, wenn ich versuche einen Wert einzutragen.

In IPS steht das LEvel auch immer in % also 50% oder 15%…

In IPS View wird das Level aber immer mit 1 für 100% oder 0,5 für 50% angezeigt.
Wenn ich jetzt über die Textbox einen Wert eintragen möche habe ich versucht direkt die Prozentzahl (15% einzutragen) aber auch 0,15 oder 0.15 aber ich bekomme immer die oben genannte Fehlermeldung.

OK, eine TextBox funktioniert in diesem Fall nicht, da der eingebene String nicht korrekt in den benötigten Float Wert konvertiert wird.

Für die Verwendung einer TextBox müsstest Du eine zusätzliche String Variable anlegen und einen Workflow, der den Wert auf die Level Variable überträgt.

Ich würde Dir entweder einen Value Button empfehlen, der Dir den Wert setzt (0.15) oder zB RangeButtons, die den Wert um jeweils 20% (0.2) erhöhen oder verringern.

Vielen Dank, für deine Hilfe. Dann werdce ich mal schauen, wie das mit soeinem Workflow funktioniert. Einen Button für einen Festen Wert möchte ich nicht. Danke für die Hinweise.

Guten Tag Allerseits
Ich habe vermutlich genau dasselbe Problem. Bei mir wird immer sofort jeder Dimmwert in die Variable IPSView_Dimmer geschrieben, leider auch der Wert 0 wenn ich das Licht mit dem Toggleswitch oder zum Beispiel mit dem Lichtschalter ausschalte, so wäre das ja vermutlich nich gemeint :wink:

Ich würde jetzt mal vermuten, dass die Synchronisierung des Homematic Dimmerwertes Probleme macht.

Enferne mal folgenden Teil und teste das Verhalten nochmals:


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

Jetzt wird die Variable gar nicht mehr verändert. Zur Info, ich habe auch noch die Änderung aus Post #2 eingefügt, habe ich da ev. etwas falsch umgesetzt :confused:


<?

	/**
	 * @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', 18918 /*[EG\Wohnzimmer\Dimmer Deckenleuchte\Helligkeit]*/);
	define ('DEVICE_WORKING_ID',29090 /*[EG\Wohnzimmer\Dimmer Deckenleuchte\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) {
	                   		if (GetValue($variableIDDimmer) <= 10) 
                      		SetValue($variableIDDimmer, 0.8); 		   
			   				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;
	}
 
?>

Dieser Teil macht so eher weniger Sinn:


                              if (GetValue($variableIDDimmer) <= 10) 
                              SetValue($variableIDDimmer, 0.8);            
                               Dimmer_SetDeviceValue(GetValue($variableIDDimmer));

die Variable zum Speichern der Helligkeit verwendet einen Wertebereich von 0-100, insofern solltest Du hier einen Wert über 10 nach dem Einschalten verwenden (anstatt 0.8).

Verwendest Du sicher die neue DimmerVariable zur Steuerung der Beleuchtung, die Variable „Helligkeit“ der Homematic Instanz darfst Du nicht verwenden.

Genau dies war mein (Anfänger-)Fehler, ich hatte nicht die neue DimmerVariable zur Steuerung der Beleuchtung verwendet :banghead:
Die Variable wurde bei mir jedoch mit dem Profil ~Intensity.1 angelegt, welches einen Wertebereich von 0.0 bis 1.0 hat. Darum musste ich es bei mir so implementieren:


if (GetValue($variableIDDimmer) <= 0.1) 
SetValue($variableIDDimmer, 0.8); 		   
Dimmer_SetDeviceValue(GetValue($variableIDDimmer));

Vielen Dank für deine Hilfe und ein Kompliment zu dieser grossartige Software!