Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템

라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템

이전 블로그 포스트에서는 사무실에 있는 콜드브루 커피 통(케그)의 무게를 측정해 재고가 부족해지면 Slack으로 알림을 보내 리필 시기를 알려주는 방법을 소개했습니다.

두 편으로 구성된 시리즈의 두 번째 글인 이번 포스트에서는 그 저울을 직접 만든 과정을 공유합니다. 핵심 목표는 시간과 비용을 최소한으로 들이는 것이었는데, 마침 우리 요구사항에 맞는 제품이 시중에 없었습니다.

Elasticsearch 케그 시스템의 요구사항

가장 먼저 프로젝트의 요구사항을 정리했습니다:

  • 저렴할 것 (100달러 미만)
  • 유지 관리가 최소화될 것
  • 원격으로 관리 가능할 것
  • 케그 잔량을 손쉽게 보고할 것
  • 콜드브루가 추출될 때마다 감지할 것 (도전 목표)
  • 무엇보다 투입 시간이 최소한일 것*

*저에게는 본업이 있고, 케그 저울 만들기는 제 업무 범위에 없습니다.

초기 조사

첫 번째 난제는 케그 데이터를 어떻게 수집할지뿐만 아니라 어떤 데이터를 수집할지 정하는 것이었습니다.

케그 모니터링을 위한 오픈소스 프로젝트가 몇 가지 있었고, 조사해 본 결과 측정 방식은 크게 두 가지였습니다:

  • 무게 측정
  • 유량계(flow rate meter) 사용

이미 나와 있는 대부분의 솔루션은 유량계를 사용합니다. 하지만 유량만으로 케그가 "비었는지" 판단하기는 다소 까다롭고, 케그 교체 시점을 파악하려면 사용자 개입이 필요합니다. 게다가 실제 커피 라인에 장치를 설치해야 하는데, 여기에는 나름의 잠재적 문제가 따릅니다.

그래서 참고할 예시가 부족했음에도 불구하고, 저울로 무게를 측정해 케그 잔량을 확인하는 방식을 선택했습니다.

케그 저울

실제 저울 하드웨어로는 라즈베리 파이 같은 소형 컴퓨터에 연결할 수 있는 기성품을 찾아봤습니다. Wi-Fi나 블루투스 저울은 많지만, 대부분 연속 측정이 안 되거나 배터리로 작동하거나 인터페이싱이 골치 아팠습니다. 케그 전용 저울도 몇 개 있긴 했지만 너무 비쌌습니다.

결국 또다시 DIY를 선택하게 됩니다.

라즈베리 파이 조립 경험이 있었기 때문에, 라즈베리 파이로 저울을 만들 하드웨어가 필요했습니다. Amazon에서 바로 이 용도에 맞는 50kg 로드셀과 HX711 앰프 세트를 찾았습니다.

HX711로 Arduino 저울을 만드는 자료는 많지만, 라즈베리 파이용 자료는 훨씬 적었습니다. 다행히 Instructables의 튜토리얼과 tatobari라는 사용자의 GitHub 저장소에서 필요에 딱 맞는 Python용 HX711 유틸리티를 찾을 수 있었습니다.

전체 아키텍처

먼저 전체 시스템이 어떤 모습일지 간단한 개략도를 그렸습니다:

라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템

하드웨어 조립

첫 번째 난관은 케그 아래에 놓을 수 있을 만큼 얇으면서도, 약 68kg(150파운드)짜리 케그 무게에 휘지 않을 만큼 튼튼하고, 케거레이터(kegerator) 안에 들어갈 수 있는 저울을 찾는 것이었습니다.

여러 가지 설계와 보강 방법을 시도했지만, 불안정하거나 두께가 너무 두꺼워져 결국 상단 배관에 압력을 주는 문제가 있었습니다.

최종 조립품은 오래된 그릴 그레이트(철망), 철물점에서 구한 작은 C형강 조각들로 보강한 그레이트, 그리고 둑테이프와 집타이로 완성했습니다.
라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템

완벽하지는 않지만 결국 모든 설계 요구사항을 충족했습니다. (혹시 더 튼튼한 해결책을 생각하고 계신 분이 계신가요?)

배선하기

HX711 보드를 라즈베리 파이에 GPIO 핀 4개로 연결하고, 저울은 휘트스톤 브리지(Wheatstone bridge)의 4개 선을 통해 HX711 보드에 연결해야 했습니다(Instructables 참조).

케거레이터 내부는 공간이 극도로 협소하고 케그를 넣고 뺄 때 상당히 거칠어질 수 있어서, HX711과 라즈베리 파이를 케그와 함께 두는 것은 좋은 선택이 아니어 보였습니다. 대신 라즈베리 파이와 HX711을 케거레이터 바로 옆 외부에 배치하고, 실제 저울에서 HX711까지의 긴 거리는 표준 케이블(믿음직한 Cat 5 또는 Cat 6)로 연결했습니다. 저울 쪽 끝과 HX711 쪽 끝에 RJ45 커넥터를 달아서, 이제 아무 이더넷 케이블이나 사용해 두 장치를 연결할 수 있습니다.

HX711과 라즈베리 파이 사이에는 서로 바로 옆에 있으므로 표준 점퍼 와이어를 사용했습니다.

소프트웨어

라즈베리 파이를 사용하면 Linux에서 돌아가는 무엇이든 소프트웨어로 활용할 수 있습니다.

첫 번째 요소는 GPIO를 통해 HX711 앰프와 인터페이싱하는 코드입니다.

HX711 프로젝트 대부분이 Arduino용이지만, 라즈베리 파이용 HX711 코드를 담은 GitHub 저장소도 꽤 찾을 수 있습니다. 예를 들어 Python으로 작성된 저장소들이 있습니다.

HX711 예제 코드를 활용해 주기적인 무게 측정값을 파일에 기록하는 간단한 Python 유틸리티를 작성했고, 이 파일을 Elasticsearch로 전송합니다. 설정 파일에서 동작하도록 확장하고 몇 가지 테스트 모드를 추가했지만, 그 외에는 상당히 단순한 코드입니다.

Elasticsearch로 데이터 전송

다음으로 데이터를 Elasticsearch로 전송해야 했습니다.

Filebeat를 사용해 무게 파일을 읽고 Elasticsearch로 데이터를 전송했습니다. Python 스크립트에서 Elasticsearch로 직접 쓸 수도 있고, Logstash로 파일을 읽거나 스크립트를 직접 호출해 실시간으로 측정값을 받을 수도 있습니다. 하지만 Filebeat는 매우 가볍고 작업량이 가장 적었습니다.

Filebeat 사용의 유일한 작은 걸림돌은 Elastic이 라즈베리 파이/ARM용 바이너리를 기본 제공하지 않는다는 점이라 직접 빌드해야 했습니다.

다행히 Elastic 사이트의 안내가 꽤 명확합니다. 사용하려는 Filebeat 버전에 맞는 Go 버전만 올바르게 선택하면 빌드는 비교적 간단합니다. (개발자 가이드에 보통 언급되어 있지만, 해당 페이지 오른쪽에서 올바른 Beat 버전을 선택했는지 꼭 확인하세요.)

모든 구성 요소가 정상 작동하면, 마지막 단계는 저울 판독 스크립트와 Filebeat를 systemd 서비스로 등록해 부팅 시 자동 시작되도록 설정하는 것입니다.

데이터 색인

무게 데이터를 Elasticsearch에 색인해야 했습니다. Filebeat를 사용하면서, Elasticsearch 쪽에서 수집 파이프라인(ingest pipeline)으로 데이터를 파싱하기로 했습니다. 물론 Logstash도 선택지였지만, 목표는 라즈베리 파이에 최소한의 부하만 걸어 로컬 대시보드로 활용하고, 나중에 온도 센서 같은 추가 센서로 확장할 수 있게 하는 것이었습니다.

몇 초마다 단순한 무게 판독기가 다음과 같은 로그 라인을 출력합니다: "2018-06-22T20:57:02+0000 – 134.0". 타임스탬프 뒤에 "-"와 무게 측정값이 붙는 극도로 단순한 형식이라 수집 파이프라인도 마찬가지로 단순합니다.


{
  "description" : "Parse the readings from the keg scale",
  "processors" : [
	{
  	"grok": {
    	"field": "message",
    	"patterns": ["^%{TIMESTAMP_ISO8601:readtime}\\s+-\\s+%{BASE10NUM:weight}$"]
  	}
	},
	{
  	"convert": {
    	"field" : "weight",
    	"type": "float"
  	}
	},
	{
  	"date" : {
    	"field" : "readtime",
                                             	"formats" : ["ISO8601"]
                                	}
	}
  ],
  "on_failure" : [
	{
  	"set" : {
    	"field" : "ingest_error",
    	"value" : "{{ on_failure_processor_type }} - Error processing message - {{ _ingest.on_failure_message }} : {{ message }}"
  	}
	}
  ]
}

그 결과 몇 초마다 부동소수점 "weight" 값과 타임스탬프, 그리고 Filebeat가 포함하는 각종 메타데이터가 담긴 문서가 생성됩니다(나중에 여러 케그로 확장할 때 유용하게 쓸 수 있습니다).

Elasticsearch 클러스터

ObjectRocket 덕분에 이 부분은 매우 쉬웠습니다. 기본 클러스터를 생성하고, ACL 몇 개를 열고, 사용자를 몇 명 설정한 뒤 바로 데이터 전송을 시작하면 됩니다. 그 외에 필요한 것은 Kibana가 함께 있는 정상 작동하는 Elasticsearch 클러스터뿐입니다.

마무리

모든 것이 준비되고 자리를 잡으면, 남은 일은 전원을 꽂는 것뿐이었습니다.

짜잔! 그냥 돌아갑니다.

초기 결과를 직접 확인해 보세요:

라즈베리 파이와 Elasticsearch로 구축하는 콜드브루 커피 통 저울 시스템

결국 다음을 보여주는 간단한 게이지를 갖게 되었습니다:

  • 케그에 남은 콜드브루의 백분율
  • Timelion 추세선
  • 가장 최근 리필 날짜

Canvas와 Vega 같은 멋진 신규 프로젝트를 활용해 더 많은 애드온을 붙일 여지가 있지만, 당장은 충분히 제 역할을 하고 있습니다.