IP-Symcon - JSON RPC Schnittstelle

Hallo IPS-Community!

Dies ist mein erster Beitrag in diesem Forum, welches mir bei IPS schon ziemlich häufig weitergeholfen hat. Gestern habe ich JSON-RPC für mich entdeckt und nutze es jetzt im vollen Umfang. Hierzu verwende ich u.a. cURL (hier zu finden) um per Knopfdruck eine von vielen Lampen im Raum per Hotkey (Logitech G-Tasten) einzuschalten. Ich habe sehr lange gebraucht, um die richtige Syntax zu finden und bin selbst hier im Forum nicht ganz fündig geworden. Von daher hier meine Erkenntnisse, die cURL-Aufrufe mit den Beispieldaten - sie funktionieren =)

IP-Symcon-Server-IP: 192.168.0.1
Port: 83
Registrierte E-Mail-Adresse bei IPS: Max.Mustermann@email.de
Passwort: Passwort123
Ziel: Skript #12345 ausführen

Aufruf für Linux/OS X
curl -i -X POST -H „Content-Type: application/json“ -d ‚{„jsonrpc“: „2.0“, „method“: „IPS_RunScript“, „params“: [12345], „id“: 1}‘ http://Max..Mustermann%40email.de:Passwort123@192.168.0.1:83/api/

Windows:
curl -i -X POST -H „Content-Type: application/json“ -d „{„jsonrpc“: „2.0“, „method“: „IPS_RunScript“, „params“: [12345], „id“: 1}“ http://Max..Mustermann%40email.de:Passwort123@192.168.0.1:83/api/

  • das " ist bei Windows unabdingbar und in Windows müssen beide " und ’ verwendet werden
  • Sonderzeichen wie @ oder ein . (Punkt) müssen für den Link kodiert werden!
  • Groß- und Kleinschreibung beachten, selbst bei der E-Mail-Adresse (so wie diese bei IPS angegeben wurde)

Danke für IPS, und danke paresy für die vielen nützlichen Infos!

Grüße, Chris

Wir haben die cURL Beispiel mal in die Doku hinzugefüg: Datenaustausch — IP-Symcon :: Automatisierungssoftware

paresy

Hallo @paresy ,

das mit dem Encoden von Benutzername und Passwort ist ein entscheidender Punkt, welcher in der Doku bisher nicht berücksichtigt ist. Für erfahrende Programmierer voraussichtlich eine Selbstverständlichkeit, für weniger erfahrene User eine harte Nuss zum Knacken.

Eventuell möchtet Ihr den Hinweis auf das encoden in der Doku noch ergänzen?

Danke und Gruß
Dirk

Kannst du mir das mit dem Encoden noch einmal erklären? Wo genau wird das benötigt?

paresy

Das Passwort muss, ebenso wie der Benutzername, URL encoded sein bei HTTP.
In der Doku steht auch bei Benutzername (Email) das @ durch %40 ersetzt werden muss.
Für das Passwort fehlt der Hinweis.
Wenn man die RPC Klasse von Symcon benutzt, muss nur das Passwort urlencoded sein. Der Benutzername nicht.
Michael

1 „Gefällt mir“

Genau, wie es @Nall-chan geschrieben hat.

Ich habe, seit dem ich sensibilisiert bin, genau meine zwei Probleme auch bei anderen Usern identifiziert:

  • Encoden
  • Keywort: Password in Konfiguration mit (t) anstatt mit (d) geschrieben ;(

Bez. JSON würde ich mir in der Doku das Theme „Token“ noch wünschen.

Dirk

Ich möchte gerne auf einer HTML-Seite, die auf einem anderen Server als IP-Symcon läuft, Variablen aus IP-Symcon anzeigen.
Die in der Doku beschriebene Variante JSON-RPC über PHP funktioniert bei mir leider nicht. Es kommt immer der Fehler HTTP Error 500.
Über die Kommandozeile funktioniert der Aufruf über CURL. Aber kann ich diesen Befehl auch in meine HTML-Seite einbinden? Wie kann ich dabei vorgehen?

Hallo Leute,

inspiriert durch das tolle IP-Symcon-Event gestern habe ich mal folgendes probiert:

$URL = "MeineDomain;
$User = urlencode("MeineLizenzAdresse");
$Pass = urlencode("MeinPasswort");

try {
    $rpc = new JSONRPC("http://".$User.":".$Pass."@".$URL.":3777/api/");
    $rpc->IPS_GetKernelDir();
} catch (JSONRPCException $e) {
    echo 'RPC Problem: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Server Problem: ',  $e->getMessage(), "\n";
}

in IP-Symcon bekomme ich folgende Fehlermeldung:

Warning: file_get_contents(http://MeineDomain:3777/api/): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
 in /usr/share/symcon/scripts/__rpc.inc.php on line 89
Server Problem: Unable to connect

Die URL in Gänze kopiert (echo „http://“.$User.„:“.$Pass.„@“.$URL.„:3777/api/“:wink: und im Browser eingetragen zeigt aber folgendes:

{"API":"0.1","IP-Symcon":"6.3","JSON-RPC":"2.0"}

Die Daten stimmen also offenbar, im IP-Symcon aber die Fehlermeldung…
Woran könnte das liegen?

Joachim

https verwenden ? Bei mir sieht das so aus :slight_smile:

$rpc = new JSONRPC(‚https://‘.$access_data[$key][‚User‘].„:“.$access_data[$key][‚PW‘].„@“.$access_data[$key][‚URL‘].„/api/“);

Geht nur wenn du ein Zertifikat bei Symcon eingerichtet hast. Das ist ab Werk nicht der Fall.

Michael

Die RPC Klasse von Symcon braucht keine maskierten Daten für eMail.
Lass es dort das urlencode weg und es geht.
Michael

…vielen Dank für Eure Antworten!

Habe jetzt das „urlencode“ für den User entfernt - funktioniert aber leider trotzdem nicht…

Antwort:

arning: file_get_contents(http://Meine Domain:3777/api/): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
 in /usr/share/symcon/scripts/__rpc.inc.php on line 89
Server Problem: Unable to connect

Im Browser funktioniert es weiterhin - obwohl ja da zwei „@“ dann drin sind…

Noch eine Idee?

Joachim

Nö… bei mir geht es so…
Außer das oben dein Script einen Fehler hat. da Fehlt ein " hinter der $URL.

Kannst du nicht direkt vergleichen. Wenn du z.B. CURL auf der Kommandozeile benutzt muss der User wieder urlencoded sein.
Michael

…habe noch mal etwas anderes probiert…
Wenn der Wohnwagen neben dem Haus steht bucht der Raspberry Pi sich in mein WLAN ein und hat damit eine „interne“ IP, ansonsten ist der „normale“ Weg ein LTE-Router.
Vom Browser funktionieren beide Variante was Webfront und Konsole angeht.
Aus dem Skript heraus funktioniert aber weder die DynDNS Anbindung über LTE, noch die direkte IP über das WLAN.

@Nall-chan : Das " fehlt nur hier im Forum (Copy/Paste/Edit-Fehler :wink: ), aber danke für den Hinweis

Noch jemand eine Idee woran es scheitern könnte?

Joachim

Unabhängig davon warum es nicht geht.
Du willst das extern nur über HTTPS über Symcon Connect benutzen und nicht über http. Sonst sind deine Zugangsdaten lesbar.
Wie gesagt, so wie oben nur ohne das urlencode beim Benutzer, geht es bei mir.
Tippfehler beim Benutzer/Passwort?
Michael

.Hallo Michael,

wenn den erstellten String so in den Browser kopiere, dann funktioniert es, von daher gehe ich davon aus dass die Zugangsdaten korrekt sind…

Da http schon nicht funktioniert habe ich mich bisher noch nicht um https gekümmert. Die Fehlermeldung lautet dann:

Warning: file_get_contents(): SSL: Erfolg in /usr/share/symcon/scripts/__rpc.inc.php on line 89

Warning: file_get_contents(): Failed to enable crypto in /usr/share/symcon/scripts/__rpc.inc.php on line 89
Warning: file_get_contents(https://MeineDomain:3777/api/): failed to open stream: operation failed in /usr/share/symcon/scripts/__rpc.inc.php on line 89
Server Problem: Unable to connect

Joachim

Dann ist da auch ein gültiges Zertifikat.
also https://<irgendwas>.ipmacgic.de/api/

Einfach https auf 3777 geht nicht. Der Port 3777 ist unverschlüsselt :wink:

$URL = "192.168.xxx.yyy";
$User = "myname@domain.com";
$Pass = urlencode('MeinPasswort');
try {
    $rpc = new JSONRPC('http://'.$User.':'.$Pass.'@'.$URL.':3777/api/');
    echo $rpc->IPS_GetKernelDir();
} catch (JSONRPCException $e) {
    echo 'RPC Problem: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Server Problem: ',  $e->getMessage(), "\n";
}

Ausgabe:

/var/lib/symcon/

Connect:

$URL = "xxxxxxxxxxxxxxxxxxxxxxxx.ipmagic.de";
$User = "myname@domain.com";
$Pass = urlencode('MeinPasswort');
try {
    $rpc = new JSONRPC('https://'.$User.':'.$Pass.'@'.$URL.'/api/');
    echo $rpc->IPS_GetKernelDir();
} catch (JSONRPCException $e) {
    echo 'RPC Problem: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Server Problem: ',  $e->getMessage(), "\n";
}

Michael
PS: Browser zählen nicht… die maskieren oder verändern die URL einfach intern…

Das ist ein Verbindungsproblem. Da tauschen wir definitiv noch keiner Benutzer/Passwort aus :slight_smile:

paresy

Hallo Michael und Paresy,

vielen Dank für Eure Antworten!

Beschränken wir uns also zunächst einmal auf den Zugriff über das interne Netz und http Ein positive Rückmeldung von Sys_Ping zeigt mir das der Raspberry Pi erreichbar ist, warum kommt dann aus der Funkion ein „Unable to connect“?
Warum funktioniert dann ein „http://InterneIP:3777/console/“ aus dem Browser heraus? Auch der Zugriff per SSH auf den Raspberry Pi funktioniert doch einwandfrei?

Ich verstehe es nicht…

Joachim

Das ist nur das Ende, der eigentliche Fehler steht da auch:

Also Zugangsdaten falsch :wink:
Hast du beim passwort auch das urlencode mal weg gelassen?!
Michael