Trong Blog trước, tôi chi tiết cách dùng trọng lượng Cold Brew Coffee Keg ở văn phòng để gửi Slack Alerts báo khi cần Refill Keg.
Trong Phần 2 của Series 2 phần này, tôi sẽ chỉ cách tôi xây dựng Scale. Chủ yếu, tôi muốn thứ gì đó không tốn nhiều thời gian và tiền, và không có giải pháp sẵn có đáp ứng nhu cầu.
Yêu cầu Keg Scale Elasticsearch
Trước hết, tôi cần phân tích yêu cầu dự án:
- Rẻ (<$100)
- Tối thiểu Care and Feeding
- Quản lý từ xa (Remotely Managed)
- Dễ dàng báo cáo Keg Level
- Xác định mỗi lần Cold Brew được lấy từ Keg (Mục tiêu mở rộng)
- Quan trọng nhất: Cần đầu tư thời gian tối thiểu*
*Tôi có Full-time Job và xây dựng Keg Scale không trong Job Description.
Nghiên cứu ban đầu
Thách thức đầu tiên là tìm ra không chỉ cách thu thập Data trên Keg, mà Data nào cần thu thập.
Một số Open Source Projects cung cấp Monitoring Kegs, sau chút Research, 2 cách chính đo lường là:
- Trọng lượng (Weight)
- Dùng Flow Rate Meter
Hầu hết giải pháp sẵn có dùng Flow Rate Meters. Hơi khó xác định Keg "Empty" hay không với Flow Rates và cần User Intervention xác định khi Keg đã đổi. Thêm vào đó, cần Device trong Coffee Line, có vấn đề riêng.
Vì vậy, dù thiếu ví dụ tham khảo, chúng tôi quyết định bắt đầu với Scale và dùng Weight xác định Keg Level.
Keg Scale
Về Hardware Scale thực tế, tôi tìm Off-the-shelf Solutions kết nối được với Small Computer như Raspberry Pi. Có hàng tá WIFI/Bluetooth Scales, nhưng hầu hết không Continuous Read; hoặc dùng Pin; hoặc rắc rối Interface. Có vài Keg-specific Scales nhưng quá đắt.
Lại phải DIY.
Tôi có kinh nghiệm Build với Raspberry Pi, nên cần Hardware xây Scale với Pi. Tìm thấy bộ 50kg Load Cells với HX711 Amplifier trên Amazon đúng cho Use Case này.
Nhiều Reference xây Arduino Scale với HX711 nhưng ít cho Pi. May mắn tìm thấy Tutorials từ Instructables kết hợp với Github Repo từ User TATOBARI bao gồm Python HX711 Utilities phù hợp.
Kiến trúc tổng thể
Trước hết, tạo Schematic đơn giản hệ thống tổng thể:
Xây dựng Hardware
Thách thức đầu: Tìm Scale đủ mỏng đặt dưới Keg vừa vặn trong Kegerator, đủ chắc không cong dưới trọng lượng 150lb Keg.
Thử nhiều Design và Method củng cố Scale, nhưng hoặc Unstable hoặc thêm độ dày quá nhiều gây áp lực lên Top Tubes.
Final Build bao gồm Grill Grate cũ, vài thanh Steel C Channel nhỏ từ Hardware Store củng cố Grate, và nhiều Duct Tape, Zip Ties.

Không hoàn hảo nhưng đáp ứng đủ yêu cầu thiết kế (Ai có giải pháp chắc chắn hơn?)
Nối dây
Cần nối HX711 Board với Raspberry Pi qua 4 GPIO Pins và Scale với HX711 Board qua 4 dây từ Wheatstone Bridge (xem Instructables).
Kegerator rất chật chỗ và khá thô bạo khi Load/Unload Keg, nên không tốt để đặt HX711 và Raspberry Pi bên trong. Thay vào đó, đặt Raspberry Pi và HX711 ngay bên cạnh, ngoài Kegerator, dùng Cable chuẩn (Cat 5/6) nối dài từ Scale thực tế đến HX711. Thêm RJ45 Connector ở Scale một đầu và HX711 đầu kia. Bây giờ dùng bất kỳ Ethernet Cable nào nối hai bên.
Giữa HX711 và Raspberry Pi, vì nằm cạnh nhau, dùng Jumper Wires chuẩn.
Phần mềm
Dùng Raspberry Pi nghĩa là có thể dùng hầu hết mọi thứ chạy trên Linux cho Software.
Mảnh đầu tiên: Code Interface với HX711 Amplifier qua GPIOs.
Dù hầu hết HX711 Projects là cho Arduino, vẫn tìm được vài GitHub Repos HX711 Code cho Raspberry Pi, như cái này viết bằng Python.
Dùng HX711 Example Code, tôi viết Python Utility nhỏ ghi Periodic Weight Readings ra File để Ship sang Elasticsearch. Mở rộng để chạy từ Config File và thêm vài Testing Modes, nhưng ngoài ra Code khá đơn giản.
Ship Data sang Elasticsearch
Tiếp, Ship Data sang Elasticsearch.
Dùng Filebeat đọc Weight Files và Ship Data sang Elasticsearch. Bạn có thể Write trực tiếp Elasticsearch từ Python Script; hoặc dùng Logstash đọc Files; hoặc trực tiếp gọi Script lấy Readings On-the-fly. Filebeat Super Lightweight và chỉ yêu cầu ít công việc nhất.
Vấn đề nhỏ khi dùng Filebeat: Elastic không cung cấp Binaries cho Raspberry Pi/ARM mặc định. Tôi phải Build nó.
May mắn Instructions trên trang Elastic khá rõ ràng. Miễn là chọn đúng Go Version match Filebeat Version bạn muốn, Build khá Straightforward. (Thường được nhắc trong Developer Guide, chắc chắn chọn đúng Beat Version bên phải trang đó.)
Khi tất cả Components hoạt động, bước cuối: Cấu hình Scale Reader Scripts và Filebeat làm Systemd Services và Start at Boot.
Indexing Data
Cần Index Weight Data trong Elasticsearch. Dùng Filebeat, tôi quyết định Parse Data phía Elasticsearch dùng Ingest Pipeline. Lại nói Logstash là Option, nhưng mục tiêu tạo Load tối thiểu trên Raspberry Pi để dùng làm Local Dashboard và có thể mở rộng sau với nhiều Sensors hơn (như Temperature).
Mỗi vài giây, Simple Weight Reader nhả Log Lines kiểu: “2018-06-22T20:57:02+0000 – 134.0”. Rất đơn giản Parse vì chỉ Timestamp theo sau “-” và Weight Reading, nên Ingest Pipeline cũng đơn giản.
{ "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 }}" } }
] }
Kết quả: Document mỗi vài giây với Floating Point "WEIGHT" và Timestamp, cùng Metadata Filebeat include (có thể dùng sau nếu mở rộng Multiple Kegs).
Elasticsearch Cluster
ObjectRocket làm phần này dễ dàng, vì tôi Spin Up Basic Cluster, mở vài ACLs, setup Users, và bắt đầu Ship Data. Ngoài ra, yêu cầu thực tế chỉ là Elasticsearch Cluster Functional với Kibana.
Kết thúc
Với mọi thứ Setup xong, chỉ cần Plug In.
Voila! Nó chỉ chạy.
Bạn tự thấy kết quả ban đầu:
Chúng ta có Gauge đơn giản hiển thị:
- Phần trăm Cold Brew còn lại trong Keg
- Timelion Trendline
- Ngày Refill gần nhất
Hệ thống có chỗ cho nhiều Add-ons hơn, với Projects cool như Canvas và Vega, nhưng hiện tại nó làm việc tốt.