디센트 저울

오픈 BLE API 문서

Discussion Forum   하프 디센트 스케일 확장 API   고객 지원


디센트 스케일 작업 방식을 보여드리기 위해 여러가지 프로그램 언어로 코드 샘플을 제공해드리고 싶습니다.
직접 제작하신 저울과 연동되는 코드를 이메일을 통해 공유해주시면, 저희와 함께 협업해서 더 빠르게 작업을 진행할 수 있습니다.

빠른 시작 가이드: 무게, 버튼 알림, 0점, 타이머

  1. 디센트 스케일 전원은 O 버튼을 2초간 누르면 켜집니다.
  2. 디바이스에서 블루투스 스캔을 해서 'Decent Scale'에 연결해주세요.
  3. TARE 와 LED ON 커맨드를 저울로 보내서 'APP'이 저울 디스플레이에 표시될 수 있도록 합니다. 저울은 앱이 연결되어 있다는걸 알려주기 위해서, 작성된 커맨드를 받기 전 까지는 무게를 측정하지 않습니다.
  4. LED 켜기: '030A0101000108' or LED 끄기: '030A0000000009'
  5. FFF4('0000FFF4-0000-1000-8000-00805F9B34FB')에서 무게 알림을 받을지 요청. 무게 알림은 byte 3과 4에서 2 byte signed (Short) integer로 1초에 10번 도착합니다.
  6. v1.0, v1.1 펌웨어는 7 byte 메시지로 무게를 보냅니다. v1.2 및 추후 출시될 펌웨어는 10 byte 메시지로 무게를 타임스탬프와 함께 보냅니다.
  7. 옵션 : '030B030000000B'를 보내서 타이머 시작 '030B0000000008'로 타이머 일시정지 '030B020000000A'로 타이머 0으로 리셋
  8. '030F000000010D'을 보내서 저울 영점 맞추기.
  9. 위 Lightblue 영상에서 위 커맨드를 입력하는걸 확인하실 수 있습니다.
  10. 버그 : 디센트 스케일 v1.0 펌웨어에서 커맨드 하나가 (예를들어 0점이나 타이머 시작) 가끔씩 드랍될 수 있습니다. 안전을 위해서 저울에 커맨드를 50ms 혹은 더 긴 딜레이로 두번 보내주세요. 이 부분은 v1.1 펌웨어에서 다뤄질 예정입니다. 커맨드를 두 번 보내는 기능을 상황에따라 사용하는 로직을 넣기 원하시는 분들을 위해 현재 저울 펌웨어 버전을 결정하는 새로운 BLE 커맨드도 v1.1에 추가될 예정입니다.
  11. 하프 디센트 스케일은 '03 0a 03 ff ff 00 0a”맥박 신호를 최소 매 5초마다 받지 않는 경우, 연결이 끊어집니다. 이 기능은 안드로이드 9 이하 버전에서 종종 발생하는 좀비 블루투스 연결을 끊어주는 아주 유용한 기능입니다. 구버전 저울에는 맥박 신호를 보내도 부정적인 영향이 없습니다. TARE와 LED ON 커맨드의 6번째 바이트는 반드시 01로 설정되어야 합니다. 그렇지 않은 경우, 하프 디센트 스케일은 앱이 맥박 기능을 인지하지 못하는 것으로 판단해서 이 기능을 사용하지 않습니다.
  12. 혹시 문제가 있으신가요? LightBlue를 다운 받아서 위 영상에 나오는 단계를 따라서 시도해보세요. ios, Android, Mac
  13. 하프 디센트 스케일 프로그래머 가이드.

커맨드 참고 :

무게 FFF4 (0000FFF4-0000-1000-8000-00805F9B34FB)

v1.0, v1.1 펌웨어는 7 byte 메시지로 무게를 보냅니다.
  • 03CE 0000 0000 CD = 0.0 grams
  • 03CE 0065 0000 A8 = 10.1 grams
  • 03CE 0794 0000 5E = 194.0 grams
  • 03CE 1B93 0000 5E = 705.9 grams
  • 03CE 2BAC 0000 4A = 1118.0 grams

    v1.2 및 추후 출시될 펌웨어는 10 byte 메시지로 무게를 타임스탬프와 함께 보냅니다.
  • 03CE 0000 010203 0000 CD = 0.0 grams - (1분, 2초, 3 데시초)
  • 03CE 0065 010204 0000 A8 = 10.1 grams - (1분, 2초, 4 데시초)
  • 03CE 0794 010205 0000 5E = 194.0 grams - (1분, 2초, 5 데시초)
  • 03CE 1B93 010206 0000 5E = 705.9 grams - (1분, 2초, 6 데시초)
  • 03CE 2BAC 010207 0000 4A = 1118.0 grams - (1분, 2초, 7 데시초)
  • 0점 (무게 0으로 되돌리기)030F000000010E
    LED ON030A0101000108 (grams)
    LED OFF030A0000000009
    타이머 시작030B030000000B
    타이머 종료030B0000000008
    타이머 리셋 (0)030B020000000A
    전원 종료
    (v1.2 펌웨어 새로운 기능)
    030A020000000B

    BLE 페어링 및 타임아웃

    1. 전원을 켜는 중, 저울이 자체적으로 파란색 LED 점멸로 BLE 페어링 알림을 시작합니다. BLE 디바이스 이름은 'Decent Scale'로 표시됩니다.
    2. 저울은 BLE 페어링이 될 때까지 계속 장치를 찾습니다. BLE 타임아웃은 없습니다.
    3. 저울과 연결된 앱에서 연결을 끊는 경우, 저울은 다시 BLE 페어링 모드로 돌아갑니다.
    4. 배터리를 사용하시는 경우, 2분간(v1.1 펌웨어는 10분) BLE 페어링이 되지 않거나 무게 변화가 없는 경우, 저울은 자동으로 타임아웃 됩니다.
    5. USB 전원을 이용하는 경우, 저울은 자동으로 꺼지지 않습니다.
    6. 앱이 연결될 때, 저울 디스플레이에 'APP' 이라고 표시됩니다.
    7. 디센트 스케일 짧은 소개 영상

    저울 설계 목표

    1. 무게 변동 민감도는 의도적으로 덜 부드럽게 설정되어 있습니다. 저울 펌웨어에서 민감도를 높게 설정하는 것 보다 연동된 장치의 소프트웨어에서 설정하는게 더 낫다고 생각합니다.
    2. 디센트 스케일은 '안정된 무게'를 측하는 컨셉이 아닙니다. 실시간으로 로드셀에서 읽는 무게가 BLE를 통해서 즉각적으로 전송됩니다.
    3. 무게를 더 부드럽게 측정하고 싶으신 경우, 저울에서 받은 로우 데이터 위에 직접 작업하셔야합니다.
    4. 무게 변동은 즉각적으로 전달됩니다.
    5. 무게 변동을 일으킬 수 있는 '최소 무게'는 없습니다.
    6. 디센트 스케일은 무게 변화 감지가 엄청나게 빠릅니다. 0.1g 단위까지 측정 가능합니다.
    7. 저울 위에 움직임이 있는 경우(예를 들어 액체), 그 움직임에 의해서 저울에 약간의 무게 변동이 생깁니다.
    8. 무게 변동이 감지될 때 표시되는 저울 LED를 숨기고 싶은 경우, 선택해서 비활성화 하실 수 있습니다. 앱에서만 무게표시 옵션도 선택하실 수 있고, 이 옵션을 선택하시는 경우 저울 배터리 수명을 훨씬 더 길게 유지하실 수 있습니다.
    9. v1.2 이상 펌웨어에는 각 무게 측정값에 데시초(0.1초) 단위 타임스탬프가 포함됩니다. (1) 유량을 계산하는데 도움이 됩니다. (2) 무게 측정에 손실이 있었는지 알 수 있습니다. (3) 무게 이상 메세지를 받았는지 알 수 있습니다.

    버튼

    1. 저울에는 O (버튼 0), ㅁ (버튼 1) 두 버튼이 있습니다.
    2. BLE 연결이 없는 경우, 버튼으로 전원과 0점, 타이머 제어가 가능합니다.
    3. BLE 연걸이 있는 경우, 버튼은 앱에서 완전히 제어하게 되고, 버튼을 터치하더라도 아무 작동이 되지 않게됩니다.

    한계

    1. 최대 측정 가능 무게는 2000g 입니다.
    2. 아주 뜨거운 음료를 올려놓는 경우 저울 무게 측정이 정확하게 되지 않을 수 있습니다.
      1. 로드셀에 열이 가해지면, 무게에 따른 저항이 바뀝니다.
      2. 그 경우, 보통 무게가 일정 숫자 이상으로 올라가지 못하게 됩니다.
      3. 그래서 뜨거운 음료를 올려놓을 때 저울 위에 단열 패드(실리콘 혹은 나무)를 올리면 이 문제를 겪지 않으셔도 됩니다.
    3. 디센트 스케일은 공장에서 1000g, 2000g 표준 추를 이용해서 칼리브레이션 되어있습니다.
      1. 하지만 배송 중 칼리브레이션이 살짝 틀어질 수도 있습니다.
      2. 더 많은 정보는 설명서 혹은 칼리브레이션 영상을 참고해주세요
      3. 무게는 10hz로 측정됩니다.
      4. LED on or off BLE 커맨드에 따라서 무게 데이터피드에 배터리 상태가 리턴됩니다.
        1. 'LED on or off 커맨드 보내기'를 참고해주세요
        2. 남은 배터리가 3% 보다 낮은 경우 저울을 켤 때 디스플레이에 LO 메시지를 표시합니다.
      5. 저울에 무거운 물체를 계속 올려놓고있는건 추천드리지 않습니다. 무거운 물체를 올려놓고 있는 경우, 로드셀이 조금씩 틀어지면서 칼리브레이션이 틀어지게 됩니다.
      6. 저울을 칼리브레이션 할 수 있는 최대 회수는 없습니다.
      7. 저울 디스플레이의 grams과 ounces를 변경할 수 있는 BLE 커맨드는 없습니다.
        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. LED on or off BLE 커맨드 응답을 통해서 저울에 gram이 표시되는지 ounce가 표시되는지 확인하실 수 있습니다. 'LEDs on or off 커맨드 보내기'를 참고해주세요.
      8. 첫 번째 BLE 커맨드가 끝나기 전에 두 번째 커맨드를 받는 경우, 저울은 두 번째 커맨드를 무시합니다.
        1. 예를 들어 : 0점 커맨드 바로 뒤 타이머 시작 커맨드
        2. 커맨드 사이에는 200ms 딜레이를 두는 것을 추천드립니다.
        3. 혹은 첫 번째 커맨드가 끝나는걸 확인할 때 까지 두 번째 커맨드를 딜레이 시킬 수도 있습니다.
        4. 예를들어 : 0점 (혹은 LED on/off) 커맨드 후 성공 알림이 FE로 설정된 byte 6로 앱으로 다시 돌아갑니다.


      BEL 개요

      디센트 스케일 패킷은 '0000FFF4-0000-1000-8000-00805F9B34FB'로 수신됩니다.

      디센트 스케일에서 오고가는 모든 BLE 패킷은 7 byte 구조를 따릅니다 :

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      0A = LED on/off
      0B = 타이머 on/off
      0F = 0점
      Command / data (1)Command / data (2)Command / data (3)Command / data (4)XOR validation
      6 byte XOR for validation
      각 커맨드와 정보 타입에 대한 더 자세한 사항은 아래 나와있습니다.

      디센트 스케일에 전송하는 7 글자 이진수 패킷을 제작하는 Tcl 절차입니다. 먼저 텍스트 스트링으로 제작된 후 마지막 절차에서 7 byte 이진수로 전환됩니다.

        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]
        }


      XOR 계산

      XOR 계산을 하려면 첫 6 byte에 수리적 XOR을 해야합니다.

      한 가지 파라미터만 이용하는 간단한 커맨드를 위한 XOR을 계산하는 Tcl 프로그래밍 코드입니다. 예를 들어 0점:

        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
        }
        

      두 가지 파라미터를 이용하는 커맨드를 위한 XOR을 계산하는 Tcl 프로그래밍 코드입니다. 예를들어 LED on/off :

        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
        }
        

      무게 정보 받기

      무게는 2 byte signed Short integer이기 때문에, 무게 데이터를 받는건 약간 특별한 케이스입니다. grams weight * 10 :

      v1.0, v1.1 펌웨어는 7 byte 메시지로 무게를 보냅니다.

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      CE = 안정된 무게
      CA = 무게 변동
      데이터 (1)
      Grams weight * 10

      High byte of a signed Short integer
      Data (2)
      Grams weight * 10

      Low byte of a signed Short integer
      Data (3)
      Change * 10

      High byte of a signed Short integer
      Data (4)
      Change * 10

      Low byte of a signed Short integer
      XOR validation
      6 byte XOR for validation
      v1.2 및 추후 출시될 펌웨어는 10 byte 메시지로 무게를 타임스탬프와 함께 보냅니다.

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7BYTE 8BYTE 9BYTE 10
      모델
      03 = Decent
      타입
      CE = 안정된 무게
      CA = 무게 변동
      데이터 (1)
      Grams weight * 10

      High byte of a signed Short integer
      Data (2)
      Grams weight * 10

      Low byte of a signed Short integer
      Data (3)
      Minutes on
      Data (4)
      Seconds on (0~59 16진수)
      Data (5)
      데시초 설정 (0-9)
      Data (6)
      나중에 사용
      Data (7)
      나중에 사용
      XOR validation
      6 byte XOR for validation
      주의사항 :
      1. 앱은 받은 메시지의 길이를 확인해야하고 파싱을 지원해야합니다. 대부분 앱은 현재 측정된 무게만 확인하면 됩니다 : 간단하게 BYTE 3, 4만 확인하는게 가능합니다. (모든 펌웨어 버전 디센트 스케일과 호환) 아니면, 펌웨어 버전이 같거나 03보다 높은지 확인하실 수 있습니다.
      2. 현재 무게는 데이터 byte 1과 2에서 2 byte의 짧은 big-endian signed integer로 도착합니다.
      3. 1초당 무게 변화는 2 byte unsigned integer로 도착합니다. 하지만 현재 이 기능은 버그가 있어서 사용을 추천드리지 않습니다. 무게 변동 데이터가 필요하신 경우, 직접 계산하서야합니다. 무게변화 기능은 펌웨어 v1.2 부터 사라집니다.
      4. 무게 데이터는 10hz로 전송됩니다.
      5. 저울은 언제 무게가 안정(변화 없음)되는지 결정을 시도하고 두번째 byte를 CE에 페어링합니다. 무게가 변하는 중에는 두 번째 byte 부분이 CA 입니다. 하지만 무게 데이터를 부드럽게 하거나 안정화를 하지 않기 때문에 이 부분을 무시하고 별도로 로직을 제작해서 언제 무게가 안정되는지 결정하실 수 있습니다.
      6. 이 페이지 상단을 확인하시면 BYTE 7, 10의 예시 메시지를 확인하실 수 있습니다.


      버튼 터치 받기

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      AA
      데이터 (1)
      01=button 0
      02=button 1
      Data (2)
      01=short tap
      02=long press
      Data (3)Data (4)XOR validation
      00
      주의사항 :
      1. BLE 연결이 되어있는 경우, 버튼 터치는 저울 기능에 아무 효과가 없습니다. 하지만 원하는 기능을 프로그램 하실 수 있고, 그 프로그램에 따라서 사용 가능합니다.
      2. 디센트 스케일 v1.1 펌웨어에서 O 버튼 작동은 BLE를 통해 전달되지 않습니다.앱에서 저울 0점을 맞춰야 하는 경우, 앱에서 BLE를 통해 0점 커맨드를 보내야합니다.

      LightBlue 앱 로그에서 가져온 버튼 터치 예시입니다 :
        16:59:51.479 - Characteristic (FFF4) notified: 03aa0101 0000a9 (O 버튼 짧게 터치)
        17:35:49.591 - Characteristic (FFF4) notified: 03aa0102 0000aa (O 버튼 길게 터치)
        17:38:16.702 - Characteristic (FFF4) notified: 03aa0201 0000aa  (ㅁ 버튼 짧게 터치)
        17:39:08.003 - Characteristic (FFF4) notified: 03aa0202 0000a9  (ㅁ 버튼 길게 터치)
        
        



      0점 커맨드 보내기 (무게 0으로 리셋)

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      0F
      데이터 (1)
      Incremented integer
      (항상 0이 될 수 있음)
      Data (2)
      00
      Data (3)
      00
      Data (4)
      00=disable heartbeat requirement
      01=maintain heartbeat
      XOR validation
      calculated
      주의사항 :
      1. 'Incremented integer'는 선택이고 항상 0이 될 수 있습니다.
      2. byte sequence 030F000000000C는 항상 0점이 성공적으로 되었을 때 결과입니다.
      3. BYTE 7 의 XOR을 확실히 맞게 계산해야합니다. 그렇지 않은 경우 0점 커맨드는 무시됩니다.
      4. 하프 디센트 스케일은 '03 0a 03 ff ff 00 0a”맥박 신호를 최소 매 5초마다 받지 않는 경우, 연결이 끊어집니다. 이 요청을 비활성화 하려면 6번째 바이트를 00으로 설정하세요. 이 요청을 유지하려면 6번째 바이트가 01 이 되어야 합니다. 6번째 바이트를 01로 설정하는 경우 맥박기능을 지원하지 않는 모델이더라도 부정적인 영향을 미치지 않습니다.
      아래는 7 byte 0점 커맨드를 어떻게 제작하는지 보여드리는 코드 부분 입니다.

        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
        }
        


      디센트 스케일은 0점 커맨드를 받은 후 답변을 보내게됩니다. 답변은 아래의 구조로 되어있습니다 :

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      0F
      데이터 (1)
      Tare counter
      Data (2)
      00
      Data (3)
      00
      Data (4)
      FE
      XOR validation


      LED on or off 커맨드 보내기

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      모델
      03 = Decent
      타입
      0A
      데이터 (1)
      무게 LED on/off
      00=off
      01=on
      02 = 전원 종료
      Data (2)
      타이머 LED on/off
      00=off
      01=on
      Data (3)
      00=grams
      01=ounces
      Data (4)
      00
      XOR validation
      calculated
      주의사항 :
      1. LED를 꺼놓으면 배터리 수명이 훨씬 연장됩니다.
      2. 위 LED가 꺼져있어도 저울은 정상적으로 작동됩니다.
      3. 전원 종료 커맨드가 v1.2 펌웨어에 추가되었습니다.
      4. 두 LED가 꺼져있는 상태에서도 무게 변화를 알려주는 LED 하나는 켜집니다
        1. 현재 v1.1 펌웨어는 ㅁ버튼 위의 LED가 무게 변화가 있어도 더 이상 켜지지 않습니다.
        2. 그 대신 ㅇ혹은 ㅁ 버튼이 터치될 때 해당 LED가 켜집니다.
        3. 그래서 버튼 터치가 감지됨을 사용자들에게 시각적으로 알려줍니다.
        예시 : grams을 사용할 때, 모든 LED on 커맨드 :
          03 0A 01 01 00 00 09
          
        예시 : ounces를 사용할 때, 모든 LED on 커맨드 :
          03 0A 01 01 01 00 08
          
        예시 : 모든 LED off 커맨드 :
          03 0A 00 00 00 00 09
          
        예시 : 전원 종료 커맨드
          03 0A 02 00 00 00 0B
          
        디센트 스케일은 LED on/off 커맨드 후 무게 데이터 피드에 grams vs ounces 정보, 남은 배터리 양, 펌웨어 버전과 함께 답을 보냅니다 (v1.1 펌웨어) 아래와 같은 구조로 되어있습니다 :

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        모델
        03 = Decent
        타입
        0A
        데이터 (1)
        00
        Data (2)
        Weight units on LED
        00=grams
        01=oz
        Data (3)
        Battery level
        Between 3% (low) 100% (full).
        FF (255) = USB powered
        Data (4)
        firmware version
        FE=v1.0
        02=v1.1
        03 = v1.2
        XOR validation
        저울 PCB의 한계로 베터리 레벨은 항상 100%로 표시됩니다.
        LightBlue 앱 로그에서 가져온 남은 배터리 양을 읽는 예시입니다 :
          16:02:36.005 - Characteristic (36F5) wrote new value: <030a0101 000009> (이 값을 보내기 위해 해당 앱을 이용했습니다, LED on)
          16:02:36.061 - Characteristic (36F5) read: (null)
          16:02:36.135 - Characteristic (FFF4) notified: 030a0000 64026f (64 hex = 100%, 배터리로 작동)
          
          15:59:50.421 - Characteristic (36F5) wrote new value: <030a0101 000009> (이 값을 보내기 위해 해당 앱을 이용했습니다, LED on)
          15:59:50.485 - Characteristic (36F5) read: (null)
          15:59:50.522 - Characteristic (FFF4) notified: 030a0000ff0ac7  (FF hex = 255%, USB 전원 연결)
          


        타이머 제어를 위한 커맨드 보내기

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        모델
        03 = Decent
        타입
        0B
        데이터 (1)
        타이머 시작/정지/리셋
        00=stop
        02=reset to zero
        03=start
        Data (2)
        00
        Data (3)
        00
        Data (4)
        00
        XOR validation
        calculated
        예시 : 타이머 시작 커맨드
          03 0B 03 00 00 00 0B
          
        예시 : 타이머 정지 커맨드
          03 0B 00 00 00 00 08
          
        예시 : 타이머 리셋 커맨드
          03 0B 02 00 00 00 0A
          

        디센트 스케일에서 다양한 데이터를 받기위한 샘플 코드

        Larger bluetooth.tcl example on Github

        아래 code fragment (Tcl 언어로 되어있지만, 이해가 가능하길 바랍니다) 로 가능한 것들
        1. 무게 정보 받기
        2. 버튼 터치 받기
        3. 현재 타이머 값 받기
        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
        }