Datenaustausch mit JSON-RPC API (Aufruf $rpc -> IPS_RunScriptEx (array(....)) )

Ich übertrage Daten von meinen Raspis (IPS 4.0) auf mein Windows Wirksystem unter IPS 3.4 nach dem Rezept Datenaustausch mit der o.g. Funktion. Damit übertrage ich Daten und Kommandos.

Das funktioniert bestens!
Ohne Erläuterung ein Auszug mit dem Aufruf:

                            $rpc -> IPS_RunScriptEx ($LAN['Svr1']['Con'], Array (       // als Heartbeat 
                                'Cmd'    => "PutData",
                                'PC'     => PCname,
                                'ObjTp'  => 'LE', // = Bluetooth Low Energie
                                'EAObj'  => 'LE',
                                'ParPac' => serialize ($DvListe['LE']),
                                'TRIG'   => $_IPS['SELF'] . '@' . PCname));

Nur kurz: im array $LAN stehen die IP-Adressen, Passwörter usw.

Jetzt versuche ich, Daten mit der gleichen Methode von IPS 3.4 an 4.0 zu senden und scheitere.

Hier der Auszug mit Trace-Informationen (auch die auskommentierte Funktion IPS_RunScript scheitert):

            
            print ("
'new JSONRPC' folgt:
");
            print ("http://" . $LAN['Svr1']['Li'] . ':' . $LAN[$PC]['PW'] . '@' . $LAN[$PC]['IP'] . '/api/');
            $rpc = new JSONRPC ("http://" . $LAN['Svr1']['Li'] . ':' . $LAN[$PC]['PW'] . '@' . $LAN[$PC]['IP'] . '/api/');

//            print ("
'rpc ->' IPS_RunScript folgt
");
//            print ($LAN[$PC]['Con']);
//            $rpc -> IPS_RunScript ($LAN[$PC]['Con']);


            print ("
'rpc ->' IPS_RunScriptEx folgt mit ObjID ");
            print ($LAN[$PC]['Con']);
            $rpc -> IPS_RunScriptEx ($LAN[$PC]['Con'], Array (
                'Cmd'   => "SetSkript",
                'PC'    => PCname,
                'ObjTp' => 'Skript',
                'EAObj' => $EAObj,
                'Par'   => IPS_GetScriptContent ($EAObj),
                'TRIG'  => $_IPS['SELF'] . '@' . PCname));

Das ist die Fehlerausgabe (Angaben zu Lizenz und Passwörtern mit ‚?‘ gelöscht):


'new JSONRPC' folgt:
http://H?????@T-Online.de:???@192.168.0.82/api/
'rpc ->' IPS_RunScriptEx folgt mit ObjID 25764
Fatal error:  Uncaught exception 'Exception' with message 'Request error: No response' in D:\IPS-Steigerts\scripts\__jsonrpc.inc.php:109
Stack trace:
#0 D:\IPS-Steigerts\scripts\__jsonrpc.inc.php(37): JSONRPC::makeRequest('http://192.168....', 'H?????@T-On...', '???', 'IPS_RunScriptEx', Array, false)
#1 D:\IPS-Steigerts\scripts\JSONcon.ips.php(87): JSONRPC->__call('IPS_RunScriptEx', Array)
#2 D:\IPS-Steigerts\scripts\JSONcon.ips.php(87): JSONRPC->IPS_RunScriptEx(25764, Array)
#3 {main}
  thrown in D:\IPS-Steigerts\scripts\__jsonrpc.inc.php on line 109

Das aufzurufende Skript mit der ObjID 25764 existiert auf dem Zielsystem, es wird aber nicht aufgerufen.

Wo liegt der Fehler?

Viele Grüsse
Harald

Das der Zielport in der RPC-URL fehlt.
Port 3777 aktuell nicht veränderbar.
Michael

Danke!

mit

          $rpc = new JSONRPC ("http://" . $LAN['Svr1']['Li'] . ':' . $LAN[$PC]['PW'] . '@' . $LAN[$PC]['IP'] . ':3777' . '/api/');

funktionierts!

Stellt sich für mich nur die Frage, weshalb es in Richtung IPS4.0 auf IPS3.4 ohne Angabe des Ports funktioniert ?

Viele Grüße
Harald

Vermutlich, weil du dort den Webserver auf Standard, also Port 80 laufen hast ;).

Die Beschreibung im Kapitel Datenaustausch
„Die seit IP-Symcon 3.0 verfügbare JSON-RPC API ist standardmäßig über den Port 3777 erreichbar“ ist NICHT richtig !!

Sie trifft zwar auf IPS-Version 4.0 für Linux zu,
jedoch nicht auf die Version 3.4 für Windows; dort darf entweder kein Port angegeben werden, weil dann der Standardport des Webserver verwendet wird oder eben der Port 80!

„standardmäßig“ (wenn man dieses Wort verwenden will) wird eben der Port des Webservers verwendet und der ist z.Z. unterschiedlich bei Version 3.4 und 4.0

Dementsprechend sind auch die Beispiele falsch, weil dort Port 82 verwendet wird.

Tipp:
Um allen möglichen Änderungen in der Zukunft begegnen zu können, hab ich die Eigenschaften meiner IPS-Systeme in ein Array geschrieben, das in die verwendeten Skripte inkludiert wird:

$LAN = array 
    'Svr1'    => array (
        'IP'    => '192.168.0.6',
        'Port'  => '80', // Port unter dem der PC per JSON erreichbar ist
        'Li'    => 'H.??????n@T?????.de', // Lizenz-Nehmer
        'PW'    => '??????',
        'IPS'   => '3.40;12.08.15;#3775',
    ),
 
 'RaspiA1' => array (
        'IP'    => '192.168.0.81',
        'Port'  => '3777',
        'PW'    => '??????',
        'IPS'   => '4.00;07.10.2015;b3ed15e7',
    ),
 // ....

);

Der Aufruf bei Datenaustausch 4.0 —> 3.4 startet dann mit folgendem Konstrukt:

  
$PC = 'Svr1';
$rpc = new JSONRPC ("http://" . $LAN['Svr1']['Li'] . ':' . $LAN[$PC]['PW'] . '@' . $LAN[$PC]['IP'] . ':' . $LAN[$PC]['Port'] . '/api/');

Für die umgekehrte Richtung steht dann statt $PC = ‚Svr1‘ die Zuweisung $PC = ‚RaspiA1‘

Wenn das Entwicklerteam die Ports ändert, ist nur das oben vorgestellt Array zu ändern.

Viele Grüsse
Harald

Da hier offenbar Experten versammelt sind, die mit einem Blick Fehler im JSON-Aufruf erkennen, hier schon meine ‚Nächste Frage‘:

Wie kann ich auf einem anderen IPS-System eine Datei umbenennen (die angesprochene Datei existiert tatsächlich) ?

Mein Ansatz:

...
                        
                        $Datei1= $rpc -> IPS_GetKernelDir () . 'scripts/' . $EAObj2 . '.ips.php';
                        $Datei2= $rpc -> IPS_GetKernelDir () . 'scripts/' . $Skript;
                        print("
Umbenennung von: $Datei1   _in_  $Datei2");

                        
                        $rpc -> rename (IPS_GetKernelDir () . 'scripts/' . $EAObj2 . '.ips.php', IPS_GetKernelDir () . 'scripts/' . $Skript); 

führt zu folgender Fehlerausgabe (Angaben zu Lizenz und Passwörtern mit ‚?‘ gelöscht):

Umbenennung von: /usr/share/symcon/scripts/38229.ips.php   _in_  /usr/share/symcon/scripts/Spielwiese3.ips.php
Fatal error:  Uncaught exception 'JSONRPCException' with message 'Method 'rename' not found' in D:\IPS-Steigerts\scripts\__jsonrpc.inc.php:121
Stack trace:
#0 D:\IPS-Steigerts\scripts\__jsonrpc.inc.php(37): JSONRPC::makeRequest('http://192.168....', 'H??????@????...', '????', 'rename', Array, false)
#1 D:\IPS-Steigerts\scripts\JSONcon.ips.php(105): JSONRPC->__call('rename', Array)
#2 D:\IPS-Steigerts\scripts\JSONcon.ips.php(105): JSONRPC->rename('D:\IPS-Steigert...', 'D:\IPS-Steigert...')
#3 {main}
  thrown in D:\IPS-Steigerts\scripts\__jsonrpc.inc.php on line 121

Viele Grüsse
Harald

Immer langsam hier :slight_smile:

Port 3777 ist korrekt, auch bei Windows.
Leider hast du das hier wohl überlesen:

Dabei ist der Port 3777 nur am lokalen System gebunden und erfordert keinerlei Authentifizierung.

D.h. es geht nur über localhost:3777
Somit ist die Doku korrekt.

Ebenso sind die Beispiele korrekt.
Port 82 ist der Port, an welchen der WebServer bei der Erst-Installation gebunden wird.

Dies gilt aktuell aber nur für IPS 3.x, weil die WebServer-Instanz bei der 4.x noch immer fehlt und wir aktuell fest an Port 3777 gebunden sind.

Normale PHP-Funktionen sind nicht zugänglich, nur IPS-Funktionen.

Die Doku sagt dazu:

Für die Funktionsaufrufe können die normalen Befehle der Befehlsreferenz und Modulreferenz verwendet werden.

Also keine PHP-Funktionen.

Du könnest über den Umweg eines Scriptes auf dem Zielsystem die Datei umbenennen.
Die benötigten Parameter kannst du dann mit IPS_RunScriptEx übergeben.

Michael