Smartmeter HEX convert

Hallo Gemeinde,

nachdem ich hier nichts mehr anfügen kann, muss ich leider eine neue Anfrage starten. Nach dem dort geposteten Code habe ich mir meinen eigenen zusammengebastelt. Leider bleib ich immer wieder an der Konvertierung hängen.

Derzeit nutze ich die hier nicht auskommentierte Zeile und sende mir den String per MQTT an den iobroker und wandel in dort mit parseInt() um.

for(int x = 0; x < sizeof(smlMessage); x++){
    temp = smlMessage[x];
    if (temp == consumptionSequence[startIndex])
    {
      startIndex =  (startIndex +1) %1000;
      if (startIndex == sizeof(consumptionSequence))
      { Gesammtzaehler ="";
        for(int y = 0; y< 8; y++){
          //hier muss für die folgenden 8 Bytes hoch gezählt werden
          consumption[y] = smlMessage[x+y+1];
          //strcat(lbuf,hex02str(consumption[y]));    //try and error
          Gesammtzaehler += hex02str(consumption[y]); //passt fast. "0" wird weggelassen      
          //Serial.println(consumption[y],HEX);     //korrekte Ausgabe
        //  sprintf(test, "%02d",consumption[y]);  //try and error
        }
        stage = 4;
        startIndex = 0;
      }

Dann Teile ich diesen dort noch durch 10000000 und ich erhalte meine Zähler.
Leider werden nicht immer 16 Stellen übertragen, da offenbar die 0 beim konvertieren weggelassen wird.
hat jemand eine funktion auf Tasche? Am leibsten wäre mir ja auch, wenn ich die Konvertierung gleich auf
dem ESP8266 machen könnte

Also diese Zeile in float oder double

//Serial.println(consumption[y],HEX);

Danke schon mal für's lesen.

Welchen Nutzen soll die Darstellung einer Fließkommazahl als HEX haben?

Gruß Tommy

Da hatten wir doch erst letztes Jahr einen amüsante und lehrreiche Diskussion über HEX mit führenden Nullen.

Allerdings nicht für float - aber das lässt sich ja mit einem cast oder einer union regeln.

Das sagt aber noch nichts über den Sinn von flost in HEX aus.

Gruß Tommy

Tommy56:
Das sagt aber noch nichts über den Sinn von flost in HEX aus.

Wer hatte denn danach gefragt?

Gruß

Gregor

Hallo
werfe mal einen Blick in die Vergangenheit :slight_smile:

gregorss:
Wer hatte denn danach gefragt?

Ich.

Gruß Tommy

Ohne auch nur im Ansatz zu verstehen, was Du dort versuchst und welchen Datentypen die Variablen da haben:

String GetHex(uint8_t data) {
  String str;
  if (data < 0x10)
    str = "0";
  str.concat(String(data, HEX));
  str.toUpperCase();
  return str;
}

Krass 7 Nachrichten... Danke für die Boardverlinkungen. Ich habe versucht zu verstehen was dort steht, aber ich glaub ich drehe mich im Kreis und ich wurde auch wahrscheinlich nicht richtig verstanden.

Welchen Nutzen soll die Darstellung einer Fließkommazahl als HEX haben?

Es ist anders herum. Ich bekommen vom Serial.read einen HEX-Wert z.B. "000164a7bafdb". Diese wird mit dieser Zeile für meine Begriffe immer korrekt angezeigt.

Serial.println(consumption[y],HEX);

Mein Taschenrechner in DECIMAL ergibt das "95738900443". Diese Zahl Geteil durch 10000000 und auf 3stellen nach dem Koma gerundet ergibt meine Zählerstand. "9573.890". (das als String wäre das Optimum)
Mit meiner funktionieren Lösung sende ich mir den HEX-Wert "000164a7bafdb" mit mqtt und iobroker macht den Rest mit javascript parseint. String deshalb, da ich per mqtt eh nur Zeichen versenden kann.
Sorry aber von pointer und byteweise verschieben bekomme ich wohl nicht mehr in meine Kopf. Da bin ich wohl schon zu alt...Ja microcontroller kann nun mal keine Hochsprache, aber vielleicht habe ich mich jetzt wenigsten verständlich ausdrücken können.

Dein Taschenrechner ist ja auch anders angelegt.
Wir haben so einfach keine Möglichkeit Zahlen > 32 Bit (long) als Hexzahlen einzulesen. Da muss man etwas Handarbeit einsetzen.

#include <binOut.h>

char s[] = "000164a7bafdb";
char s1[8], s2[8];

void setup() {

  uint64_t ll1,ll2;
  Serial.begin(115200);
  Serial.println("Start");
  Serial.println(s);
  strcpy(s1,s+9);
  ll1 = strtol(s1,NULL,16);
  s[9] = 0;
  strcpy(s2,s);
  ll2 = strtol(s2,NULL,16);
  uint64_t res = ll2 * 256 * 256 +ll1;
  printlnInt64(Serial,res,HEX);
  printlnInt64(Serial,res);
  
  float f = 1.0 * res / 10000000;
  Serial.println(f,3);   // ------> 9573.890
}

void loop() {}

Die binOut-Lib findest Du hier.
Das ganze hat übrigens mit float in Hex überhaupt nichts zu tun.

Gruß Tommy

Vielen Dank!! Bis auf eine paar Zeilen, verstehe ich es zwar nicht, aber es tut jetzt alles was es soll.

Ich werde mit jetzt noch die anderen Zahlen holen und das Script aufräumen. Ich bin nicht stolz auf den zusammengeklauten Code, würde ihn aber bei Interesse dennoch teilen. Mein Zähler ist ein Q3MA1170 V6.03. Abgegriffen über die "INFO"-Schnittstellen nach PIN Eingabe.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.