MQTT String in verschiedene Variable schreiben?

Moin,

welche elegante Lösung wäre sinnvoll um ein langen String zu zerlegen und in Variablen zu schreiben?

Es komm in eine Variable etwa folgendes rein:

MQT: tele/general-meter-switch/RESULT = {"SerialReceived":"FE01083002000076230000808404000050000028431100000000007253110000100000A6"}

So wird es bei anderen Systemen gelöst, geht das bei IPS so ähnlich?

  - platform: mqtt
    name: "Mains Consumed Energy"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[6:14] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'kWh' 

Sorry das ich vielleicht so eine Lappalie nach frage, das ist für mich wirklich ein Urwald mit den Hex und Bits…

Danke schon mal für die Hilfe

Den String per

$daten_array=json_decode(.....);
print_r($daten_array);

in ein Array zerlegen.

Gruß
hardlog

Vielen Dank für die Antwort, habe etwas gesucht im Forum da sind verschiedene Ansetze.

Muss mich da bisschen einlesen.

Gruß

Ich hab das für meine MiFlora so gelöst:

Der MQTT-String, der in Symcon ankommt:

{„light“: 226, „temperature“: 21.2, „moisture“: 14, „conductivity“: 286, „battery“: 98}

Daraus werden mit diesem Script die einzelnen Variablen gefüllt:

<?php

$string = GetValueString(53533);
$a = json_decode($string, true);
SetValue(56772,$a['light']);
SetValue(53624,$a['temperature']);
SetValue(30376,$a['moisture']);
SetValue(41791,$a['conductivity']);
SetValue(11680,$a['battery']);

Sieht dann folgendermaßen aus:

Hoffe das hilft ein wenig.

Gruß

Burkhard

Vielen Dank für die tolle Antwort, ich denke bei mir muss man zuschneiden.

So kommt es rein:

{"SerialReceived":"FE01080000000007230000000000000050000000000000000000000000000000100000A1"}

So ist es aufgesplittet:

FE0108 14000000 59230000 47860400 00500000 96381100 00000000 41491100 00100000 F0

Das hier sind z.B. 235,9 Volt:

59230000

So macht einer aus einer Anleitung aus Python (denke das es Python ist):

- platform: mqtt
  name: "zmai_90_voltage"
  state_topic: "tele/zmai_90/RESULT"
  availability_topic: 'tele/zmai_90/LWT'
  qos: 1
  payload_available: 'Online'
  payload_not_available: 'Offline'
  value_template: >- 
    {% set message = value_json.SerialReceived %}
    {% set payload = message[14:22] %}
    {% set payload_len = (payload | length) %}
    {% set result = namespace(value='') %}
    
    {% for i in range(0, payload_len + 1) | reverse -%}
      {%- if i is divisibleby 2 -%}
        {%- set result.value = result.value + payload[i:i+2] -%}
      {%- endif -%}
    {%- endfor -%}
    
    {{ (result.value|float) / 10 }}
  unit_of_measurement: 'V'
  icon: mdi:flash-circle

Und wie ich verstehe so picken die:

{% set payload = message[14:22] %}

Gruß

Ich glaube, da kommst Du mit dem hier weiter:

str_split — Konvertiert einen String in ein Array

Musst Du mal schauen. Ich stecke da nicht so tief drin, kann also auch sein, dass es da eine einfachere Lösung gibt. Und ich hier falsch liege.

Vielen Dank, da werde ich mich mit befassen.

Kann mir nur einer kurz sagen wie daraus:

59230000

235,9 wird?

SerialConfig 8E1

Hallo,

hast du den ZMAi-90 mit Tasmota ? Dann musst du das Gerät als Tuya MCU konfigurienen. Tasmota gibt dann alles Klartext aus. Schau mal hier: https://openhabforum.de/viewtopic.php?f=19&t=3792

Gruß

Swifty

Moin,

nein geht leider nicht da ältere Version.
Was ich nur nicht probiert hatte, geht nicht.

Ja genau den Link bis ende schauen, da bin ich auch am gange und habe Bilder eingestellt.

Muss den String splitten.

Gruß

Dreh doch mal an den Zahlen in 59230000 = „59“ „23“ = 00002359, wenn das mit anderen Werten auch passt, fehlt nur die Komma Stelle.

Hallo Tom,

danke für die Antwort. Hab jetzt so weit das ich die Daten aus dem String picken kann.

Wie meinst Du das mit den Zahlen drehen? Hast man nen Link?
Wenn ich komplett umdrehe kommt ja auch Unfug heraus.
Habe auch nach ne Möglichkeit gesucht string zu string zu legen, leider auch nichts gefunden.

So sieht es bis jetzt aus:

<?php

// String der rein kommt Beispiel: {"SerialReceived":"FE01081400000059230000478604000050000096381100000000004149110000100000F0"}
// aufsplittung des Strings: FE0108 14000000 59230000 47860400 00500000 96381100 00000000 41491100 00100000 F0

$str = GetValue(10493);


$verbrauch = substr($str, 25, 8);
$volt = substr($str, 33, 8);
$strom = substr($str, 41, 8);
$frequenz = substr($str, 49, 8);
$livewatt = substr($str, 57, 8);
$scheinleistung = substr($str, 65, 8);
$blindleistung = substr($str, 73, 8);
$arbeitszahl = substr($str, 81, 8);

echo $volt;
?>

In Java setzt einer so die Ausgabe zusammen, geht es auch mit PHP?:

real_kWh = Double.parseDouble(raw_kWh.mid(6, 2) + raw_kWh.mid(4, 2) + raw_kWh.mid(2, 2) + raw_kWh.mid(0, 2))/100

Edit: an sich geht es so, werde heute noch testen müssen.

<?php

// String der rein kommt Beispiel: {"SerialReceived":"FE01081400000059230000478604000050000096381100000000004149110000100000F0"}
// aufsplittung des Strings: FE0108 14000000 59230000 47860400 00500000 96381100 00000000 41491100 00100000 F0

$str = GetValue(10493);


$verbrauch = substr($str, 25, 8);
$volt = substr($str, 33, 8);
$strom = substr($str, 41, 8);
$frequenz = substr($str, 49, 8);
$livewatt = substr($str, 57, 8);
$scheinleistung = substr($str, 65, 8);
$blindleistung = substr($str, 73, 8);
$arbeitszahl = substr($str, 81, 8);

// Verbrauch umsetzen:
    $a = substr($verbrauch, 6, 2);
    $b = substr($verbrauch, 4, 2);
    $c = substr($verbrauch, 2, 2);
    $d = substr($verbrauch, 1, 1);
    $e = substr($verbrauch, 0, 1);
    $f = $a . $b . $c . $d . $e;
    $fs = $f / 100;

// Volt umsetzen
    $g = substr($volt, 6, 2);
    $h = substr($volt, 4, 2);
    $i = substr($volt, 2, 2);
    $j = substr($volt, 1, 1);
    $k = substr($volt, 0, 1);
    $l = $g . $h . $i . $j . $k;
    $ls = $l / 10;

// Strom umsetzen
    $m = substr($strom, 6, 2);
    $n = substr($strom, 4, 2);
    $o = substr($strom, 2, 2);
    $p = substr($strom, 1, 1);
    $q = substr($strom, 0, 1);
    $r = $m . $n . $o . $p . $q;
    $rs = $r / 10000;

// Frequenz umsetzen
    $s = substr($frequenz, 6, 2);
    $t = substr($frequenz, 4, 2);
    $u = substr($frequenz, 2, 2);
    $v = substr($frequenz, 1, 1);
    $w = substr($frequenz, 0, 1);
    $x = $s . $t . $u . $v . $w;
    $xs = $x / 100;

// Watt umsetzen
    $aa = substr($livewatt, 6, 2);
    $ab = substr($livewatt, 4, 2);
    $ac = substr($livewatt, 2, 2);
    $ad = substr($livewatt, 1, 1);
    $ae = substr($livewatt, 0, 1);
    $af = $aa . $ab . $ac . $ad . $ae;
    $afs = $af / 100;

// Scheinleistung umsetzen
    $ag = substr($scheinleistung, 6, 2);
    $ah = substr($scheinleistung, 4, 2);
    $ai = substr($scheinleistung, 2, 2);
    $aj = substr($scheinleistung, 1, 1);
    $ak = substr($scheinleistung, 0, 1);
    $al = $ag . $ah . $ai . $aj . $ak;
    $als = $al / 100;

// Blindleistung umsetzung
    $am = substr($blindleistung, 6, 2);
    $an = substr($blindleistung, 4, 2);
    $ao = substr($blindleistung, 2, 2);
    $ap = substr($blindleistung, 1, 1);
    $aq = substr($blindleistung, 0, 1);
    $ar = $am . $an . $ao . $ap . $aq;
    $ars = $ar / 100;

// Arbeitszahl umsetzung
    $as = substr($arbeitszahl, 6, 2);
    $at = substr($arbeitszahl, 4, 2);
    $au = substr($arbeitszahl, 2, 2);
    $av = substr($arbeitszahl, 1, 1);
    $aw = substr($arbeitszahl, 0, 1);
    $ax = $as . $at . $au . $av . $aw;
    $axs = $ax / 10;

echo $axs;
?>

Gruß

So ist glaube so schon mal ok, Langzeittest steht noch aus:

<?php

// String der rein kommt Beispiel: {"SerialReceived":"FE01081400000059230000478604000050000096381100000000004149110000100000F0"}
// aufsplittung des Strings: FE0108 14000000 59230000 47860400 00500000 96381100 00000000 41491100 00100000 F0

$str = GetValue(10493);


$verbrauch = substr($str, 25, 8);
$volt = substr($str, 33, 8);
$strom = substr($str, 41, 8);
$frequenz = substr($str, 49, 8);
$livewatt = substr($str, 57, 8);
$scheinleistung = substr($str, 65, 8);
$blindleistung = substr($str, 73, 8);
$arbeitszahl = substr($str, 81, 8);

// Verbrauch umsetzen:
    $a = substr($verbrauch, 6, 2);
    $b = substr($verbrauch, 4, 2);
    $c = substr($verbrauch, 2, 2);
    $d = substr($verbrauch, 0, 1);
    $e = substr($verbrauch, 1, 1);
    $f = $a . $b . $c . $d . $e;
    $fs = $f / 100;
    SetValue(40565, $fs);

// Volt umsetzen
    $g = substr($volt, 6, 2);
    $h = substr($volt, 4, 2);
    $i = substr($volt, 2, 2);
    $j = substr($volt, 0, 1);
    $k = substr($volt, 1, 1);
    $l = $g . $h . $i . $j . $k;
    $ls = $l / 10;
    SetValue(35282, $ls);

// Strom umsetzen
    $m = substr($strom, 6, 2);
    $n = substr($strom, 4, 2);
    $o = substr($strom, 2, 2);
    $p = substr($strom, 0, 1);
    $q = substr($strom, 1, 1);
    $r = $m . $n . $o . $p . $q;
    $rs = $r / 10000;
    SetValue(19411, $rs);

// Frequenz umsetzen
    $s = substr($frequenz, 6, 2);
    $t = substr($frequenz, 4, 2);
    $u = substr($frequenz, 2, 2);
    $v = substr($frequenz, 0, 1);
    $w = substr($frequenz, 1, 1);
    $x = $s . $t . $u . $v . $w;
    $xs = $x / 100;
    SetValue(18198, $xs);

// Watt umsetzen
    $aa = substr($livewatt, 6, 2);
    $ab = substr($livewatt, 4, 2);
    $ac = substr($livewatt, 2, 2);
    $ad = substr($livewatt, 0, 1);
    $ae = substr($livewatt, 1, 1);
    $af = $aa . $ab . $ac . $ad . $ae;
    $afs = $af / 100;
    SetValue(21390, $afs);

// Scheinleistung umsetzen
    $ag = substr($scheinleistung, 6, 2);
    $ah = substr($scheinleistung, 4, 2);
    $ai = substr($scheinleistung, 2, 2);
    $aj = substr($scheinleistung, 0, 1);
    $ak = substr($scheinleistung, 1, 1);
    $al = $ag . $ah . $ai . $aj . $ak;
    $als = $al / 100;
    SetValue(35646, $als);

// Blindleistung umsetzung
    $am = substr($blindleistung, 6, 2);
    $an = substr($blindleistung, 4, 2);
    $ao = substr($blindleistung, 2, 2);
    $ap = substr($blindleistung, 0, 1);
    $aq = substr($blindleistung, 1, 1);
    $ar = $am . $an . $ao . $ap . $aq;
    $ars = $ar / 100;
    SetValue(58946, $ars);

// Arbeitszahl umsetzung
    $as = substr($arbeitszahl, 6, 2);
    $at = substr($arbeitszahl, 4, 2);
    $au = substr($arbeitszahl, 2, 2);
    $av = substr($arbeitszahl, 0, 1);
    $aw = substr($arbeitszahl, 1, 1);
    $ax = $as . $at . $au . $av . $aw;
    $axs = $ax / 10;
    SetValue(46033, $axs);

?>

Danke euch für die Tipps.

Gruß