TL;DR

  • Elitech RC-5 USB 온도 로거에 Linux용 소프트웨어가 없어, 프로토콜을 확인해 직접 앱을 작성한 사례임.
  • 장치는 USB 대용량 저장 장치와 HID 장치로 나타나며, 데이터는 64바이트 보고서와 명령·주소·길이 프레임으로 구성됨.
  • 기존 프로젝트 두 개를 대조해 프로토콜 참조 문서를 만들고, 순수 Go 앱 go-elite-log를 약 한 시간 만에 작성함.
  • 영하 온도 기록의 부호 비트는 12번 비트이며, 실시간 상태값의 15번 비트와 달라 냉동고에서 직접 검증함.
  • 앱은 명령줄 인터페이스와 브라우저 기반 UI, 차트, CSV 내보내기를 제공하지만, 기록을 시작하려면 USB를 분리하고 버튼을 10초간 눌러야 함.

장치의 작동 방식

  • Elitech RC-5는 버튼, 화면, USB 플러그가 달린 작고 저렴한 온도 로거임.
  • 일반적인 사용 경로는 Elitech 웹사이트에서 ElitechLog를 내려받아 Windows에 설치하는 방식임. Linux용 소프트웨어는 제공되지 않음.
  • Linux 컴퓨터에 장치를 연결해 직접 소프트웨어를 작성함. 예전에는 한 시간쯤 걸릴 작업이었지만, 이제는 설명서를 읽는 것보다 빠른 방식임.
  • lsusb에서 장치 식별자는 246c:9001이며, USB 대용량 저장 장치와 HID 장치로 인식됨.
  • 데이터가 오가는 HID 인터페이스는 64바이트 보고서를 사용하며, 보고서 프레임에는 명령, 주소, 길이가 들어 있음. 클록, 샘플링 간격, 시작·중지 모드, 기록은 평탄한 파라미터 공간에 저장됨.
  • Claude가 기존 프로젝트 두 개를 찾아냄.
  • elitech-hid-webui: Windows 프로그램의 통신 흐름을 역공학하고 같은 하드웨어에서 테스트한 프로젝트임.
  • python-elitech: 이전 모델을 위한 프로젝트임.
  • 두 프로젝트의 내용을 대조해 하나의 프로토콜 참조 문서로 정리하고, 확인되지 않은 항목은 미확인 상태로 표시함.

앱 작성

  • 프로토콜을 문서화한 뒤 Claude와 함께 go-elite-log를 한 시간쯤 만에 작성함.
  • 앱은 cgo 없는 순수 Go로 구현되며, /dev/hidrawN에 직접 접근함.
  • 명령줄 인터페이스는 elitelog info, records, start, stop 명령을 제공함.
  • lofigui 웹 UI에는 장치 페이지, 차트가 있는 기록 페이지, 5초마다 새로고침되는 모니터 페이지가 포함됨.
  • 프로토콜 대부분은 먼저 가짜 로거에서 테스트했으며, 참조 문서의 예제 프레임을 테스트 벡터로 사용한 뒤 실제 장치에서도 확인함.

참조 문서의 오류

  • 영하 온도 기록을 얻으려고 로거를 냉동고에 넣자 기록값이 엉뚱하게 나타남.
  • 기록 데이터의 온도는 1/10도 단위로 인코딩되며, 부호는 15번 비트가 아니라 12번 비트에 저장됨.
  • 00 01은 0.1도임.
  • 10 05는 -0.5도임.
  • 10 0B는 -1.1도임.
  • 실시간 상태값은 15번 비트를 사용하며, 80 BC는 -18.8도를 나타냄. 같은 장치에서 음수를 표현하는 규칙이 두 가지임.
  • 영하에서 테스트한 사람이 없어 이 차이가 문서화되지 않았으며, 직접 찾아낸 역공학 결과는 냉동고를 사용해 확인한 내용임.

문제점

  • 로거는 USB에 연결된 동안 기록하지 않음. 설정을 저장한 뒤 USB를 분리하고 버튼을 10초간 눌러야 함.
  • 루트 권한 없이 hidraw 장치 노드에 접근하려면 udev 규칙이 필요함.

의미

  • Linux에서 작동하고 브라우저에서 차트를 확인할 수 있으며 CSV 내보내기도 가능한 로거와, 누구나 읽을 수 있는 프로토콜 문서를 확보함.
  • 다음 날 냉동고가 제대로 작동하지 않는 이유를 확인하러 오는 엔지니어에게 실제 데이터를 보여줄 예정임.
  • 글은 Claude와 함께 작성함.