Daten per HTTP Abrufen und in Variable speichern

Guten Tag zusammen,

Ich bin gerade dabei meinen Roomba980 in IPS einzubinden, da ein PHP Modul mein können / meine Kenntnisse um ein weites übersteigt nutze ich das Node Modul „Dorita980 / Rest980“ somit kann ich den Roomba wenigstens über IPS per HTTP Befehl ansprechen.

Das Funktioniert soweit auch Problemlos, nun würde ich mir gerne auch die ein oder anderen Statusinformationen in IPS übergeben lassen, sofern dies möglich ist.
Alles wichtige kann ebenfalls über ein HTTP Command im Browser eingesehen werden über folgenden Befehl:
http://IP des Servers:3000/api/local/info/mission

Als Ausgabe erhält man nun folgendes:

{„cleanMissionStatus“:{„cycle“:„none“,„phase“:„charge“,„expireM“:0,„rechrgM“:0,„error“:0,„notReady“:0,„mssnM“:0,„sqft“:313,„initiator“:„localApp“,„nMssn“:1009},„pose“:{„theta“:0,„point“:{„x“:7,„y“:0}},„bin“:{„present“:true,„full“:false},„batPct“:100}

Ist es möglich diese Daten per IPS „abzuholen“ zu „selektieren“ und in Variablen zu Speichern ?

Als Beispiel nehme ich mal das letzte ( „batPct“:100 ) = Aktueller Akkustand des Roboters diesen würde ich nun eben gerne in eine Variable „Batterie“ geben diese ich im 2 - 5Minuten Zyklus aktualisiere, ist dies so mit IPS möglich ?

Gruß, Adrian

Das bekommst Du in IP-Symcon z.B. mit


$info_json = file_get_contents("http://IP des Servers:3000/api/local/info/mission");

Was Du bekommst ist JSON, siehe auch JSON Daten von einer Webseite auslesen und auswerten

Also


$info_json = file_get_contents("http://IP des Servers:3000/api/local/info/mission");
$info = json_decode($info_json);

Da kannst Du aus $info die Daten entsprechend der Anleitung (siehe oben) auslesen und mit SetValue in einer Variable ablegen.

Probier mal ob Du Anhand des Beispiels bzw. der Anleitung zurecht kommst, ansonsten musst Du mal das komplette JSON, das als Antwort geliefert wird posten.

Als Hilfe kannst Du Dir den Inhalt immer mit


var_dump($info);

ausgeben lassen. Mit json_decode bekommst Du ein Standardobjekt zurück.
mit -> gehst Du zur nächsten Verzweigung (Node).

Hallo Fonzo,

Vielen vielen Dank,

Das klappt wunderbar, habe es bisher an 3 Werten versucht, 2 bekomme ich richtig übertragen beim dritten macht es mir noch Probleme geht um einen Boolean Wert ich erhalte folgende Meldung

Es geht hier um den Datenpunkt „bin“ = Auffangbehälter voll / leer

Warning: Cannot auto-convert value for parameter VariableValue in /var/lib/symcon/scripts/46614.ips.php on line 8
object(stdClass)#2 (4) {
[„cleanMissionStatus“]=>
object(stdClass)#1 (10) {
[„cycle“]=>
string(4) „none“
[„phase“]=>
string(6) „charge“
[„expireM“]=>
int(0)
[„rechrgM“]=>
int(0)
[„error“]=>
int(0)
[„notReady“]=>
int(0)
[„mssnM“]=>
int(0)
[„sqft“]=>
int(313)
[„initiator“]=>
string(8) „localApp“
[„nMssn“]=>
int(1009)
}
[„pose“]=>
object(stdClass)#3 (2) {
[„theta“]=>
int(0)
[„point“]=>
object(stdClass)#4 (2) {
[„x“]=>
int(7)
[„y“]=>
int(0)
}
}
[„bin“]=>
object(stdClass)#5 (2) {
[„present“]=>
bool(true)
[„full“]=>
bool(false)
}
[„batPct“]=>
int(100)
}

Hier noch mein Skript:

<?

$info_json = file_get_contents("http://192.168.178.68:3000/api/local/info/mission");
$info = json_decode($info_json);  

SetValueString(56454, $info->cleanMissionStatus->phase);
SetValueInteger(30887, $info->batPct);
SetValueBoolean(35502, $info->bin);




var_dump($info);  

?>

wenn ich das richtig sehe ist $info->bin selbst doch ein Objekt, das aus den Wertewn ‚present‘ und ‚full‘ besteht.

Also $info->bin->full oder $info->bin->present

Hallo,

Hast vollkommen recht, das war mein Fehler.
Das Objekt „present“ hat mich im ersten Moment etwas verwirrt.
Full gibt an ob der Behälter leer oder voll ist und present gibt an ob er überhaupt im Roboter steckt oder nicht :wink:

Danke dir.

Gruß, Adrian

Hallo zusammen,

ich habe ähnlich gelagerte Frage (nicht zum Roboter aber zum auslesen von arrays) und stehe gerade auf dem schlauch und hoffe auf eure Hilfe:

Ich habe folgende Abfrage:


$content = Sys_GetURLContent("https://api.thingspeak.com/channels/950344/feeds.json?api_key=xxxxxxxxxxxxx&results=2");
$json = json_decode($content);
print_r($json);

und bekomme folgende Ausgabe:


stdClass Object
(
    [channel] => stdClass Object
        (
            [id] => 950344
            [name] => Test1
            [latitude] => 0.0
            [longitude] => 0.0
            [field1] => Temp
            [field2] => EC
            [created_at] => 2020-01-02T21:02:55Z
            [updated_at] => 2020-01-02T21:02:55Z
            [last_entry_id] => 6
        )

    [feeds] => Array
        (
            [0] => stdClass Object
                (
                    [created_at] => 2020-01-02T22:04:01Z
                    [entry_id] => 5
                    [field1] => 
                    [field2] => 1
                )

            [1] => stdClass Object
                (
                    [created_at] => 2020-01-02T22:04:19Z
                    [entry_id] => 6
                    [field1] => 
                    [field2] => 80
                )

        )

)

Die ausgabe von CHANNEL und ID funktioniert mit


echo $json->channel->id;

einwandfrei.

Ich schaffe es jedoch nicht „weiter runter“. Ziel ist es, die Arraywerte aus „field1“ und „field2“ jeweils an eine IPS Variable zu übergeben.

Danke für euren Support :slight_smile:

VG und schönes WE !
Andre


$json = json_decode($content, true);
$id = $json["channel"]["id"];
var_dump($id);
$field1 = $json["feeds"][0]["field1"];
var_dump($field1);
$field2 = $json["feeds"][0]["field2"];
var_dump($field2);

Danke dir für die schnelle Antwort ! Klappt perfekt.

VG
Andre

Gute Morgen,

bitte um Hilfe: Auslesen einer https URL mit Authentifizierung:

https://apiieu.hik-connect.com/v3/devconfig/v1/call/XXXXXX/status

Wobei XXXXXX die Seriennummer ist.

Dann bekomme ich natürlich folgendes:

Warning: Error 401, {"meta":{"code":401,"message":"Unauthorized"}} in /var/lib/symcon/scripts/16749.ips.php on line 5

Frage: Wie kann ich hier eine Auth hinzufügen?
mit z.B. admin:PASSWORT@https://apiieu.hik… geht es leider nicht.

Update:
Auch mit curl scheint es nicht zu funktionieren:

$url2 = "apiieu.hik-connect.com/v3/devconfig/v1/call/AGxxxx/status";

// ******************************************************************
$url1 = "https://";
$url = $url1.$url2;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: */*']);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_HTTP09_ALLOWED, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); // egal ob Digest oder Basic
        curl_setopt($ch, CURLOPT_USERNAME, '43650xxxx');
        curl_setopt($ch, CURLOPT_PASSWORD, 'Gxxxxx'); // Hier gehen auch Sonderzeichen

Ergebnis:

HTTP/1.1 401 Unauthorized
Content-Type: application/json
Date: Wed, 31 Jan 2024 07:36:24 GMT
Server: Tengine
Content-Length: 46
Connection: keep-alive

{"meta":{"code":401,"message":"Unauthorized"}}

Update:
Ich habe gefunden, dass man eine SessionID „mitgeben“ muss:

- platform: rest
    name: hikconnect_login
    scan_interval: 3600
    resource: "https://apiieu.hik-connect.com/v3/users/login/v2"
    headers:
      customno: 1000002
      appChannel: "hikvision"
      Content-Type: "application/x-www-form-urlencoded"
      featureCode: "b547bcdd76b2f2c93e0956114a6f8665"
      lang: "en-US"
      clientVersion: "4.14.1.0407"
      appId: "HikConnect"
      sessionId: ""
      clientType: 55
      clientNo: "google_play"
      areaId: 111
      netType: "WIFI"
      osVersion: "5.1.1"   
    method: POST
    payload: !secret hikvision_payload
    value_template: "Hikconnect Login"    
    json_attributes:
    - loginSession

Aber wie?

Danke und lg