Balance Decent Scale

Documentation de l'API BLE ouverte

Forum de discussion   Half Decent Scale API élargi   contactez-nous


Nous voulons fournir des exemples de code dans de nombreux langages de programmation qui montrent comment faire des choses avec la balance Decent Scale.
N'hésitez pas à nous envoyer un courriel et à partager votre propre code de mise à la balance, afin que nous puissions aider les autres à démarrer plus rapidement.

Guide de démarrage rapide: notifications du poids et des boutons, de la tare et de la minuterie

  1. Allumez la balance Decent Scale en maintenant le bouton O enfoncé pendant 2 secondes.
  2. Faites un scan BLE sur votre appareil, puis connectez-vous à « Decent Scale ».
  3. Envoyez une commande TARE ou LED ON à la balance pour que l'application s'affiche sur la balance. La balance ne pèsera pas jusqu'à ce qu'une commande d'écriture soit envoyée à la balance, pour lui faire savoir que votre application est là.
  4. Allumez le LED ON : « 030A0101000108 » ou éteignez le LED OFF : « 030A0000000009 »
  5. Demandez à recevoir les notifications de poids de FFF4 ('0000FFF4-0000-1000-8000-00805F9B34FB'). Les notifications de poids arriveront désormais à 10x par seconde, sous la forme d'un entier signé de deux octets (Short), sur les octets 3 et 4.
  6. Les firmwares v1.0 et v1.1 envoient le poids sous la forme d'un message de 7 octets. Les firmwares v1.2 et les versions plus récentes envoient le poids avec un horodatage sous la forme d'un message de 10 octets.
  7. Optional: Démarrez le minuteur en envoyant '030B030000000B', mettez-le en pause avec '030B0000000008' et remettez-le à zéro avec '030B020000000A'.
  8. Tarer la balance en envoyant « 030F000000010D ».
  9. Regardez la démonstration de Light Blue effectuant ces commandes.
  10. Bogue connu : dans le firmware v1.0 de la balance Decent, une commande (telle que la tare ou le démarrage du minuteur) peut être occasionnellement abandonnée. Par sécurité, envoyez une commande à la balance deux fois, avec un délai de 50 ms ou plus. Ce problème sera résolu dans le firmware v1.1. Une nouvelle commande BLE pour déterminer la version actuelle du firmware sera ajoutée dans la version 1.1, au cas où vous voudriez mettre en place une logique conditionnelle pour ne pas envoyer les commandes deux fois.
  11. La balance Half Decent se déconnecte si un battement de cœur de « 03 0a 03 ff ff 00 0a » n'est pas reçu au moins toutes les 5 secondes. Il s'agit d'une fonction très utile qui permet de déconnecter les connexions Bluetooth zombies, ce qui arrive souvent sur Android 9 et les versions antérieures. L'envoi du battement de cœur à des balances plus anciennes n'a pas d'effet négatif. L'octet 6 des commandes TARE et LED ON doit être réglé sur 01, sinon la Half Decent Scale supposera que votre application n'est pas au courant de la fonction de battement de cœur et ne l'appliquera pas.
  12. Avez-vous des problèmes ? Téléchargez LightBlue pour iosAndroid, Mac et suivez les étapes présentées dans la vidéo ci-dessus.
  13. Guide du programmeur pour la Half Decent Scale.

Référence des commandes :

Poids reçu surFFF4 (0000FFF4-0000-1000-8000-00805F9B34FB)

Les firmwares v1.0 et v1.1 envoient le poids sous la forme d'un message de 7 octets :
  • 03CE 0000 0000 CD = 0.0 grammes
  • 03CE 0065 0000 A8 = 10.1 grammes
  • 03CE 0794 0000 5E = 194.0 grammes
  • 03CE 1B93 0000 5E = 705.9 grammes
  • 03CE 2BAC 0000 4A = 1118.0 grammes

    Les firmwares v1.2 et les versions plus récentes envoient le poids avec un horodatage sous la forme d'un message de 10 octets :
  • 03CE 0000 010203 0000 CD = 0.0 grammes - (1 minute, 2 secondes, 3 décisecondes)
  • 03CE 0065 010204 0000 A8 = 10.1 grammes - (1 minute, 2 secondes, 4 décisecondes)
  • 03CE 0794 010205 0000 5E = 194.0 grammes - (1 minute, 2 secondes, 5 décisecondes)
  • 03CE 1B93 010206 0000 5E = 705.9 grammes - (1 minute, 2 secondes, 6 décisecondes)
  • 03CE 2BAC 010207 0000 4A = 1118.0 grammes - (1 minute, 2 secondes, 7 décisecondes)
  • Tare (mettre le poids à zéro)030F000000010E
    allumer LED030A0101000108 (grammes)
    éteindre LED030A0000000009
    démarrer minuterie030B030000000B
    arrêter minuterie030B0000000008
    mettre minuterie à zéro030B020000000A
    Mise hors tension
    (nouveau dans le firmware v1.2)
    030A020000000B

    Couplage et délai d'attente BLE

    1. À son démarrage, la balance s'annonce pour le couplage BLE. Une LED bleue clignote. L'appareil BLE s'appelle « Decent Scale ».
    2. La balance restera disponible pour le couplage BLE en permanence. Il n'y a pas de délai d'attente BLE.
    3. Si votre application se connecte, puis se déconnecte, la balance repasse en mode de couplage BLE.
    4. Si elle fonctionne sur piles, la balance s'éteint au bout de 2 minutes (10 minutes pour le firmware v1.1) si elle n'est pas connectée à BLE ou si aucune pesée n'a eu lieu.
    5. Si elle fonctionne sur l'alimentation USB, la balance ne s'éteindra jamais d'elle-même.
    6. Lorsque votre application est connectée, le mot APP apparaît sur l'écran de la balance.
    7. Une vidéo de présentation rapide de la balance Decent est disponible.

    Objectifs de conception de la balance

    1. Les informations relatives au poids sont intentionnellement non lissées, car nous pensons que le lissage peut être mieux réalisé sur un dispositif informatique, dans un logiciel, qu'il ne peut l'être dans un firmware de balance.
    2. La balance Decent n'a pas de concept de « poids stable ». Les lectures actuelles de la cellule de charge sont transférées immédiatement sur BLE.
    3. Si vous voulez un poids lissé, vous devez l'implémenter vous-même en plus des données brutes reçues par la balance.
    4. Les changements de poids sont communiqués immédiatement.
    5. Il n'y a pas de « poids seuil » qui doit être atteint pour que le poids soit considéré comme ayant changé.
    6. Cette balance se veut extrêmement rapide pour répondre aux changements de poids, à 0,1g de précision.
    7. S'il y a du mouvement sur votre support de pesée (comme un liquide), vous verrez probablement de petites variations de poids dues à ce mouvement.
    8. Si votre cas d'utilisation fait que vous préférez cacher les variations de poids sur la LED de la balance, vous pouvez choisir de les désactiver. Vous pouvez ainsi choisir de n'afficher le poids qu'à l'intérieur de votre application. Cela aura l'avantage supplémentaire d'allonger considérablement la durée de vie de la batterie.
    9. Le micrologiciel v1.2 et les versions plus récentes incluent un horodatage précis à la déciseconde pour chaque mesure de poids. Cela vous permet (1) de calculer le débit, (2) de savoir si vous avez perdu une mesure de poids ou (3) si vous avez reçu un message de poids hors service.

    Boutons

    1. Il y a deux boutons, marqués d'un cercle (bouton 0) et d'un carré (bouton 1).
    2. Lorsqu'il n'y a pas de connexion BLE, ces boutons contrôlent l'alimentation, la tare et la minuterie.
    3. Une fois qu'il y a une connexion BLE, ces boutons sont complètement sous le contrôle de votre application, et les pressions n'ont plus aucun effet sur la balance.

    Limites

    1. Le poids maximum est de 2000 g.
    2. Les boissons très chaudes peuvent empêcher la balance de fournir une mesure correcte.
      1. En effet, elles chauffent la cellule de charge, ce qui modifie sa résistance sous le poids.
      2. En général, cela se manifeste par le fait que le poids ne dépasse pas un certain nombre.
      3. Vous pouvez résoudre ce problème en utilisant un tampon isolant entre la balance et votre boisson chaude, comme un morceau de silicone ou de bois.
    3. La balance Decent est calibrée en usine avec des poids de 1000 g et 2000 g.
      1. Cependant, la calibration peut être affectée par le transport.
      2. Consultez le Manuel d'utilisation ou cette vidéo de calibration pour plus d'informations.
      3. Le poids est transmis à 10 hz.
      4. L'état de la batterie est renvoyé dans le flux de données du poids en réponse à la commande BLE de mise en marche ou d'arrêt de la LED.
        1. Voir « Envoyer des commandes pour allumer ou éteindre des LED ».
        2. Une batterie de 3% ou moins fera apparaître un message LO sur la balance lors de sa mise sous tension.
      5. Il n'est pas recommandé de laisser des poids lourds sur la balance en permanence, car cela déforme lentement la cellule de charge et la désajuste.
      6. Il n'y a pas de limite au nombre de fois où la balance peut être recalibrée.
      7. Il n'y a pas de commande BLE pour régler les Grammes vs Onces sur l'affichage de la balance.
        1. This must be done manually, by pressing both O and [] buttons immediately after turning the scale on. See the User Manual for more information.
        2. Vous pouvez découvrir si la balance affiche des Grammes ou des Onces en lisant la réponse à la commande BLE pour allumer ou éteindre les LEDs. Voir « Envoyer des commandes pour allumer ou éteindre les LED ».
      8. Si une deuxième commande BLE est envoyée à la balance avant qu'elle ait fini d'exécuter la première commande, la balance ignorera la deuxième commande.
        1. Par exemple : une commande de tare immédiatement suivie d'une commande de démarrage de minuterie.
        2. Un délai de 200 ms entre les commandes envoyées à la balance est recommandé.
        3. Vous pouvez également retarder l'envoi de la deuxième commande jusqu'à ce que vous puissiez reconnaître que la première commande a été exécutée.
        4. Par exemple, après une tare (ou une commande pour allumer ou éteindre la LED), une réponse est envoyée à votre application, avec l'octet 6 réglé sur FE pour indiquer le succès.


      Aperçu de la BLE

      Les paquets de la balance Decent arrivent sur '0000FFF4-0000-1000-8000-00805F9B34FB'.

      Tous les paquets BLE vers/depuis la balance Decent ont la structure suivante de 7 octets :

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      0A=LED marche/arrêt
      0B=Minuterie marche/arrêt
      0F=Tarage
      Commande / données (1)Commande / données (2)Commande / données (3)Commande / données (4)Validation XOR
      XOR 6 octets pour validation
      Vous trouverez plus de détails sur chaque commande et type d'information ci-dessous.

      Voici une procédure Tcl qui construit le paquet binaire de 7 caractères à envoyer à la balance Decent. Il est d'abord construit comme une chaîne de texte, qui est ensuite convertie en un binaire de 7 octets à la fin de la procédure :

        proc decent_scale_make_command {cmdtype cmdddata {cmddata2 {}} } {
            if {$cmddata2 == ""} {
                msg "1 part decent scale command"
                set hex [subst {03${cmdtype}${cmdddata}000000[decent_scale_calc_xor "0x$cmdtype" "0x$cmdddata"]}]
            } else {
                msg "2 part decent scale command"
                set hex [subst {03${cmdtype}${cmdddata}${cmddata2}0000[decent_scale_calc_xor4 "0x$cmdtype" "0x$cmdddata" "0x$cmddata2"]}]
            }
            msg "hex is '$hex' for '$cmdtype' '$cmdddata' '$cmddata2'"
            return [binary decode hex $hex]
        }


      Calcul du XOR

      Pour calculer le XOR, vous devez faire un XOR mathématique des 6 premiers octets.

      Voici un code de programmation Tcl qui calcule le XOR pour une commande simple qui ne prend qu'un seul paramètre, comme TARE :

        proc decent_scale_calc_xor {cmdtype cmdddata} {
            set xor [format %02X [expr {0x03 ^ $cmdtype ^ $cmdddata ^ 0x00 ^ 0x00 ^ 0x00}]]
            msg "decent_scale_calc_xor for '$cmdtype' '$cmdddata' is '$xor'"
            return $xor
        }
        

      Voici un code de programmation Tcl qui calcule le XOR pour une commande à deux paramètres, comme l'activation des LED :

        proc decent_scale_calc_xor4 {cmdtype cmdddata1 cmdddata2} {
            set xor [format %02X [expr {0x03 ^ $cmdtype ^ $cmdddata1 ^ $cmdddata2 ^ 0x00 ^ 0x00}]]
            msg "decent_scale_calc_xor4 for '$cmdtype' '$cmdddata1' '$cmdddata2' is '$xor'"
            return $xor
        }
        

      Réception du poids

      La réception de données de poids est un cas un peu particulier, car le poids est envoyé sous la forme d'un nombre entier court signé de deux octets de grammes poids * 10 :

      Les firmwares v1.0 et v1.1 envoient le poids sous la forme d'un message de 7 octets.

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      CE = poids stable
      CA= changement de poids
      Données (1)
      Poids en grammes * 10

      Octet supérieur d'un nombre entier court signé
      Données (2)
      Poids en grammes * 10

      Octet inférieur d'un nombre entier court signé
      Données (3)
      Changement * 10

      Octet supérieur d'un nombre entier court signé
      Données (4)
      Changement * 10

      Octet inférieur d'un nombre entier court signé
      Validation XOR
      XOR 6 octets pour validation
      Les firmwares v1.2 et les versions plus récentes envoient le poids avec un horodatage sous la forme d'un message de 10 octets.

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7OCTET 8OCTET 9OCTET 10
      Modèle
      03 = Decent
      Type
      CE = poids stable
      CA= changement de poids
      Données (1)
      Poids en grammes * 10

      Octet supérieur d'un nombre entier court signé
      Données (2)
      Poids en grammes * 10

      Octet inférieur d'un nombre entier court signé
      Données (3)
      Minutes sur
      Données (4)
      Secondes activées (0-59 en hexadécimal)
      Données (5)
      Décisecondes activées (0-9)
      Données (6)
      pour une utilisation ultérieure
      Données (7)
      pour une utilisation ultérieure
      Validation XOR
      XOR 6 octets pour validation
      Notes :
      1. Votre application devrait tenir compte de la longueur du message reçu et prendre en charge l'analyse des deux. La plupart des applications n'ont besoin que de connaître le poids actuel : il suffit de regarder les octets 3 et 4 pour être compatible avec tous les firmwares de Decent Scale. Vous pouvez également vérifier que la version du firmware est égale ou supérieure à 03.
      2. Le poids actuel arrive sous la forme d'un entier signé gros-boutiste court de deux octets sur les octets de données 1 et 2.
      3. Le changement de poids par seconde arrive sous la forme d'un court non signé gros-boutiste de deux octets. Cependant, cette fonctionnalité est actuellement boguée et son utilisation n'est pas recommandée. Si vous avez besoin de données sur le changement de poids, vous devez les calculer vous-même. La fonction de changement de poids a été abandonnée à partir du firmware v1.2.
      4. Les données de poids sont envoyées à 10 hz.
      5. La balance essaie de déterminer quand le poids semble être stable (plus de changement) et fixe la deuxième paire d'octets à CE. Lorsque le poids change, la deuxième partie d'octet est CA. Cependant, vous pouvez choisir d'ignorer cela et d'implémenter votre propre logique pour décider quand le poids est stable, car aucun lissage ou stabilisation des données n'est effectué sur les données de poids rapportées.
      6. Vous trouverez en haut de cette page des exemples de messages de 7 et 10 octets.


      Réception des tapes du bouton

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      AA
      Données (1)
      01=bouton 0
      02=bouton 1
      Données (2)
      01=appui courte
      02=appui longue
      Données (3)Données (4)Validation XOR
      00
      Notes :
      1. Lorsque vous disposez d'une connexion BLE, les appuis sur les boutons n'ont aucun effet sur la balance et peuvent être programmées pour avoir la fonction que vous souhaitez, en fonction de votre programmation.
      2. Sur le firmware v1.1 de Scale, l'appui sur le bouton O n'est pas envoyé via BLE.Si votre application doit tarer la balance, elle doit envoyer la commande de tarage BLE.

      Voici des exemples d'appui sur les boutons tirés du journal de l'application Light Blue :
        16:59:51.479 - Caractéristique (FFF4) notifiée : 03aa0101 0000a9 (appui court sur le bouton O)
        17:35:49.591 - Caractéristique (FFF4) notifiée : 03aa0102 0000aa (appui long sur le bouton O)
        17:38:16.702 - Caractéristique (FFF4) notifiée : 03aa0201 0000aa  (appui court sur le bouton [])
        17:39:08.003 - Caractéristique (FFF4) notifiée : 03aa0202 0000a9  (appui long sur le bouton [])
        
        



      Envoi de la commande de tare (remise à zéro du poids)

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      0F
      Données (1)
      Nombre entier incrémenté
      (Peut toujours être 0)
      Données (2)
      00
      Données (3)
      00
      Données (4)
      00=disable heartbeat requirement
      01=maintain heartbeat
      Validation XOR
      calculé
      Notes :
      1. Le 'nombre entier incrémenté' est facultatif, et peut toujours être zéro.
      2. La séquence d'octets 030F000000000C se traduira toujours par une tare réussie.
      3. Veillez à calculer correctement le XOR pour l'octet 7 ou la commande TARE sera ignorée.
      4. La balance Half Decent se déconnecte si un battement de cœur de « 03 0a 03 ff ff 00 0a » n'est pas reçu au moins toutes les 5 secondes. Si vous souhaitez désactiver cette exigence, l'octet 6 doit être 00. Si vous souhaitez conserver cette exigence, l'octet 6 doit être égal à 01. Le réglage de l'octet 6 sur 01 n'a pas d'effet négatif sur les modèles qui ne prennent pas en charge la fonction de battement de cœur.
      Et voici un fragment de code vous montrant comment construire une commande de tare de 7 octets :

        proc tare_counter_incr {} {
        
            if {[info exists ::decent_scale_tare_counter] != 1} {
                set ::decent_scale_tare_counter 0
            } elseif {$::decent_scale_tare_counter >= 255} {
                set ::decent_scale_tare_counter 0
            } else {
                incr ::decent_scale_tare_counter
            }
        
            # alternatively: the tare counter can in fact be any not-recently-used integer, such as this random digit-picker
            # set ::decent_scale_tare_counter [expr {int(rand() * 255)}]
        
        }
        
        proc decent_scale_tare_cmd {} {
            tare_counter_incr
            set cmd [decent_scale_make_command "0F" [format %02X $::decent_scale_tare_counter]]
            return $cmd
        }
        


      La Decent Scale renvoie une réponse après une commande de tare. Cette réponse a la structure suivante :

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      0F
      Données (1)
      Compteur de tare
      Données (2)
      00
      Données (3)
      00
      Données (4)
      FE
      Validation XOR


      Envoi de commandes pour allumer ou éteindre les LEDs

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      Modèle
      03 = Decent
      Type
      0A
      Données (1)
      Poids LED allumer/éteindre
      00=êteindre
      01=allumer
      02=mise hors tension
      Données (2)
      Activation/ désactivation de la LED de la minuterie
      00=êteindre
      01=allumer
      Données (3)
      00=grammes
      01=onces
      Données (4)
      00
      Validation XOR
      calculé
      Notes :
      1. La durée de vie des piles est prolongée en gardant les LEDs éteintes.
      2. La balance continuera à fonctionner, même si les deux LED sont éteintes.
      3. La commande de mise hors tension a été ajoutée dans le firmware v1.2.
      4. La seule LED qui indique 'le poids change' s'allumera, même si les deux LED ont été éteintes.
        1. Depuis le firmware v1.1, la LED au-dessus du bouton carré ne s'allume plus pendant le changement de poids.
        2. En revanche, cette LED s'allume lorsque vous appuyez sur l'un des boutons.
        3. Il s'agit de fournir un retour visuel à l'utilisateur, lui indiquant que l'appui sur le bouton a été détecté.
        Exemple : commande pour allumer toutes les LED, en utilisant des grammes :
          03 0A 01 01 00 00 09
          
        Exemple : commande pour allumer toutes les LED, en utilisant des onces : [nécessite le firmware v1.1]
          03 0A 01 01 01 00 08
          
        Exemple : commande pour étaindre toutes les LED :
          03 0A 00 00 00 00 09
          
        Exemple : Commande de mise hors tension :
          03 0A 02 00 00 00 0B
          
        Après une commande pour allumer ou éteindre la LED (firmware v1.1), la balance Decent enverra une réponse dans le flux de données de poids, avec des informations sur les grammes et les onces, le niveau de puissance de la batterie et la version du firmware. Elle a la structure suivante :

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        Modèle
        03 = Decent
        Type
        0A
        Données (1)
        00
        Données (2)
        Unités de poids sur la LED
        00=grammes
        01=onces
        Données (3)
        Charge de la batterie
        Entre 3 % (bas) et 100 % (plein).
        FF (255) = Alimentation par USB
        Données (4)
        version du firmware
        FE=v1.0
        02=v1.1
        03=v1.2
        Validation XOR
        Le niveau de la batterie est toujours indiqué à 100 %, en raison d'une limitation dans le circuit imprimé de la balance.
        Voici un exemple de lecture de la charge de la batterie à partir du journal de l'application Light Blue :
          16:02:36.005 - La caractéristique (36F5) a écrit une nouvelle valeur : <030a0101 000009> (nous avons utilisé l'application pour envoyer cette valeur, en allumant la LED)
          16:02:36.061 - Caractéristique (36F5) lue : ( nulle )
          16:02:36.135 - Caractéristique (FFF4) notifiée : 030a0000 64026f (64 hex = 100%, fonctionnant sur batteries)
          
          15:59:50.421 - La caractéristique (36F5) a écrit une nouvelle valeur : <030a0101 000009> (nous avons utilisé l'application pour envoyer cette valeur, en allumant la LED)
          15:59:50.485 - Caractéristique (36F5) lue : ( nulle )
          15:59:50.522 - Caractéristique (FFF4) notifiée : 030a0000ff0ac7  (FF hex = 255 %, fonctionnement sur alimentation USB)
          


        Envoi de commandes pour contrôler la minuterie

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        Modèle
        03 = Decent
        Type
        0B
        Données (1)
        Démarrage/arrêt/remise à zéro de la minuterie
        00=arrêt
        02=reset to zero
        03=démarrage
        Données (2)
        00
        Données (3)
        00
        Données (4)
        00
        Validation XOR
        calculé
        Exemple : Commande de démarrage de la minuterie
          03 0B 03 00 00 00 0B
          
        Exemple : Commande d'arrêt de la minuterie
          03 0B 00 00 00 00 08
          
        Exemple : Commande de remise à zéro de la minuterie
          03 0B 02 00 00 00 0A
          

        Un grand exemple de code pour recevoir de diverses données de la balance de Decent.

        Exemple plus large de bluetooth.tcl sur Github

        Le fragment de code suivant (en langage Tcl, mais j'espère que vous pourrez le comprendre) peut faire les choses suivantes :
        1. recevoir des informations de poids
        2. recevoir une pression sur un bouton
        3. recevoir la valeur actuelle de la minuterie
        set ::de1(cuuid_decentscale_read) "0000FFF4-0000-1000-8000-00805F9B34FB"
        set ::de1(cuuid_decentscale_write) "000036F5-0000-1000-8000-00805F9B34FB"
        set ::de1(cuuid_decentscale_writeback) "83CDC3D4-3BA2-13FC-CC5E-106C351A9352" 
        
        if {$cuuid eq $::de1(cuuid_decentscale_read)} {
            # decent scale
            parse_decent_scale_recv $value weightarray
        
            if {[ifexists weightarray(command)] == [expr 0x0F] && [ifexists weightarray(data6)] == [expr 0xFE]} {
                # tare cmd success is a msg back to us with the tare in 'command', and a byte6 of 0xFE
                msg "- decent scale: tare confirmed"
        
                return
            } elseif {[ifexists weightarray(command)] == 0xAA} {
                msg "Decentscale BUTTON $weightarray(data3) pressed"
                if {[ifexists $weightarray(data3)] == 1} {
                    # button 1 "O" pressed
                    decentscale_tare
                } elseif {[ifexists $weightarray(data3)] == 2} {
                    # button 2 "[]" pressed
                }
            } elseif {[ifexists weightarray(command)] != ""} {
                msg "scale command received: [array get weightarray]"
        
            }
        
            if {[info exists weightarray(weight)] == 1} {
                set sensorweight [expr {$weightarray(weight) / 10.0}]
                #msg "decent scale: ${sensorweight}g [array get weightarray] '[convert_string_to_hex $value]'"
                #msg "decentscale recv read: '[convert_string_to_hex $value]'"
                ::device::scale::process_weight_update $sensorweight $event_time
            } else {
                msg "decent scale recv: [array get weightarray]"
            }
        }
        
        proc parse_decent_scale_recv {packed destarrname} {
            upvar $destarrname recv
            unset -nocomplain recv
        
               ::fields::unpack $packed [decent_scale_generic_read_spec] recv bigeendian
        
               if {$recv(command) == 0xCE || $recv(command) == 0xCA} {
                   unset -nocomplain recv
                   ::fields::unpack $packed [decent_scale_weight_read_spec2] recv bigeendian
               } elseif {$recv(command) == 0xAA} {
                   msg "Decentscale BUTTON pressed: [array get recv]"
               } elseif {$recv(command) == 0x0C} {
                   unset -nocomplain recv
                   ::fields::unpack $packed [decent_scale_timing_read_spec] recv bigeendian
                   msg "Decentscale time received: [array get recv]"
               }
        }
        
        proc decent_scale_generic_read_spec {} {
            set spec {
                model {char {} {} {unsigned} {}}
                command {char {} {} {unsigned} {}}
                data3 {char {} {} {unsigned} {}}
                data4 {char {} {} {unsigned} {}}
                data5 {char {} {} {unsigned} {}}
                data6 {char {} {} {unsigned} {}}
                xor {char {} {} {unsigned} {}}
            }
            return $spec
        }
        
        proc decent_scale_weight_read_spec2 {} {
            set spec {
                model {char {} {} {unsigned} {}}
                wtype {char {} {} {unsigned} {}}
                weight {Short {} {} {signed} {}}
                rate {Short {} {} {unsigned} {}}
                xor {char {} {} {unsigned} {}}
            }
            return $spec
        }