OpenWRT LUCI API

Guten Morgen

Ich hab im Zuge des Providerwechsels auch meinen Router/Firewall wechseln müssen. Die Zyxel hat leider nicht die Perfamance für 500mBit Download. Also ist ein Raspberry Pi 4B mit OpenWRT eingezogen. Der packt das. Und das zu einem drittel der Kosten. Egal

Was es für OpenWRT gibt ist die API und genau da möchte ich ansetzen. Ich würd gern ein paar Werte von den Schnittstellen herausholen. Das sollte eigentlich funktionieren. Es gibt auch eine Dokue zur API aber entweder hab ich nciht die aktuelle oder es ist ein Fehler im System.
Die notwendigen Module hab ich installiert. Das Holen vom Token funktioniert auch schon. Allerdings bekomme ich bei der Methode „net.deviceinfo“ einen Fehler, dass es diese Methode nicht gibt. Es sollte sie aber laut Doku geben. Die Methode „net.devices“ liefert alle Schnittstellen zurück, aber eben nicht mehr.

Hat das jemand von euch schon mal gemacht?

Ok, das „Projekt“ ist mal auf Eis gelegt. Was ich bisher herausgefunden hab ist, dass die Doku nicht aktuell und leider ncht mit der aktuellen Version der Module übereinstimmt. Da sind nicht mehr alle Datenpunkte verfügbar.
Es sollte auch mit UBUS funktionieren, dazu hab ich aber noch keine für mich verständliche Doku gefunden. Eigentlich gar keine wirkliche. Es muss aber irgendwie gehen, da ich eine Andorid App installiert hat, die mir genau die Werte liefert, die ich auch gern in IPS hätte, und das ohne zusätzlicher Module.
Sollte doch jemand eine Idee oder weiterführende Informationen haben, dann her damit :wink:

Aufgegeben wird bekannterweise nur ein Brief. Mir hat das keine Ruhe gelassen. Kann ja nicht so schwer sein. Also hab ich ganz einfach den Entwickler der Android App über Github angeschrieben, ober mir nicht einen Denkanstoß geben könnte. Einfach in welche Richtung ich suchen muss. Die Doku ist wirklich schlecht. Zumindest aus meiner Sicht.
Er hat sich tatsächlich gemeldet und ich hab mal das draus gemacht. Es ist nicht mal ein Prototyp aber die Anmeldung funktioniert und es kommen zumindest die für mich interessanten Werte rüber. Alles noch unformatiert. Ich werd mich die Tage damit auseinandersetzen und mir anschauen, was ich möchte und wie ich das in IPS reinbringe. Das ist allerdings nur Kosmetik, der für mich schwierigste Part ist geschafft. Das Ding antwortet auf meine Wünsche.
Wer das auch versuchen möchte, gerne.
Hier der Code. Wie gesagt, alles in einer Wurscht, unformatiert und lediglich mit einer Ausgabe in der Konsole. Ein zusätzliches Modul muss nicht auf OpenWRT installiert werden.

    <?php

$ch = curl_init();


curl_setopt($ch, CURLOPT_URL, 'http://192.168.32.1/ubus');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);

//Anmeldung
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "call",
    "params": [ 
        "00000000000000000000000000000000",
        "session",
        "login", {
            "username": "root",
           "password": "PASSWORTHIEREINGEBEN"
                 }
               ]
    }');
$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);

$sessionid=json_decode($result,true)["result"][1]["ubus_rpc_session"];

//Systeminformationen
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "system",
        "info",{}        ]
    }');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
var_dump(json_decode($result,true));

//Hardwareinformationen
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "system",
        "board",{}        ]
    }');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
var_dump(json_decode($result,true));

//Daten vom DHCP Server
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "luci-rpc",
        "getDHCPLeases",{}        ]
    }');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
var_dump(json_decode($result,true));

//Übersicht der Netzwerkschnittstellen
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "network.interface",
        "dump",{}        ]
    }');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
var_dump(json_decode($result,true));

//Werte von den Netzwerkkarten
curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "luci-rpc",
        "getNetworkDevices",{}        ]
    }');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
var_dump(json_decode($result,true));

curl_close($ch);

Hallo…bist du an der Stelle weiter gekommen? - Ich habe mehrere OpenWRT-AccessPoints und würde mir das was sich darauf tut, gerne in die Symcon holen. Beste Grüße

Ja, ich hab das für meine Bedürfnisse angepasst

<?php
$erg=array();
$user="root"; //Benutzername, bei mir root
$password=""; //das Passwort
$sessionid="";

function openwrtlogon($user,$password)
{
    $ch = curl_init();


    curl_setopt($ch, CURLOPT_URL, 'http://192.168.32.1/ubus');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "call",
    "params": [ 
        "00000000000000000000000000000000",
        "session",
        "login", {
            "username": "'.$user.'",
           "password": "'.$password.'"
                 }
               ]
    }');
    $headers = array();
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result,true)["result"][1]["ubus_rpc_session"];
}

function openwrtcall($sessionid,$path,$procedure,$parameter="")
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://192.168.32.1/ubus');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "'.$path.'",
        "'.$procedure.'",{'.$parameter.'}        ]
    }');
    $headers = array();
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    return $result;
    curl_close($ch);    
}
//logon
$sessionid=openwrtlogon($user,$password);
//Systeminformationen
$erg=json_decode(openwrtcall($sessionid,"system","info"),true);

$laufzeit=$erg["result"][1]["uptime"]; /*in Sekunden */
setvalue(15424,sprintf('%dT %dStd %dMin %dSek',
 $laufzeit / 86400,
 $laufzeit / 3600 % 24,
 $laufzeit / 60 % 60,
 $laufzeit % 60,
));
setvalue(38889,$erg["result"][1]["load"][0]."/".$erg["result"][1]["load"][1]."/".$erg["result"][1]["load"][2]);
setvalue(46220,$erg["result"][1]["memory"]["total"]/1000000);
setvalue(20047,$speicherfrei=$erg["result"][1]["memory"]["free"]/1000000);
setvalue(18483,getvalue(46220)-getvalue(20047));

//Hardwareinformationen
$erg=json_decode(openwrtcall($sessionid,"system","board"),true);

setvalue(28576,$erg["result"][1]["kernel"]);
setvalue(22901,$erg["result"][1]["hostname"]);
setvalue(59415,$erg["result"][1]["release"]["distribution"]);
setvalue(42651,$erg["result"][1]["release"]["version"]);
setvalue(21459,$erg["result"][1]["release"]["revision"]);

/*
//Daten vom DHCP Server - wird derzeit nicht verwendet
$erg=json_decode(openwrtcall($sessionid,"luci-rpc","getDHCPLeases"),true);
//Übersicht der Netzwerkschnittstellen
$erg=json_decode(openwrtcall($sessionid,"network.interface","dump"),true);
*/

//Werte der Netzwerkkarten
$rx=0;
$erg=json_decode(openwrtcall($sessionid,"luci-rpc","getNetworkDevices"),true);
setvalue(24104,$erg["result"][1]["eth0"]["name"]);
setvalue(19950,$erg["result"][1]["eth0"]["up"]);
setvalue(39521,$erg["result"][1]["eth0"]["ipaddrs"][0]["address"]);
setvalue(32869,$erg["result"][1]["eth0"]["mac"]);

$rx=$erg["result"][1]["eth0"]["stats"]["rx_bytes"]/1000000;
setvalue(33358,$rx-getvalue(59821));
setvalue(59821,$rx);
$rx=0;

setvalue(19075,$erg["result"][1]["eth0"]["stats"]["tx_bytes"]/1000000-getvalue(17855));
setvalue(17855,$erg["result"][1]["eth0"]["stats"]["tx_bytes"]/1000000);

setvalue(42012,$erg["result"][1]["eth0"]["link"]["speed"]);
setvalue(24124,$erg["result"][1]["eth0"]["link"]["duplex"]);

setvalue(13901,$erg["result"][1]["eth1"]["name"]);
setvalue(52731,$erg["result"][1]["eth1"]["up"]);
setvalue(34079,$erg["result"][1]["eth1"]["ipaddrs"][0]["address"]);
setvalue(43788,$erg["result"][1]["eth1"]["mac"]);

$rx=$erg["result"][1]["eth1"]["stats"]["rx_bytes"]/1000000;
setvalue(32143,$rx-getvalue(57576));
setvalue(57576,$rx);
$rx=0;

setvalue(24852,$erg["result"][1]["eth1"]["stats"]["tx_bytes"]/1000000-getvalue(28159));
setvalue(28159,$erg["result"][1]["eth1"]["stats"]["tx_bytes"]/1000000);

setvalue(46888,$erg["result"][1]["eth1"]["link"]["speed"]);
setvalue(16125,$erg["result"][1]["eth1"]["link"]["duplex"]);

eth0 ist bei mir der LAN-Anschluss und eth1 der WAN.
Hier meine Variabelen die befüllt werden.#


So siehts in der Visualisierung aus.

Cool. Danke. - Mich würde noch interessieren, welche WLAN-Geräte sich verbinden. Hast du das gesehen? Kann man das abfragen?

In dem Script ist ein DHCP bereich drinnen. Vielliecht hilft das. WLAN hab ich nicht aktiviert. Ich verwende das für den Router. Du müsstes herausfinden, welche Datenpunkte dafür zuständig sind.
Ich weiß aber nciht mehr, woher ich es hab. Ich denke UBUS ist ein guter Ansatz für die Suche.

Vielen Dank… ich schaue mal was ich hinbekomme :slight_smile:

Wie kann ich angezeigt bekommen, was UBUS alles zur Verfügung stellt?

Du musst die Dokumentation zu OpenWRT oder Luci oder UBUS finden :wink:

Da ich mehrere OpenWRT-Access-Points betreibe und keinen Router, habe ich Dein Skript so angepasst, dass ein INSTALL_Skript die Dummy-Instanz und alle Variablen selbst anlegt… man ist ja bequem. Für Access-Points muss das Ganze auch etwas in eine andere Richtung gehen, z.B. gibt es bei mir die eth0 Schnittstelle nicht, sondern einen „Switch“ auf dem mehrere VLANs ankommen. Aber dieser Stand ist bestimmt schon mal interessant, wenn man einen OpenWRT-Router verwendet

Das Ganze ist noch nicht ganz rund…

  • die entsprechende Zuweisung von Variablen-Profilen fehlt noch

  • das Anlegen fehlender Variablen-Profile (hier ein Beispiel aus einem anderen INSTALL_Skript)

    // eigenes Profil anlegen, dafür das vorhandene löschen
    if (IPS_VariableProfileExists("AVR_VOLUME"))
    IPS_DeleteVariableProfile("AVR_VOLUME");
    IPS_CreateVariableProfile ("AVR_VOLUME", 1 );
    IPS_SetVariableProfileText ("AVR_VOLUME", "", "%" );
    IPS_SetVariableProfileValues ("AVR_VOLUME", 40, 161 , 1 );
    IPS_SetVariableProfileIcon("AVR_VOLUME", "Speaker");
    
  • ein Auslöser (vermutlich Zeitlich) fehlt noch (hier ein Beispiel aus einem anderen INSTALL_Skript)

    // timer der das script zykisch aufruft für power in abfrage 
    $ID_EVENT = IPS_CreateEvent (1); 
    IPS_SetEventCyclic($ID_EVENT, 2, 1, 0, 0, 2, 5);   //Jeden Tag jede 5 Minuten 
    IPS_SetParent($ID_EVENT, $ID_PIONEER_SCRIPT); 
    IPS_SetEventActive($ID_EVENT, true);  // Aktivert Ereignis
    

Installationshinweise:

0.) Skript wurde in IPS 7.2 erstellt
1.) Leeres Skript erzeugen (Name z.B. „OpenWRT_Install“)
2.) Skript an den Ort (Kategorie,…) verschieben, in dem die Objekte eingebaut werden sollen
3.) Inhalt für INSTALL-Skript einfügen und CONFIG-Werte im Skript an anpassen
4.) Install-Skript ausführen
5.) Leeres Skript im Bereich der Variablen erzeugen (Name z.B. „OpenWRT“)
6.) Inhalt für OpenWRT einfügen
7.) Einen Auslöser für das OpenWRT-Skript ergänzen
→ Fertig

PHP-Skript: OPENWRT_INSTALL

<?php
###################  CONFIG-START  ################### 

define ('ID_WebFront', "41040");				// WebFront-ID
define ('NAME_DEVICE',"mr-191-ap55");		    // Gerätebenennung
define ('IP_DEVICE',"10.0.0.191");				// IP-Adresse


###################  CONFIG-ENDE  ###################

if (ID_WebFront=="" or NAME_DEVICE=="" or IP_DEVICE=="") {echo("CONFIG-Daten unvollständig!"); return;} 

$ParentID=IPS_GetParent($_IPS['SELF']);

// dummy instanz erstellen 
$ID_INSTANZ= IPS_CREATEINSTANCE("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); 
IPS_SetParent($ID_INSTANZ, $ParentID); 
IPS_SETName($ID_INSTANZ, NAME_DEVICE); 

     
        // Variablen anlegen
        // Funktion zum erstellen eines Variablen 
        // 
        // Parameter: 
        // VarNAME  	= Name wie die Variable im Objektbaum heissen soll
        // VarTyp		= Typ der Variablen (0=Boolean, 1=Integer, 2=Float, 3=String)
        // Icon			= Icon für Variable, wenn nicht aus Profil
        // ParentID 	= Objekt ID unter der das Script untergehangen wird
        // Profil		= Name des Profils 
        // ScriptID 	= Aktionsskript ID
        // Position		= Reihenfolge im Objektbaum 
        // Hidden		= Variable unsichtbar (true|false)
        //function CreateVarByName($Position, $VarNAME, $VarTyp, $Icon, $ParentID, $Profil, $ScriptID, $Hidden) 
            $VarID_Laufzeit=CreateVarByName(        2,"Laufzeit",           3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Auslastung=CreateVarByName(      4,"Auslastung",         3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Speicher_gesamt=CreateVarByName( 6,"Speicher gesamt",    2,null,$ID_INSTANZ,null,      null,false);
            $VarID_Speicher_frei=CreateVarByName(   8,"Speicher frei",      2,null,$ID_INSTANZ,null,      null,false);
            $VarID_Speicher_belegt=CreateVarByName( 10,"Speicher belegt",   2,null,$ID_INSTANZ,null,      null,false);
            $VarID_Hostname=CreateVarByName(        12,"Hostname",          3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Kernel=CreateVarByName(          14,"Kernel",            3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Distribution=CreateVarByName(    16,"Distribution",      3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Version=CreateVarByName(         18,"Version",           3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_Revision=CreateVarByName(        20,"Revision",          3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_LANName=CreateVarByName(         22,"LANName",           3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_LANUp=CreateVarByName(           24,"LANUp",             0,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANIP=CreateVarByName(           26,"LANIP",             3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_LANMAC=CreateVarByName(          28,"LANMAC",            3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_LANRX=CreateVarByName(           30,"LANRX",             2,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANRX_aktuell=CreateVarByName(   32,"LANRX aktuell",     2,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANTX=CreateVarByName(           34,"LANTX",             2,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANTX_aktuell=CreateVarByName(   36,"LANTX aktuell",     2,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANSpeed=CreateVarByName(        38,"LANSpeed",          2,null,$ID_INSTANZ,null,      null,false);
            $VarID_LANDuplex=CreateVarByName(       40,"LANDuplex",         3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_WANName=CreateVarByName(         42,"WANName",           3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_WANUP=CreateVarByName(           44,"WANUP",             0,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANIP=CreateVarByName(           46,"WANIP",             3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_WANMAC=CreateVarByName(          48,"WANMAC",            3,null,$ID_INSTANZ,"~String",   null,false);
            $VarID_WANRX=CreateVarByName(           50,"WANRX",             2,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANRX_aktuell=CreateVarByName(   52,"WANRX aktuell",     2,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANTX=CreateVarByName(           54,"WANTX",             2,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANTX_aktuell=CreateVarByName(   56,"WANTX aktuell",     2,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANSpeed=CreateVarByName(        58,"WANSpeed",          2,null,$ID_INSTANZ,null,      null,false);
            $VarID_WANDuplex=CreateVarByName(       60,"WANDuplex",         3,null,$ID_INSTANZ,"~String",   null,false);




        // Script mit Variablen-Definitionen für das Haupt-Skript anlegen 
            $SText="<?\r"; 
            $SText.="// Erzeugt von INSTALL_SCRIPT\r";
            $SText.="// Variablen-Definitionen für das Haupt-Skript\r"; 
            $SText.="\r";

            $SText.="define ('IP_DEVICE', '".IP_DEVICE."');\r";

            $SText.="define ('ID_Laufzeit', ".$VarID_Laufzeit.");\r";
            $SText.="define ('ID_Auslastung', ".$VarID_Auslastung.");\r";
            $SText.="define ('ID_Speicher_gesamt', ".$VarID_Speicher_gesamt.");\r";
            $SText.="define ('ID_Speicher_frei', ".$VarID_Speicher_frei.");\r";
            $SText.="define ('ID_Speicher_belegt', ".$VarID_Speicher_belegt.");\r";
            $SText.="define ('ID_Hostname', ".$VarID_Hostname.");\r";
            $SText.="define ('ID_Kernel', ".$VarID_Kernel.");\r";
            $SText.="define ('ID_Distribution', ".$VarID_Distribution.");\r";
            $SText.="define ('ID_Version', ".$VarID_Version.");\r";
            $SText.="define ('ID_Revision', ".$VarID_Revision.");\r";
            $SText.="define ('ID_LANName', ".$VarID_LANName.");\r";
            $SText.="define ('ID_LANUp', ".$VarID_LANUp.");\r";
            $SText.="define ('ID_LANIP', ".$VarID_LANIP.");\r";
            $SText.="define ('ID_LANMAC', ".$VarID_LANMAC.");\r";
            $SText.="define ('ID_LANRX', ".$VarID_LANRX.");\r";
            $SText.="define ('ID_LANRX_aktuell', ".$VarID_LANRX_aktuell.");\r";
            $SText.="define ('ID_LANTX', ".$VarID_LANTX.");\r";
            $SText.="define ('ID_LANTX_aktuell', ".$VarID_LANTX_aktuell.");\r";
            $SText.="define ('ID_LANSpeed', ".$VarID_LANSpeed.");\r";
            $SText.="define ('ID_LANDuplex', ".$VarID_LANDuplex.");\r";
            $SText.="define ('ID_WANName', ".$VarID_WANName.");\r";
            $SText.="define ('ID_WANUP', ".$VarID_WANUP.");\r";
            $SText.="define ('ID_WANIP', ".$VarID_WANIP.");\r";
            $SText.="define ('ID_WANMAC', ".$VarID_WANMAC.");\r";
            $SText.="define ('ID_WANRX', ".$VarID_WANRX.");\r";
            $SText.="define ('ID_WANRX_aktuell', ".$VarID_WANRX_aktuell.");\r";
            $SText.="define ('ID_WANTX', ".$VarID_WANTX.");\r";
            $SText.="define ('ID_WANTX_aktuell', ".$VarID_WANTX_aktuell.");\r";
            $SText.="define ('ID_WANSpeed', ".$VarID_WANSpeed.");\r";
            $SText.="define ('ID_WANDuplex', ".$VarID_WANDuplex.");\r";
            $SText.="\r";
            $SText.="?>\r"; 

            $ID_OPENWRT_SCRIPT_VARS= CreateScriptByName(NAME_DEVICE."_Vars", $ID_INSTANZ, $SText);


// Funktion zum erstellen eines Variablen 
// 
// Parameter: 
// VarNAME  	= Name wie die Variable im Objektbaum heissen soll
// VarTyp		= Typ der Variablen (0=Boolean, 1=Integer, 2=Float, 3=String)
// Icon			= Icon für Variable, wenn nicht aus Profil
// ParentID 	= Objekt ID unter der das Script untergehangen wird
// Profil		= Name des Profils 
// ScriptID 	= Aktionsskript ID
// Position		= Reihenfolge im Objektbaum 
// Hidden		= Variable unsichtbar (true|false)

function CreateVarByName($Position, $VarNAME, $VarTyp, $Icon, $ParentID, $Profil, $ScriptID, $Hidden) 
 { 
 global $IPS_SELF; 
 $VarID = @IPS_GetVariableIDByName($VarNAME, $ParentID); 
 if ($VarID == 0){ 
  $VarID = IPS_CreateVariable($VarTyp); 
  IPS_SetName($VarID, $VarNAME); 
  IPS_SetParent($VarID, $ParentID);
  IPS_SetVariableCustomProfile($VarID, $Profil); 
  IPS_SetVariableCustomAction($VarID, $ScriptID);    
  IPS_SetPosition($VarID, $Position);
  IPS_SetIcon($VarID, $Icon);
  IPS_SetHidden($VarID, $Hidden);
 } 
return $VarID; 
}

// Funktion zum erstellen eines Scripts 
// 
// Parameter: 
// ScriptNAME  = Name wie das Script im Objektbaum heissen soll 
// ParentID    = Objekt ID unter der das Script untergehangen wird 
// ScriptTEXT  = Inhalt der Scriptdatei 

function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT) 

 { 
 global $IPS_SELF; 
 $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID); 
 if ($ScriptID == 0){ 
  $ScriptID = IPS_CreateScript(0); 
  IPS_SetName($ScriptID, $ScriptNAME); 
  IPS_SetParent($ScriptID, $ParentID); 
  IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#"); 
  IPS_SetScriptContent($ScriptID, $ScriptTEXT);
  IPS_SetHidden($ScriptID, true); 
  IPS_SetPosition($ScriptID, 98); 
 } 
return $ScriptID; 
}

PHP-Sktipt: OpenWRT

<?php
$ID_INSTANZ=IPS_GetParent($_IPS['SELF']);
$NAME_INSTANZ=IPS_GetName($ID_INSTANZ);
echo $NAME_INSTANZ;

$ID_OPENWRT_SCRIPT_VARS= IPS_GetScriptIDByName($NAME_INSTANZ."_Vars", $ID_INSTANZ);
echo $ID_OPENWRT_SCRIPT_VARS;
include(IPS_GetScriptFile($ID_OPENWRT_SCRIPT_VARS));

$erg=array();
$user="root"; //Benutzername, bei mir root
$password=""; //das Passwort
$sessionid="";

function openwrtlogon($user,$password)
{
    $ch = curl_init();


    curl_setopt($ch, CURLOPT_URL, 'http://10.0.0.191/ubus');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "call",
    "params": [ 
        "00000000000000000000000000000000",
        "session",
        "login", {
            "username": "'.$user.'",
           "password": "'.$password.'"
                 }
               ]
    }');
    $headers = array();
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result,true)["result"][1]["ubus_rpc_session"];
}

function openwrtcall($sessionid,$path,$procedure,$parameter="")
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://10.0.0.191/ubus');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "call",
    "params": [ "'.$sessionid.'",
        "'.$path.'",
        "'.$procedure.'",{'.$parameter.'}        ]
    }');
    $headers = array();
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    return $result;
    curl_close($ch);    
}
//logon
$sessionid=openwrtlogon($user,$password);
//Systeminformationen
$erg=json_decode(openwrtcall($sessionid,"system","info"),true);

$laufzeit=$erg["result"][1]["uptime"]; /*in Sekunden */
setvalue(ID_Laufzeit,sprintf('%dT %dStd %dMin %dSek',
 $laufzeit / 86400,
 $laufzeit / 3600 % 24,
 $laufzeit / 60 % 60,
 $laufzeit % 60,
));
setvalue(ID_Auslastung,$erg["result"][1]["load"][0]."/".$erg["result"][1]["load"][1]."/".$erg["result"][1]["load"][2]);
setvalue(ID_Speicher_gesamt,$erg["result"][1]["memory"]["total"]/1000000);
setvalue(ID_Speicher_frei,$speicherfrei=$erg["result"][1]["memory"]["free"]/1000000);
setvalue(ID_Speicher_belegt,getvalue(ID_Speicher_gesamt)-getvalue(ID_Speicher_frei));

//Hardwareinformationen
$erg=json_decode(openwrtcall($sessionid,"system","board"),true);

setvalue(ID_Kernel,$erg["result"][1]["kernel"]);
setvalue(ID_Hostname,$erg["result"][1]["hostname"]);
setvalue(ID_Distribution,$erg["result"][1]["release"]["distribution"]);
setvalue(ID_Version,$erg["result"][1]["release"]["version"]);
setvalue(ID_Revision,$erg["result"][1]["release"]["revision"]);

/*
//Daten vom DHCP Server - wird derzeit nicht verwendet
$erg=json_decode(openwrtcall($sessionid,"luci-rpc","getDHCPLeases"),true);
//Übersicht der Netzwerkschnittstellen
$erg=json_decode(openwrtcall($sessionid,"network.interface","dump"),true);
*/

//Werte der Netzwerkkarten
$rx=0;
$erg=json_decode(openwrtcall($sessionid,"luci-rpc","getNetworkDevices"),true);
//var_dump($erg);
setvalue(ID_LANName,$erg["result"][1]["eth0"]["name"]);
setvalue(ID_LANUp,$erg["result"][1]["eth0"]["up"]);
setvalue(ID_LANIP,$erg["result"][1]["eth0"]["ipaddrs"][0]["address"]);
setvalue(ID_LANMAC,$erg["result"][1]["eth0"]["mac"]);

$rx=$erg["result"][1]["eth0"]["stats"]["rx_bytes"]/1000000;
setvalue(ID_LANRX_aktuell,$rx-getvalue(ID_LANRX));
setvalue(ID_LANRX,$rx);
$rx=0;

setvalue(ID_LANTX_aktuell,$erg["result"][1]["eth0"]["stats"]["tx_bytes"]/1000000-getvalue(ID_LANTX));
setvalue(ID_LANTX,$erg["result"][1]["eth0"]["stats"]["tx_bytes"]/1000000);

setvalue(ID_LANSpeed,$erg["result"][1]["eth0"]["link"]["speed"]);
setvalue(ID_LANDuplex,$erg["result"][1]["eth0"]["link"]["duplex"]);

setvalue(ID_WANName,$erg["result"][1]["eth1"]["name"]);
setvalue(ID_WANUP,$erg["result"][1]["eth1"]["up"]);
setvalue(ID_WANIP,$erg["result"][1]["eth1"]["ipaddrs"][0]["address"]);
setvalue(ID_WANMAC,$erg["result"][1]["eth1"]["mac"]);

$rx=$erg["result"][1]["eth1"]["stats"]["rx_bytes"]/1000000;
setvalue(ID_WANRX_aktuell,$rx-getvalue(ID_WANRX));
setvalue(ID_WANRX,$rx);
$rx=0;

setvalue(ID_WANTX_aktuell,$erg["result"][1]["eth1"]["stats"]["tx_bytes"]/1000000-getvalue(ID_WANTX));
setvalue(ID_WANTX,$erg["result"][1]["eth1"]["stats"]["tx_bytes"]/1000000);

setvalue(ID_WANSpeed,$erg["result"][1]["eth1"]["link"]["speed"]);
setvalue(ID_WANDuplex,$erg["result"][1]["eth1"]["link"]["duplex"]);

PHP-Skript: Variablen-Definitionen (wird automatisch erzeugt und sieht dann wie folgt aus…nur mit anderen IDs)

<?

// Erzeugt von INSTALL_SCRIPT
// Variablen-Definitionen für das Haupt-Skript
define ('IP_DEVICE', '10.0.0.191');
define ('ID_Laufzeit', 50164);
define ('ID_Auslastung', 18801);
define ('ID_Speicher_gesamt', 32537);
define ('ID_Speicher_frei', 44953);
define ('ID_Speicher_belegt', 51109);
define ('ID_Hostname', 50074);
define ('ID_Kernel', 40529);
define ('ID_Distribution', 18806);
define ('ID_Version', 13617);
define ('ID_Revision', 16389);
define ('ID_LANName', 46169);
define ('ID_LANUp', 26013);
define ('ID_LANIP', 43910);
define ('ID_LANMAC', 30705);
define ('ID_LANRX', 25221);
define ('ID_LANRX_aktuell', 27297);
define ('ID_LANTX', 52165);
define ('ID_LANTX_aktuell', 46673);
define ('ID_LANSpeed', 46485);
define ('ID_LANDuplex', 19557);
define ('ID_WANName', 50302);
define ('ID_WANUP', 55711);
define ('ID_WANIP', 29091);
define ('ID_WANMAC', 52608);
define ('ID_WANRX', 47610);
define ('ID_WANRX_aktuell', 20233);
define ('ID_WANTX', 51908);
define ('ID_WANTX_aktuell', 25025);
define ('ID_WANSpeed', 33084);
define ('ID_WANDuplex', 12262);
?>

PHP class to query OpenWRT built-in Ubus API

[GitHub - soif/OpenWrtApi: An OpenWrt API Php client exposing Ubus commands. Helps to easily remote control your Open WRT router.](https://PHP class to query OpenWRT built-in Ubus API)