IPSLight

Habe das Problem, dass neuerdings beim Dimmen von FS20 Geräten immer ein Error im Webfront kommt.

Unbenannt.jpg

Das Problem tritt nur bei FS20 auf
In den Components ist folgender Code (sollte Original sein)

<?
	/**@addtogroup ipscomponent
	 * @{
	 *
 	 *
	 * @file          IPSComponentDimmer_FS20.class.php
	 * @author        Andreas Brauneis
	 *
	 *
	 */

   /**
    * @class IPSComponentDimmer_Homematic
    *
    * Definiert ein IPSComponentDimmer_FS20 Object, das ein IPSComponentDimmer Object für FS20 implementiert.
    *
    * @author Andreas Brauneis
    * @version
    * Version 2.50.1, 31.01.2012<br/>
    */

	IPSUtils_Include ('IPSComponentDimmer.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentDimmer');

	class IPSComponentDimmer_FS20 extends IPSComponentDimmer {

		private $instanceId;

		/**
		 * @public
		 *
		 * Initialisierung eines IPSComponentDimmer_FS20 Objektes
		 *
		 * @param integer $instanceId InstanceId des FS20 Devices
		 */
		public function __construct($instanceId) {
			$this->instanceId = IPSUtil_ObjectIDByPath($instanceId);
		}

		/**
		 * @public
		 *
		 * Funktion liefert String IPSComponent Constructor String.
		 * String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
		 * wieder neu zu erzeugen.
		 *
		 * @return string Parameter String des IPSComponent Object
		 */
		public function GetComponentParams() {
			return get_class($this).','.$this->instanceId;
		}

		/**
		 * @public
		 *
		 * Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event
		 * an das entsprechende Module zu leiten.
		 *
		 * @param integer $variable ID der auslösenden Variable
		 * @param string $value Wert der Variable
		 * @param IPSModuleDimmer $module Module Object an das das aufgetretene Event weitergeleitet werden soll
		 */
		public function HandleEvent($variable, $value, IPSModuleDimmer $module){
		}

		/**
		 * @public
		 *
		 * Zustand Setzen
		 *
		 * @param integer $power Geräte Power
		 * @param integer $level Wert für Dimmer Einstellung (Wertebereich 0-100)
		 */
		public function SetState($power, $level) {
			// Zeit in Sekunden wie schnell der Aktor dimmmen soll
		   $DimspeedSec = 2;
			if (!$power) {
				FS20_SetIntensity ($this->instanceId, 0, $DimspeedSec);
				// Wartezeit um den Aktor auf OFF zu Schalten
				// IPS_Sleep wird in Millisekunden angegeben, darum * 1000
				IPS_Sleep ($DimspeedSec*1000);
				FS20_SwitchMode	($this->instanceId, false);
			} else {
				// 100% Helligkeit Entsprechen bei FS20 dem Wert 16
				$levelFS20 = round($level / 100 * 16);
				FS20_SetIntensity ($this->instanceId, $levelFS20, $DimspeedSec);
			}

		}

		/**
		 * @public
		 *
		 * Liefert aktuellen Level des Dimmers
		 *
		 * @return integer aktueller Dimmer Level
		 */
		public function GetLevel() {
			return GetValue(IPS_GetVariableIDByName('Intensität', $this->instanceId));
		}

		/**
		 * @public
		 *
		 * Liefert aktuellen Power Zustand des Dimmers
		 *
		 * @return boolean Gerätezustand On/Off des Dimmers
		 */
		public function GetPower() {
			return GetValue(IPS_GetVariableIDByName('Intensität', $this->instanceId)) > 0;
		}

	}

	/** @}*/
?>


Tritt immer beim ändern der Helligkeit auf und wird nur in dem Webfront gezeigt, auf dem der Dimmer geändert wird.

Blöd ist dass in der Meldung rein gar nichts steht
Auch in der Meldungsübersicht wird nichts angezeigt.

Habt ihr das Problem auch?

Hast ganz am Ende hinter

?>

noch Leerzeichen oder Leerzeilen ?

Habe gerade mal nachgeschaut, das Original „IPSComponentDimmer_FS20“-Skript hat eine Zeile oder ein Leerzeichen am Ende (nach ?>) zu viel. Müsste man bitte auch im Repos. anpassen.

Gruß
Bruno

Tatsächlich waren die am Ende des Scripts noch ein paar Leerzeichen. Fehlermeldung ist weg.

Vielen Dank

Ist eingepflegt …

I have Eltako FUD61NPN and FSR61NP modules configured in IPSLight. Everything works fine als long as I use IP-Symcon to operate the lights. The status of an IPSLight-Switch is not updated when I use a physical switch connected the Eltako module.

I modified IPSLight_Installation.ips.php to define the IPSMessageHandler for Enocean.

		// Eltako
		} elseif ($componentClass=='IPSComponentSwitch_Enocean') {
			$instanceId = IPSUtil_ObjectIDByPath($componentParams[1]);
			$variableId = @IPS_GetObjectIDByName("Status", (int)$instanceId);
			if ($variableId===false) {
				$moduleManager->LogHandler()->Log('Variable with Ident Status could NOT be found for Enocean Instance='.$instanceId);
			} else {
				$moduleManager->LogHandler()->Log('Register OnChangeEvent vor Enocean Instance='.$instanceId);
				$messageHandler->RegisterOnChangeEvent($variableId, $component, 'IPSModuleSwitch_IPSLight,');
			}
		} elseif ($componentClass=='IPSComponentDimmer_Enocean') {
			$instanceId = IPSUtil_ObjectIDByPath($componentParams[1]);
			$variableId = @IPS_GetObjectIDByName("Status", $instanceId);
			if ($variableId===false) {
				$moduleManager->LogHandler()->Log('Variable with Ident Status could NOT be found for Enocean Instance='.$instanceId);
			} else {
				$moduleManager->LogHandler()->Log('Register OnChangeEvent vor Enocean Instance='.$instanceId);
				$messageHandler->RegisterOnChangeEvent($variableId, $component, 'IPSModuleSwitch_IPSLight,');
			}
			$variableId = @IPS_GetObjectIDByName("Intensity", $instanceId);
			if ($variableId===false) {
				$moduleManager->LogHandler()->Log('Variable with Ident Intensity could NOT be found for Enocean Instance='.$instanceId);
			} else {
				$moduleManager->LogHandler()->Log('Register OnChangeEvent vor Enocean Instance='.$instanceId);
				$messageHandler->RegisterOnChangeEvent($variableId, $component, 'IPSModuleSwitch_IPSLight,');
			}

The modified installation script creates triggers for IPSMessageHandler_Event.

Operating a physical switch executes IPSMessageHandler_Event but this generates the following error messages:

rror: Unknown Error: Argument 3 passed to IPSComponentDimmer_Enocean::HandleEvent() must be an instance of IPSModuleDimmer, instance of IPSModuleSwitch_IPSLight given, called in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSMessageHandler\IPSMessageHandler.class.php on line 357 and defined
Error in Script C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSComponent\IPSComponentDimmer\IPSComponentDimmer_Enocean.class.php on Line 62
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
77 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
62 in IPSLibrary\app\core\IPSComponent\IPSComponentDimmer\IPSComponentDimmer_Enocean.class.php (call IPSLogger_PhpErrorHandler)
357 in IPSLibrary\app\core\IPSMessageHandler\IPSMessageHandler.class.php (call HandleEvent)
20 in IPSLibrary\app\core\IPSMessageHandler\IPSMessageHandler_Event.ips.php (call HandleEvent)

Can someone tell me how I can debug/resolve this error.

Thanks in advance.

Hi,

‚IPSComponentDimmer_Enocean‘

needs a Dimmer Module for feedback to IPSLight


...
   $messageHandler->RegisterOnChangeEvent($variableId, $component, 'IPSModuleDimmer_IPSLight,');
...

Hello Andreas,

Thanks for your answer. I don’t have enough PHP experience to solve the following problem.

IPSModuleDimmer_IPSLight.class.php doesn’t exist.
I created one based on IPSModuleSwitch_IPSLight.class.php.

	IPSUtils_Include ("IPSLight.inc.php",          "IPSLibrary::app::modules::IPSLight");
	IPSUtils_Include ('IPSModuleDimmer.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentDimmer');

	class IPSModuleDimmer_IPSLight extends IPSModuleDimmer {

		/*
		 * @public
		 *
		 * Ermöglicht die Synchronisation einer Beleuchtung zu IPSLight
		 *
		 * @param string $state Aktueller Status des Switch
		 */
		public function SyncDimLevel($state, $level, IPSComponentDimmer $componentToSync) {
			$componentParamsToSync = $componentToSync->GetComponentParams();
			$deviceConfig          = IPSLight_GetLightConfiguration();
			foreach ($deviceConfig as $deviceIdent=>$deviceData) {
				$componentConfig       = IPSComponent::CreateObjectByParams($deviceData[IPSLIGHT_COMPONENT]);
				$componentParamsConfig = $componentConfig->GetComponentParams();
				if ($componentParamsConfig==$componentParamsToSync) {
					$lightManager = new IPSLight_Manager();
					$lightManager->SynchronizeDimmer($deviceIdent, $state, $level);
				}
			}
		}

The HandleEvent function in IPSMessageHandler.class.php passes one variable, $Intensity or $status. The SynchronizeDimmer function in IPSLight_Manager requires both variables. How can I retrieve the status of the other variable?

Henk

Wie ist denn der Stand mit der Abwesenheitssimulation ? Auf Basis der Log-Datei ?

Gesendet von meinem iPad mit Tapatalk

@weimigolf

Ist leider noch immer eine Baustelle, hoffe dass ich bis in den Sommer mal Zeit finde, damit ich das Thema nochmals angehen kann.

@Henk

i think in your case the state variable could be calculated like this:


   $state = $level > 0;

i already build a prototype for homematic in the past, but i got troubles with the „ramp time“…

Hallo Zusammen,

Andreas hat gestern eine aktualisierte Version der Klasse zur Ansteuerung der Philips Hue Leuchten in die Library aufgenommen.

Die Änderungen sind:

  • Verbesserte Farbumwandlung von RGB->XY analog dem SDK von Philipps
  • Neue Funktion zum Abruf von lampenspezifischen Details
  • Neue Funktion zum triggern der Hue-internen Alert-Funktion
  • Fix: Korrekte Umrechnung der Helligkeit

Details zur Ansteuerung im Wiki: http://www.ip-symcon.de/wiki/Philips_Hue

Vielen Dank auch an meberhardt für Bereitstellung des „offiziellen“ Algorithmus zur Farbumwandlung von RGB.

Viele Grüße

Jörg

Hallo,

habe gestern IPS Light installiert.

Meine normalen HM Aktoren werden alle richtig angezeigt.

Nun wollte ich auch gerne meine neuen HUE Lampen integrieren.

Dazu habe ich das Script „IPSComponentRGB_PhilipsHUE“ im Objektbaum gesucht und dort die Einstellungen für die HUE gesucht.

Leider bekomm ich aber beim Ausführen einen Error…Sind die Daten an der richtigen Stelle von mir eingefügt worden?


<?
    /**@addtogroup ipscomponent
     * @{
     *
      *
     * @file          IPSComponentRGB_PhilipsHUE.class.php
     * @author        Andreas Brauneis
     *
     *
     */

   /**
    * @class IPSComponentRGB_PhilipsHUE
    *
    * Definiert ein IPSComponentRGB_PhilipsHUE Object, das ein IPSComponentRGB Object fuer PhilipsHUE implementiert.
	*
    * Farbumwandlung implementiert von meberhardt analog der offiziellen iOS App:
	*
	* https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX/blob/master/ApplicationDesignNotes/RGB%20to%20xy%20Color%20conversion.md 
	*
    * @author Andreas Brauneis
    * @version
    * Version 2.50.1, 28.01.2014<br/>
    */

    IPSUtils_Include ('IPSComponentRGB.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentRGB');
    IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");

    class IPSComponentRGB_PhilipsHUE extends IPSComponentRGB {

        private $bridgeIP;
        private $lampNr;
        private $hueKey;
		private $modelID;
		
		public 	$Status;
		public  $Hue;
		public  $ModelID;
		public  $XY;
		public  $Level;
		public  $Saturation;
		
    
        /**
         * @public
         *
         * Initialisierung eines IPSComponentRGB_PhilipsHUE Objektes
         *
         * @param string $bridgeIP IP Addresse der HUE Lampe
         * @param string $hueKey Key zum Zugriff auf die Lampe
         * @param string $lampNr Nummer der Lampe
		 * @param string $modelID Philips Modelnummer der Lampe
		 *
         */
        public function __construct($bridgeIP, $hueKey, $lampNr, $modelID) {
           
	$this-> 192.168.178.xxx = $bridgeIP;
        $this-> 1234567890 = $hueKey;
        $this-> 1   = $lampNr;
	$this-> LCT001 = $modelID;
        }

        /**
         * @public
         *
         * Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event 
         * an das entsprechende Module zu leiten.
         *
         * @param integer $variable ID der auslösenden Variable
         * @param string $value Wert der Variable
         * @param IPSModuleRGB $module Module Object an das das aufgetretene Event weitergeleitet werden soll
         */
        public function HandleEvent($variable, $value, IPSModuleRGB $module){
        }

        /**
         * @public
         *
         * Funktion liefert String IPSComponent Constructor String.
         * String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
         * wieder neu zu erzeugen.
         *
         * @return string Parameter String des IPSComponent Object
         */
        public function GetComponentParams() {
            return get_class($this).','.$this->bridgeIP.','.$this->hueKey.','.$this->lampNr.','.$this->modelID;
        }

        /**
        *  @brief Sends command to HUE bridge using JSON
        *  
        *  @param [in] $type Type of parameter ([Lights, Bridge]
        *  @param [in] $request [GET,PUT]
        *  @param [in] $cmd Command string
        *  @return Returns the result of the JSON command
        *  
        */
        private function hue_SendLampCommand($type, $request, $cmd = null) {
			
			switch ($type) {

			case 'Lights':
			    $json_url = 'http://'.$this->bridgeIP.'/api/'.$this->hueKey.'/lights/'.$this->lampNr.'/state';
				break;

			case 'Bridge':
				$json_url = 'http://'.$this->bridgeIP.'/api/'.$this->hueKey;
				break;
				
			case 'api':
			//For further development
				break;

			default:
				break;
			}
			
			
			$json_string = '{'.$cmd.'}';
            
			// Configuring curl 
            $ch = curl_init($json_url);
            $options = array(
                           CURLOPT_RETURNTRANSFER => true,
                           CURLOPT_CUSTOMREQUEST => $request, 
                           CURLOPT_HTTPHEADER => array('Content-type: application/json') ,
                           CURLOPT_POSTFIELDS => $json_string
                           );
            curl_setopt_array($ch, $options);
            IPSLogger_Inf(__file__, 'Send PhilipsHUE: JsonURL='.$json_url.', Command='.$json_string);

            // Execute
            if ($this->bridgeIP <> '') {
                $json_result = curl_exec($ch);
				return json_decode($json_result);
            }
        }
        
        
        /**
         * @public
         *
         * @brief Zustand Setzen 
         *
         * @param boolean $power RGB Gerät On/Off
         * @param integer $color RGB Farben (Hex Codierung)
         * @param integer $level Dimmer Einstellung der RGB Beleuchtung (Wertebereich 0-100)
         */
        public function SetState($power, $color, $level) {
            if (!$power) {
                $cmd = '"on":false';  
            } else {

			   $rotDec = (($color >> 16) & 0xFF);
			   $gruenDec = (($color >> 8) & 0xFF);
			   $blauDec = (($color >> 0) & 0xFF); 
			   $color_array = array($rotDec,$gruenDec,$blauDec);
			   
			   $modelID = $this->modelID;
			   
			   //Convert RGB to XY values
			   $values = $this->calculateXY($color_array, $modelID);
			  
			   //IPSLight is using percentage in variable Level, Hue is using [0..255] 
			   $level = round($level * 2,55);		   
			   $cmd 	= '"bri":'.$level.', "xy":['.$values->x.','.$values->y.'], "on":true'; 
			   
            }
			
			$type	 = 'Lights'; //Type of Command
			$request = 'PUT';	 //Type of Request
            
			//Send command to Hue lamp
			$this->hue_SendLampCommand($type, $request, $cmd);
        }
		
		/**
		 *  @brief Queries bridge for details of the lamp 
		 *  
		 *  @return None, details are populated in the public variables of the class
		 *  
		 */
		public function QueryHUE() {

			
			$type	 = 'Bridge'; //Type of Command
			$request = 'GET';	 //Type of Request
            
			//Send command to Hue lamp
			$result = $this->hue_SendLampCommand($type, $request);
			
 			$id = 1;

			foreach ($result->lights as $light) {

				if ($id == $this->lampNr) {
				
						$this->Status 		= $light->state->on;
						$this->Hue			= $light->state->hue;
						$this->ModelID		= $light->modelid;
						$this->XY			= $light->state->xy;
						$this->Level		= $light->state->bri;
						$this->Saturation 	= $light->state->sat;

				}
				
				$id=$id+1;
				
			}
		}

		/**
		 *  @brief Sets the alert state. 'select' blinks once, 'lselect' blinks repeatedly, 'none' turns off blinking
		 *  
		 */
		public function SetAlert( $alert_type = 'select' ) {
		
			 $type	 	= 'Lights'; //Type of Command
			 $request 	= 'PUT';	 //Type of Request
             $cmd 		= '"alert":"'.$alert_type.'"';
		     
			 //Send command to Hue lamp
             $this->hue_SendLampCommand($type, $request, $cmd);		
		}
		
		/**
		 *  @brief Converts colour value from RGB to XY 
		 *  
		 *  @param [in] $color Color in RGB
		 *  @param [in] $model Philips lamp model
		 *  @return XY value
		 */
		private function calculateXY($color, $model) {
		
			// Get the RGB values from color object and convert them to be between 0 and 1.
			$red = round($color[0] / 255,2);
			$green = round($color[1] / 255,2);
			$blue = round($color[2] / 255,2);

			// Apply a gamma correction to the RGB values
			$r = ($red > 0.04045) ? pow(($red + 0.055) / (1.0 + 0.055), 2.4) : ($red / 12.92);
			$g = ($green > 0.04045) ? pow(($green + 0.055) / (1.0 + 0.055), 2.4) : ($green / 12.92);
			$b = ($blue > 0.04045) ? pow(($blue + 0.055) / (1.0 + 0.055), 2.4) : ($blue / 12.92);

			// Convert the RGB values to XYZ using the Wide RGB D65 conversion formula
			$X = $r * 0.649926 + $g * 0.103455 + $b * 0.197109;
			$Y = $r * 0.234327 + $g * 0.743075 + $b * 0.022598;
			$Z = $r * 0.0000000 + $g * 0.053077 + $b * 1.035763;
			
			// Calculate the xy values from the XYZ values
			if($X==0 && $Y ==0 && $Z ==0) $Z = 0.1;
			
			$cx  = $X / ($X + $Y + $Z);
			$cy  = $Y / ($X + $Y + $Z);
			if(is_nan($cx)) $cx = 0.0;
			if(is_nan($cy)) $cy = 0.0;

			// Check if the found xy value is within the color gamut of the light
			$xyPoint = new cgpoint($cx, $cy);
			$colorPoints = $this->getColorPointsForModel($model);
			$inReachOfLamps = $this->checkPointInLampsReach($xyPoint, $colorPoints);

			if(!$inReachOfLamps)
			{
			    // Calculate the closest point on the color gamut triangle and use that as xy value
				$pAB = $this->getClosestPointToPoints($colorPoints[0], $colorPoints[1], $xyPoint);
				$pAC = $this->getClosestPointToPoints($colorPoints[2], $colorPoints[0], $xyPoint);
				$pBC = $this->getClosestPointToPoints($colorPoints[1], $colorPoints[2], $xyPoint);

				$dAB = $this->getDistanceBetweenTwoPoints($xyPoint, $pAB);
				$dAC = $this->getDistanceBetweenTwoPoints($xyPoint, $pAC);
				$dBC = $this->getDistanceBetweenTwoPoints($xyPoint, $pBC);

				$lowest = $dAB;
				$closestPoint = $pAB;

				if($dAC < $lowest)
				{
					$lowest = $dAC;
					$closestPoint = $pAC;
				}
				if($dBC < $lowest)
				{
					$lowest = $dBC;
					$closestPoint = $pBC;
				}

				$cx = $closestPoint->x;
				$cy = $closestPoint->y;
			}
			return new cgpoint($cx, $cy);
		}
		
        /**
		 *  @brief Returns the color gamut of a specific Philips light model
		 *  
		 *  @param [in] $model ID of the lamp model
		 *  @return Array with color gamut
		 *  
		 *  @details 
		 *  
		 *  Following models are supported:
		 *  
		 *  Hue
         *   "LCT001": Hue A19 
         *   "LCT002": Hue BR30 
         *   "LCT003": Hue GU10
		 *	LivingColors
		 *	 "LLC001": Monet, Renoir, Mondriaan (gen II) 
         *   "LLC005": Bloom (gen II) 
         *   "LLC006": Iris (gen III) 
         *   "LLC007": Bloom, Aura (gen III) 
         *   "LLC011": Hue Bloom 
         *   "LLC012": Hue Bloom 
         *   "LLC013": Storylight 
         *   "LST001": Light Strips 
         * 
		 */
		private function getColorPointsForModel($model) {
			$colorPoints = array();
			$hueBulbs = array("LCT001","LCT002","LCT003");
			$livingColors = array("LLC001","LLC005","LLC006","LLC007","LLC011","LLC012","LLC013","LST001");

			if(in_array($model, $hueBulbs))
			{
				array_push($colorPoints, new cgpoint(0.674,0.322));
				array_push($colorPoints, new cgpoint(0.408,0.517));
				array_push($colorPoints, new cgpoint(0.168,0.041));
			}
			else if(in_array($model, $livingColors))
			{
				array_push($colorPoints, new cgpoint(0.703,0.296));
				array_push($colorPoints, new cgpoint(0.214,0.709));
				array_push($colorPoints, new cgpoint(0.139,0.081));
			}
			else
			{
				array_push($colorPoints, new cgpoint(1.0,0.0));
				array_push($colorPoints, new cgpoint(0.0,1.0));
				array_push($colorPoints, new cgpoint(0.0,0.0));
			}
			
			return $colorPoints;
		}

		/**
		 * @brief Find the distance between two points.
		 *
		 * @param one
		 * @param two
		 * @return the distance between point one and two
		 */
		private function getDistanceBetweenTwoPoints($one, $two) {
		
			$dx = $one->x - $two->x;
			$dy = $one->y - $two->y;
			$dist = sqrt($dx * $dx + $dy * $dy);
			return $dist;
		}
		
		/**
		 *  @brief Find the closest point on a line. This point will be within reach of the lamp.
		 *
		 * @param A the point where the line starts
		 * @param B the point where the line ends
		 * @param P the point which is close to a line.
		 * @return the point which is on the line.
		 */
		private function getClosestPointToPoints($A, $B, $P) {
		
			$AP = new cgpoint($P->x - $A->x, $P->y - $A->y);
			$AB = new cgpoint($B->x - $A->x, $B->y - $A->y);
			$ab2 = $AB->x * $AB->x + $AB->y * $AB->y;
			$ap_ab = $AP->x * $AB->x + $AP->y * $AB->y;

			$t = $ap_ab / $ab2;
			if($t < 0.0)
			{
				$t = 0.0;
			}
			else if($t > 1.0)
			{
				$t = 1.0;
			}
			$newPoint = new cgpoint($A->x + $AB->x * $t, $A->y + $AB->y * $t);
			return $newPoint;
		}

		/**
		 *  @brief Calculates crossProduct of two 2D vectors / points
		 * 
		 * @param p1 first point used as vector
		 * @param p2 second point used as vector
		 * @return crossProduct of vectors
		 *  
		 */
		private function getCrossProduct($p1, $p2) {
			return ($p1->x * $p2->y - $p1->y * $p2->x);
		}

		/**
		 * @brief Method to see if the given XY value is within the reach of the lamps.
		 *
		 * @param p the point containing the X,Y value
		 * @return true if within reach, false otherwise.
		 *  
		 */
		private function checkPointInLampsReach($p, $colorPoints) {
		
			$red = $colorPoints[0];
			$green = $colorPoints[1];
			$blue = $colorPoints[2];
			$grx =$green->x - $red->x;
			$gry =$green->y - $red->y;
			$brx =$blue->x - $red->x;
			$bry =$blue->y -$red->y;
			$prx =$p->x - $red->x;
			$pry =$p->y - $red->y;
			$v1 = new cgpoint($grx, $gry);
			$v2 = new cgpoint($brx, $bry);
			$q = new cgpoint($prx, $pry);

			$s = ($this->getCrossProduct($q, $v2) / $this->getCrossProduct($v1, $v2));
			$t = ($this->getCrossProduct($v1, $q) / $this->getCrossProduct($v1, $v2));

			if(($s > 0.0) && ($t >= 0.0) && ($s + $t <= 1.0))
			{
				return true;
			}
			return false;
		}


    }
	
	// @cond Ignore this class in doxygen
	/**
    *
    * Helper class to ease translation from Philips C-coding
	* Implements CGPoint class from iOS SDK
    *
    */	
	
  class cgpoint {
  
	public $x;
	public $y;
	
	function __construct($_x, $_y) {
      $this->x = $_x;
	  $this->y = $_y;
	}
	
	};
	// @endcond
	
    /** @}*/
?>


In der IPS-Light Config habe ich die erste HUE so hinzugefügt



<?
	/*
	 * This file is part of the IPSLibrary.
	 *
	 * The IPSLibrary is free software: you can redistribute it and/or modify
	 * it under the terms of the GNU General Public License as published
	 * by the Free Software Foundation, either version 3 of the License, or
	 * (at your option) any later version.
	 *
	 * The IPSLibrary is distributed in the hope that it will be useful,
	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	 * GNU General Public License for more details.
	 *
	 * You should have received a copy of the GNU General Public License
	 * along with the IPSLibrary. If not, see http://www.gnu.org/licenses/gpl.txt.
	 */

	/**@defgroup ipslight_configuration IPSLight Konfiguration
	 * @ingroup ipslight
	 * @{
	 *
	 * @file          IPSLight_Configuration.inc.php
	 * @author        Andreas Brauneis
	 * @version
	 *  Version 2.50.1, 26.07.2012<br/>
	 *
	 * Konfigurations File für IPSLight
	 *
	 */

	/**
	 *
	 * Definition der Beleuchtungs Elemente
	 *
	 * Die Konfiguration erfolgt in Form eines Arrays, für jedes Beleuchtungselement wird ein Eintrag im Array erzeugt.
	 *
	 * Für jedes Beleuchtungselement werden dann die Eigenschaften in einem gesonderten Array hinterlegt:
	 *
	 * IPSLIGHT_NAME  - spezifiziert den Namen der Beleuchtung in der GUI, Änderungen an dieser Eigenschaft werden erst nach einem
	 *                  erneuten Ausführen der Installationsprozedur sichtbar.
	 *
	 * IPSLIGHT_GROUP - beinhaltet eine Liste aller Gruppen, der das Beleuchtungselement zugeordnet ist. Diese Eigenschaft kann
	 *                  jederzeit geändert werden (vorausgesetzt die Gruppe ist bereits definiert, siehe weiter unten).
	 *
	 * IPSLIGHT_TYPE  - spezifiziert den Type der Beleuchtung, zur Zeit werden 3 Beleuchtungstypen unterstützt:
	 *    - IPSLIGHT_TYPE_SWITCH:  Normale Beleuchtung mit Ein/Aus Funktionalität
	 *    - IPSLIGHT_TYPE_RGB:     RGB Beleuchtung
	 *    - IPSLIGHT_TYPE_DIMMER:  Dimmbare Beleuchtung
	 *                  Änderungen an diesem Parameter erfordern ein Ausführen der Installations Prozedure.
	 *
	 * IPSLIGHT_COMPONENT - dieser Eintrag spezifiziert die Hardware, die Angabe des Component Strings muss mit dem spezifizierten
	 *                      Beleuchtungstypen (siehe oben) zusammenpassen (Type Dimmer benötigt zB eine Klasse IPSComponentDimmer).
	 *
	 * IPSLIGHT_POWERCIRCLE - Hier kann spezifiziert werden an welchem Stromkreis die Lampe angeschlossen ist. Dieser Parameter ist
	 *                        optional.
	 *
	 * IPSLIGHT_POWERWATT - Spezifiert die maximale Leistung der Beleuchtung. Zusammen mit dem Parameter IPSLIGHT_POWERCIRCLE ist es 
	 *                      nun möglich die aktuelle Leistung eines Stromkreises abzufragen. Details siehe auch im WIKI.
	 *
	 * Eine ausführliche Beispielliste findet sich auch im Example Ordner
	 *
	 *
	 * Beispiel:
	 * @code
        function IPSLight_GetLightConfiguration() {
          return array(
            'Kueche'  =>  array(
               IPSLIGHT_NAME            => 'Küche',
               IPSLIGHT_GROUPS          => 'Erdgeschoss,All',
               IPSLIGHT_TYPE            => IPSLIGHT_TYPE_SWITCH',
               IPSLIGHT_COMPONENT       => 'IPSComponentSwitch_Homematic,12345',
               IPSLIGHT_POWERCIRCLE     => 1,
               IPSLIGHT_POWERWATT       => 60),
            'Ambiente'  =>  array(
               IPSLIGHT_NAME            => 'Ambiente',
               IPSLIGHT_GROUPS          => 'Erdgeschoss,All',
               IPSLIGHT_TYPE            => IPSLIGHT_TYPE_RGB,
               IPSLIGHT_COMPONENT       => 'IPSComponentRGB_IPS868,12345'),
             );
        }
	 * @endcocde
	 *
	 * @return string Liefert Array mit Beleuchtungs Elementen
	 */
	function IPSLight_GetLightConfiguration() {
		return array(
			'Abstellraum'       						=>	array('Abstellraum','Keller,All','Switch','IPSComponentSwitch_Homematic,55594 /*[Haus\Keller\Abstellraum\Deckenlampe]*/'),
			'Werkstatt'           					=>	array('Werkstatt','Keller,All','Switch','IPSComponentSwitch_Homematic,56997 /*[Haus\Keller\Werkstatt\Deckenlampe]*/'),
         'Bad Keller'       						=>	array('Bad Keller','Keller,All','Switch','IPSComponentSwitch_Homematic,47649 /*[Haus\Keller\Bad\Deckenlampe]*/'),
			'Gästezimmer'          	 				=>	array('Gästezimmer','Keller,All','Switch','IPSComponentSwitch_Homematic,11330 /*[Haus\Keller\Gästezimmer\Deckenlampe]*/'),
         'Flur Keller'       						=>	array('Flur Keller','Keller,All','Switch','IPSComponentSwitch_Homematic,30527 /*[Haus\Keller\Flur\Deckenlampe]*/'),
			'Wohnzimmer'     							=>	array('Wohnzimmer','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,34265 /*[Haus\Erdgeschoss\Wohnzimmer\Deckenlampe Wohnzimmer]*/ /*[Haus\Erdgeschoss\Wohnzimmer\Deckenlampe Esszimmer]*/'),
			'Esszimmer'           					=>	array('Esszimmer','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,24648 /*[Haus\Erdgeschoss\Wohnzimmer\Deckenlampe Esszimmer]*/ /*[Haus\Obergeschoss\Bad\Deckenlampe]*/'),
			'Eingang'          						=>	array('Flur EG','Flur EG,All','Switch','IPSComponentSwitch_Homematic,45769 /*[Haus\Erdgeschoss\Foyer\Deckenlampe Flur]*/ /*[Haus\Erdgeschoss\Eingang\Außenlampe Eingang]*/'),
      	'Foyer EG'       							=>	array('Foyer EG','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,32664 /*[Haus\Erdgeschoss\Foyer\Deckenlampen Foyer Erdgeschoss]*/'),
			'BadEG'           						=>	array('Bad EG','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,54260 /*[Haus\Erdgeschoss\Bad\Deckenlampe]*/'),
         'Küche'      								=>	array('Küche','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,25507 /*[Haus\Erdgeschoss\Küche\Deckenlampe]*/'),
			'Anbau Terrasse'      					=>	array('Anbau Terrasse','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,10732 /*[Haus\Erdgeschoss\Wohnzimmer\Licht Anbau Terrasse]*/'),
         'Licht Treppe Foyer'      				=>	array('Licht Treppe Foyer','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,40788 /*[Haus\Erdgeschoss\Foyer\Licht Treppe Foyer ]*/ /*[Haus\Erdgeschoss\Wohnzimmer\Licht Anbau Terrasse]*/'),
			'Wohnzimmer Sofalampe'     			=>	array('Wohnzimmer Sofalampe','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,23680 /*[Haus\Erdgeschoss\Wohnzimmer\Sofa Lampe ]*/ /*[Haus\Erdgeschoss\Küche\Deckenlampe]*/'),
			'Wohnzimmer LEDs'      					=>	array('Wohnzimmer LEDs','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,42004 /*[Haus\Erdgeschoss\Wohnzimmer\LED Beleuchtung ]*/ /*[Haus\Erdgeschoss\Wohnzimmer\Licht Anbau Terrasse]*/'),
         'Außenlampe Haustür'     				=>	array('Außenlampe Haustür','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,52658 /*[Haus\Erdgeschoss\Eingang\Außenlampe Eingang]*/ /*[Haus\Erdgeschoss\Wohnzimmer\Sofa Lampe ]*/ /*[Haus\Erdgeschoss\Küche\Deckenlampe]*/'),
			'Außenlampe Terrassentür'  			=>	array('Außenlampe Terrassentür','Erdgeschoss,All','Switch','IPSComponentSwitch_Homematic,47743 /*[Haus\Erdgeschoss\Foyer\Außenlampe Kellertür]*/ /*[Haus\Erdgeschoss\Wohnzimmer\LED Beleuchtung ]*/ /*[Haus\Erdgeschoss\Wohnzimmer\Licht Anbau Terrasse]*/'),
			'Foyer OG'           					=>	array('Foyer OG','Obergeschoss,All','Switch','IPSComponentSwitch_Homematic,23391 /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'Kinderzimmer'       					=>	array('Kinderzimmer','Obergeschoss,All','Switch','IPSComponentSwitch_Homematic,34810 /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
			'Bad OG'           						=>	array('Bad OG','Obergeschoss,All','Switch', 'IPSComponentSwitch_Homematic,11849 /*[Haus\Obergeschoss\Bad\Deckenlampe]*/'),
         'Schlafzimmer'       					=>	array('Schlafzimmer','Obergeschoss,All','Switch','IPSComponentSwitch_Homematic,37891 /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
       	'Nachttisch Dom'           			=>	array('Nachttisch Dom','Obergeschoss,All','Switch','IPSComponentSwitch_Homematic,21758 /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Dom]*/ /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'Nachttisch Caro'       				=>	array('Nachttisch Caro','Obergeschoss,All','Switch','IPSComponentSwitch_Homematic,23614 /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
			'Terrasse Einbaustrahler'  			=>	array('Terrasse Einbaustrahler','Garten,All','Switch','IPSComponentSwitch_Homematic,16017 /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
         'Terrasse Decken- und Wandlampe'  	=>	array('Terrasse Decken- und Wandlampe','Garten,All','Switch','IPSComponentSwitch_Homematic,44790 /*[Haus\Garten Hinten\Terrasse\Decken- und Wandlampe]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
			'Laternen Einfahrt'        			=>	array('Laternen Einfahrt','Garten,All','Switch','IPSComponentSwitch_Homematic,51413 /*[Haus\Garten Vorne\Einfahrt\Laternen Einfahrt ]*/ /*[Haus\Garten Vorne\Einfahrt\Laternen Einfahrt ]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Dom]*/ /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'Laternen Garten Hinten'   			=>	array('Laternen Garten Hinten','Garten,All','Switch', 'IPSComponentSwitch_Homematic,34746 /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
			'Beleuchtung Teichfilter'  			=>	array('Beleuchtung Teichfilter','Garten,All','Switch','IPSComponentSwitch_Homematic,46552 /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Teichfilter]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
         'Strahler Carport'  						=>	array('Strahler Carport','Garten,All','Switch','IPSComponentSwitch_Homematic,54259 /*[Haus\Garten Vorne\Einfahrt\Carport Strahler ]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
			'Beleuchtung Schuppen'        		=>	array('Beleuchtung Schuppen','Garten,All','Switch','IPSComponentSwitch_Homematic,51020 /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Schuppen]*/ /*[Haus\Garten Vorne\Einfahrt\Laternen Einfahrt ]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Dom]*/ /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'Strahler Satspiegel'   				=>	array('Strahler Satspiegel','Garten,All','Switch','IPSComponentSwitch_Homematic,11721 /*[Haus\Garten Hinten\Garten\Strahler Satspiegel ]*/ /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
         'TV Wohnzimmer'  							=>	array('TV Wohnzimmer','Technik,All','Switch','IPSComponentSwitch_Homematic,34113 /*[Haus\Erdgeschoss\Wohnzimmer\Entertainment ]*/ /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Teichfilter]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
         'IPS Touch PC'  							=>	array('IPS Touch PC','Technik,All','Switch','IPSComponentSwitch_Homematic,13083 /*[Haus\Erdgeschoss\Foyer\IPS Touch PC Foyer]*/ /*[Haus\Garten Vorne\Einfahrt\Carport Strahler ]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
			'TV Schlafzimmer'        				=>	array('TV Schlafzimmer','Technik,All','Switch','IPSComponentSwitch_Homematic,44362 /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Entertainment]*/ /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Schuppen]*/ /*[Haus\Garten Vorne\Einfahrt\Laternen Einfahrt ]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Dom]*/ /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'Ozon Pumpe'   							=>	array('Ozon Pumpe','Technik,All','Switch','IPSComponentSwitch_Homematic,33552 /*[Haus\Garten Hinten\Teich\Pumpe Ozon]*/ /*[Haus\Garten Hinten\Garten\Strahler Satspiegel ]*/ /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
         'Filter Pumpe'  							=>	array('Filter Pumpe','Technik,All','Switch','IPSComponentSwitch_Homematic,42865 /*[Haus\Garten Hinten\Teich\Pumpe Teichfilter]*/ /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Teichfilter]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
         'Ozon- und Sauerstoffkonzentrator' 	=>	array('Ozon- und Sauerstoffkonzentrator','Technik,All','Switch','IPSComponentSwitch_Homematic,54259 /*[Haus\Garten Vorne\Einfahrt\Carport Strahler ]*/ /*[Wired\Schaltaktor\KEQ0055045\Einbaustrahler Terrasse und Strahler Teich]*/ /*[Haus\Obergeschoss\Schlafzimmer\Container Links\Beleuchtung\Deckenlampe]*/'),
			'Sauerstoffpumpe Filter'        		=>	array('Sauerstoffpumpe Filter','Technik,All','Switch','IPSComponentSwitch_Homematic,27168 /*[Wired\Schaltaktor\KEQ0055045\Sauerstoffpumpe Hel-X]*/ /*[Wired\Schaltaktor\KEQ0055045\Beleuchtung Schuppen]*/ /*[Haus\Garten Vorne\Einfahrt\Laternen Einfahrt ]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Dom]*/ /*[Haus\Obergeschoss\Foyer\Container Links\Beleuchtung\Deckenlampe Foyer Obergeschoss]*/'),
         'UV Lampe'   								=>	array('UV Lampe','Technik,All','Switch','IPSComponentSwitch_Homematic,31967 /*[Wired\Schaltaktor\KEQ0055045\UVC]*/ /*[Haus\Garten Hinten\Garten\Strahler Satspiegel ]*/ /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
         'Beleuchtung Briefkasten'   			=>	array('Beleuchtung Briefkasten','Garten,All','Switch','IPSComponentSwitch_Homematic,17878 /*[Haus\Einfahrt\Container Links\Beleuchtung\Beleuchtung Briefkasten]*/ /*[Haus\Garten Hinten\Garten\Strahler Satspiegel ]*/ /*[Wired\Schaltaktor\KEQ0055045\Laternen Garten Hinten]*/ /*[Haus\Obergeschoss\Schlafzimmer\Nachttischlampe Caro]*/ /*[Haus\Obergeschoss\Kinderzimmer\Container Links\Deckenlampe]*/'),
         'Philips HUE Lampe Terrasse'   		=>	array('Philips HUE Lampe Terrasse','Garten,All','RGB','IPSComponentRGB_PhilipsHUE,192.168.178.46,9711014820aa6881368541449fe7ce00,1,LCT001),
);
	}


	/**
	 *
	 * Definition der Beleuchtungs Gruppen
	 *
	 * Die Konfiguration erfolgt in Form eines Arrays, für jede Beleuchtungsgruppe wird ein Eintrag im Array erzeugt.
	 *
	 * Für jede Beleuchtungsgruppe werden dann die Eigenschaften in einem gesonderten Array hinterlegt:
	 *
	 * IPSLIGHT_NAME  - spezifiziert den Namen der Gruppe in der GUI, Änderungen an dieser Eigenschaft werden erst nach einem
	 *                  erneuten Ausführen der Installationsprozedur sichtbar.
	 *
	 * IPSLIGHT_ACTIVATABLE - gibt an, ob die Gruppe über die GUI eingeschaltet werden kann
	 *
	 * Eine Liste mit diversen Beispiel Konfigurationen findet sich auch im Example Ordner
	 *
	 *
	 * Beispiel:
	 * @code
        function IPSLight_GetGroupConfiguration() {
          return array(
            'All'  =>  array(
               IPSLIGHT_NAME            => 'All',
               IPSLIGHT_ACTIVATABLE     => false),
            'Erdgeschoss'  =>  array(
               IPSLIGHT_NAME            => 'Erdgeschoss',
               IPSLIGHT_ACTIVATABLE     => false),
            'Obergeschoss'  =>  array(
               IPSLIGHT_NAME            => 'Obergeschoss',
               IPSLIGHT_ACTIVATABLE     => false),
            'Keller'  =>  array(
               IPSLIGHT_NAME            => 'Keller',
               IPSLIGHT_ACTIVATABLE     => false),
            'Garten'  =>  array(
               IPSLIGHT_NAME            => 'Garten',
               IPSLIGHT_ACTIVATABLE     => false),
            'Technik'  =>  array(
               IPSLIGHT_NAME            => 'Technik',
               IPSLIGHT_ACTIVATABLE     => false),
             );
        }
	 * @endcocde
	 *
	 * @return string Liefert Array mit Beleuchtungs Gruppen
	 */
	function IPSLight_GetGroupConfiguration() {
		return array('All'            =>	array('All',            IPSLIGHT_ACTIVATABLE => false,),
		             'Erdgeschoss'    =>	array('Erdgeschoss',    IPSLIGHT_ACTIVATABLE => false,),
		             'Obergeschoss'   =>	array('Obergeschoss',   IPSLIGHT_ACTIVATABLE => false,),
		             'Keller'     		=>	array('Keller',    		IPSLIGHT_ACTIVATABLE => false,),
		             'Garten'     		=>	array('Garten',    		IPSLIGHT_ACTIVATABLE => false,),
		             'Technik'     	=>	array('Technik',    		IPSLIGHT_ACTIVATABLE => false,)
	   );
	}

	/**
	 *
	 * Definition der Beleuchtungs Programme
	 *
	 * Die Konfiguration erfolgt in Form eines Arrays, für jedes Beleuchtungsprogramm wird ein Eintrag im Array erzeugt.
	 *
	 * Für jedes Beleuchtungsprogramm werden dann die einzelnen Programme ebenfalls als Array hinterlegt, diese wiederum haben ihre
	 * Eigenschaften nochmals in einem Array gespeichert:
	 *
	 * IPSLIGHT_PROGRAMON  - Liste mit Beleuchungselementen, die bei diesem Programm eingeschaltet sein sollen.
	 *
	 * IPSLIGHT_PROGRAMOFF  - Liste mit Beleuchungselementen, die bei diesem Programm ausgeschaltet sein sollen.
	 *
	 * IPSLIGHT_PROGRAMLEVEL  - Liste mit Beleuchungselementen, die auf einen bestimmten Dimm Level gestellt werden sollen
	 *
	 * Eine Liste mit diversen Beispiel Konfigurationen findet sich auch im Example Ordner
	 *
	 *
	 * Beispiel:
	 * @code
        function IPSLight_GetProgramConfiguration() {
          return array(
				'Aus'  	=>	array(
					IPSLIGHT_PROGRAMOFF		=> 	'WellnessWand,WellnessDecke,WellnessSauna,WellnessDusche,WellnessAmbiente',
				),
				'TV'  	=>	array(
					IPSLIGHT_PROGRAMLEVEL	=> 	'WellnessWand,30',
					IPSLIGHT_PROGRAMOFF		=> 	'WellnessDecke,WellnessSauna,WellnessDusche,WellnessAmbiente',

				),
				'Relax'  	=>	array(
					IPSLIGHT_PROGRAMON		=> 	'WellnessSauna,WellnessDusche,WellnessAmbiente',
					IPSLIGHT_PROGRAMLEVEL	=> 	'WellnessDecke,30,WellnessWand,30',

				),
             );
        }
	 * @endcocde
	 *
	 * @return string Liefert Array mit Beleuchtungs Gruppen
	 */
	function IPSLight_GetProgramConfiguration() {
		return array(
		);
	}

	/**
	 *
	 * Definition der WebFront GUI
	 *
	 * Die Konfiguration der WebFront Oberfläche ist NICHT dokumentiert, ist aber analog zur normalen WebFront Konfigurator GUI
	 * aufgebaut.
	 *
	 * Beispiele finden sich im Example Ordner
	 *
	 * @return string Liefert Array zum Aufbau des WebFronts
	 */
	function IPSLight_GetWebFrontConfiguration() {
		return array(
		);
	}

	/**
	 *
	 * Definition der Mobile GUI
	 *
	 * Die Konfiguration der Mobile GUI ist NICHT dokumentiert
	 *
	 * Beispiele finden sich im Example Ordner
	 *
	 * @return string Liefert Array zum Aufbau der Mobile GUI
	 */
	function IPSLight_GetMobileConfiguration() {
		return array(
		);
	}

	/** @}*/
?>



Leider bekomm ich auch hier einen Error

Parse error: syntax error, unexpected ‚All‘ (T_STRING), expecting ‚)‘ in [Program\IPSLibrary\config\modules\IPSLight\IPSLight_Configuration] on line 153
Abort Processing during Fatal-Error: syntax error, unexpected ‚All‘ (T_STRING), expecting ‚)‘
Error in Script C:\IPS\ips\scripts\IPSLibrary\config\modules\IPSLight\IPSLight_Configuration.inc.php on Line 153

Hallo dpoessl,

Änderungen an „IPSComponentRGB_PhilipsHUE“ sind nicht nötig, die Parameter werden aus der IPSLight_Configuration.inc.php gelesen.

Dein Eintrag für die Hue in der in der IPSLight_Configuration.inc.php sieht gut aus, aber ich denke es fehlt ein " ’ " am Ende des Strings. Versuch es mal hiermit:


'Philips HUE Lampe Terrasse'           =>    array('Philips HUE Lampe Terrasse','Garten,All','RGB','IPSComponentRGB_PhilipsHUE,192.168.178.46,9711014820aa6881368541449fe7ce00,1,LCT001'),

Viele Grüße

Jörg

Super damit funktioniert das Config Skript.

Aber leider bringt das Hue_Script noch einen Fehler.

Könnte bitte mal jemand seine Hue_Class hier posten. Also die originale Version. Wäre super.


<?
    /**@addtogroup ipscomponent
     * @{
     *
      *
     * @file          IPSComponentRGB_PhilipsHUE.class.php
     * @author        Andreas Brauneis
     *
     *
     */

   /**
    * @class IPSComponentRGB_PhilipsHUE
    *
    * Definiert ein IPSComponentRGB_PhilipsHUE Object, das ein IPSComponentRGB Object fuer PhilipsHUE implementiert.
	*
    * Farbumwandlung implementiert von meberhardt analog der offiziellen iOS App:
	*
	* https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX/blob/master/ApplicationDesignNotes/RGB%20to%20xy%20Color%20conversion.md 
	*
    * @author Andreas Brauneis
    * @version
    * Version 2.50.1, 28.01.2014<br/>
    */

    IPSUtils_Include ('IPSComponentRGB.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentRGB');
    IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");

    class IPSComponentRGB_PhilipsHUE extends IPSComponentRGB {

        private $bridgeIP;
        private $lampNr;
        private $hueKey;
		private $modelID;
		
		public 	$Status;
		public  $Hue;
		public  $ModelID;
		public  $XY;
		public  $Level;
		public  $Saturation;
		
    
        /**
         * @public
         *
         * Initialisierung eines IPSComponentRGB_PhilipsHUE Objektes
         *
         * @param string $bridgeIP IP Addresse der HUE Lampe
         * @param string $hueKey Key zum Zugriff auf die Lampe
         * @param string $lampNr Nummer der Lampe
		 * @param string $modelID Philips Modelnummer der Lampe
		 *
         */
        public function __construct($bridgeIP, $hueKey, $lampNr, $modelID)
		  {
           
			$this-> = $bridgeIP;
         $this-> = $hueKey;
         $this-> = $lampNr;
			$this-> = $modelID;
        }

        /**
         * @public
         *
         * Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event 
         * an das entsprechende Module zu leiten.
         *
         * @param integer $variable ID der auslösenden Variable
         * @param string $value Wert der Variable
         * @param IPSModuleRGB $module Module Object an das das aufgetretene Event weitergeleitet werden soll
         */
        public function HandleEvent($variable, $value, IPSModuleRGB $module){
        }

        /**
         * @public
         *
         * Funktion liefert String IPSComponent Constructor String.
         * String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
         * wieder neu zu erzeugen.
         *
         * @return string Parameter String des IPSComponent Object
         */
        public function GetComponentParams() {
            return get_class($this).','.$this->bridgeIP.','.$this->hueKey.','.$this->lampNr.','.$this->modelID;
        }

        /**
        *  @brief Sends command to HUE bridge using JSON
        *  
        *  @param [in] $type Type of parameter ([Lights, Bridge]
        *  @param [in] $request [GET,PUT]
        *  @param [in] $cmd Command string
        *  @return Returns the result of the JSON command
        *  
        */
        private function hue_SendLampCommand($type, $request, $cmd = null) {
			
			switch ($type) {

			case 'Lights':
			    $json_url = 'http://'.$this->bridgeIP.'/api/'.$this->hueKey.'/lights/'.$this->lampNr.'/state';
				break;

			case 'Bridge':
				$json_url = 'http://'.$this->bridgeIP.'/api/'.$this->hueKey;
				break;
				
			case 'api':
			//For further development
				break;

			default:
				break;
			}
			
			
			$json_string = '{'.$cmd.'}';
            
			// Configuring curl 
            $ch = curl_init($json_url);
            $options = array(
                           CURLOPT_RETURNTRANSFER => true,
                           CURLOPT_CUSTOMREQUEST => $request, 
                           CURLOPT_HTTPHEADER => array('Content-type: application/json') ,
                           CURLOPT_POSTFIELDS => $json_string
                           );
            curl_setopt_array($ch, $options);
            IPSLogger_Inf(__file__, 'Send PhilipsHUE: JsonURL='.$json_url.', Command='.$json_string);

            // Execute
            if ($this->bridgeIP <> '') {
                $json_result = curl_exec($ch);
				return json_decode($json_result);
            }
        }
        
        
        /**
         * @public
         *
         * @brief Zustand Setzen 
         *
         * @param boolean $power RGB Gerät On/Off
         * @param integer $color RGB Farben (Hex Codierung)
         * @param integer $level Dimmer Einstellung der RGB Beleuchtung (Wertebereich 0-100)
         */
        public function SetState($power, $color, $level) {
            if (!$power) {
                $cmd = '"on":false';  
            } else {

			   $rotDec = (($color >> 16) & 0xFF);
			   $gruenDec = (($color >> 8) & 0xFF);
			   $blauDec = (($color >> 0) & 0xFF); 
			   $color_array = array($rotDec,$gruenDec,$blauDec);
			   
			   $modelID = $this->modelID;
			   
			   //Convert RGB to XY values
			   $values = $this->calculateXY($color_array, $modelID);
			  
			   //IPSLight is using percentage in variable Level, Hue is using [0..255] 
			   $level = round($level * 2,55);		   
			   $cmd 	= '"bri":'.$level.', "xy":['.$values->x.','.$values->y.'], "on":true'; 
			   
            }
			
			$type	 = 'Lights'; //Type of Command
			$request = 'PUT';	 //Type of Request
            
			//Send command to Hue lamp
			$this->hue_SendLampCommand($type, $request, $cmd);
        }
		
		/**
		 *  @brief Queries bridge for details of the lamp 
		 *  
		 *  @return None, details are populated in the public variables of the class
		 *  
		 */
		public function QueryHUE() {

			
			$type	 = 'Bridge'; //Type of Command
			$request = 'GET';	 //Type of Request
            
			//Send command to Hue lamp
			$result = $this->hue_SendLampCommand($type, $request);
			
 			$id = 1;

			foreach ($result->lights as $light) {

				if ($id == $this->lampNr) {
				
						$this->Status 		= $light->state->on;
						$this->Hue			= $light->state->hue;
						$this->ModelID		= $light->modelid;
						$this->XY			= $light->state->xy;
						$this->Level		= $light->state->bri;
						$this->Saturation 	= $light->state->sat;

				}
				
				$id=$id+1;
				
			}
		}

		/**
		 *  @brief Sets the alert state. 'select' blinks once, 'lselect' blinks repeatedly, 'none' turns off blinking
		 *  
		 */
		public function SetAlert( $alert_type = 'select' ) {
		
			 $type	 	= 'Lights'; //Type of Command
			 $request 	= 'PUT';	 //Type of Request
             $cmd 		= '"alert":"'.$alert_type.'"';
		     
			 //Send command to Hue lamp
             $this->hue_SendLampCommand($type, $request, $cmd);		
		}
		
		/**
		 *  @brief Converts colour value from RGB to XY 
		 *  
		 *  @param [in] $color Color in RGB
		 *  @param [in] $model Philips lamp model
		 *  @return XY value
		 */
		private function calculateXY($color, $model) {
		
			// Get the RGB values from color object and convert them to be between 0 and 1.
			$red = round($color[0] / 255,2);
			$green = round($color[1] / 255,2);
			$blue = round($color[2] / 255,2);

			// Apply a gamma correction to the RGB values
			$r = ($red > 0.04045) ? pow(($red + 0.055) / (1.0 + 0.055), 2.4) : ($red / 12.92);
			$g = ($green > 0.04045) ? pow(($green + 0.055) / (1.0 + 0.055), 2.4) : ($green / 12.92);
			$b = ($blue > 0.04045) ? pow(($blue + 0.055) / (1.0 + 0.055), 2.4) : ($blue / 12.92);

			// Convert the RGB values to XYZ using the Wide RGB D65 conversion formula
			$X = $r * 0.649926 + $g * 0.103455 + $b * 0.197109;
			$Y = $r * 0.234327 + $g * 0.743075 + $b * 0.022598;
			$Z = $r * 0.0000000 + $g * 0.053077 + $b * 1.035763;
			
			// Calculate the xy values from the XYZ values
			if($X==0 && $Y ==0 && $Z ==0) $Z = 0.1;
			
			$cx  = $X / ($X + $Y + $Z);
			$cy  = $Y / ($X + $Y + $Z);
			if(is_nan($cx)) $cx = 0.0;
			if(is_nan($cy)) $cy = 0.0;

			// Check if the found xy value is within the color gamut of the light
			$xyPoint = new cgpoint($cx, $cy);
			$colorPoints = $this->getColorPointsForModel($model);
			$inReachOfLamps = $this->checkPointInLampsReach($xyPoint, $colorPoints);

			if(!$inReachOfLamps)
			{
			    // Calculate the closest point on the color gamut triangle and use that as xy value
				$pAB = $this->getClosestPointToPoints($colorPoints[0], $colorPoints[1], $xyPoint);
				$pAC = $this->getClosestPointToPoints($colorPoints[2], $colorPoints[0], $xyPoint);
				$pBC = $this->getClosestPointToPoints($colorPoints[1], $colorPoints[2], $xyPoint);

				$dAB = $this->getDistanceBetweenTwoPoints($xyPoint, $pAB);
				$dAC = $this->getDistanceBetweenTwoPoints($xyPoint, $pAC);
				$dBC = $this->getDistanceBetweenTwoPoints($xyPoint, $pBC);

				$lowest = $dAB;
				$closestPoint = $pAB;

				if($dAC < $lowest)
				{
					$lowest = $dAC;
					$closestPoint = $pAC;
				}
				if($dBC < $lowest)
				{
					$lowest = $dBC;
					$closestPoint = $pBC;
				}

				$cx = $closestPoint->x;
				$cy = $closestPoint->y;
			}
			return new cgpoint($cx, $cy);
		}
		
        /**
		 *  @brief Returns the color gamut of a specific Philips light model
		 *  
		 *  @param [in] $model ID of the lamp model
		 *  @return Array with color gamut
		 *  
		 *  @details 
		 *  
		 *  Following models are supported:
		 *  
		 *  Hue
         *   "LCT001": Hue A19 
         *   "LCT002": Hue BR30 
         *   "LCT003": Hue GU10
		 *	LivingColors
		 *	 "LLC001": Monet, Renoir, Mondriaan (gen II) 
         *   "LLC005": Bloom (gen II) 
         *   "LLC006": Iris (gen III) 
         *   "LLC007": Bloom, Aura (gen III) 
         *   "LLC011": Hue Bloom 
         *   "LLC012": Hue Bloom 
         *   "LLC013": Storylight 
         *   "LST001": Light Strips 
         * 
		 */
		private function getColorPointsForModel($model) {
			$colorPoints = array();
			$hueBulbs = array("LCT001","LCT002","LCT003");
			$livingColors = array("LLC001","LLC005","LLC006","LLC007","LLC011","LLC012","LLC013","LST001");

			if(in_array($model, $hueBulbs))
			{
				array_push($colorPoints, new cgpoint(0.674,0.322));
				array_push($colorPoints, new cgpoint(0.408,0.517));
				array_push($colorPoints, new cgpoint(0.168,0.041));
			}
			else if(in_array($model, $livingColors))
			{
				array_push($colorPoints, new cgpoint(0.703,0.296));
				array_push($colorPoints, new cgpoint(0.214,0.709));
				array_push($colorPoints, new cgpoint(0.139,0.081));
			}
			else
			{
				array_push($colorPoints, new cgpoint(1.0,0.0));
				array_push($colorPoints, new cgpoint(0.0,1.0));
				array_push($colorPoints, new cgpoint(0.0,0.0));
			}
			
			return $colorPoints;
		}

		/**
		 * @brief Find the distance between two points.
		 *
		 * @param one
		 * @param two
		 * @return the distance between point one and two
		 */
		private function getDistanceBetweenTwoPoints($one, $two) {
		
			$dx = $one->x - $two->x;
			$dy = $one->y - $two->y;
			$dist = sqrt($dx * $dx + $dy * $dy);
			return $dist;
		}
		
		/**
		 *  @brief Find the closest point on a line. This point will be within reach of the lamp.
		 *
		 * @param A the point where the line starts
		 * @param B the point where the line ends
		 * @param P the point which is close to a line.
		 * @return the point which is on the line.
		 */
		private function getClosestPointToPoints($A, $B, $P) {
		
			$AP = new cgpoint($P->x - $A->x, $P->y - $A->y);
			$AB = new cgpoint($B->x - $A->x, $B->y - $A->y);
			$ab2 = $AB->x * $AB->x + $AB->y * $AB->y;
			$ap_ab = $AP->x * $AB->x + $AP->y * $AB->y;

			$t = $ap_ab / $ab2;
			if($t < 0.0)
			{
				$t = 0.0;
			}
			else if($t > 1.0)
			{
				$t = 1.0;
			}
			$newPoint = new cgpoint($A->x + $AB->x * $t, $A->y + $AB->y * $t);
			return $newPoint;
		}

		/**
		 *  @brief Calculates crossProduct of two 2D vectors / points
		 * 
		 * @param p1 first point used as vector
		 * @param p2 second point used as vector
		 * @return crossProduct of vectors
		 *  
		 */
		private function getCrossProduct($p1, $p2) {
			return ($p1->x * $p2->y - $p1->y * $p2->x);
		}

		/**
		 * @brief Method to see if the given XY value is within the reach of the lamps.
		 *
		 * @param p the point containing the X,Y value
		 * @return true if within reach, false otherwise.
		 *  
		 */
		private function checkPointInLampsReach($p, $colorPoints) {
		
			$red = $colorPoints[0];
			$green = $colorPoints[1];
			$blue = $colorPoints[2];
			$grx =$green->x - $red->x;
			$gry =$green->y - $red->y;
			$brx =$blue->x - $red->x;
			$bry =$blue->y -$red->y;
			$prx =$p->x - $red->x;
			$pry =$p->y - $red->y;
			$v1 = new cgpoint($grx, $gry);
			$v2 = new cgpoint($brx, $bry);
			$q = new cgpoint($prx, $pry);

			$s = ($this->getCrossProduct($q, $v2) / $this->getCrossProduct($v1, $v2));
			$t = ($this->getCrossProduct($v1, $q) / $this->getCrossProduct($v1, $v2));

			if(($s > 0.0) && ($t >= 0.0) && ($s + $t <= 1.0))
			{
				return true;
			}
			return false;
		}


    }
	
	// @cond Ignore this class in doxygen
	/**
    *
    * Helper class to ease translation from Philips C-coding
	* Implements CGPoint class from iOS SDK
    *
    */	
	
  class cgpoint {
  
	public $x;
	public $y;
	
	function __construct($_x, $_y) {
      $this->x = $_x;
	  $this->y = $_y;
	}
	
	};
	// @endcond
	
    /** @}*/
?>


Parse error: syntax error, unexpected ‚=‘, expecting identifier (T_STRING) or variable (T_VARIABLE) or ‚{‘ or ‚$‘ in [Program\IPSLibrary\app\core\IPSComponent\IPSComponentRGB\IPSComponentRGB_PhilipsHUE] on line 58
Abort Processing during Fatal-Error: syntax error, unexpected ‚=‘, expecting identifier (T_STRING) or variable (T_VARIABLE) or ‚{‘ or ‚$‘
Error in Script C:\IPS\ips\scripts\IPSLibrary\app\core\IPSComponent\IPSComponentRGB\IPSComponentRGB_PhilipsHUE.class.php on Line 58

Hi,

da ist beim Aufräumen wohl etwas danebengegangen, der Konstruktor sollte so aussehen:


$this->bridgeIP = $bridgeIP;
$this->hueKey = $hueKey;
$this->lampNr = $lampNr;
$this->modelID	= $modelID;

Hier findest Du den Quelltext im Original:

https://github.com/brownson/IPSLibrary/blob/Development/IPSLibrary/app/core/IPSComponent/IPSComponentRGB/IPSComponentRGB_PhilipsHUE.class.php

Ein „Modul Update“ über die GUI sollte Dir auch den korrekten Code-Stand wiederherstellen.

Viele Grüße

Jörg

Danke Jörg :slight_smile:

Bekomme leider beim Schalten meines LED IPS868 RGB Stripe nun einen Error im WebFront und auch der Status in IPS Light wird nicht richtig übernommen. Ist das ein bekanntes Problem? Oder muss ich da doch noch was an der Config ändern?

Funktioniert bei mir, hab aber auch etwas gebraucht. Hier meine Config mit Level-/Farbauswahl für HUE/IPS868 für das WebFrontend:

array(IPSLIGHT_WFCGROUP,       		'Level',  			'Light_2_CAv2h1', 	'Wohnzimmer_RGB_HUE#Level,Wohnzimmer_RGB_IPS868#Level,Wohnzimmer_Sofa#Level', 'Hue,IPS868,Sofa'),
array(IPSLIGHT_WFCGROUP,       		'Hue',  			'Light_2_CAv2h1', 	'Wohnzimmer_RGB_HUE#Color', 'Farbe'),
array(IPSLIGHT_WFCGROUP,       		'IPS868',  			'Light_2_CAv2h1', 	'Wohnzimmer_RGB_IPS868#Color', 'Farbe'),

Mein Teil der Config sieht so aus…


'Philips HUE Lampe Terrasse'   		=>	array('Philips HUE Lampe Terrasse','Garten,All','RGB','IPSComponentRGB_PhilipsHUE,192.168.178.46,9711014820aa6881368541449fe7ce00,1,LCT001'),

'Philips HUE Lampe Außenlampe'   	=>	array('Philips HUE Lampe Außenlampe','Garten,All','RGB','IPSComponentRGB_PhilipsHUE,192.168.178.46,9711014820aa6881368541449fe7ce00,2,LCT001'),

'LEDs Küche'   							=>	array('LEDs Küche','Erdgeschoss,All','RGB','IPSComponentRGB_IPS868,29750'),

'LEDs Teich'   							=>	array('LEDs Teich','Garten,All','RGB','IPSComponentRGB_IPS868,42360'),



Leider aktualisiert es, wie ihr im Bild sehen könnt, aber nicht die Variablen.