MQTT String auswerten?

Hallo miteinander,
ich bräuchte kurz unterstützung bei einer sache die die Profis hier sicher zum schmuzeln bringen wird.
Ich habe einen IPswitch-8xS0-WiFi: IPs_I8S_1-8 per MQTT mit IPs verbunden und ich hab jetzt einen String der diese Werte sendet:

{"E7":648920,"P7":0,"E8":2187080,"P8":0}

8xS0
wie bekomm ich das jetzt hin das diese werte in einzelne Variablen geschrieben werden.

Schau dir mal

var_dump(json_decode($deinString, true));

an.

Vielleicht hilft dir das schon weiter.

Dank dir.
hab das erstellt:

<?php

$mqtt_string=GetValueString(36192);

var_dump(json_decode($mqtt_string, true));

?>

dann kommt das raus:

array(4) {
  ["E7"]=>
  int(648920)
  ["P7"]=>
  int(0)
  ["E8"]=>
  int(2187080)
  ["P8"]=>
  int(0)
}

wie bekomm ich die jetzt in variablen?

Ich komm jetzt wieder nicht weiter. Hab einiges aus dem Forum bereits probiert aber nix funktioniert.

Ich weiß nicht wie eilig du es hast, aber zur 5.6 unterstützen die MQTT Module auch den Datentyp „JSON“, welcher dir diese in schöne Variablen zerlegt. Eine Beta-Version sollte dort noch im Laufe dieses Monats kommen :slight_smile:

paresy

1 „Gefällt mir“

Ah… ok. Eilig hab ich ´s nicht. Dann wart ich mal ab!

Der Monat ist noch lang :slight_smile:

Aber du bist ja schon fast am Ziel. Wie du Werte in eine Variable schreibst, weißt du bestimmt:

SetValueInteger($id, $value);

Also muss du nur den Wert aus dem ArrayElement holen und schreiben. Auf das Element greifst du zu mit

$value = $array['E1'];

Dummerweise sind die Arrays aber immer mit unterschiedlichen Elementen gefüllt. Daher muss du prüfen, ob das Element auch vorhanden ist (isset).

Eine Lösung wäre daher:

$mqttValues = json_decode($mqtt_string, true);

if (isset($mqttValues['E1'])){
  SetValueInteger($idE1, $mqttValues['E1']);
}

if (isset($mqttValues['E2'])){
  SetValueInteger($idE2, $mqttValues['E2']);
}
...

@bumaas
Super, ich dank dir…Hat funktioniert.
Ich hab allerdings Float-Variablen verwendet.
Entschuldige meine Unwissenheit, aber beim scripten beschränkt sich mein wissen auf copy/paste.

Ich würde anstelle von isset array_key_exists() verwenden.

Grüße,
Kai

Ok, ich test das… was ist der unterschied

Schau mal hier: PHP: array_key_exists - Manual

Da gibt es das Beispiel: Beispiel #2 array_key_exists() vs. isset()

Grüße,
Kai

Kai hat Recht. array_key_exists ist die treffendere Funktion hier.
In deinem Fall wird es aber wohl keinen Unterschied machen.

Ich habs probiert aber nicht hinbekommen… Aber es geht auch so und ab IPS 5.6 wird ja eh alles besser…
Danke trotzdem

@bumaas, da gebe ich dir auch Recht! :smiley:

@Conan79 hier mal en Beispiel mit array_kexy_exists():

$mqttValues = json_decode($mqtt_string, true);

if (array_key_exists('E1', $mqttValues)){
  SetValueInteger($idE1, $mqttValues['E1']);
}

if (array_key_exists('E2', $mqttValues)){
  SetValueInteger($idE2, $mqttValues['E2']);
}
...

Grüße,
Kai

Dank euch,
test ich heut Abend nach meiner lästigen Verpflichtung (der täglichen Arbeit)!

Hi, gibts die Beta 5.6 eigentlich schon? Wenn ja, wie komm ich da ran?

Wir haben die 5.6 mittlerweile zur 6.0 ernannt. Die ist im Testing Bereich öffentlich verfügbar.

paresy

ok. gibts da eine Anleitung dafür wie ich jetzt auf die Beta wechsle?

Ist im Beitrag der Version 6.0 testing zu finden…
Michael

Habs gefunden! Danke
Noch eine Frage: Ich habe eine Unlimited-Version 5.5 auf einem Pi am laufen. Kann ich jetzt IPS 6.0 auf einem 2ten Pi installieren und meine Lizens einspielen oder gibt das Problem?