[Project] Controlling HUE from PHP
Posted: Fri Jan 25, 2013 9:36 pm
Yet another simple library written in PHP to control the HUE lights.
For whoever finds it helpfull
First call the register() method when you pressed the button on the main controller. The returned username should be persisted. You can then use this to authenticate.
For whoever finds it helpfull

Code: Select all
<?php
class Hue {
const POST = 'POST';
const PUT = 'PUT';
const GET = 'GET';
const TYPE_BULB = 0;
const TYPE_GRP = 1;
/**
* @var string
*/
private $url;
/**
* @var string
*/
private $username;
private $transitionTime = 5;
public function __construct($ip, $username=false) {
$this->url = 'http://'.$ip;
$this->username = $username;
}
public function setTransitionTime($time) {
$this->transitionTime = $time;
}
private function callapi($url, $type, $datain='') {
$params = array(
'http' => array(
'method' => $type,
'content' => $datain
)
);
$context = stream_context_create($params);
$data = json_decode(file_get_contents($url, 0, $context), true);
return $data;
}
public function register() {
$name = 'Home automation systeem';
$data = $this->callapi($this->url.'/api', self::POST, '{"username": "'.md5($name).'", "devicetype": "'.$name.'"}');
if ( isset($data[0]['success']['username']) ) {
return $data[0]['success']['username'];
}
return false;
}
private function statechange($json, $name, $type) {
if ( $type == self::TYPE_BULB ) {
$url = $this->url.'/api/'.$this->username.'/lights/'.$name.'/state';
} elseif ( $type == self::TYPE_GRP ) {
$url = $this->url.'/api/'.$this->username.'/groups/'.$name.'/action';
} else {
return false;
}
return $this->callapi($url, self::PUT, $json);
}
public function turnon($name,$type=0) {
return $this->statechange('{"bri":183, "hue":15331, "sat": 121,"transitiontime": '.$this->transitionTime.',"on":true}', $name, $type);
}
public function turnoff($name,$type=0) {
return $this->statechange('{"on":false,"transitiontime": '.$this->transitionTime.'}', $name, $type);
}
public function changebri($name, $bri,$type=0) {
return $this->statechange('{"bri":'.round($bri).', "hue":15331, "sat": 121,"transitiontime": '.$this->transitionTime.',"on":true}', $name, $type);
}
public function flashonce($name,$type=0) {
return $this->statechange('{"alert":"select"}', $name, $type);
}
public function flashrepeat($name,$type=0) {
return $this->statechange('{"alert":"select"}', $name, $type);
}
public function setrgb($name,$r,$g,$b, $type=0) {
$hsv = self::rgbToHsv($r, $g, $b);
// h, s, v
$hsv[0] = $hsv[0]*182;
$hsv[1] = ($hsv[1]/100)*254;
$hsv[2] = ($hsv[2]/100)*254;
return $this->sethsl($name, $hsv[2], $hsv[0], $hsv[1], $type);
}
public function sethsl($name, $bri, $hue, $sat, $type=0) {
return $this->statechange('{"bri":'.round($bri).',"hue":'.round($hue).',"transitiontime": '.$this->transitionTime.', "sat":'.round($sat).', "on":true}', $name, $type);
}
public function getgroups() {
return $this->callapi($this->url.'/api/'.$this->username.'/groups/0', self::GET);
}
public function getinfo() {
return $this->callapi($this->url.'/api/'.$this->username, self::GET);
}
public static function rgbToHsv($r,$g,$b) {
$r = $r / 255;
$g = $g / 255;
$b = $b / 255;
$min = min($r, $g, $b);
$max = max($r, $g, $b);
$v = $max;
$delta = $max - $min;
if ($delta == 0) {
return array(0, 0, $v * 100);
}
if ($max != 0) {
$s = $delta / $max;
} else {
$s = 0;
$h = -1;
return array($h, $s, $v);
}
if ($r == $max) {
$h = ($g - $b) / $delta;
} else if ($g == $max) {
$h = 2 + ($b - $r) / $delta;
} else {
$h = 4 + ($r - $g) / $delta;
}
$h *= 60;
if ($h < 0) {
$h += 360;
}
return array($h, $s * 100, $v * 100);
}
}