MQTT-Variable einlesen, aufsplitten und in Variablen schreiben

Hallo Gemeinde,

Ich möchte mir von einem ESP32 meine BLE-Devices auslesen lassen und dann in IPS eine Anwesenheitserkennung einrichten.
Habe jetzt den ganzen Tag versucht die Variable, die vom MQTT-Server angelegt wird zu zerlegen und in einzelne Variablen zu speichern. Bekomme es einfach nicht hin.
Folgendes steht in der Variable:


Die markierten Werte (60:99:60:12:67:00) sind die MAC-Adressen von BLE-Devices mit anschließenden RSSI-Werten (-86).

Folgendes Script habe ich jetzt versucht:

<?php

$STRING = GetValue (51274);

$STRING = trim($STRING, "{}");
$STRING = str_replace(':', '', $STRING);
$STRING = str_replace('"', '', $STRING);

####  String in Teilstrings zerlegen und zwischenspeichern   ###

$teilstring = explode(",", $STRING);
foreach($teilstring AS $value){ 
    $id=(explode('-',$value));
    var_dump ($id);

    foreach($id AS $TagID => $RSSI) {
        echo "$TagID $RSSI <br>";
        $vid = IPS_CreateVariable(1);
        IPS_SetName($vid, $RSSI);
        IPS_SetParent($vid, 12272);

Ich möchte jetzt pro Device eine Variable anlegen lassen. Der Name der Variable ist die MAC und der Wert ist der RSSI.
Es müssten momentan also 4 Variablen angelegt werden, die jeweils mit ihren RSSI-Werten befüllt sind. Es werden jedoch 8 Variablen angelegt.

Zerlege mal den String mit „json_decode“

Hast du die Instanz mit dem MQTT Konfigurator angelegt?
Ich habe gestern auch etwas mit meinem ESP32 und BLE per MQTT gespielt und habe für jeden Wert eine eigene Instanz mit Wert erstellen können.
Michael

@Nall-chan,
ja die Instanz habe ich mit dem Mqtt-Konfigurator angelegt.
Versuche mir gerade nachdieser Anleitung eine Anwesenheitskontrolle zu erstellen.

Grüße, Jürgen

Hi kann meinen String mit Json decode zerlegen aber wie kann ich auf die Werte zugreifen

Json decode


<?php

 $Mac=GetValueString(40280); //Holt Text aus Variable String Mqtt


var_dump(json_decode($Mac));

var_dump(json_decode($Mac, true));

Ausgabe:
object(stdClass)#1 (4) {
  ["time"]=>
  string(20) "2021-02-09T09:00:07Z"
  ["mac"]=>
  **string(12) "ac233f66b520"**
  ["payload"]=>
  string(44) "0201060303e1ff0e16e1ffa1086420b5663f23ac4333"
  ["rssi"]=>
  int(-68)
}
array(4) {
  ["time"]=>
  string(20) "2021-02-09T09:00:07Z"
  ["mac"]=>
  **string(12) "ac233f66b520"**
  ["payload"]=>
  string(44) "0201060303e1ff0e16e1ffa1086420b5663f23ac4333"
  ["rssi"]=>
  int(-68)
}

Wie kann ich jetzt auf die string(12) zugreifen??
Danke für eure Ideen

Hallo,
bin jetzt nicht der Hyperexperte und es wird hier auch oft die Umwandlung in ein Array bevorzugt, aber wenn du nur einen Wert brauchst, geht es mit Objekt sehr smart.

$Objekt=json_decode($Mac);
$MacAddr=$Objekt->mac;

Selbstverständlich kannst du das auch direkt in einen Einzeiler zusammenfügen.

Natürlich kannst du auch beim Array direkt auf ein Element zugreifen.
Sollte so gehen.

$Objekt=json_decode($Mac, true);
$MacAddr=$Objekt-[„mac“];

Gruß Achim

Du hast da einen Tippfehler.
Das müsste so aussehen:

$Objekt=json_decode($Mac, true);
$MacAddr=$Objekt["mac"];

Grüße,
Kai

Das war ich nicht, kann nur am neuen Forum liegen,
das hat den Bindestrich eingefügt! :joy: :rofl: :upside_down_face:

Hi,
Danke schonmal für die Antworten:
Mqtt kann aufgesplittet werden, mqtt string wird in Script zerlegt und auf vaiablen in IPSymcon geschrieben. Da ich aber mal einen Unterschiedlichen String zu IPSymcon bringe, besteht hier das Problem das mein Script unnötigerweise Last hat.
Daten werden von einem ESP32 gesammelt und danach soll nur bei einer bestimmten Macadresse der Mqtt string aus dem ESP geschickt werden.
Sitz jetzt schon 2 Tage dran aber kein Erfolg, kann mir hier jemand helfen aktuell habe ich es mit

if („mac“ == „ac233f66b520“) // nur ausgabe wenn bekannter mac???

probiert aber jetzt kommt nix mehr an, bzw. wird nix mehr gesendet.

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      // Construct a JSON-formatted string with device information
      String msg = "{";
      msg.reserve(300);
      
      msg.concat("\"time\":\"");
      msg.concat(getIsoTime());
      msg.concat("\",");
      
      msg.concat("\"mac\":\"");
      msg.concat(hexToStr(*advertisedDevice.getAddress().getNative(), 6));
      msg.concat("\",");

      msg.concat("\"payload\":\"");
      msg.concat(hexToStr(advertisedDevice.getPayload(), advertisedDevice.getPayloadLength()));
      msg.concat("\",");
      
      if (advertisedDevice.haveName()) {
        msg.concat("\"name\":\"");
        msg.concat(advertisedDevice.getName().c_str());
        msg.concat("\",");
      }

      if (advertisedDevice.haveRSSI()) {
        msg.concat("\"rssi\":");
        msg.concat(advertisedDevice.getRSSI());
        msg.concat(",");
      }

      if (advertisedDevice.haveTXPower()) {
        msg.concat("\"tx\":");
        msg.concat(advertisedDevice.getTXPower());
        msg.concat(",");
      }


      **if ("mac" == "ac233f66b520")  // nur ausgabe wenn bekannter ibeacon ????**
      {

      // trim the final comma to ensure valid JSON
      if (msg.endsWith(",")) {
        msg.remove(msg.lastIndexOf(","));
      }
      msg.concat("}");

      // Publish the string via MQTT
    
      mqtt.beginPublish(topic.c_str(), msg.length(), false);
      mqtt.print(msg.c_str());
      // mqtt.endPublish();  // does nothing
    
      // Blink for every received advertisement
      nBlinks += 1;

      Serial.println(msg);
      //Serial.printf("BLE: %s \n", advertisedDevice.toString().c_str());
    };
    }
    
};

Herzlichen Dank im vorraus.
Gruß