Moin auch,
in den letzten Wochen habe ich es erfolgreich geschafft meine Harmonies durch die Remote Two zu ersetzen dabei sind mir neue Erkenntnisse gekommen:
- Wenn man die Entities ausliest sind dort alle Sachen enthalten, also Aktivitäten, Geräte und Macros.
- Ich habe mich gewundert das die Aktivitäten bei mir in IPS oft anders heißen als im Web-Konfigurator. Das lag daran das die Daten mehrere Sprachen enthalten können und ich nur Englisch ausgelesen hatte. Da mein Web-Konfigurator aber auf Deutsch eingestellt ist gab es Unterschiede. Ich habe meine Scripte so angepasst das ich bevorzugt Deutsch als Sprache nehme und nur wenn nicht vorhanden die englische Bezeichnung nehme.
Obwohl in Entities auch Aktivitäten enthalten sind habe ich dafür ein eigenenes Script erstellt da ich dieses Script einmal pro Minute aufrufe um den aktuellen Status in meiner Visu anzeigen zu können und 20 Einträge geht schneller als 200. Hier das geänderte Script für Aktivitäten:
<?php
// API Key und IP der ersten Fernbedienung
$Key1 = GetValue(22717);
$IP1 = '192.168.178.227';
// API Key und IP der zweiten Fernbedienung
$Key2 = GetValue(17539);
$IP2 = '192.168.178.228';
$Page = 1;
// Mit Device Monitor prüfen ob erste Fernbedienung online ist
if (!GetValue(43134)) return;
//if (!GetValue(44614)) return;
// cURL-Session initialisieren
$ch = curl_init();
// cURL-Optionen festlegen
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $Key1,
'accept: application/json'
]);
// Kategorie Activities erzeugen
$ParentID = @IPS_GetObjectIDByName("Activities", IPS_GetParent($_IPS['SELF']));
if ($ParentID == false){
$ParentID = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($ParentID, "Activities"); // Kategorie benennen
IPS_SetParent($ParentID, IPS_GetParent($_IPS['SELF'])); // Kategorie einsortieren unter dem Objekt
}
while (true){
curl_setopt($ch, CURLOPT_URL, 'http://'.$IP1.'/api/activities?page='.$Page.'&limit=100');
$response = curl_exec($ch);
$Activities = array();
$Activities = ($response);
$Activities = json_decode($response,true);
if ((is_null($Activities)) || (count($Activities) == 0)) {
// cURL-Session schließen
curl_close($ch);
return;
}
$Page++;
foreach ($Activities as $Activity){
if (array_key_exists("de", $Activity["name"])){
$Parent = @IPS_GetObjectIDByName($Activity["name"]["de"], $ParentID);
if ($Parent == false){
$Parent = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($Parent, $Activity["name"]["de"]); // Kategorie benennen
IPS_SetParent($Parent, $ParentID); // Kategorie einsortieren unter dem Objekt
}
}
else if (array_key_exists("en", $Activity["name"])){
$Parent = @IPS_GetObjectIDByName($Activity["name"]["en"], $ParentID);
if ($Parent == false){
$Parent = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($Parent, $Activity["name"]["en"]); // Kategorie benennen
IPS_SetParent($Parent, $ParentID); // Kategorie einsortieren unter dem Objekt
}
}
$UIDID = @IPS_GetObjectIDByName("UID", $Parent);
if ($UIDID == false){
$UIDID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPOsition($UIDID, 10); // Position setzent
IPS_SetName($UIDID, "UID"); // Kategorie benennen
IPS_SetParent($UIDID, $Parent); // Kategorie einsortieren unter dem Objekt
}
if (GetValue($UIDID) != $Activity["entity_id"]){
SetValue($UIDID, $Activity["entity_id"]);
}
$StateID = @IPS_GetObjectIDByName("State", $Parent);
if ($StateID == false){
$StateID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPOsition($StateID, 20); // Position setzent
IPS_SetName($StateID, "State"); // Kategorie benennen
IPS_SetParent($StateID, $Parent); // Kategorie einsortieren unter dem Objekt
}
if (GetValue($StateID) != $Activity["attributes"]["state"]){
SetValue($StateID, $Activity["attributes"]["state"]);
$text = IPS_GetName($Parent);
if (GetValue($StateID) == 'OFF'){
$text .= ' ausgeschaltet';
}
else{
$text .= ' eingeschaltet';
}
//IPS_RunScriptEx(59691 , Array("SENDER" => "RBsoft", "Betreff" => "Remote 2", "Text" => $text, "Sprache" => 0, "Mail" => 0, "Enigma2" => 0, "LogFile" => 1));
}
$enbledID = @IPS_GetObjectIDByName("enabled", $Parent);
if ($enbledID == false){
$enbledID = IPS_CreateVariable(0); // Booleanvariable anlegen
IPS_SetPOsition($enbledID, 30); // Position setzent
IPS_SetName($enbledID, "enabled"); // Kategorie benennen
IPS_SetParent($enbledID, $Parent); // Kategorie einsortieren unter dem Objekt
}
if (GetValue($enbledID) != $Activity["enabled"]){
SetValue($enbledID, $Activity["enabled"]);
}
}
}
?>
Ach ja ich habe mir einen API-Key generiert und in einer Variablen abgelegt so das Pin-Änderungen keine Rolle mehr spielen.
Hier noch das Script für alle Entities.
<?php
// API Key und IP der ersten Fernbedienung
$Key1 = GetValue(22717);
$IP1 = '192.168.178.227';
// API Key und IP der zweiten Fernbedienung
$Key2 = GetValue(17539);
$IP2 = '192.168.178.228';
$Page = 1;
// Mit Device Monitor prüfen ob erste Fernbedienung online ist
if (!GetValue(43134)) return;
//if (!GetValue(44614)) return;
// Kategorie Entities/Devices erzeugen
$ParentID = @IPS_GetObjectIDByName("Entities", IPS_GetParent($_IPS['SELF']));
if ($ParentID == false){
$ParentID = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($ParentID, "Entities"); // Kategorie benennen
IPS_SetParent($ParentID, IPS_GetParent($_IPS['SELF'])); // Kategorie einsortieren unter dem Objekt
}
// cURL-Session initialisieren
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $Key1,
'accept: application/json'
]);
while (true){
curl_setopt($ch, CURLOPT_URL, 'http://'.$IP1.'/api/entities?page='.$Page.'&limit=100');
$response = curl_exec($ch);
$Entities = array();
$Entities = ($response);
$Entities = json_decode($response,true);
if ((is_null($Entities)) || (count($Entities) == 0)) {
// cURL-Session schließen
curl_close($ch);
return;
}
// var_dump($Entities);
// return;
$Page++;
foreach ($Entities as $Entity){
if (array_key_exists("de", $Entity["name"])){
$Parent = @IPS_GetObjectIDByName($Entity["name"]["de"], $ParentID);
if ($Parent == false){
$Parent = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($Parent, $Entity["name"]["de"] . '=' . $Entity["entity_type"]); // Kategorie benennen
IPS_SetParent($Parent, $ParentID); // Kategorie einsortieren unter dem Objekt
}
}
else if (array_key_exists("en", $Entity["name"])){
$Parent = @IPS_GetObjectIDByName($Entity["name"]["en"], $ParentID);
if ($Parent == false){
$Parent = IPS_CreateCategory(); // Kategorie anlegen
IPS_SetName($Parent, $Entity["name"]["en"] . '=' . $Entity["entity_type"]); // Kategorie benennen
IPS_SetParent($Parent, $ParentID); // Kategorie einsortieren unter dem Objekt
}
}
if (isset($Entity["entity_id"]) && isset($Entity["entity_type"])){
$UIDID = @IPS_GetObjectIDByName("UID", $Parent);
if ($UIDID == false){
$UIDID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($UIDID, 10); // Stringvariable positionieren
IPS_SetName($UIDID, "UID"); // Stringvariable benennen
IPS_SetParent($UIDID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
SetValue($UIDID, $Entity["entity_id"]);
$TypeID = @IPS_GetObjectIDByName("Type", $Parent);
if ($TypeID == false){
$TypeID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($TypeID, 20); // Stringvariable positionieren
IPS_SetName($TypeID, "Type"); // Stringvariable benennen
IPS_SetParent($TypeID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
SetValue($TypeID, $Entity["entity_type"]);
}
if (isset($Entity["features"])){
foreach ($Entity["features"] as $Feature){
$FeaturesID = @IPS_GetObjectIDByName("Features", $Parent);
if ($FeaturesID == false){
$FeaturesID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($FeaturesID, 30); // Stringvariable positionieren
IPS_SetName($FeaturesID, "Features"); // Stringvariable benennen
IPS_SetParent($FeaturesID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
$Features = json_encode($Entity["features"]);
SetValue($FeaturesID, $Features);
}
}
if (isset($Entity["options"]["simple_commands"])){
$SimpleCommandsID = @IPS_GetObjectIDByName("SimpleCommands", $Parent);
if ($SimpleCommandsID == false){
$SimpleCommandsID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($SimpleCommandsID, 40); // Stringvariable positionieren
IPS_SetName($SimpleCommandsID, "SimpleCommands"); // Stringvariable benennen
IPS_SetParent($SimpleCommandsID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
$SimpleCommands = json_encode($Entity["options"]["simple_commands"]);
SetValue($SimpleCommandsID, $SimpleCommands);
}
if ($Entity["entity_type"] == "macro"){
if (isset($Entity["options"]["sequence"])){
$MacrosID = @IPS_GetObjectIDByName("Commands", $Parent);
if ($MacrosID == false){
$MacrosID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($MacrosID, 50); // Stringvariable positionieren
IPS_SetName($MacrosID, "Commands"); // Stringvariable benennen
IPS_SetParent($MacrosID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
$string = '';
foreach ($Entity["options"]["sequence"] as $Sequence){
if (isset($Sequence["command"])){
$string .= $Sequence["command"]["cmd_id"] . ' , ';
}
}
SetValue($MacrosID, $string);
}
}
$StateID = @IPS_GetObjectIDByName("State", $Parent);
if ($StateID == false){
$StateID = IPS_CreateVariable(3); // Stringvariable anlegen
IPS_SetPosition($StateID, 50); // Stringvariable positionieren
IPS_SetName($StateID, "State"); // Stringvariable benennen
IPS_SetParent($StateID, $Parent); // Stringvariable einsortieren unter dem Objekt
}
SetValue($StateID, $Entity["attributes"]["state"]);
}
}
?>
Da hier ja Aktivitäten, Geräte und Macros enthalten sind schreibe ich hinter dem Namen noch den Typ des Entities:

Um Aktivitäten zu starten oder einen Befehl auszuführen habe ich ein Script geschrieden das beides macht:
<?php
switch ($_IPS['SENDER']){
case 'R2':
$IP = $_IPS['IP'];
$Key = $_IPS['Key'];
$UID = $_IPS['UID'];
$Kommando = $_IPS['Kommando'];
send_remote($IP, $Key, $UID, $Kommando);
break;
}
function send_remote($IP, $Key, $UID, $Kommando) {
$ch = curl_init('http://' . $IP . '/api/entities/'.$UID.'/command');
$data['entity_id'] = $UID;
$data['cmd_id'] = $Kommando;
$data_string = json_encode($data);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $Key,
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
SetValue(34457, $result);
curl_close($ch);
sleep(5);
// rufe Script GetActivities auf damit der Status schneller kommt
IPS_RunScript(22072);
}
?>
Aufgerufen wird dieses Script mit
IPS_RunScriptEx(, Array(„SENDER“ => „R2“, „IP“ => $IP, „Key“ => $Key, „UID“ => $UID, „Kommando“ => $Command));
$IP und $Key sind die IP und der Key der gewünschten R2. Ich benötige diese Information zusätzlich um 2 (oder später mal mehr) Fernbedienungen synchron zu halten.
Viel Spaß Ralf