Wrapper Klassen in Perl und PHP für JSON API

Ich habe für mich wie schon erwähnt Wrapper Klassen um die in V3.0 enthaltene Json API geschrieben, die ich jetzt hier kurz beschrieben habe.
In Perl sieht das zum Beispiel so aus:

use strict;
use IPS_JSON;
my $user='...';
my $pass='...';
my $host='...';
my $port=...;
my $url="http://".$user.":".$pass."@".$host.":".$port."/api/";
my $id=123456;//FS20-Instance
my $state='On';//einschalten
my $ips=IPS_JSON->new($url,2);//2=timeout, see perldoc
my $action=$ips->bool($state=~/On|Ein|1/i);
my $res=$ips->FS20_SwitchMode($id,$action);
if ($res) {
	print "Switch $state Instance $id succeeded
";
	exit (0);
}else{
	die "Error:".$ips->getError;
}

Tommi

Ein Wrapper Script erlaubt nun die Entwicklung und Nutzung von IPS-Scripten in externer IDEs und Webservern.
Dabei werden die IPS-Funktionen auf die Wrapper-Klassen gemappt.
Die Nutzung ist trival, einfach ein include hinzufügen:

if (!function_exists('IPS_GetKernelVersion')) {
   //Funktion fehlt, also Script läuft nicht innerhalb von IPS
   //lade IPS Funktionsreferenzen
   include('ips_wrapper.php');
}
//jetzt wie gewohnt weiter
$val=GetValue(12345);
print $val;	

Die aktualisierten Scripte sind wieder unter http://www.tdressler.net/ipsymcon/jsonapi.html zu finden.

Tommi

Hallo Tommi,
Ich habe Deine Wrapper-Klassen damit eingebunden. Funktioniert super!!

Nachdem ich jedoch nicht alle Scripts anpassen will, habe ich für das externe PHP eine „__autoinclude.inc.php“-Datei geschrieben und über die „PHP.ini“ eingebunden. Diese Lösung ist aus meiner Sicht besser, da dann fremde Scripts (z.B. aus der IPSLibrary) nicht angepasst werden müssen.

PHP.ini:


...
auto_prepend_file="C:\php\__autoinclude.inc.php"
...

__autoinclude.inc.php:

<?
if(file_exists("<#Eigener Pfad#>\JsonApi\ips_wrapper.php")) {
    require_once("<#Eigener Pfad#>\JsonApi\ips_wrapper.php");
}	
?>

Zusätzlich bin ich mir nicht ganz sicher, ob die Zeile 112 in „IPS_JSON.php“ richtig ist. Dort steht:

	$this->method=$method;

Ist nicht folgendes korrekt:

	$this->method=$mame;

LG
Eisi2003

Sorry, habe ich ganz übersehen.

Du hast recht, statt $method muss natürlich $name rein. An der eigentlichen Funktionalität ändert das zum Glück wenig, da intern die Klassenvariable $this->method gar nicht benutzt wird.

Tommi

Auf meiner Webseite habe ich heute eine neue Version der Klassen und der Beispiele bereitgestellt. Ich hoffe, damit alle Fehler beseitigt zu haben. Die IPS Verbindungsinformationen können nun in eine gemeinsam genutzte Datei ausgelagert werden, so dass sich der notwendige eigene Code nocheinmal reduziert.

Tommi

Ich den Titel mal zu 3.x angepasst :slight_smile:

paresy

Danke! Ich darf scheinbar den Titel nicht nachträglich ändern…

Tommi

Die Wrappenklassen und die zugehörigen Beispiele habe ich nun für IPS V3.1 angepasst. Als wesentlichste Änderung ist die Übergabe von Usernamen und Password jetzt nicht mehr in der URL, sondern in den Headern. Dadurch hat sich auch die Syntax für den constructor geändert. Als 2+3. Parameter wird jetzt username und password gewertet. Man kann die Werte aber auch später mit setUsername und setPassword übergeben.


$host="ips";
$port="82";
$user='lizenz@email.ips';
$password='fernsteuer-password';
$url="http://".$host.":".$port."/api/";
$rpc = new IPS_JSON($url,$user,$password);
$version=$rpc->IPS_GetKernelVersion();

Das alternative Perlmodul benötigt nun zusätzlich noch das MIME::Base64 Modul für die Authentifizierung.
Da die Konfigurationsmöglichkeit in den Webserver-Instancen zur Aktivierung der API weggefallen ist und nun über den Tray erfolgt, habe ich auch die Webseiten aktualisiert.

Die PHP JSON_RPC und das gen_ips_wrapper.sh Script habe ich jetzt an Symcon 7.0 angepasst und neu generiert. Siehe https://github.com/Tommi2Day/ipsymcon-phpmodule-by-Tommi/tree/7.0/libs/Api