ในบล็อกก่อนหน้า ผมรายละเอียดว่าผมใช้น้ำหนักของถังเบียร์ cold brew coffee ในออฟฟิศของเรา เพื่อส่ง Slack alerts ให้เรารู้เมื่อเราใกล้หมดและต้องเติมถังเบียร์ cold brew coffee ใหม่
ในส่วนที่สองของชุด 2 ส่วนนี้ ผมจะแสดงว่าผมสร้างเครื่องชั่งอย่างไร โดยหลักๆ ผมต้องการบางอย่างที่ไม่ต้องใช้เวลาและเงินมาก และไม่มีอะไรที่มีอยู่แล้วตอบโจทย์ความต้องการของเรา
Elasticsearch keg set up requirements
ก่อนอื่น ผมต้องแยก requirements สำหรับโครงการ:
- ถูก (<$100)
- Minimal care และ feeding
- Remotely managed
- รายงานระดับถังได้ง่าย
- กำหนดทุกครั้งที่มี cold brew ถูกนำออกจากถัง (เป้าหมายยืดหยุ่น)
- สำคัญที่สุด ต้องใช้เวลาน้อยที่สุด*
*ผมมีงานประจำ และการสร้าง keg scales ไม่อยู่ใน job description ของผม
Initial research
ความท้าทายแรกคือการหาไม่ว่าจะเก็บข้อมูลบนถังอย่างไร แต่ว่าจะเก็บข้อมูลอะไร
บาง open source projects ให้การ monitor ถัง และหลังจากค้นคว้าสักนิด สองวิธีหลักสำหรับวัดคือ
- น้ำหนัก
- ใช้ flow rate meter
สิ่งที่มีอยู่ส่วนใหญ่ใช้ flow rate meters มันซับซ้อนกว่าที่จะกำหนดว่าถัง "ว่าง" หรือไม่ ด้วย flow rates และคุณต้องการ user intervention บางอย่างเพื่อกำหนดเมื่อถังถูกเปลี่ยน นอกจากนี้ ยังต้องการอุปกรณ์ใน coffee line จริง ซึ่งมีปัญหาที่เป็นของมันเอง
ดังนั้น ถึงแม้จะขาดตัวอย่างที่จะนำมาใช้ เราตัดสินใจเริ่มด้วยเครื่องชั่งและใช้น้ำหนักเพื่อกำหนดระดับถัง
The keg scale
สำหรับ hardware เครื่องชั่งจริง ผมมองหา off-the-shelf solutions ที่เชื่อมต่อกับคอมพิวเตอร์ขนาดเล็กอย่าง Raspberry Pi ได้ มี WIFI และ Bluetooth scales มากมาย แต่มากกว่าครึ่งไม่ใช่ continuous read หรือใช้แบตเตอรี่ หรือยุ่งยากในการ interface มี keg-specific scales อยู่บ้าง แต่แพงเกินไป
อีกครั้ง ผมต้องทำ DIY
ผมมีประสบการณ์ในการสร้างกับ Raspberry Pi ดังนั้นผมต้องการ hardware เพื่อสร้างเครื่องชั่งกับ Pi ผมพบชุด 50kg load cells พร้อม HX711 amplifier บน Amazon สำหรับ use case นี้พอดี
มี references มากมายสำหรับการสร้าง Arduino scale กับ HX711 แต่มีน้อยกว่าสำหรับ Pi โชคดี ผมพบ tutorials จาก Instructables ร่วมกับ Github repo จาก user tatobari ที่รวม python HX711 utilities ที่เหมาะสม
Overall architecture
ก่อนอื่น ผมต้องสร้าง schematic เรียบง่ายของระบบโดยรวม:

The hardware build
ความท้าทายแรกคือหาเครื่องชั่งที่บางพอที่จะวางใต้ถัง และยังพอดีใน kegerator ที่แข็งแรงพอที่จะไม่บิดงอภายใต้น้ำหนักถัง 150lb
ผมลองหลาย designs และ methods เพื่อเสริมความแข็งแรง แต่พวกมันไม่มั่นคงหรือเพิ่มความหนาเกินไปที่สุดท้ายกดทับท่อด้านบน
Final build รวมถึง old grill grate, ชิ้นเล็กๆ ของ steel c channel จากร้าน hardware เพื่อเสริม grate, และ duct tape และ zip ties มากมาย

มันไม่สมบูรณ์แต่ตอบโจทย์ design requirements ทั้งหมด (ใครมีโซลูชันที่แข็งแรงกว่านี้ในใจไหม?)
Wiring it up
เราต้องเชื่อม HX711 board กับ Raspberry pi ผ่าน 4 GPIO pins และเครื่องชั่งกับ HX711 board ผ่านสาย 4 เส้นจาก Wheatstone bridge (ดู Instructables)
Kegerator เยอะ space-constrained และอาจค่อนข้าง rough เมื่อโหลดและปลดถัง ดังนั้นไม่ดูเหมือนการตัดสินใจที่ดีที่จะวาง HX711 และ raspberry pi ไว้กับถัง แทนที่จะเราจะวาง Raspberry Pi และ HX711 ไว้ข้างๆ นอก kegerator ใช้ standard cable (cat 5 หรือ 6 ดีๆ) เพื่อทำ longer run จากเครื่องชั่งจริงไป HX711 เพิ่ม RJ45 connector ที่เครื่องชั่งปลายหนึ่งและ HX711 อีกปลาย ตอนนี้เราสามารถใช้ Ethernet cable ใดๆ เชื่อมทั้งสอง
ระหว่าง HX711 และ raspberry pi เนื่องจากอยู่ติดกัน เราใช้ standard jumper wires
The software
การใช้ Raspberry Pi หมายความว่าผมสามารถใช้งานอะไรก็ได้ที่รันบน Linux สำหรับ software
ชิ้นแรกคือโค้ดสำหรับ interface กับ HX711 amplifier ผ่าน GPIOs
แม้โปรเจกต์ HX711 ส่วนใหญ่จะเป็นสำหรับ Arduino คุณยังคงหา GitHub repos ที่พอสมควรสำหรับ HX711 code สำหรับ Raspberry Pi ได้ เช่นอันนี้ที่เขียนด้วย Python
ใช้ HX711 example code ผมเขียน Python utility เล็กๆ ที่เขียน weight readings เป็นระยะไปยังไฟล์ที่เราสามารถส่งไป Elasticsearch ผมขยายมันให้ทำงานจาก config file และรวม testing modes ไปด้วย แต่ส่วนอื่นๆ โค้ดค่อนข้าง simple
Shipping the data to Elasticsearch
ต่อไป ผมต้องส่งข้อมูลไป Elasticsearch
ผมใช้ Filebeat เพื่ออ่าน weight files และส่งข้อมูลไป Elasticsearch คุณอาจเขียนตรงไป Elasticsearch จาก Python script หรือใช้ Logstash เพื่ออ่านไฟล์ หรือเรียก script โดยตรงเพื่อได้ readings on the fly Filebeat super lightweight และเพียงต้องการงานน้อยที่สุด
ความซับซ้อนเล็กน้อยกับการใช้ Filebeat คือ Elastic ไม่ได้提供 binaries สำหรับ Raspberry Pi/ARM โดยค่าเริ่มต้น ผมต้อง build เอง
โชคดี คำแนะนำบน Elastic site ค่อนข้างชัดเจน ตราบใดที่คุณเลือก Go version ที่ถูกต้องซึ่งตรงกับ Filebeat version ที่คุณต้องการ build ควรจะ straightforward (มักถูกเรียกใน developer guide ตรวจสอบให้แน่ใจว่าคุณเลือก Beat version ที่ถูกต้องด้านขวาของหน้านั้น)
เมื่อทุก component ทำงานแล้ว ขั้นตอนสุดท้ายคือกำหนดค่า scale reader scripts และ Filebeat เป็น systemd services และให้เริ่มต้นที่ boot
Indexing the data
ผมต้องการให้ weight data นั้น indexed ใน Elasticsearch ใช้ Filebeat ผมตัดสินใจ parse data บน Elasticsearch side โดยใช้ ingest pipeline อีกครั้ง Logstash เป็นตัวเลือก แต่เป้าหมายคือสร้าง absolute minimum load บน Raspberry Pi เพื่อให้ผมใช้เป็น local dashboard และอาจขยายต่อด้วย sensors เพิ่มเติม (เช่น temperature)
ทุกไม่กี่วินาที simple weight reader ปล่อย log lines เหมือนนี้: "2018-06-22T20:57:02+0000 - 134.0" นี่非常简单 to parse เพราะมันแค่ timestamp ตามด้วย "-" และ weight reading ดังนั้น ingest pipeline ก็ simple เช่นกัน
{ "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 }}" } } ] }
ผลลัพธ์คือ document ทุกไม่กี่วินาที พร้อม floating point "weight" และ timestamp พร้อมกับ metadata ต่างๆ ที่ Filebeat รวมอยู่ (ซึ่งเราอาจใช้ต่อหากขยายไป multiple kegs)
Elasticsearch cluster
ObjectRocket ทำส่วนนี้ง่ายมาก เนื่องจากผมสามารถ spin up basic cluster, เปิด ACLs ไปหน่อย ตั้งค่า users สองคน และเริ่มส่งข้อมูล นอกจากนั้น ข้อกำหนดจริงเพียงอย่างเดียวคือ functional Elasticsearch cluster พร้อม Kibana
Wrapping up
เมื่อทุกอย่าง setup และ in place แล้ว ทั้งสิ่งที่ผมต้องทำคือเสียบเข้าไป
Voila! มันแค่รัน
คุณสามารถดูผลลัพธ์เริ่มต้นด้วยตัวเอง:

เราได้ simple gauge ที่แสดง:
- Percentage ของ cold brew ที่เหลือในถัง
- Timelion trendline
- Date ของการเติมล่าสุด
ระบบมีพื้นที่สำหรับ add-ons มากมาย ด้วยโปรเจกต์ใหม่ๆ เหมือน Canvas และ Vega แต่วันนี้ มันทำงานได้