पिछले ब्लॉग में, मैंने विस्तार से बताया था कि कैसे मैंने अपने कार्यालय में कोल्ड ब्रू कॉफी केग के वजन का उपयोग स्लैक अलर्ट भेजने के लिए किया ताकि हमें पता चल सके कि हम कब कम चल रहे हैं और कोल्ड ब्रू कॉफी केग रिफिल की आवश्यकता है।
हमारी दो-भाग श्रृंखला में इस दूसरे में, मैं आपको दिखाऊंगा कि मैंने पैमाने कैसे बनाया। मुख्य रूप से, मुझे बहुत सारा समय और निवेश किए बिना कुछ चाहिए था, और पहले से ऐसा कुछ भी उपलब्ध नहीं था जो हमारी ज़रूरतों को पूरा करता हो।
Elasticsearch keg सेट अप आवश्यकताएं
सबसे पहले, मुझे परियोजना के लिए आवश्यकताओं को तोड़ने की जरूरत है:
- सस्ता (<$100)
- न्यूनतम देखभाल और भोजन
- दूर से प्रबंधित
- केजी स्तर की आसानी से रिपोर्ट करें
- यह निर्धारित करें कि हर बार केग (एक खिंचाव लक्ष्य) से ठंडा काढ़ा लिया गया था
- सबसे महत्वपूर्ण बात, इसमें न्यूनतम समय का निवेश शामिल होना चाहिए*
*मेरे पास एक दिन का काम है और केग स्केल बनाना मेरे काम के विवरण में नहीं है।
प्रारंभिक शोध
पहली चुनौती न केवल यह पता लगाने की थी कि केग पर डेटा कैसे इकट्ठा किया जाए, बल्कि कौन सा डेटा इकट्ठा किया जाए।
कुछ ओपन सोर्स प्रोजेक्ट केग्स की निगरानी के लिए प्रदान करते हैं, और थोड़े से शोध के बाद, मापने के दो प्रमुख तरीके हैं
- वजन
- फ्लो रेट मीटर का उपयोग करना
जो पहले से उपलब्ध है उनमें से अधिकांश प्रवाह दर मीटर का उपयोग करते हैं। यह निर्धारित करना थोड़ा मुश्किल है कि केग "खाली" है या प्रवाह दरों के साथ नहीं है और आपको यह निर्धारित करने के लिए किसी प्रकार के उपयोगकर्ता हस्तक्षेप की आवश्यकता है कि केग को कब बदला गया है। साथ ही, इसके लिए वास्तविक कॉफी लाइन में एक उपकरण लगाने की आवश्यकता होती है, जिसकी अपनी संभावित समस्याएं होती हैं।
इसलिए उधार लेने के लिए उदाहरणों की कमी के बावजूद, हमने केजी स्तर को निर्धारित करने के लिए पैमाने से शुरू करने और वजन का उपयोग करने के लिए कॉल किया।
केग स्केल
वास्तविक पैमाने के हार्डवेयर के लिए, मैंने ऐसे ऑफ-द-शेल्फ समाधानों की तलाश की, जो रास्पबेरी पाई जैसे छोटे कंप्यूटर से जुड़ सकें। वहाँ बहुत सारे वाईफ़ाई और ब्लूटूथ स्केल हैं, लेकिन अधिकांश लगातार पढ़े नहीं गए थे; या बैटरी चालित थे; या एक बड़ी परेशानी जिसके साथ इंटरफेस करना है। कुछ केग-विशिष्ट तराजू मौजूद हैं, लेकिन वे बहुत महंगे थे।
एक बार फिर, मुझे DIY जाना था।
मुझे रास्पबेरी पाई के साथ निर्माण करने का अनुभव है, इसलिए मुझे एक के साथ एक स्केल बनाने के लिए हार्डवेयर की आवश्यकता है। मुझे इस उपयोग के मामले के लिए अमेज़न पर HX711 एम्पलीफायर के साथ 50kg लोड सेल का एक सेट मिला।
HX711 के साथ Arduino स्केल बनाने के लिए बहुत सारे संदर्भ हैं, लेकिन Pi के लिए बहुत कम उपलब्ध हैं। सौभाग्य से, मुझे इंस्ट्रक्शंस से ट्यूटोरियल मिला, जो उपयोगकर्ता तातोबारी से एक जीथब रेपो के साथ युग्मित था जिसमें कुछ अजगर HX711 उपयोगिताओं को शामिल किया गया था जो बिल में फिट होंगे।
समग्र वास्तुकला
सबसे पहले, मुझे एक सरल योजना बनाने की जरूरत है कि समग्र प्रणाली कैसी दिखेगी:
हार्डवेयर बिल्ड
पहली चुनौती केग के नीचे रखने के लिए पर्याप्त पतले पैमाने को खोजने की थी और अभी भी कीगरेटर में फिट थी जो इतना मजबूत था कि 150lb केग के वजन के नीचे झुकना नहीं था।
मैंने पैमाने को सुदृढ़ करने के लिए कई डिज़ाइन और विधियों की कोशिश की, लेकिन वे या तो अस्थिर थे या बहुत अधिक मोटाई जोड़ते थे जो अंततः शीर्ष ट्यूबों पर दबाव डालते थे।
अंतिम निर्माण में पुरानी ग्रिल ग्रेट, ग्रेट को सुदृढ़ करने के लिए हार्डवेयर स्टोर से स्टील सी चैनल के कुछ छोटे टुकड़े, और डक्ट टेप का एक गुच्छा, और ज़िप टाई शामिल थे।
यह सही नहीं है, लेकिन यह अंततः हमारी सभी डिज़ाइन आवश्यकताओं को पूरा करता है (क्या किसी के मन में थोड़ा मजबूत समाधान है?)
इसे वायर करना
हमें HX711 बोर्ड को 4 GPIO पिन के माध्यम से रास्पबेरी पाई से और व्हीटस्टोन ब्रिज से चार तारों के माध्यम से HX711 बोर्ड को स्केल से जोड़ने की आवश्यकता थी (निर्देश देखें)।
कीगरेटर सुपर स्पेस-विवश है और केग लोड और अनलोड होने पर यह बहुत मोटा हो सकता है, इसलिए केग के साथ HX711 और रास्पबेरी पाई का पता लगाने के लिए यह एक अच्छा निर्णय नहीं लगता था। इसके बजाय, हमने रास्पबेरी पाई और HX711 को इसके ठीक बगल में, कीगरेटर के बाहर, मानक केबल (अच्छी पुरानी बिल्ली 5 या 6) का उपयोग करके वास्तविक पैमाने से HX711 तक लंबे समय तक चलाने के लिए स्थित किया। एक छोर पर स्केल द्वारा RJ45 कनेक्टर और दूसरे छोर पर HX711 जोड़ें। अब हम दोनों को जोड़ने के लिए किसी भी पुराने ईथरनेट केबल का उपयोग कर सकते हैं।
HX711 और रास्पबेरी पाई के बीच, चूंकि वे एक दूसरे के ठीक बगल में स्थित हैं, इसलिए हमने मानक जम्पर तारों का उपयोग किया।
सॉफ्टवेयर
रास्पबेरी पाई का उपयोग करने का मतलब है कि मैं सॉफ्टवेयर के लिए लिनक्स पर चलने वाली किसी भी चीज का बहुत अधिक उपयोग कर सकता हूं।
पहला टुकड़ा GPIO के माध्यम से HX711 एम्पलीफायर के साथ इंटरफेस करने के लिए कोड है।
हालाँकि अधिकांश HX711 प्रोजेक्ट Arduino के लिए हैं, फिर भी आप रास्पबेरी पाई के लिए HX711 कोड के साथ GitHub रेपो की एक अच्छी संख्या पा सकते हैं, जैसे कि यह पायथन में लिखा गया है।
HX711 उदाहरण कोड का उपयोग करते हुए, मैंने एक छोटी पायथन उपयोगिता लिखी जो केवल आवधिक वजन रीडिंग को एक फ़ाइल में लिखती है जिसे हम Elasticsearch पर भेज सकते हैं। मैंने इसे कॉन्फ़िगरेशन फ़ाइल से काम करने और कुछ परीक्षण मोड शामिल करने के लिए विस्तारित किया, लेकिन इसके अलावा यह काफी सरल कोड है।
डेटा को Elasticsearch पर भेजना
इसके बाद, मुझे डेटा को Elasticsearch पर भेजना था।
मैंने वजन फाइलों को पढ़ने के लिए फाइलबीट का इस्तेमाल किया और फिर डेटा को एलिस्टिक्स खोज में भेज दिया। आप Python लिपि से सीधे Elasticsearch को लिख सकते हैं; या फ़ाइलों को पढ़ने के लिए लॉगस्टैश का उपयोग करें; या तुरंत ही रीडिंग प्राप्त करने के लिए स्क्रिप्ट को सीधे कॉल करें। फ़ाइलबीट बहुत हल्का है और इसके लिए कम से कम काम की आवश्यकता होती है।
फ़ाइलबीट का उपयोग करने के साथ एकमात्र छोटी जटिलता यह है कि इलास्टिक डिफ़ॉल्ट रूप से रास्पबेरी पाई / एआरएम के लिए बायनेरिज़ प्रदान नहीं करता है। मुझे इसे बनाना था।
सौभाग्य से, इलास्टिक साइट पर निर्देश बहुत स्पष्ट हैं। जब तक आप गो का सही संस्करण चुनते हैं जो फ़ाइलबीट के उस संस्करण से मेल खाता है जिसका आप उपयोग करना चाहते हैं, तो निर्माण बहुत सीधा होना चाहिए। (हालांकि इसे आमतौर पर डेवलपर गाइड में कहा जाता है, सुनिश्चित करें कि आपने उस पृष्ठ के दाईं ओर सही बीट संस्करण का चयन किया है।)
एक बार जब सभी घटक काम कर रहे थे, तो अंतिम चरण स्केल रीडर स्क्रिप्ट और फाइलबीट को सिस्टमड सेवाओं के रूप में कॉन्फ़िगर करना और उन्हें बूट पर स्टार्टअप करना था।
डेटा को अनुक्रमित करना
मुझे उस वजन डेटा को Elasticsearch में अनुक्रमित करने की आवश्यकता थी। फ़ाइलबीट का उपयोग करते हुए, मैंने एक अंतर्ग्रहण पाइपलाइन का उपयोग करके इलास्टिक्स खोज पक्ष पर डेटा को पार्स करने का निर्णय लिया। एक बार फिर, लॉगस्टैश एक विकल्प है, लेकिन लक्ष्य रास्पबेरी पाई पर पूर्ण न्यूनतम लोड बनाना था ताकि मैं इसे स्थानीय डैशबोर्ड के रूप में उपयोग कर सकूं और संभावित रूप से बाद में अधिक सेंसर (जैसे तापमान) के साथ इसका विस्तार कर सकूं।
हर कुछ सेकंड में, साधारण वेट रीडर इस तरह से लॉग लाइन निकालता है:"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 }}"
}
}
]
}
परिणाम एक दस्तावेज़ है जो हर दो सेकंड में एक फ्लोटिंग पॉइंट "वेट" और एक टाइमस्टैम्प के साथ-साथ फाइलबीट में शामिल विभिन्न मेटाडेटा के साथ होता है (जिसे हम बाद में उपयोग कर सकते हैं यदि हम इसे कई कीग्स तक विस्तारित करते हैं)।
इलास्टिक्स खोज क्लस्टर
ऑब्जेक्टरॉकेट इस हिस्से को बहुत आसान बनाता है, क्योंकि मैं एक बुनियादी क्लस्टर को स्पिन कर सकता हूं, कुछ एसीएल खोल सकता हूं, कुछ उपयोगकर्ता सेट कर सकता हूं, और फिर डेटा शिपिंग शुरू कर सकता हूं। इसके अलावा, यहां केवल वास्तविक आवश्यकता किबाना के साथ एक कार्यात्मक इलास्टिक्स खोज क्लस्टर है।
रैपिंग अप
सब कुछ सेट अप और जगह के साथ, मुझे बस इसे प्लग इन करना था।
वोइला! यह बस चलता है।
प्रारंभिक परिणाम आप स्वयं देख सकते हैं:
हमने हमें दिखाने के लिए एक साधारण गेज के साथ समाप्त किया:
- केग में बचा हुआ ठंडा काढ़ा का प्रतिशत
- एक टाइमलियन ट्रेंडलाइन
- नवीनतम रिफिल की तिथि
सिस्टम में कई और ऐड-ऑन के लिए जगह है, जिसमें कैनवास और वेगा जैसे शानदार नए प्रोजेक्ट हैं, लेकिन अभी के लिए, यह काम पूरा हो गया है।