Hi Ralf,
das klingt gut. Mit welchem Command bzw. mit welcher URL setzt Du den Activity-On- bzw. -Off-Befehl ab? Ich hätte, wie bei den anderen IR-Commands, mit einem PUT gerechnet. Aber dazu finde ich auf die Schnelle nichts.
Chris
Hi Ralf,
das klingt gut. Mit welchem Command bzw. mit welcher URL setzt Du den Activity-On- bzw. -Off-Befehl ab? Ich hätte, wie bei den anderen IR-Commands, mit einem PUT gerechnet. Aber dazu finde ich auf die Schnelle nichts.
Chris
Moin Chris,
mit diesem Script:
<?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);
// Data und Result speichere ich für Debugging in Variablen.
// SetValue(58547, $data_string);
// SetValue(15501, $result);
curl_close($ch);
// Hier rufe ich nochmal alle Aktivitäten ab um den Status schneller zu bekommen
// sleep(5);
// IPS_RunScript(22072);
}
?>
Dieses Script rufe ich mit
IPS_RunScriptEx(<ID vom obigen Script> , Array("SENDER" => "R2", "IP" => $IP, "Key" => $Key, "UID" => $UID, "Kommando" => 'activity.on'));
auf. $IP = IP der R2, $Key = API-Key dieser R2, $UID = UID vom Gerät oder Aktion, Kommando = activity.on (an), activity.off (aus) oder eben DIGIT_1, MUTE oder anderen Befehl.
Ralf
Hi,
Ich lese hier gespannt mit da ich auch auf meine R3 warte.
Gruß Max
Moin Ralf,
danke Dir! Ich wollte nicht glauben bzw. konnte mir nicht vorstellen, dass man für „activity.on“ erstnahft zweimal die UID der Aktivität weitergeben muss. Aber dann ist es eben so.
Weißt Du, ob es einen Befehl für „ActivityGroup.off“ gibt? Ein Skript welches zunächst auswertet, welche Aktivität „on“ ist, um diese in der Gruppe auszuschalten wäre unpraktisch. Den State der ActivityGroup kann man auswerten - aber gibt es auch einen globalen Aus-Befehl für eine ganze Gruppe?
Chris
Sorry nein. Ich habe immer nur eine Aktivität in meinen Gruppen aktiv.
Ralf
Moin,
ich wollte meine 2. R2 heute mal wieder aktualisieren wusst aber nicht ob die Integrationen aktuell sind. Was machen? Script schreiben das eine Liste der Integrationen mit Versionsnummer erstellt
Hier ist das Script:
<?php
// cURL-Session initialisieren
$Key1 = GetValue(22717);
$IP1 = '192.168.178.227';
$Key2 = GetValue(17539);
$IP2 = '192.168.178.228';
$Page = 1;
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"] . '=' . $Entity["entity_type"], $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"] . '=' . $Entity["entity_type"], $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"]);
}
}
?>
Edit 30.4.25: Da ich hinter den Entity-Namen auch den Typ geschrieben hatte um schneller das richtige zu finden wurde mit dem vorherigen Script bei jedem Durchgang alles neu gefunden. Jetzt sollten die Einträge nicht immer wieder neu angelegt werden so das man schön auf die UIDs per ID zugreifen kann.
Viel Spaß Ralf
Ich mache gerade die ersten Gehversuche mit der Remote 3.
@HarmonyFan Du hattest mir mal Schritt für Schritt erklärt, wie ich Roku MQTT als Docker auf der Synology installiere und mit der Harmony in Verbindung bringe. Das funktioniert auch sehr gut.
Bei der Remote 3 wird Roku nativ unterstützt. Es wird über das Netzwerk ein Roku erkannt, aber nach erfolgreicher Einrichtung werden keine Entitäten gefunden.
Ich hatte gehofft wie bei der Harmony die Befehle up, down, search, netflix etc. zu finden.
Hast du vielleicht einen Tipp für mich?
Viele Grüße
marvus
Moin Marvus,
ich habe bei meiner R2 nachgesehen da verhält es sich genauso. Es gibt ja verschiedene Rokus, aktuell glaube ich Roku 4, und das Docker-Image unterstützt vielleicht eine andere API als R2/R3.
Ich hatte aber nicht wirklich den Bedarf mit dem Fake-Roku denn damit konnte man ja nur 13 Befehle an IPS schicken. Ich benutze die Request-Integration und aktuell schicke ich damit 210 verschiedene Befehle an Webhook in IPS Ich meine das habe ich oben auch beschrieben.
Ralf
Hallo Ralf,
danke, das klingt noch viel besser. Ich habe jetzt den halben Tag damit verbracht den Webhook zum Laufen zu bekommen. Ohne Erfolg.
Bisher habe ich auf der Remote 3 erfolgreich die Http Post Erweiterung installiert. Da ich nur eine Remote habe, wollte ich dein Skript wieder auf eine Remote reduzieren. Allerdings habe ich auch mit Chatgpt keine Lösung hinbekommen, die läuft.
Wenn du mal die Zeit hast, wärst du so nett und könntest mir dein Skript noch einmal auf eine Remote umschreiben und 2-3 Beispiele für mehrere Befehle integrieren?
Welche Hilfsvariablen müssen noch angelegt werden? Bzw. muss ich noch irgendwo eine Information aus der Remote rausholen? (außer die Pin der Remote).
Viele Grüße
marvus
eigentlich nur key2 und ip2 auskommentieren
<?php
// API Key und IP der ersten Fernbedienung
$Key1 = GetValue(39343);
$IP1 = '192.168.178.63';
// 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(49178)) 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';
}
}
$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"]);
}
}
}
?>
Aber das ist doch das Script, um die Aktivitäten auszulesen, oder?
Ich meine das Skript, um Befehle von der Remote nach IPS an den Webhook zu schicken.
ahhh ok mein Fehler
nutze das ganze momentan nur zum Starten und Stoppen von Activitäten per IPS
Moin Marvus,
ich versuche es mal ausführlicher.
Hook bleibt der selbe. In IPS einen Webhook SZ2-UC anlegen und auf dieses Script zeigen.
In der R2/R3 muss man ein HTTP-Post anlegen und als Source z.B. sowas angeben. In Requests darf NICHT LEGACY ausgewählt werden!
url="http://192.168.178.2:3777/hook/SZ2-UC",json="{'cmd':'licht-power'}"
Man kann auch mehr Parameter übergeben wie z.B.
url="http://192.168.178.2:3777/hook/SZ2-UC",json="{'cmd':'licht-helligkeit', 'level':'50'}"
Ich versuche jetzt mal das Script zu vereinfachen.
<?php
// array aus json machen
$Command = json_decode(file_get_contents("php://input"), true);
// wenn kein cmd nix machen
if (!isset($Command['cmd'])) return;
/*
// Mit dem UserAgenten kann man unterschiedliche Fernbedienungen unterscheiden und muss im Setup der Request-Integration angegeben werde
// Wenn man nur eine Fernbedienung hat ist es überflüssig
$UserAgent = $_SERVER['HTTP_USER_AGENT'];
if ($UserAgent == 'Remote1'){
$Key = GetValue(17539);
$IP = '192.168.178.228';
}
*/
$kommando = $Command['cmd'];
/*
// Hier habe ich überprüft ob das Kommando von einer anderen Fernbedienung schon geschickt wurde
// Ist für mein System mit 2 synchronisierten Fernbedienungen nötig so das An-/Aus-Befehle nicht doppelt gesendet werden
// sonst gibt es eine Endlosschleife
if ((GetValue(10091)) && ((stristr($kommando, 'activity.on') !== false) || (stristr($kommando, 'activity.off') !== false))){
SetValue(10091, false);
return;
}
*/
// hier kann man sich jetzt austoben. Wenn man möchte kann man so ALLES mit IPS steuern
// Variable 11082 enthält die Helligkeit für diesen Raum
// Variable 39712 enthält die Schaltervariable für diesen Raum
// Wie gesagt austoben ist hier angesagt
switch ($kommando){
case "licht-an":
$brightness = GetValue(11082) + 10;
if ($brightness > 100) $brightness = 100;
SetValue(11082, $brightness);
// Hier Helligkeit setzen rein
break;
case "licht-aus":
$brightness = GetValue(11082) - 10;
if ($brightness < 0) $brightness = 0;
SetValue(11082, $brightness);
// Hier Helligkeit setzen rein
break;
case "licht-power":
$power = GetValue(39712);
if ($power) RequestAction(39712, false);
else RequestAction(39712, true);
break;
}
?>
Besser so?
Ralf
Hi,
ich habe auch mal eine Frage:
Hat jemand ein kleines Beispiel für WebSocket? Bisher habe ich nur die REST-API benutzt und will auch mal in die WS-API reinschauen.
Ralf
Hello,
meine Remote 3 ist angekommen und ich bin am Einrichten. Den Webconfigurator finde ich ja sehr gewöhnungsbedürftig. Ich möchte gerne nur ein paar Kommandos von der Remote an IPS schicken, z. B. für Licht. Da kommt leider ein Fehler bzw. Timeout, liegt vermutlich an der Konfiguration der Remote: Ich habe die HTTP Integration installiert und eingerichtet, in IPS ist der Webhook aktiv. Dann habe ich die Entity HTTP Post eingerichtet und eine Activity „Licht“. Muss ich dann eine Startsequenz eintragen, oder geht auch ein verknüpfter Button im Userinterface? Wenn ich die Startsequenz nehme, gibt es dort ein unbeschriftetes Texteingabefeld, Wozu? Quelle? Da hab ich mal mein "http://192.168.178.39:3777/hook/ucremote",json="{‚cmd‘:‚licht-aus‘} eingetragen. Gibt aber ein Fehler und das Script in IPS läuft auch nicht. Wie macht ihr das genau?
Vielen Dank Ralf,
es funktioniert jetzt und es ist wirklich viel besser als ein Fake-Roku. Das Skript ist auch viel übersichtlicher als von Chatgpt.
Mein großer Fehler war zudem, dass ich die iP der Remote im Webhook hatte. So kann es ja nicht funktionieren…
@TK6
ich habe den Http Post dann noch innerhalb der Activity ergänzt. Danach den Reiter Sequenz geöffnet und dort den Http Post der Startsequenz hinzugefügt. In das leere Feld muss dann noch der Aufruf für den Webhook.
Die Einrichtung ist deutlich mühsamer als bei der Logitech. Aber am Ende wird sich die Mühe lohnen. Mir gefällt die Remote bisher sehr gut.
Das einzige mit dem ich zurzeit kämpfe ist, dass nicht alle selbstangelernten IR-Befehle gesendet werden. Hier muss ich noch nachsteuern und hoffe, dass es zuverlässig funktionieren wird.
Lediglich die Abbrüche zwischen der Remote und dem Web Konfigurator nerven ein wenig. Auch halte ich den Akku derzeit für relativ schwach. Kann aber auch an dem intensiveren Gebrauch bei der Einrichtung liegen.
Viele Grüße
marvus
Hi,
IR Probleme hat auch der „glückliche“ Fonzo ich benutze kaum IR und wenn dann ging es bisher bei 4 angelernten Geräten.
Zum Configurator die Verbindung sollte eigentlich einigermaßen stabil sein wenn R2/R3 im Dock steht oder man bei Aktionen „prevent sleep“ gewählt hat. Mit meinem PC habe ich ganz selten einen Abbruch mit meinem Laptop öfter aber da bin ich nicht sicher ob er nicht WiFi-Probleme hat.
Ralf
Es werden wieder Bestellungen angenommen. Schaut mal unter
Remote 3
Lieferung geschätzt auf Ende des dritten Quartals 2025
Mit ~500€ für ein Set allerdings ganz schön hart.
Hi,
glaub mir, als jemand mit einem Remotefetish, es geht noch härter Überleg vielleicht auch mal was viele Leute für ein „Telefon“ ausgeben da wird mittlerweile €2000 angestrebt.
Ralf
Glaube ich dir.
Durch die langen Lieferzeiten bin ich auch am überlegen mir eine 2te zu bestellen ohne die erste zu haben.