So, hier mal mein aktueller Stand der Dinge für alle die es brauchen können:
1. Datenempfang vom Raspbee -> IPS
CLIENT SOCKET->WEBSOCKETCLIENT->REGISTERVARIABLE-> SCRIPT: Auswertung
PHP-Code:
<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
$apikey=GetValue(48874);
//ID ARRAY aus Datei holen
// Datei Struktur:
// UniqueID,Id,StateVarID,BrightVarId,SatVarID,HueVarID,XVarID,YVarID
$string_data = file_get_contents("tradfri.db"); //Lädt Datei in String
$lights = unserialize($string_data); //String in Array zurückwandeln
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
$data = RegVar_GetBuffer($_IPS['INSTANCE']);
$json=json_decode($_IPS['VALUE']);
if (( $json->r == "lights" ) && ( $json->e == "changed" )) {
if ( isset($json->state->on)) {
//ermitteln der nötigen variablen id!
$jid = $json->id;
$key = array_search($jid, $lights); // Sucht die Statusvariablen ID und ermittelt den KEY dazu
$key = $key +1; // Die gesuchte ID ist eine Stelle Rechts von der ID
$id = $lights[$key];
if ($json->state->on == 1 ) { SetValue($id,true);
} else
{ SetValue($id,false);
}
}
if ( isset($json->state->bri)) {
//ermitteln der nötigen variablen id!
$jid = $json->id;
$key = array_search($jid, $lights); // Sucht die Statusvariablen ID und ermittelt den KEY dazu
$key = $key +2; // Die gesuchte ID ist zwei Stellen Rechts von der ID
$id = $lights[$key];
SetValue($id,$json->state->bri);
}
//if ( isset($json->state->x)) { echo "FARBE-X: ".$json->state->x."\n"; }
//if ( isset($json->state->y)) { echo "FARBE-Y: ".$json->state->y."\n"; }
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
?>
Diese Script setzt bei Empfangen Daten für STATE->ON und STATE->BRI die zu der Lampe gehörenden Variablen in IPS
2. Regelmäßiges erstellen einer Datenbank aller Lichter mit ihren Unique Id,Id und den zugehörigen Statusvariablen in IPS
Dies mache ich automatisch alle 15 Minuten um in allen anderen Scripten die Zuordnung der IPS Variablen zu den Geräten machen zu können
PHP-Code:
<?
// Dieses Script liest regelmäßig den Status aller Lampen aus und erstellt eine
// Datenbankdatei um die Zuordnung UniqueID,ID und IPS Status Variablen zu ermöglichen
// Diese Datenbank Datei wird von allen anderen Tradfri Scripten benötigt.
// Datei Struktur:
// UniqueID,Id,StateVarID,BrightVarId,SatVarID,HueVarID,XVarID,YVarID
$apikey=GetValue(48874);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://192.168.1.49/api/$apikey/lights",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
//CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/json",
"x-api-key: $apikey"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
$status = json_decode($response);
$array = get_object_vars($status);
//var_dump($array);
$index = 0;
foreach($array as $key => $data) {
//echo $key . "\n";
//KEY ist die Laufende ID vom Phoscon Gateway
switch ($data->uniqueid) {
case '90:fd:9f:ff:fe:33:54:4c-01':
echo $data->name."\n";
$statevar = 30319;
$brightvar = 22239;
$satvar = 13336;
$huevar = 17446;
$xvar = 28584;
$yvar = 22764;
break;
case '00:0b:57:ff:fe:d9:8e:3a-01':
echo $data->name."\n";
$statevar = 32094;
$brightvar = 46600;
$satvar = 0;
$huevar = 0;
$xvar = 0;
$yvar = 0;
break;
case '00:0b:57:ff:fe:db:ac:54-01':
echo $data->name."\n";
$statevar = 17762;
$brightvar = 53670;
$satvar = 0;
$huevar = 0;
$xvar = 0;
$yvar = 0;
break;
default:
echo "Unbekannte Lampe\n";
$statevar = 0;
$brightvar = 0;
$satvar = 0;
$huevar = 0;
$xvar = 0;
$yvar = 0;
break;
}
// Datei Struktur 10 Felder:
// UniqueID,Id,StateVarID,BrightVarId,SatVarID,HueVarID,XVarID,YVarID,Reserve,Reserve
$lights[$index]=$data->uniqueid;
$index=$index+1;
$lights[$index]=$key;
$index=$index+1;
$lights[$index]=$statevar;
$index=$index+1;
$lights[$index]=$brightvar;
$index=$index+1;
$lights[$index]=$satvar;
$index=$index+1;
$lights[$index]=$huevar;
$index=$index+1;
$lights[$index]=$xvar;
$index=$index+1;
$lights[$index]=$yvar;
$index=$index+1;
$lights[$index]="nix";
$index=$index+1;
$lights[$index]="nix";
$index=$index+1;
}
}
//echo "\n";
//var_dump($lights);
$string_data = serialize($lights);
file_put_contents("tradfri.db", $string_data);
echo "Writing Tradfri State to Array DB!\n";
?>
Diese Datei "trafri.db" wird im Scripts Verzeichnis abgelegt und jedesmal überschrieben.
Sie wird von den andern Scripten Geladen um die zum Gerät gehörigen Variablen ID´s auslesen zu können.
Das TOGGLE Aktionsscript (invertiert mit jedem Aufruf den Schaltzustand der betreffenden Lampe)
PHP-Code:
<?
SetValue((int)$IPS_VARIABLE,!GetValue((int)$IPS_VARIABLE));
$currentstate=GetValue((int)$IPS_VARIABLE);
$varid = (int)$IPS_VARIABLE;
$apikey=GetValue(48874);
//ID ARRAY aus Datei holen
// Datei Struktur:
// UniqueID,Id,StateVarID,BrightVarId,SatVarID,HueVarID,XVarID,YVarID
$string_data = file_get_contents("tradfri.db"); //Lädt Datei in String
$lights = unserialize($string_data); //String in Array zurückwandeln
$key = array_search($varid, $lights); // Sucht die Statusvariablen ID und ermittelt den KEY dazu
$key = $key -1; // Die gesuchte ID ist eine Stelle Links von der Statevar
$id = $lights[$key]; // die ID aus dem Array lesen
if ( $currentstate == "false" ) { $data='{"on": true}'; } else { $data='{"on": false}'; }
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://192.168.1.49/api/$apikey/lights/$id/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/json",
"x-api-key: $apikey"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
//echo $response;
}
?>
Das DIM Aktionsscript (Liest den Wert der Brightness IPS Variable uns sendet ihn an die zugehörige Lampe
PHP-Code:
<?
//Variable setzen
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$currentstate=GetValue((int)$IPS_VARIABLE);
$varid = (int)$IPS_VARIABLE;
$apikey=GetValue(48874);
//ID ARRAY aus Datei holen
// Datei Struktur:
// UniqueID,Id,StateVarID,BrightVarId,SatVarID,HueVarID,XVarID,YVarID
$string_data = file_get_contents("tradfri.db"); //Lädt Datei in String
$lights = unserialize($string_data); //String in Array zurückwandeln
$key = array_search($varid, $lights); // Sucht die Statusvariablen ID und ermittelt den KEY dazu
$key = $key -2; // Die gesuchte ID ist zwei Stelle Links von der Brightevar
$id = $lights[$key]; // die ID aus dem Array lesen
$data='{"bri": '.$currentstate.'}';
//echo "BRI: ".$data."\n";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://192.168.1.49/api/$apikey/lights/$id/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/json",
"x-api-key: $apikey"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
//echo $response;
}
?>
So hier noch ein paar Screenshots..........


