6-stelliger Hex-Wert zu uint24 konvertieren?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • MarkusCosi
    LoxBus Spammer
    • 28.09.2023
    • 321

    #1

    6-stelliger Hex-Wert zu uint24 konvertieren?

    Hallo zusammen,

    ich habe eine Bluetooth-Mesh Lampe. Über ein Gateway bekomme ich per MQTT (und somit potenziell auch in Loxone vom Loxberry) Strings (payloads des Mesh Protokolls) der Form "c409XXYYZZ", wobei "XXYYZZ" 3 byte in Hex sind, die ich in einen uint24-Wert umwandeln möchte. Die Werte "XXYYZZ"stellen Lightness-Level dar, bzw. Illuminance-Werte in einem Valid Range von 0.00 bis 167772.14.

    Beispiele:
    "payload": "c409000000" → 0 x 00 00 00 (dunkel)
    "payload": "c409dc0500" → 0 x 00 05 dc (etwas heller)
    "payload": "c409a40600" → 0 x 00 06 a4 (noch heller)
    "payload": "c409905f01" → 0 x 01 5f 90
    "payload": "c409d05f02" → 0 x 02 5f d0
    "payload": "c409400d03" → 0 x 03 0d 40 (sehr hell)

    Kann mir vllt. jemand helfen oder einen Tipp geben, wie ich diese Strings "XXYYZZ", die man wohl nach little-endian-manier umsortieren muss (der XX-byte "wackelt" bei etwas Licht zuerst und stets, dann der YY-byte, zuletzt bei viel Licht erst der ZZ-Wert), in eine Zahl bzw. Prozent (0-100) umwandeln kann?

    Vielen Dank!
  • Jan W.
    Lox Guru
    • 30.08.2015
    • 1498

    #2
    Entweder kannst Du die 6 Zeichen einzeln lesen und mit aufwändiger Logik in eine Zahl umwandeln - siehe hier.

    Alternativ kannst Du den String als Input für ein Programm-Baustein nehmen und via Pico-C die Berechnung durchführen. Zu Pico-C findest Du was im oberen Link, zu benötigten Code hier.

    Vielleicht kann man auch auf dem LoxBerry im MQTT Gateway die Umrechnung durchführen?
    Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
    Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
    Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
    Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
    Node-RED: IKEA Tradfri

    Kommentar

    • MarkusCosi
      LoxBus Spammer
      • 28.09.2023
      • 321

      #3
      Hallo Jan,

      vielen Dank für deine Antwort! Die verlinkten Beispiele sehen ja grausam aus . Das wird wohl nicht ganz leicht.

      Mittlerweile habe ich zumindest schon ein python3-Skript welches mir die Umrechnung macht, und gelernt, dass die Werte bei 200.000 sättigen (bei c409400d03 bleibt es, also bei XXYYZZ=400d03 ist Schluss mit Helligkeit).

      python3 -c 'print(round((int.from_bytes(bytes.fromhex("XXYYZZ "), byteorder="little", signed=False) / 200000) * 100, 2))'

      Im MQTT-Gateway des Loxberry finde ich leider nur die Option "text-to-value conversions" vorzunehmen. Also ein Mapping, wohingegen ich eine Rechenvorschrift benötige.

      Gibt es eine Möglichkeit per php-Skript (darin dann wohl?: hexdec(unpack("H*", strrev(pack("H*", "XXYYZZ")))[1])/200000.0 *100) und cronjob in Regelmäßigen Abständen ein bestimmtes MQTT-topic auszulesen und auf dem Loxberry zu verarbeiten im obigen Sinne? Ich habe das hier gefunden, aber weiß nicht so recht , wie ich das json-output ({"source": "SID", "payload": "c409XXYYZZ","destination":"somedest","opcode" :"OP CODE"}) mit dem Feld "payload" welches mich interessiert, als Variable bekomme? Im "incoming view" des MQTT Plugin sehe ich natürlich direkt das json Feld da das Plugin das bereits parsed (e.g. Test_payload)... Wie käme ich im php code daran?

      Oder geht es vllt. per regelmäßig getriggerten AnyPlug-In Bash-Befehl? Wie würde ich dann ein MQTT Wert des Loxberry MQTT-Gateway Puffers abfragen?


      Vielen Dank!

      Edit:
      Variante 1 (AnyPlugin)
      im Loxberry Terminal bekomme ich mit folgendem Befehl den Wert unter Einbezug des MQTT-Strings...
      Code:
      python3 -c 'print(round((int.from_bytes(bytes.fromhex('\"$(mosquitto_sub -h <<IPLoxberry>> -p 1883 -u "LoxberryUsername" -P "LoxberryPassword" -t "Test/rawMessage" -C 1 -W 10 |  jq -r "select(.source == \"0001\") | .payload" | cut -c 5-)\"'), byteorder="little", signed=False)/ 200000) * 100, 2))'
      → da ich hier den -W Parameter in der Abfrage der payload bei mosquitto_sub nutze, und der Befehl auf ein MQTT publish 10s wartet: blockiere ich damit das AnyPlugin für sonstige Befehle??

      Variante 2 (php)
      leider bekomme ich mit folgender Variante keine Daten, sondern NULL bzw. nix zurück... Woran kann das liegen?
      PHP-Code:
      <?php
      require_once "loxberry_XL.php";
      // Topic vom Gateway lesen
      $data = $mqtt->get("Test/rawMessage");
      var_dump($data);
      $jsonArray = json_decode($data, true);
      var_dump($jsonArray);
      $test = $mqtt->get("Test/rawMessage_payload");
      echo $test;
      $payload = $jsonArray['payload'];
      $opcode = $jsonArray['opcode'];
      $source = $jsonArray['source'];
      if ($opcode == "000052") {
      //publish reading converted to percent
      $value = hexdec(unpack("H*", strrev(pack("H*", $payload)))[1]);
      if ($source == "0001") {
      $mqtt->set("Test/rawMessage/L0001", strval($value));
      } elseif ($source == "0002") {
      $mqtt->set("Test/rawMessage/L0002", strval($value));
      }
      } else {
      //do nothing
      }
      ?>
      Zuletzt geändert von MarkusCosi; 20.07.2025, 17:25.

      Kommentar

      Lädt...