আগের একটি ব্লগে, আমি বিশদভাবে বলেছিলাম যে কীভাবে আমি আমাদের অফিসে কোল্ড ব্রু কফির কেগের ওজন ব্যবহার করেছিলাম যখন আমরা কম চলছি তখন আমাদের জানাতে স্ল্যাক অ্যালার্ট পাঠাতাম এবং কোল্ড ব্রু কফির কেগ রিফিলের প্রয়োজন হয়৷
আমাদের দুই-অংশের সিরিজের এই সেকেন্ডে, আমি আপনাকে দেখাব কিভাবে আমি স্কেল তৈরি করেছি। প্রধানত, আমি অনেক সময় এবং অর্থ বিনিয়োগ ছাড়াই কিছু চেয়েছিলাম এবং আমাদের চাহিদা পূরণ করে এমন কিছু আগে থেকেই পাওয়া যায়নি।
ইলাস্টিক সার্চ কেগ সেট আপ প্রয়োজনীয়তা
প্রথমত, আমার প্রজেক্টের জন্য প্রয়োজনীয়তাগুলি ভাঙ্গতে হবে:
- সস্তা (<$100)
- ন্যূনতম যত্ন এবং খাওয়ানো
- দূরবর্তীভাবে পরিচালিত
- সহজেই কেগ লেভেল রিপোর্ট করুন
- প্রতিবার কেগ থেকে ঠান্ডা ব্রু নেওয়া হয়েছে তা নির্ধারণ করুন (একটি প্রসারিত গোল)
- সবচেয়ে গুরুত্বপূর্ণ, এটিতে ন্যূনতম সময় বিনিয়োগের প্রয়োজন ছিল*
*আমার একটি দিনের কাজ আছে এবং কেগ স্কেল তৈরি করা আমার কাজের বিবরণে নেই।
প্রাথমিক গবেষণা
প্রথম চ্যালেঞ্জটি ছিল কেবল কীভাবে কেগের ডেটা সংগ্রহ করা যায় তা নয়, তবে কী ডেটা সংগ্রহ করা যায় তা নির্ধারণ করা।
কিছু ওপেন সোর্স প্রজেক্টগুলি নিরীক্ষণের জন্য সরবরাহ করে এবং কিছু গবেষণার পরে, পরিমাপের দুটি প্রধান উপায় হল
- ওজন
- একটি প্রবাহ হার মিটার ব্যবহার করে
ইতিমধ্যে উপলব্ধ বেশিরভাগ ফ্লো রেট মিটার ব্যবহার করে। কেগটি "খালি" বা প্রবাহের হারের সাথে নয় তা নির্ধারণ করা একটু জটিল এবং পিপাটি কখন পরিবর্তন করা হয়েছে তা নির্ধারণ করতে আপনার কোনও ধরণের ব্যবহারকারীর হস্তক্ষেপ প্রয়োজন। এছাড়াও, এর জন্য প্রকৃত কফি লাইনে একটি ডিভাইস রাখা প্রয়োজন, যার নিজস্ব সম্ভাব্য সমস্যা রয়েছে৷
তাই ধার করার উদাহরণ না থাকা সত্ত্বেও, আমরা একটি স্কেল দিয়ে শুরু করার জন্য এবং কেগ স্তর নির্ধারণের জন্য ওজন ব্যবহার করার জন্য কল করেছি৷
কিগ স্কেল
প্রকৃত স্কেল হার্ডওয়্যারের জন্য, আমি অফ-দ্য-শেল্ফ সমাধানগুলি খুঁজছিলাম যা একটি রাস্পবেরি পাই এর মতো একটি ছোট কম্পিউটারের সাথে সংযোগ করতে পারে। সেখানে প্রচুর ওয়াইফাই এবং ব্লুটুথ স্কেল রয়েছে, তবে বেশিরভাগই ক্রমাগত পড়া হয়নি; বা ব্যাটারি চালিত ছিল; বা ইন্টারফেস করার জন্য একটি বড় ঝামেলা। কিছু কেগ-নির্দিষ্ট স্কেল বিদ্যমান, তবে সেগুলি খুব ব্যয়বহুল ছিল।
আবার, আমাকে DIY যেতে হবে।
আমি একটি রাস্পবেরি পাই তৈরিতে অভিজ্ঞ, তাই একটি দিয়ে একটি স্কেল তৈরি করার জন্য আমার হার্ডওয়্যার প্রয়োজন। আমি ঠিক এই ব্যবহারের ক্ষেত্রে Amazon-এ HX711 অ্যামপ্লিফায়ার সহ 50kg লোড সেলের একটি সেট পেয়েছি৷
HX711 এর সাথে একটি Arduino স্কেল তৈরি করার জন্য প্রচুর রেফারেন্স রয়েছে কিন্তু Pi এর জন্য অনেক কম উপলব্ধ। সৌভাগ্যবশত, আমি ইনস্ট্রাক্টেবল থেকে টিউটোরিয়াল খুঁজে পেয়েছি এবং ব্যবহারকারী ট্যাটোবারির একটি গিথুব রেপো সহ যেটিতে কিছু পাইথন HX711 ইউটিলিটি রয়েছে যা বিলের জন্য উপযুক্ত।
সামগ্রিক স্থাপত্য
প্রথমত, সামগ্রিক সিস্টেমটি কেমন হবে তার একটি সাধারণ পরিকল্পনা তৈরি করতে হবে:
হার্ডওয়্যার বিল্ড
প্রথম চ্যালেঞ্জটি ছিল কেগের নিচে রাখার মতো যথেষ্ট পাতলা স্কেল খুঁজে বের করা এবং এখনও কেজারেটরে ফিট করা যা 150 পাউন্ড কেগের ওজনের নিচে বাঁকানোর জন্য যথেষ্ট মজবুত ছিল।
আমি স্কেলটিকে শক্তিশালী করার জন্য একাধিক ডিজাইন এবং পদ্ধতির চেষ্টা করেছি, কিন্তু সেগুলি হয় অস্থির ছিল বা অত্যধিক পুরুত্ব যোগ করেছিল যা শেষ পর্যন্ত উপরের টিউবগুলিতে চাপ দেয়৷
চূড়ান্ত নির্মাণে পুরানো গ্রিল গ্রেট, গ্রেটকে শক্তিশালী করার জন্য হার্ডওয়্যার স্টোর থেকে স্টিলের সি চ্যানেলের কিছু ছোট টুকরো এবং একগুচ্ছ ডাক্ট টেপ এবং জিপ টাই অন্তর্ভুক্ত ছিল।
এটি নিখুঁত নয় তবে এটি শেষ পর্যন্ত আমাদের সমস্ত ডিজাইনের প্রয়োজনীয়তা পূরণ করেছে (এখানে কারও মনে একটু শক্ত সমাধান আছে?)
ওয়্যার আপ করা হচ্ছে
আমাদের 4টি GPIO পিনের মাধ্যমে HX711 বোর্ডকে Raspberry pi-এর সাথে এবং Wheatstone ব্রিজের চারটি তারের মাধ্যমে HX711 বোর্ডে স্কেল সংযুক্ত করতে হবে (নির্দেশনা দেখুন)।
কেজারেটরটি অত্যন্ত স্থান-সংক্রান্ত এবং কেগগুলি লোড এবং আনলোড করার সময় এটি বেশ রুক্ষ হয়ে উঠতে পারে, তাই কেগের সাথে HX711 এবং রাস্পবেরি পাই সনাক্ত করা একটি ভাল সিদ্ধান্ত বলে মনে হয় না। পরিবর্তে, আমরা রাস্পবেরি পাই এবং HX711 এর ঠিক পাশেই, কেজারেটরের বাইরে, স্ট্যান্ডার্ড ক্যাবল (ভাল পুরানো বিড়াল 5 বা 6) ব্যবহার করে প্রকৃত স্কেল থেকে HX711 পর্যন্ত দীর্ঘস্থায়ী করতে পেরেছি। এক প্রান্তে স্কেল এবং অন্য প্রান্তে HX711 দ্বারা একটি RJ45 সংযোগকারী যোগ করুন। এখন আমরা যেকোন পুরানো ইথারনেট কেবল ব্যবহার করতে পারি দুইটি সংযোগ করতে।
HX711 এবং রাস্পবেরি পাই এর মধ্যে, যেহেতু তারা একে অপরের ঠিক পাশে অবস্থিত, আমরা স্ট্যান্ডার্ড জাম্পার তার ব্যবহার করেছি।
সফ্টওয়্যার
একটি রাস্পবেরি পাই ব্যবহার করার অর্থ হল আমি সফ্টওয়্যারের জন্য লিনাক্সে যেকোন কিছু ব্যবহার করতে পারি।
প্রথম অংশটি হল GPIO এর মাধ্যমে HX711 পরিবর্ধকের সাথে ইন্টারফেস করার কোড৷
যদিও বেশিরভাগ HX711 প্রজেক্টগুলি Arduino-এর জন্য রয়েছে, তবুও আপনি সেখানে রাস্পবেরি পাই-এর জন্য HX711 কোড সহ একটি শালীন সংখ্যক গিটহাব রেপো খুঁজে পেতে পারেন, যেমন এটি পাইথনে লেখা।
HX711 উদাহরণ কোড ব্যবহার করে, আমি একটি ছোট পাইথন ইউটিলিটি লিখেছি যা কেবলমাত্র একটি ফাইলে পর্যায়ক্রমিক ওজন রিডিং লিখে দেয় যা আমরা ইলাস্টিকসার্চে পাঠাতে পারি। আমি এটিকে একটি কনফিগার ফাইল থেকে কাজ করার জন্য এবং কয়েকটি টেস্টিং মোড অন্তর্ভুক্ত করার জন্য প্রসারিত করেছি, তবে তা ছাড়া এটি মোটামুটি সহজ কোড৷
ইলাস্টিকসার্চে ডেটা শিপিং
এর পরে, আমাকে ইলাস্টিকসার্চে ডেটা পাঠাতে হবে।
আমি ওজন ফাইলগুলি পড়ার জন্য ফাইলবিট ব্যবহার করেছি এবং তারপরে ইলাস্টিকসার্চে ডেটা প্রেরণ করেছি। আপনি পাইথন স্ক্রিপ্ট থেকে ইলাস্টিকসার্চে সরাসরি লিখতে পারেন; অথবা ফাইল পড়ার জন্য Logstash ব্যবহার করুন; অথবা সরাসরি ফ্লাই রিডিং পেতে স্ক্রিপ্ট কল. ফাইলবিট অত্যন্ত হালকা এবং সহজভাবে সর্বনিম্ন পরিমাণে কাজ করা প্রয়োজন৷
ফাইলবিট ব্যবহারের ক্ষেত্রে একমাত্র ছোট জটিলতা হল যে ইলাস্টিক ডিফল্টরূপে রাস্পবেরি পাই/এআরএম-এর জন্য বাইনারি সরবরাহ করে না। আমাকে এটি তৈরি করতে হয়েছিল।
ভাগ্যক্রমে, ইলাস্টিক সাইটের নির্দেশাবলী বেশ পরিষ্কার। যতক্ষণ না আপনি Go এর সঠিক সংস্করণটি বাছাই করেন যা ফাইলবিটের সংস্করণের সাথে মেলে যা আপনি ব্যবহার করতে চান, বিল্ডটি বেশ সহজবোধ্য হওয়া উচিত। (যদিও এটি সাধারণত ডেভেলপার গাইডে বলা হয়, নিশ্চিত করুন যে আপনি সেই পৃষ্ঠার ডানদিকে সঠিক বিট সংস্করণটি নির্বাচন করেছেন।)
একবার সমস্ত উপাদান কাজ করার পরে, চূড়ান্ত পদক্ষেপটি ছিল স্কেল রিডার স্ক্রিপ্ট এবং ফাইলবিটকে সিস্টেমড পরিষেবা হিসাবে কনফিগার করা এবং সেগুলি বুট করার সময় শুরু করা।
ডেটা ইন্ডেক্সিং
আমাকে ইলাস্টিকসার্চে সেই ওজনের ডেটা ইনডেক্স করা দরকার। ফাইলবিট ব্যবহার করে, আমি একটি ইনজেস্ট পাইপলাইন ব্যবহার করে ইলাস্টিকসার্চ সাইডে ডেটা পার্স করার সিদ্ধান্ত নিয়েছি। আবারও, 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 }}"
}
}
]
}
ফলাফল হল প্রতি কয়েক সেকেন্ডে একটি ফ্লোটিং পয়েন্ট "ওজন" এবং একটি টাইমস্ট্যাম্প সহ ফাইলবিট অন্তর্ভুক্ত বিভিন্ন মেটাডেটা সহ একটি নথি (যা আমরা পরে ব্যবহার করতে পারি যদি আমরা এটিকে একাধিক কিগগুলিতে প্রসারিত করি)।
ইলাস্টিক সার্চ ক্লাস্টার
অবজেক্ট রকেট এই অংশটিকে খুব সহজ করে তোলে, যেহেতু আমি একটি বেসিক ক্লাস্টার স্পিন করতে পারি, কয়েকটি ACL খুলতে পারি, কয়েকটি ব্যবহারকারী সেট আপ করতে পারি এবং তারপরে কেবল ডাটা শিপিং শুরু করতে পারি। তা ছাড়া, এখানে একমাত্র বাস্তব প্রয়োজন কিবানা সহ একটি কার্যকরী ইলাস্টিকসার্চ ক্লাস্টার।
র্যাপিং আপ
সবকিছু সেট আপ এবং জায়গায়, আমাকে যা করতে হবে তা হল এটি প্লাগ ইন করুন৷
৷ভয়লা ! এটা শুধু চলে।
আপনি নিজের জন্য প্রাথমিক ফলাফল দেখতে পারেন:
আমরা আমাদের দেখানোর জন্য একটি সাধারণ গেজ দিয়ে শেষ করেছি:
- পিজিতে অবশিষ্ট ঠাণ্ডা মদ্যের শতাংশ
- একটি টাইমলিয়ন ট্রেন্ডলাইন
- সবচেয়ে সাম্প্রতিক রিফিলের তারিখ
ক্যানভাস এবং ভেগা-এর মতো দুর্দান্ত নতুন প্রোজেক্ট সহ সিস্টেমে আরও অনেক অ্যাড-অনের জন্য জায়গা রয়েছে, কিন্তু আপাতত, এটি কাজটি সম্পন্ন করে।