YIO Remote Two auf Kickstarter

Moin,
Ist ganz einfach. Benutze mein Script unterändert und dann schreibe ein kleines, eigenes Script

<PHP?
IPS_RunScriptEx(„ID vom Sendescript“ , Array(„SENDER“ => „R2“, „IP“ => '192.168.178.68', „Key“ => 'hier dein Key als String rein', „UID“ =>'hier die UID als String rein', „Kommando“ => 'hier das Kommando als String rein'));
?>

Kommando z.B „activity.on“, „activity.off“ oder „mute“. Mute benutze ich z.B. wenn der Anrufmonitor meldet das ein Gespräch startet oder endet.

Ralf

ahhhhh danke jetzt sehe ich was ich falsch gemacht habe werde ich am abend testen.
danke

jetzt bekomme ich leider eine Fehlermeldung:


gruß Stefan

Ersetze die Anführungszeichen durch vorne und hinten oben.

genau das wars jetzt geht es
danke dir

Hi,
vielleicht noch Ideen für dich :smile:

Ich hatt ja schon geschrieben as ich mit dem Anrufmonitor der Fritzbox Geräte stumm schalte.

Per Alexa kann ich mit „Alexa Kanal auf 25“ auf Programm 25 umschalten. Jetzt habe ich auch noch die Direktwahl für beliebte Programme eingebaut wie „Alexa Kabel 1 an“. Eben da noch „Alexa stop,weiter,ende an“ um schnell TimeShift zu aktivieren.

Für Tagesschau- oder Tatortfans könnte man eine automatische Umschaltung um 20:00 oder Sonntags um 20:15 auf ARD programmieren.

Viel Spaß mit der R2.

Ralf

1 „Gefällt mir“

Moin mal wieder,
ich hatte ja mal den Schritt von PIN zu API-Key gemacht. Damit man nicht im Web-Konfigurator arbeiten muss habe ich mal ein kleines Script geschrieben das den Key erstellt.

<?php
$IP = 'IP der Remote';
$PIN = 'Pin der Remote'; 
$Name = 'Name des Api-Keys';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://' . $IP . '/api/auth/api_keys');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'web-configurator:' . $PIN);
$AuthList = json_decode(curl_exec($ch), true);
$found = false;
foreach ($AuthList as $Auth){
    if ($Auth["name"] == $Name){
        echo $Name . ' with Key ' . $Auth['key_id'] . ' found' . PHP_EOL;
        $found = true;
// API Key löschen
        $data = array(
            'name' => $Name
        );
        $data_string = json_encode($data);
        curl_setopt($ch, CURLOPT_URL, 'http://' . $IP . '/api/auth/api_keys/' . $Auth['key_id']);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERPWD, 'web-configurator:' . $PIN);
        $result = curl_exec($ch);
        $result = json_decode($result);
        $found = false;
    }
}
if (!$found){
// API Key erstellen und in Variable schreiben
    $API_Key = @IPS_GetObjectIDByName("API_Key " . $IP, $_IPS['SELF']);
    if ($API_Key == false){
        $API_Key = IPS_CreateVariable(3);                                     // Stringvariable anlegen
        IPS_SetPOsition($API_Key, 10);                                        // Position setzent
        IPS_SetName($API_Key, "API_Key " . $IP);                              // Variable benennen
        IPS_SetParent($API_Key, $_IPS['SELF']);                               // Variable einsortieren unter dem Objekt
    }

    $data = array(
        'name' => $Name,
        'scopes' => ['admin']
    );
    $data_string = json_encode($data);
    curl_setopt($ch, CURLOPT_URL, 'http://' . $IP . '/api/auth/api_keys');
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
    );
    curl_setopt($ch, CURLOPT_USERPWD, 'web-configurator:' . $PIN);
    $result = curl_exec($ch);
    $result = json_decode($result, true);
    if (isset($result['message'])) echo $result['message'] . PHP_EOL;
    else SetValue($API_Key, $result['api_key']);
    var_dump($result);
}    
curl_close($ch);
?>

In den ersten 3 Zeilen die nötigen Informationen eintragen und dann ausführen. Das Script erzeugt eine Textvariable in der am Ende der Key gespeichert wird. Sollte der Name schon vergeben sein so wird er vorher gelöscht und danach neu erzeugt. Das ist nötig weil man nach der Erzeugungs des Keys nicht wieder an ihn rankommt wenn er mal gelöscht wurde.

Ralf

1 „Gefällt mir“

Danke
dass du drann bleibst auch wenn noch nicht allzuviele darauf antworten.
Aber die R3 wird bald ausgeliefert werden…

Wie bist du mit der R2 zufrieden? Speziell in Verbindung mit IPS?

Mit der Auslieferung der R3 wird sich hier sicherlich mehr tun und ich hoffe das danach auch mehr Energie in die Weiterentwicklung des Produktes seitens des Herstellers gesteckt wird.

Heiner

Moin,

ist mir schon klar. Ich will Leute neidisch machen :joy: Aber im Ernst im Prinzip will ich jemanden animieren über ein Modul nachzudenken. So groß zu einer Harmony scheinen die Unterschiede nicht zu sein.

Sagen wir mal so alles was ich machen will kann ich schon. Aktuell ist sie schon die bei weitem beste Fernbedienung die ich je hatte und mit Harmony Ultimate/Elite und Neeo hatte ich ja schon Spitzenprodukte.

Im Core Simulator unter http://nofritz.rbsoft.de:30080 kannst Du dir mal meine aktuelle Konfiguration ansehen. Passwort ist 1234.

Mit den obigen Scripten starte ich von IPS Aktivitäten und bediene Geräte/Aktivitäten wie z.B. Mute falls ein Anruf kommt. Mit einer Request Integration für die R2 kann ich einen json-String an einen Webhook in IPS schicken und so Lampen, Steckdosen usw. schalten.

Das einzige was ich mir bei der R2/R3 noch wünschen würde ich eine Push-Nachricht wie bei der Neeo.

Stimmt im Moment werden die Armen ziemlich im Stress wegen Produktion und Versand sein. In den nächsten Tagen sollte ein Update kommen wie der Zeitplan aktuell ist. An diesem Wochenende wird ja die Versandliste geschlossen.

Ralf

Danke für den Core Simulator Zugriff.
Interessant.
Installieren über die Dokerversion wollte ich bisher nicht.

Hi,
für mich war das Docker mit dem Compose auch eine Premiere. Ich hatte erst die VM genommen aber die hatte noch den alten Konfigurator. Mit dem Container Manager der Synology war es aber ganz einfach wenn man die Comose-Datei erstmal verstanden hat. Verstehen hat bei mir ca. 1 Stunde gedauert.

Meine Geräte sind sehr R2-freundlich denn 16 der 23 kann ich per WiFi bedienen und meine letzten beiden IR-Geräte werden von einzig nötigen Dock gesteuert. BlueTooth könnte mit Glück auch klappen aber da es LE ist wird die Reichweite wohl nicht reichen. Somit habe ich zum ersten Mal eine Fernbedienung mit der ich die wichtigsten Sachen mit nur einer Fernbedienung steuern kann. Bei Harmony benötigte ich per Zimmer einen Hub.

Mich würde mal interessieren wie viele IPS-Benutzer eine R2 haben bzw. eine R3 erwarten. Gefühlt war es bei Harmony >>50%. Mit mir kenne ich jetzt 3.

Ich habe das Docker jetzt auf die R3 umgestellt. So kann ich die Tasten schon mal neu belegen.

Ralf

Wie kommt man an den Web-Konfigurator 2.0 für Docker mit dem Compose? Lauffähig unter Win11.

Wenn du der Ralf aus der Unfolded Community bist hast du es zwar dort schon mal versucht zu erklären aber das war für die alte Version des Web-Konfigurators.
Die Umstellung für die R3 scheint ja nur eine Zeile in der docker-compose.yml zu sein.

Btw: Wie kann man hier im Forum eine Umfrage starten?

Kann sein das ich es war damals wohl mit der veralteten virtuellen Maschine die anscheind nicht mehr aktualisiert wird/wurde.

Ich benutze Docker schon lange aber meistens vorgefertige Images. Wegen dem Konfigurator habe ich es das erste Mal selbst erstellt aber eben in meiner Synology. Wie es unter Win11 geht kann ich nicht sagen.

Sorry Ralf

Moin Ralf,
als stolzer Besitzer der Remote Two wollte ich meine Erfahrungen teilen. Ich habe neben Symcon nur für die Remote Two aktuell noch Home Assistant im Docker laufen, womit ich einige Lampen, Rollos und den Mulchroboter per MQTT über Symcon steuere. Der Vorteil ist, dass die Integration der R2 zu HA sehr gut und stabil ist. Ich hoffe natürlich auf eine MQTT- oder Symcon-Integration der R2, damit ich HA wieder loswerden kann :slight_smile:

Da ich einige Funktionen der R2 auch über Symcon steuern möchte, habe ich in Symcon einen WebSocket-Client konfiguriert. Dazu ist notwendig:
URL: wss://[IP_der_R2]/ws
Zertifikate verifizieren: false (eigene Zertifikate werden leider noch nicht unterstützt)
Typ: Text
Header:
Name: API-Key
Wert: [siehe http://[IP_der_R2]/doc/core-rest/#/api-keys/createApiKey]

Mithilfe des Bearer Tokens ist man nicht mehr auf die PIN oder das Admin-Passwort angewiesen, was sehr praktisch ist.

Nun fehlt lediglich das Skript - hier zum Umschalten des Ambilight im Standby eines Philips Fernsehers:

<?php

$remoteWebSocketID = 12345;

$message = '{"kind":"req","id":1,"msg":"execute_entity_command","msg_data":{"entity_id":"uc.main.7e066513-29eb-4e55-b70d-656109de8ccf","cmd_id":"remote.send","params":{"command":"Ambilight"}}}';

WSC_SendMessage ( $remoteWebSocketID , $message );

?>

Die zugehörigen Befehle einer Entität innerhalb der Home Assistant Integration auf der R2 kann man wie folgt abfragen:

$message = {"kind":"req","id":1,"msg":"get_entity_commands","msg_data":{"entity_id":"uc.main.7e066513-29eb-4e55-b70d-656109de8ccf"}}

uc.main.7e066513-29eb-4e55-b70d-656109de8ccf ist bei mir die von der R2 vergebenen ID der Fernbedienung eines Philips Fernsehers. Die zugehörige ID innerhalb der R2 kann man in den Entitäten auslesen: http://[IP_der_R2]/configurator/#/entities

Aktuell warte ich auch auf meine Remote 3, werde wohl aber etwas länger warten, da ich das Angebot angenommen und zusätzliche Booster und Docks bestellt habe. Jetzt kennst Du schon 3 Symcon-RemoteTwo User :wink:

Hi,
interessant aber es sind 3+1 User du hast mich vergessen :rofl:

Du benutzt die Core-API WS oder? Ich curl. Ich habe im Prinzip schon alles als Script was man braucht, d.h. Aktivitäten inkl. der vorhandenen Befehle und Entities inkl. der vorhanden Befehle auslesen sowie Befehle absetzen.

Für mich sieht es so aus das sich die Innereien der R2/3 nicht so sehr von der Harmony unterscheiden. Harmony hat den Aktivitäten und Geräten auch eine Nummer verpasst aber als Integer die R2 benutzt UIDs also Strings.

Mit meinen Scripten und dem Harmony-Modul könnte sich schon was basteln. Da ich mich noch nicht an Module rantraue und auch keine Zeit habe ist es für mich verschoben.

Btw. Mein Liebling ist die Requests Integration. In der R2 konfiguriere ich

url="http://192.168.178.2:3777/hook/SZ2-UC",json="{'cmd':'licht-power'}"

und schon wird ein web-Hook in IPS aufgerufen mit einer json-Strunktur. Hier ein abgekürztes Beispiel:

<?php
// array aus json machen
$Command = json_decode(file_get_contents("php://input"), true);
// wenn kein cmd nix machen
if (!isset($Command['cmd'])) return;
// damit ich meine beiden R2 unterscheiden kann je nachdem welche es war benutze ich in einigen Befehlen andere IP und Key
$UserAgent = $_SERVER['HTTP_USER_AGENT'];
if ($UserAgent == 'Remote1'){
    $Key = GetValue(17539);
    $IP = '192.168.178.228';
}
else if ($UserAgent == 'Remote2'){
    $Key = GetValue(22717);
    $IP = '192.168.178.227';
}
else return;
        
$kommando = $Command['cmd'];

// Start/Ende speziell behandeln Script wird nur ausgeführt wenn die Variable 10091 false ist
// Ich benutze diese Routinen um meine beiden R2s zu synchronisieren, d.h. R2-1 startet Aktivität XYZ dann wird die auch auf R2-2 gestartet
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
switch ($kommando){
    case "licht-an":
        $brightness = GetValue(11082) + 10;
        if ($brightness > 100) $brightness = 100;
        SetValue(11082, $brightness);
        IPS_RunScript(26798);
        break;
    case "licht-aus":
        $brightness = GetValue(11082) - 10;
        if ($brightness < 0) $brightness = 0;
        SetValue(11082, $brightness);
        IPS_RunScript(26798);
        break;
    case "licht-power":
        $power = GetValue(39712);
        if ($power) RequestAction(39712, false);
        else RequestAction(39712, true);
        break;
    case "luefter-power":
        if (GetValue(41643)) RequestAction(10444, !GetValue(10444));
        break;
    case "luefter-speed":
        if (GetValue(41643)) RequestAction(29783, (GetValue(29783) %3) + 1);
        break;
    case "luefter-osci":
        if (GetValue(41643)) RequestAction(11897, !GetValue(11897));
        break;
// für mein Philips Eingänge umschalten weil es da keine Direktbefehle gibt. Dazu benutze ich das FireTV-Modul
    case "HDMI1":
        FireTV_Send_String(13812, "shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/com.mediatek.tvinput%2F.hdmi.HDMIInputService%2FHW5 -n org.droidtv.playtv/.PlayTvActivity -f 0x10000000");
        break;
    case "HDMI2":
        FireTV_Send_String(13812, "shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/com.mediatek.tvinput%2F.hdmi.HDMIInputService%2FHW6 -n org.droidtv.playtv/.PlayTvActivity -f 0x10000000");
        break;
    case "HDMI3":
        FireTV_Send_String(13812, "shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/com.mediatek.tvinput%2F.hdmi.HDMIInputService%2FHW7 -n org.droidtv.playtv/.PlayTvActivity -f 0x10000000");
        break;
    case "HDMI4":
        FireTV_Send_String(13812, "shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/com.mediatek.tvinput%2F.hdmi.HDMIInputService%2FHW8 -n org.droidtv.playtv/.PlayTvActivity -f 0x10000000");
        break;
// Aktivität Dune-HD (Android TV) wurde gestartet
    case "StartDune":
// Eingang umschalten
        FireTV_Send_String(13812, "shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/com.mediatek.tvinput%2F.hdmi.HDMIInputService%2FHW5 -n org.droidtv.playtv/.PlayTvActivity -f 0x10000000");
        sleep(5);
// MagentaTV starten
        FireTV_MagentaTV(47980, false);
        sleep(2);
// Auf Kanal 1 schalten
        RequestAction(36984, 1);
// wenn die 2. R2 nicht online ist war es das hier
        if (!GetValue(44614)) return;
// 2. R2 ist online also auf dieser die selbe Aktivität starten
        $UID = $Command['UID'];
        IPS_RunScriptEx(19294 , Array("SENDER" => "R2", "IP" => $IP, "Key" => $Key, "UID" => $UID, "Kommando" => 'activity.on'));
        break;
// Aktivität Dune-HD (Android TV) wurde beendet
    case "EndDune":
        if (!GetValue(44614)) return;
// 2. R2 ist online also auf dieser die selbe Aktivität beenden
        $UID = $Command['UID'];
        IPS_RunScriptEx(19294 , Array("SENDER" => "R2", "IP" => $IP, "Key" => $Key, "UID" => $UID, "Kommando" => 'activity.off'));
        break;
}
?>

Wie Du siehst kann ich schon nur mit IPS machen was ich will. Vielleicht nicht immer so schön wie mit HA aber ich habe die volle Kontrolle. Ich weiß das HA sehr umfangreich und beliebt ist aber ich mag es nicht weil es in der Discord-Gruppe von Unfolded Circle für gefühlte 90% der Fragen und Probleme sorgt. Auch wollte ich neben IPS und IOBroker keine 3. Automation.

Ralf

Moin Ralf,

danke dafür - probiere ich mal aus. Hast Du auch eine Lösung für die Visualisierung innerhalb der R2? Das heißt, dass Deine Lampe auf der R2 den aktuellen Dimmwert anzeigt, obwohl dieser nicht an der R2 eingestellt wurde. Das ist für die Lampe weniger wichtig, als für meinen Mulchroboter. Denn dieser verfängt sich alle Jubeljahre im Beet und wimmelt lautlos nach Hilfe. Eine String-Variable in Symcon zeigt mir mittels dieses Status an, wo der Schuh drückt. Es wäre praktisch, diese Info auf der R2 zu sehen. Dabei ist die HA-Intrgration sehr praktisch - denn diese macht bei mir keine Probleme. Egal was ich versuche, um die R2 aus dem Tritt zu bringen, wie z.B. einen Wi-Fi-, Firewall-, Container- oder Symcon-Reboot, oder wenn ich einen ganzheitlichen Kaltstart im Haus durchführe - sobald alles wieder da ist, zeigt die R2 den korrekten Status an, obwohl der Weg fehleranfällig aussieht:
Mulchroboter → Husqvarna Cloud → Symcon → Home Assistant → Remote Two

Sobald ich das ohne HA hinbekomme, verbanne ich ihn wieder
Die nächste Baustelle ist FHEM zu verbannen. Denn FHEM bindet meine Wärmepumpe über einen PRODINo MKR Zero Ethernet V1 und der NIBE-GW Integration an und übermittelt die Daten ebenfalls per MQTT an Symcon. NIBE redet zwar seit einem knappen Jahr MQTT over TLS, jedoch leider nur in die Cloud (MyUplink), die wiederum sehr hemdsärmelig umgesetzt wurde.

Chris

Moin Chris,

leider nein. Das bräuchte ich zwar nicht unbedingt aber wie heißt es so schön „nice to have“. Ich werde mal beim Autor nachfragen.

Ralf

Moin Chris,
der Autor hat jetzt ein Widget eingebaut das mit Daten gefüttert werden soll die per HTTP-Get kommen aber das ist mir bisher nicht gelungen. HTTP-Get is neu für mich.

btw. Du scheinst WS-API zu benutzen. Hast Du schon mal was mit SequenceState state gemacht? Also festgestellt ob eine Activität gestartet/beendet wurde und wenn ja welche?

Ralf

Moin Ralf,

von dem WebSocket bin ich weg, da dieser nach einem Verbindungsabbruch nicht zuverlässig wieder aufgebaut wird. Ich triggere nun Skripte manuell, um Infrarot-Befehle auszugeben.
Einen HTTP-GET für die Activities hatte ich bislang noch nicht. Aber ich habe mal einen heruntergeschrieben für Dich :slight_smile:

<?php

$ipAddressVar   = xxxxx;
$bearerTokenVar = xxxxx;
$activityIDVar  = xxxxx;
$stateVar       = xxxxx;

$ipAddress      = GetValue ( $ipAddressVar );
$bearerToken    = GetValue ( $bearerTokenVar );
$activityID     = GetValue ( $activityIDVar );
$state          = false;

$command   = '/api/activities/' . $activityID;

// cURL initialisieren
$ch = curl_init ( );

// cURL-Parameter setzen
curl_setopt ( $ch , CURLOPT_URL            , 'https://' . $ipAddress . $command );
curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , false );
curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST , false );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST  , 'GET' );
curl_setopt ( $ch , CURLOPT_HTTPHEADER     , [
    'accept: application/json' ,
    'Authorization: Bearer ' . $bearerToken  ] );

// Anfrage ausführen
$response = curl_exec ( $ch );

// Antwort decodieren
$responseData = json_decode ( $response , true );

// cURL schließen
curl_close ( $ch );

if ( $responseData === null && json_last_error ( ) !== JSON_ERROR_NONE ) {
    // Debugging
    //echo "JSON-Decodierungsfehler: " . json_last_error_msg ( );

} else {
    // Debugging
    //var_dump ( $responseData );

    if ( isset ( $responseData [ 'attributes' ] [ 'state' ] ) ) {
        $stateString = $responseData [ 'attributes' ] [ 'state' ];
        // Debugging
        //echo $stateString;

    } else {
        // Debugging
        //echo "Schlüssel 'state' nicht gefunden";
    }
}

if ( $stateString == "ON" ) $state = true;

SetValue ( $stateVar , $state );

?>

Ganz oben habe ich die Datensätze für IP-Adresse, Bearer Token, Activitiy-ID der RemoteTwo Aktivität in IPS-String-Variablen gepackt. Die $stateVar ist ein boolscher Wert, der den Zustand der jeweiligen Aktivität angibt: OFF–> false bzw. ON–>true
Das muss natürlich pro Aktivität erfolgen.

Chris

Moin Chris,
danke für die (unnötige) Arbeit. Ich weiß nicht ob ich es oben schon erwähnte. Ich habe ein Script um ALLE Aktivitäten abzufragen u.a. auch mit Status. Dieses Script starte ich einmal pro Minute. Damit reagiere ich jetzt schon in der Visu, d.h. wenn sich der Status ändert wird auch ein Schalter geändert bzw. wenn ich den Schalter drücke wird die Aktivität gestartet.

Ich hatte nach WS gefragt weil darüber, laut Markus, diverse Statussachen gepushed werden man bräuchte nicht mehr aktiv pollen.

Ralf