Philips HUE Modul

Mal ausprobiert was z.B. bei

<?
$lightId = 52757 /*[Hardware\Phillips Hue\Hue Modul\Lampen\Wohnzimmer]*/ ; // Objekt ID der Hue Lampe 
$list = array ("BRIGHTNESS" => 200, "TRANSITIONTIME" => 40); // Transtionstime given as a multiple of 100ms 
HUE_SetValues($lightId, $list);
?>

passiert?

Also ich habe das mal getestet. Also wenn ich die 3 Parameter übergebe, werden auch alle Werte übergeben. Vielleicht hat man hier eine falsche Erwartung bzw. ein Bug in der Bridge. Dein Verhalten kann ich aber bestätigen.

HUE_SetValues(34792 /*[System\Philips Hue\Lampen\Wohnzimmer TV Links]*/, array ("BRIGHTNESS" => 10, "TRANSITIONTIME" => 40, "STATE" => true));

Array
(
    [transitiontime] => 40
    [on] => 1
    [bri] => 10
    [ct] => 153
)

Hallo Zusammen,

also ich habe es jetzt noch mal versucht und sogar mit meinem Script-Schnipsel hat es ohne Probleme funktioniert…ich weiß noch nicht so ganz warum es vorher nicht ging…
Dennoch Danke für den schnellen Support :slight_smile: Ein schönes Wochenende wünsche ich euch!

Hallo :slight_smile:

ich würde gerne eine bestimmte Lichtszene, welche über die Hue-App erstellt wurde, aktivieren. Lässt sich sowas mit dem Modul bewerkstelligen?

Hat das schon mal jemand gemacht oder umgesetzt?

Gruß

Das hängt von der App bzw. Version ab die Du nutzt. Die alte Hue App speichert Szenen in der App die können nicht aus IP-Symcon aufgerufen werden. Die neue Hue App oder auch andere Apps speichern Szenen auf dem Hub. Diese Szenen lassen sich aus IP-Symcon aufrufen.

Ich weiß bereits wie man die Szenen mithilfe der API auslesen und aktivieren kann. Nun habe ich mir das Ziel gesetzt das irgendwie in das Modul zu integrieren - mal sehen ob es klappt :slight_smile:

Brauche eigentlich nur einen Befehl der mir alle verfügbaren Szenen namentlich als Array/Liste liefert und einen weiteren Befehl mit dem man eine bestimmte Szene aktivieren kann.

Hier einmal in die Kategorie kopieren unter der die Szenen angelegt werden sollen, dann die ObjektID der Hue Bridge eintragen und ausführen. Dann kannst Du deine Szenen schalten. Könnte man auch ins Modul aufnehmen geht aber auch so. Sind alles Dummy Instanzen mit einem Skript zum Aufrufen der Szene. Da es sehr viele HUE Szenen sein können wäre sonst der Variablenverbrauch immens. Wenn man aber sowieso unendlich Variablen hat kannst Du das Skript ja auch noch modifizieren und Dir Variablen anlegen lassen mit den Lampen der Szene usw. Alle Infos, wenn Du was wissen willst, stehen aber im Beschreibungsfeld der Dummy Instanz.


<?
	// Config
	$HueBridgeID = 44625 /*[Philips Hue Bridge]*/; // ObjektId der HueBridge
 	// Config End

	$json_result = GetScences($HueBridgeID);
	SetupScences($json_result, $HueBridgeID);


function GetScences($HueBridgeID)
{
	$HueIP = IPS_GetProperty($HueBridgeID, "Host");
	$HueUserKey = IPS_GetProperty($HueBridgeID, "User");
	//Szenen von Hue Auslesen
	$url = 'http://'.$HueIP.'/api/'.$HueUserKey.'/scenes';
	$ch = curl_init( $url );
	$options = array(
	               CURLOPT_RETURNTRANSFER => true,
	               CURLOPT_CUSTOMREQUEST => 'GET', // -X
	               CURLOPT_HTTPHEADER => array('Content-type: application/json') ,
	               );
	curl_setopt_array( $ch, $options );
	
	// Getting results
	$json_result =  curl_exec($ch);
	return $json_result;
}

function SetupScences($json_result, $HueBridgeID)
{
	$result = json_decode($json_result, true);
	$num = count(json_decode($json_result, true)); // als array
	$idCatScenes = CreateCategory("HUE_Scenes_Category", "Szenen",IPS_GetParent($_IPS['SELF']),0);
	echo "Es wurden ".$num." Szenen gefunden 
";

	$id = 0;
	foreach ($result as $key => $scene)
 	{
	$id=$id+1;
	
	$scene_description = json_encode(array ($key => $scene));
	$id = $key; // The id of the scene being modified or created.
	$ident = GetIdent($id);
	$name = $scene["name"]; // Human readable name of the scene. Is set to <id> if omitted on creation.
		
		$myScene = @IPS_GetObjectIDByIdent($id, $idCatScenes);
		if (!$myScene) //Neu anlegen
			{
				//echo $id."
";
				$myScene = CreateScene($ident, $name, $id, $idCatScenes, $scene_description, $HueBridgeID); 
			}
	}
}

function CreateScene($ident, $name, $id, $parentID, $scene_description, $HueBridgeID)
{
	$instanceid = @CreateInstance($ident, $name, $parentID, "{485D0419-BE97-4548-AA9C-C083EB82E61E}", $Position=0); 
	IPS_SetIdent ($instanceid, $ident);
	IPS_SetInfo($instanceid, $scene_description);
	CreateScript ($ident."_actionscript", $name, $id, $instanceid, $Position=0, $HueBridgeID);
	return $instanceid;
}

function CreateCategory ($Ident, $Name, $ParentId, $Position, $Icon=null)
 {
		$CategoryId = @IPS_GetObjectIDByIdent($Ident, $ParentId);
		if ($CategoryId === false)
		 {
			$CategoryId = IPS_CreateCategory();
			IPS_SetName($CategoryId, $Name);
			IPS_SetIdent($CategoryId, $Ident);
			IPS_SetParent($CategoryId, $ParentId);
			if ($Position!==false) {
				IPS_SetPosition($CategoryId, $Position);
			}
			if ($Icon!==false) {
				IPS_SetIcon($CategoryId, $Icon);
			}
			echo 'Created Category '.$Name.'='.$CategoryId."
";
		}
		return $CategoryId;
	}
	
function CreateInstance ($Ident, $Name, $ParentId, $ModulId, $Position=0)
 {
		$InstanceId = @IPS_GetObjectIDByIdent($Ident, $ParentId);
		if ($InstanceId === false) {
			$InstanceId	= IPS_CreateInstance($ModulId);
			IPS_SetName($InstanceId, $Name);
			IPS_SetIdent($InstanceId, $Ident);
			IPS_SetParent($InstanceId, $ParentId);
			IPS_SetPosition($InstanceId, $Position);
			echo "Created Instance ".$Name."=".$InstanceId."
";
		}
		return $InstanceId;
	}
	

function GetIdent($id)
{
	$search = "-";
	$replace = "_";
	$ident = str_replace($search, $replace, $id);
	return $ident;
}

function CreateScript ($Ident, $Name, $id, $ParentId, $Position=0, $HueBridgeID)
 {
	//$json_url = 'http://'.$HueIP.'/api/'.$HueUserKey.'/scenes';
		$ScriptId = @IPS_GetObjectIDByIdent($Ident, $ParentId);
		if ($ScriptId === false) {
			$ScriptId = IPS_CreateScript(0);
			IPS_SetName($ScriptId, $Name);
			IPS_SetIdent($ScriptId, $Ident);
			$content = '<?
$HueIP = IPS_GetProperty('.$HueBridgeID.', "Host");
$HueUserKey = IPS_GetProperty('.$HueBridgeID.', "User");
$data = array ("scene" => "'.$id.'");
$client = curl_init();
curl_setopt($client, CURLOPT_URL, "http://".$HueIP.":80/api/".$HueUserKey."/groups/0/action");
curl_setopt($client, CURLOPT_USERAGENT, "SymconHUE");
curl_setopt($client, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($client, CURLOPT_TIMEOUT, 5);
curl_setopt($client, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($client, CURLOPT_CUSTOMREQUEST, \'PUT\');
curl_setopt($client, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($client);
$status = curl_getinfo($client, CURLINFO_HTTP_CODE);
curl_close($client);		  
?>';
 			IPS_SetScriptContent($ScriptId, $content);
			IPS_SetParent($ScriptId, $ParentId);
			IPS_SetPosition($ScriptId, $Position);
			echo 'Created Script '.$Name.'='.$ScriptId."
";
		}
		return $ScriptId;
	}	
		
?>

Entschuldige die späte Antwort, Fonzo. Ich konnte das Script problemlos in Betrieb nehmen und habe es in Ruhe getestet. Vielen Dank für die Bereitstellung :slight_smile:

Parallel dazu habe ich selber versucht die gewünschten Szenen-Funktionen in das Modul zu integrieren. Wer sich dafür interessiert kann sich ja mal den Code ansehen -> Comparing traxanos:master…vita2:feature/scenes · traxanos/SymconHUE · GitHub

Ganz zufrieden bin ich damit aber noch nicht weswegen ich auch noch keinen Pull Request an traxanos gesendet habe.

Wenn man das ins Modul einbaut fehlt da dann noch deutlich mehr. Der Standard Request nutzt PUT. Daher müste zunächst mal noch eine seperate Funktion zum Szenen abholen und Szenen löschen angelegt werden. Das Abholen geht mit GET und das löschen mit DELETE

Löschen z.B.


$status = DeleteScence($HueBridgeID, $sceneid);

 
 function DeleteScence($HueBridgeID, $sceneid)
{
	$HueIP = IPS_GetProperty($HueBridgeID, "Host");
	$HueUserKey = IPS_GetProperty($HueBridgeID, "User");
	//Szenen von Hue Auslesen
	$url = 'http://'.$HueIP.'/api/'.$HueUserKey.'/scenes/'.$sceneid;
	$ch = curl_init( $url );
	$options = array(
	               CURLOPT_RETURNTRANSFER => true,
	               CURLOPT_CUSTOMREQUEST => 'DELETE', 
	               CURLOPT_HTTPHEADER => array('Content-type: application/json') ,
	               );
	curl_setopt_array( $ch, $options );
	
	// Getting results
	$json_result =  curl_exec($ch);
	return $json_result;
}

Was möchtest Du denn genau machen? Erst die Szenen in eine Liste einlesen lassen, dann den Nutzer auswählen lassen welche Szenen er angelegt haben will und dann diese als Instanz anlegen? Was soll dann eine Szenen Instanz an Informationen bzw. Variablen enthalten?

Hallo,

hatte mich gestern mal an die Version 5.0 gewagt (Ninja) und seitdem taucht diese Meldung bei jeder Aktualisierung in der Konsole auf:

11.10.2017 01:31:03 | ScriptEngine | Ergebnis für Ereignis 12689
<br />
<b>Fatal error</b>:  Uncaught TypeError: Argument 1 passed to HUEBridge::GetDeviceByGroupId() must be an instance of integer, string given, called in /var/lib/symcon/modules/SymconHUE/HUEBridge/module.php on line 332 and defined in /var/lib/symcon/modules/SymconHUE/HUEBridge/module.php:374
Stack trace:
#0 /var/lib/symcon/modules/SymconHUE/HUEBridge/module.php(332): HUEBridge->GetDeviceByGroupId('1')
#1 /var/lib/symcon/scripts/__generated.inc.php(223): HUEBridge->SyncStates()
#2 /-(2): HUE_SyncStates(13223)
#3 {main}
  thrown in <b>/var/lib/symcon/modules/SymconHUE/HUEBridge/module.php</b> on line <b>374</b><br />

Ich habe die letzte Version von dem Modul installiert, ist dieser Fehler bekannt?

Vielen Dank schon mal.

Liebe Grüße Sebastian

Für 5.x sind da noch Anpassungen notwendig da dann PHP 7 verwendet wird. Du kannst diese von Hand vornehmen wenn Du mit 5.x testest. Einerseits müssen sämtliche Funktionen mit Type Hinting entsprechend PHP 7 korrigiert werden.
In dem Fall wird aus
public function GetDeviceByGroupId(integer $groupId)


public function GetDeviceByGroupId(int $groupId)

Außerdem scheint an der Stelle
$deviceId = $this->GetDeviceByGroupId($groupId);
$groupid ein String zu sein, das erzeugt den Fehler, da ein Integer von der Funktion erwartet wird.
Auf die Schnelle kannst Du das korrigieren indem Du nachdem Du oben die Zeile 374 ausgebessert hast den Sting in int umwandelst indem Du zusätzlich in Zeile 332


$groupId = intval($groupId);

ergänzt.

Sieht dann also so aus


foreach ($groups as $groupId => $group) {
        $groupId = intval($groupId);
        $deviceId = $this->GetDeviceByGroupId($groupId);
        if($deviceId > 0) HUEGroup_ApplyData($deviceId, $group);
      }

Bleibt der Fehler dann aus? Dann kann traxanos das ja für zukünftige Anpassungen übernehmen, ansonsten ist das was Du händisch geändert hast nach dem nächsten Modulupdate dann wieder weg.

Hi,
hatte das gleiche Problem bei Umstellung auf Vers. 5

habe alle Aufrufe / Befehle auf:

HUE_SetValue($id_hue, key , value );
HUEGroup_SetValue($id_hue, key , value );
umgestellt.

Dann funktioniert alles ohne Eingriff in das Modul.

Quasi, ja. Ich möchte eine Liste anhand der verfügbaren Szenen erstellen und zusätzlich per Befehl eine bestimmte Szene aktivieren können. Eine Szenenauswahl über das Webfront ist für mich erst mal nur zweitrangig.

Mit der oben verlinkten Code-Änderung kann ich das auch umsetzen. Hier ein Beispiel was passiert wenn ich den Lichtszenen-Button an meinem HomeMatic-Wandtaster betätige:


...
$variablenName = "Szene";
$variablenID = @IPS_GetVariableIDByName($variablenName, $_IPS['SELF']);

$curScene = GetValue($variablenID);
if(!$curScene == "") {
  $scenes = HUEGroup_GetScenes(23480 /*[Lab\HUEScenes\Gruppen\Wohnzimmer]*/);

  foreach ($scenes as $key => $val) {
    if ($val['SceneName'] === $curScene) {
      $sceneKey = $key;
      break;
    }
  }
  
  $cntScenes = count($scenes)-1;
  if($sceneKey < $cntScenes) {
    $nextScene = $scenes[$sceneKey+1]["SceneName"];
  } elseif ($sceneKey == $cntScenes) {
    $nextScene = $scenes[0]["SceneName"];
  }
} else {
  $nextScene = "Abendlicht";
}
HUEGroup_SetValue(23480 /*[Lab\HUEScenes\Gruppen\Wohnzimmer]*/, "SCENE", "$nextScene");
SetValue($variablenID, $nextScene);
...

Das Script aktiviert, wenn die Variable „Szene“ leer ist, die auf der Hue-Bridge hinterlegte Szene „Abendlicht“. Ein erneuter Tastendruck wechselt dann zur nächsten Szene. Gleichzeitig wird die Szene namentlich in der Variable gespeichert damit das System beim Tastendruck weiß an welcher Stelle weiter gemacht werden muss. So kann ich die Szenen ohne Webfront schön durchschalten :slight_smile:

Hi Fonzo,

vielen Dank für deine umfangreiche Beschreibung. Was soll ich sagen, funktioniert wieder alles einwandfrei, kann so übernommen werden :slight_smile:

Ich versuche mich gerade wieder viel zu lange an einer Kleinigkeit… Wäre nett wenn jemand helfen könnte.

Was ich will:

Zustand einer beliebigen Hue auslesen (Zustand, Farbe Helligkeit,…)
Hue in einer beliebigen Farbe /Helligkeit blinken lassen
Den alten Zustand wieder herstellen (an / aus, Farbe, Helligkeit)

Was funktioniert :
Zustand State und Color getrennt auslesen (mit Echo überprüft)
In beliebiger Farbe blinken lassen
Generell die Steuerung der Hue auch die Szenen funktionieren super.

Was nicht funktioniert:
Zustand als Array auslesen
Den alten Status wiederherstellen

Wenn ich mit SetValues (…Rotefarbe… Alert) arbeite und danach SetValue (alter Zustand)ausführe, blinkt es ganz kurz rot aber dann mit der neuen/alten Farbe weiter

Wenn ich nur SetValues stehen lasse, dann ist die Hue nach dem roten blinken Dauerrot

Schönen Dank für die Arbeit mit dem Modul, das funktioniert ansonsten sehr gut.

Gesendet von meinem SM-G935F mit Tapatalk

Wie sieht den der Code aus mit dem Du das versuchst? Wenn Du die Lampe blinken lässt mit alert was setzt Du dann select oder lselect? Setzt Du dann danach auch wieder auf none?

Ich muss sagen es war gestern schon spät, ich hab keine Ahnung von PHP und wollte das mal spontan lösen.
hier ist der Code mit welchem ich rumgespielt hab, ein paar Dinge hab ich immer mal wieder auskommentiert aber zum Ziel bin ich nicht gekommen. (Das Verhalten hab ich ja oben weiter erklärt)

<?
$lightID = 12356 /*[Hardware\Philips Hue\Lampen\Hue iris 2]*/;
$state = HUE_GETValue($lightID, "STATE");
$color1 = HUE_GETValue($lightID, "COLOR");
//$array = array("STATE" =>$state, "COLOR" => $color1);
echo $state;
echo $color1;
//echo $array;

HUE_SetValues(12356 /*[Hardware\Philips Hue\Lampen\Hue iris 2]*/, array('COLOR' => hexdec('FF0000'), 'ALERT' => 'lselect', 'STATE' => true));
//HUE_SetValues(12356 /*[Hardware\Philips Hue\Lampen\Hue iris 2]*/, array('COLOR' => $color1, 'STATE' => false));

//HUE_SetValue(12356 /*[Hardware\Philips Hue\Lampen\Hue iris 2]*/, 'COLOR', $color1, 'STATE', $state);
//HUE_SetValues(InstanceID: Integer, list: Variant): Variant
?>

Ich habe mich wie gesagt nicht irgendwo intensiv eingelesen, hatte gehofft mir ein paar Codeschnipsel zu kopieren und dann nach dem Try&Error Prinzip an mein Ziel zu kommen… war wohl nix.
Obwohl ich die fast 50 Seiten über Tapatalk überflogen hab… glaube Beitrag 240 war so in etwa wie ich das haben will.

Ich möchte halt Meldungen über die Hue Lampen ausgeben, ob jemand geklingelt hat oder ein Fenster irgendwo noch nicht geschlossen wurde weil die Temperatur zu doll von dem letzen Wert abweicht oder oder oder. Deswegen sollen die Hue danach wieder den letzten Zustand bekommen.

Hat keiner einen Schnipsel für mich oder gibt es irgendwo ein ähnliches Beispiel?

Gesendet von meinem SM-G935F mit Tapatalk

Probiere es doch mal so:


$lightID = 12356 /*[Hardware\Philips Hue\Lampen\Hue iris 2]*/; 
$hue_state = GetCurrentState($lightID);
$colorhex = "B5CB0A"; // color of the alert as hex
$alerttype = "lselect"; // type of alert
SetAlert($lightID, $colorhex, $alerttype);
IPS_Sleep(15000); // duration alert ms
StopAlert($lightID);
SetPreviousState($lightID, $hue_state);


// Get Current State
// returns Color as Hex Value
function GetCurrentState($lightID)
{
	$state = HUE_GetState($lightID);
	$color = GetValueFormatted(IPS_GetObjectIDByIdent("COLOR", $lightID));
	$hue_state = array ('COLOR' => $color, 'STATE' => $state);
	return $hue_state;
}
function SetPreviousState($lightID, $hue_state)
{
	$color = $hue_state["COLOR"];
	$hue_state["COLOR"] = hexdec($color);
	HUE_SetValues($lightID, $hue_state);
}
/*
Set an Alert with colorhex (Hex String e.g. B5CB0A)
and an alerttype:
“select” – The light is performing one breathe cycle.
“lselect” – The light is performing breathe cycles for 15 seconds or until an "alert": "none" command is received.
*/
function SetAlert($lightID, $colorhex, $alerttype)
{
	$color = hexdec($colorhex);
	HUE_SetValue($lightID, 'COLOR', $color);
	HUE_SetValue($lightID, "ALERT", $alerttype);
}

/*
Stops an alert
*/
function StopAlert($lightID)
{
	HUE_SetValue($lightID, "ALERT", "none");
}

Meine Güte, wie soll ich denn auf sowas kommen :confused:

Probiere ich aus, heute oder morgen.
Danke erstmal.

Gesendet von meinem SM-G935F mit Tapatalk