Wer sich zu einem Dimmer auch noch einen Toggle Switch bauen möchte, kann das mit dem Skript in diesem Betrag realisieren.
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.
Zur Installation einfach ein neues Skript in der betreffenden Instanz anlegen und die Statusvariable eingetragen, die den aktuellen Wert des Dimmers enthält.
Nach dem erstmaligen manuellen Ausführen des Skriptes werden 2 zusätzliche Variablen angelegt, eine boolean Variable für den Switch und eine Float Variable für die Speicherung des letzten Dimmer Wertes.
Diese beiden Variablen können gegebenenfalls auch für die Kategorisierung in IPSView verwendet werden, um den Dimmer in die generiereten Views einzubinden.
<? /** * @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', 12345); /* * 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; } ?>
Für Homematic User gibt es hier noch eine erweiterte Version des Skriptes, die auch eine Rücksynchronisierung des Dimmerwertes von Homematic ermöglicht.
Die Synchronisierung ist insbesondere deshalb problematisch, weil bei einer eingestellten „Rampen“ Zeit (langsames hochdimmen über einen bestimmten Zeitraum), periodisch die temporären Werte des Dimmers von Homematic gesendet werden.
Diese temporären Werte führen aber zu einem Springen der Anzeige nach dem Setzen eines Wertes. Dieses Problem wird in dem Skript durch die Abfrage der Status Variable „Working“ gelöst (diese gibt an, ob der Aktor gerade eine Aktion ausführt oder nicht).
[EDIT 2018-10-10] Die Abfrage der Working Variable funktioniert mittlerweile nicht mehr und dadurch wird durch den Sync der letzte Wert der Dimmer Variable immer überschrieben. Diese hat zur Folge, dass der Dimmer beim Einschalten den letzten Wert nicht mehr setzen kann und immer auf 0 bleibt. Habe als Workaround nun eine Abfrage eingebaut, die den Wert beim Einschalten auf 80% korrigiert.
<? /** * @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', 31568 /*[Hardware\Homematic\Couch\LEVEL]*/); define ('DEVICE_WORKING_ID',50107 /*[Hardware\Homematic\Couch\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 && GetValue($variableIDDimmer)<= 0.05) SetValue($variableIDDimmer, 0.8); 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; } ?>