Daten (Status aus Shelly 2.5 auslesen)

[b]Hallo Experten

[/b]Wer kann helfen
Mit diesem Script lese ich den Shelly 2.5 aus.
Die Befehle Scripte Hoch/Runter Stop funktionieren


[b]<?php[/b]
$url = "http://192.168.xxx.xxx/roller/0";      // URL nach API ergänzen

$result = Sys_GetURLContent($url);
if($result)

{
$json = json_decode($result);
var_dump($json);
// $json auswerten und Werte in Variablen ablegen
// Wie kann man das machen? 
}
############################################
[b]Nach Scriptausführung wird das ausgegeben:[/b]

object(stdClass)#1 (11) {
  ["state"]=>
  string(4) "stop"
  ["source"]=>
  string(4) "http"
  ["power"]=>
  float(0)
  ["is_valid"]=>
  bool(true)
  ["safety_switch"]=>
  bool(false)
  ["overtemperature"]=>
  bool(false)
  ["stop_reason"]=>
  string(6) "normal"
  ["last_direction"]=>
  string(5) "close"
  [b]["current_pos"]=>
  int(101)[/b]
  ["calibrating"]=>
  bool(false)
  ["positioning"]=>
  bool(true)
}
#########################################
Wie kann ich die Daten in Variablen schreiben
Wobei mir die [b]current_pos[/b] reichen würde....

Vielen Dank im Voraus
Egon

Ich würde dir empfehlen, beim json_decode noch ein true mit ranzuhängen. Dann bekommst du nämlich ein assoziatives Array zurück, die gleiche Form, die auch die IPS-spezifischen Funktionen wie IPS_GetObject verwenden. Danach kannst du auf die einzelnen Felder zugreifen und diese in ein Array speichern, beispielsweise:


// Vorher alles analog machen

$json = json_decode($result, true);

SetValue(12345 /* Hier die VariablenID anpassen */, $json['current_pos']);
// Nach belieben weitere Variablen füttern

Hallo Dr Niels

Vielen Dank
Funktioniert prima.
Darum habe ich IPSymcon

Schönen Gruß:)
Egon

Darf ich fragen, wieso du das alles selbst machst?
Du kannst doch auch das Shelly Modul mit MQTT nutzen.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Hallo Kai
Danke, hab ich schon im Blick aber für Hoch, Runter Stop gehts mit diesen Scripten
sehr einfach.

MQTT:
Ist mir alles zu unübersichtlich.
Muss ich den Shelly flashen?
Welchen MQTT Broker oder und Client was ist der Token?
MQTT von Symcon oder dein MQTT Modul?

Oder ist mit dem Script noch ein Nachteil damit, wo ich noch nicht entdeckt habe…

$runter = file_get_contents(  "http://192.168.xxx.xxx/roller/0?go=close");

Schönen Gruß:)
Egon

Hallo Egon,

ich sehe keinen Nachteil auch über http ein Shelly zu steuern.
Aber MQTT hat halt Vorteile, da der Status von leber kommt.
Brauchen tust du, den Symcon MQTTserver und Kai’s Shelly Modul.
Shelly braucht NICHT geflasht werden, kann MQTT von Haus aus.

Ich habe auch mittlerweile 4 verschiedene Shellys mit dem Shelly-Modul in Betrieb und bin bestens zufrieden.
Beim ersten Shelly habe ich mir die einzelnen Schritte genau aufgeschrieben und dann geht es bei den anderen raz faz :slight_smile:
Danke in diesem Zusammenhang Kai für die Erstellung dieses tollen Moduls.

LG. Werner

Gerne und bei Fragen einfach im Thread nachfragen. :slight_smile:

Grüße,
Kai

Hallo
Wer hilft nochmal?
Das ist schon 3 Jahre her aber jetzt wieder aktuell:
So sind die eingelesenen Werte wie krieg ich damit z.B. die „voltage“:239.1, "
in die Variable 14519 rein??
{„ble“:{},„cloud“:{„connected“:true},„input:0“:{„id“:0,„state“:false},„mqtt“:{„connected“:true},„switch:0“:{„id“:0, „source“:„init“, „output“:true, „apower“:598.0, „voltage“:239.1, „current“:2.463, „aenergy“:{„total“:590725.113,„by_minute“:[9994.883,10005.285,10020.639],„minute_ts“:1722256500},„temperature“:{„tC“:67.5, „tF“:153.5}},„sys“:{„mac“:„A8032AB816D8“,„restart_required“:false,„time“:„14:35“,„unixtime“:1722256541,„uptime“:3386687,„ram_size“:246644,„ram_free“:135484,„fs_size“:458752,„fs_free“:135168,„cfg_rev“:37,„kvs_rev“:2,„schedule_rev“:0,„webhook_rev“:0,„available_updates“:{„stable“:{„version“:„1.3.3“}},„reset_reason“:1},„wifi“:{„sta_ip“:„192.168.178.86“,„status“:„got ip“,„ssid“:„EGONS24“,„rssi“:-76,„ap_client_count“:0},„ws“:{„connected“:false}}object(stdClass)#2 (8) {
[„ble“]=>
object(stdClass)#1 (0) {
}
[„cloud“]=>
object(stdClass)#3 (1) {
[„connected“]=>
bool(true)
}
[„input:0“]=>
object(stdClass)#4 (2) {
[„id“]=>
int(0)
[„state“]=>
bool(false)
}
[„mqtt“]=>
object(stdClass)#5 (1) {
[„connected“]=>
bool(true)
}
[„switch:0“]=>
object(stdClass)#6 (8) {
[„id“]=>
int(0)
[„source“]=>
string(4) „init“
[„output“]=>
bool(true)
[„apower“]=>
float(598)
[„voltage“]=>
float(239.1)
[„current“]=>
float(2.463)
[„aenergy“]=>

Das hat Dr. Niels als Antwort geschrieben:
$json = json_decode($result, true);
SetValue(12345 /* Hier die VariablenID anpassen */, $json[‚current_pos‘]);
// Nach belieben weitere Variablen füttern
Das kapiere ich nicht :
$json[‚current_pos‘]);
Schönen Gruß
Egon

Die kommt aus deiner Frage von vor fast 4 Jahren :smiley: .

Du musst dort jeweils den Feldnamen aus dem JSON angeben, dessen Wert du haben möchtest.

Da es heute scheinbar nicht mehr current_pos heißt, wäre es vielleicht nur current.

Hi ralf danke
$json = json_decode($result, true);

SetValueFloat(14519, $json[‚current‘]=>
Geht nicht. Schönen Gruß
Egon

falls du genau das per copy&paste nutzt, das funktioniert nicht, da das Forum die Schreibweise ändert.

Versuch es mal manuell und wirklich mit einfachen ’ oder doppelten Hochkomma "

korrekt wäre eigentlich

SetValueFloat(14519, $json['current']);

Hi ralf
Danke kommt leider die Fehlermeldung:
Warning: Undefined array key „current“ in /mnt/data/symcon/scripts/22898.ips.php on line 27

Dann ist die Struktur eventuell verschachtelt.

Nach dem json_decode sollte es ja ein Array sein.

Mach mal ein
print_r($json);

Und nutze bitte die Code Tags, wenn du das Ergebnis postest. Sonst ist das so schwer zu lesen.

print_r($json);

$json = json_decode($result, true);

print_r($json);

Dann kommt das hier z. B.:
[switch:0] => Array
(
[id] => 0
[source] => init
[output] => 1
[apower] => 12.1
[voltage] => 234.1
[current] => 0.13
[aenergy] => Array
(
[total] => 592609.086
[by_minute] => Array
(
[0] => 216.946
[1] => 220.909
[2] => 225.367
)

                [minute_ts] => 1722277620
            )

        [temperature] => Array
            (
                [tC] => 61.5
                [tF] => 142.8
            )

    )

SetValueFloat(14519, $json[‚switch:0‘][‚voltage‘]);

Mit korrekten Hochkomma :wink:.

Hi ralf
Sehr schön das funktioniert
Prima Hilfe
Schönen Gruß :smiley: :smiley: :smiley:
Egon

Hallo ralf
Darf ich nochmal um Hilfe bitten?
apower und voltage hab ich jetzt in den Variablen
Wie sieht der Scriptteil aus um [total] in die Variable zu bekommen

SetValueFloat(14519, $json['switch:0']['voltage']);
SetValueFloat(45918, $json['switch:0']['apower']);
SetValueFloat(43311, $json['switch:0']['total']);     // Hilfe....

[switch:0] => Array
(
[id] => 0
[source] => init
[output] => 1
[apower] => 350.2
[voltage] => 236.1
[current] => 0.994
[aenergy] => Array
(
[total] => 592759.011
[by_minute] => Array
(
[0] => 3887.202
[1] => 3757.925
[2] => 3752.972

Vielen Dank
Egon

sehr vergleichbar, nur mit dem zusätzlichen Array
SetValueFloat(43311, $json['switch:0']['aenergy']['total']);

Hi ralf
Wieder vielen Dank
Ich hatte das so eingegeben leider mit einem Schreibfehler. :money_mouth_face:
Jetzt funktioniert alles :smiley:
Schönen Gruß
Egon