একটি পূর্বের ব্লগে, আমি বিস্তারিত করেছি কিভাবে আমার অফিসের কোল্ড ব্রু কফি কেগের ওজন ব্যবহার করে Slack অ্যালার্ট পাঠিয়েছিলাম যাতে আমরা জানতে পারি কখন কোল্ড ব্রু কফি কেগ রিফিল প্রয়োজন।
এই দুই-ভাগের সিরিজের দ্বিতীয় অংশে, আমি দেখাব কিভাবে আমি স্কেলটি বানিয়েছিলাম। মূলত, আমি এমন কিছু চাইতাম যেটিতে খুব বেশি সময় এবং টাকা লাগে না, এবং ইতিমধ্যে আমাদের প্রয়োজন মেটাতে এমন কিছু উপলব্ধ ছিল না।
Elasticsearch কেগ সেটআপের প্রয়োজনীয়তা
প্রথমে, আমাকে প্রজেক্টের প্রয়োজনীয়তা ভাঙা পড়েছিল:
- সস্তা (<$১০০)
- ন্যূনতম কেয়ার এবং ফিডিং
- রিমোটলি ম্যানেজড
- কেগ লেভেল সহজে রিপোর্ট করবে
- প্রতিবার কেগ থেকে কোল্ড ব্রু নেওয়া হয়েছে কিনা তা নির্ধারণ করবে (একটি স্ট্রेच গোল)
- সর্বোচ্চ গুরুত্বপূর্ণ, এটিতে ন্যূনতম সময় লাগবে*
*আমার একটি ডে জব আছে এবং কেগ স্কেল বানানো আমার জব ডেসক্রিপশনে নেই।
প্রাথমিক গবেষণা
প্রথম চ্যালেঞ্জ ছিল কেগে ডেটা সংগ্রহ কীভাবে করবেন, কিন্তু কোন ডেটা সংগ্রহ করবেন সেটি বের করা।
কিছু ওপেন সোর্স প্রজেক্ট কেগ মনিটর করার জন্য উপলব্ধ, এবং একটু গবেষণা করার পর, মাপার দুটি প্রধান পদ্ধতি পেলাম:
- ওজন দিয়ে
- ফ্লো রেট মিটার ব্যবহার করে
যা ইতিমধ্যে উপলব্ধ তার অধিকাংশ ফ্লো রেট মিটার ব্যবহার করে। ফ্লো রেট দিয়ে কেগ "খালি" কিনা তা নির্ধারণ করা একটু কঠিন এবং কেগ কখন চেঞ্জ করা হয়েছে তা নির্ধারণ করতে কিছু ইউজার ইন্টারভেনশন প্রয়োজন। প্লাস, এটিকে আসলে কফি লাইনে একটি ডিভাইস বসাতে হয়, যেটির নিজস্ব পটেনশিয়াল ইস্যু আছে।
তাই উদাহরণের অভাব 있음েও, আমরা স্কেল দিয়ে শুরু করতে সিদ্ধান্ত নিলাম এবং ওজন দিয়ে কেগ লেভেল নির্ধারণ করতে।
কেগ স্কেল
আসল স্কেল হার্ডওয়্যারের জন্য, আমি অফ-দ-শেলফ সমাধান খুঁজেছিলাম যা রাসবেরি পাই ছোট কম্পিউটারের সাথে সংযোগ করতে পারে। वहाँ টনখানি WIFI এবং ব্লুটুথ স্কেল আছে, অধিকাংশ কনটিনিউয়াস রিড নয়; বা ব্যাটারি চালিত; বা ইন্টারফেস করার জন্য বড় ঝামেলা। কিছু কেগ-স্পেসিফিক স্কেল আছে, কিন্তু সেগুলো খুব ব্যয়বহুল।
একবার আবার, আমাকে DIY-তে যেতে পড়ল।
আমি রাসবেরি পাই দিয়ে বিল্ড করার অভিজ্ঞতা রাখি, তাই আমাকে রাসবেরি পাই দিয়ে একটি স্কেল বানাতে হার্ডওয়্যার প্রয়োজন ছিল। আমি Amazon-এ ৫০kg লোড সেল এবং HX711 앰প্লিফায়ার এর একটি সেট পেলাম ঠিক এই ইউজ কেসের জন্য।
Arduino-র সাথে HX711 দিয়ে স্কেল বানার অনেক রেফারেন্স আছে কিন্তু রাসবেরি পাই-এর জন্য অনেক কম। ভাগ্যভরে, আমি Instructables-এ টিউটোরিয়াল এবং user tatobari-এর GitHub রিপো পেলাম যাতে কিছু পাইথন HX711 ইউটিলিটি ছিল যা কাজে লাগবে।
সমগ্র আর্কিটেকচার
প্রথমে, আমাকে পুরো সিস্টেম কীভাবে দেখাবে তার একটি সিম্পল স্কেম্যাটিক তৈরি করতে পড়ল:

হার্ডওয়্যার বিল্ড
প্রথম চ্যালেঞ্জ ছিল একটি স্কেল খুঁজে বের করা যেটি কেগের নিচে রাখা যায় এবং কেগেরেটরে ফিট হয় এবং ১৫০lb কেগের ওজন ধারণ করতে যথেষ্ট স্টার্ডি।
আমি একাধিক ডিজাইন এবং রিইনফোর্সমেন্ট মেথড ট্রাই করলাম, কিন্তু সেগুলো অস্থির ছিল বা অতিরিক্ত থিকনেস যোগ করতো যা চূড়ান্তে টপ টিউবগুলোর ওপর প্রেশার সৃষ্টি করত।
চূড়ান্ত বিল্ডে পুরনো গ্রিল গ্রেট, কিছু ছোট স্টীল সি চ্যানেল হার্ডওয়্যার স্টোর থেকে গ্রেট রিইনফোর্স করতে, এবং অনেক ডাকটেপ এবং জিপ টাই ছিল।

এটি পারফেক্ট নয় কিন্তু আমাদের সকল ডিজাইন রিকোয়ারমেন্ট পূরণ করল (কারো কাছে কেমন একটু স্ট্রাঙ্গার সমাধান আছে মনে হয়?)
ওয়ারিং আপ
আমাদের HX711 বোর্ডকে রাসবেরি পাই-এর সাথে ৪টি GPIO পিন দিয়ে সংযোগ করতে পড়ল এবং স্কেলকে HX711 বোর্ডের সাথে Wheatstone bridge-এর চারটি তার দিয়ে সংযোগ করতে পড়ল (Instructables দেখুন)।
কেগেরেটর সুপার স্পেস-কনস্ট্রেইনড এবং কেগ লোড/আনলোড করার সময় বেশ রাফ হয়ে যেতে পারে, তাই HX711 এবং রাসবেরি পাই কেগের সাথে রাখা ভালো ডিসিশন মনে হয়নি। বরং, আমরা রাসবেরি পাই এবং HX711 কেগেরেটরের বাইরে ঠিক বगलেই রেখেছি, স্ট্যান্ডার্ড ক্যাবল (ভালো পুরনো cat 5 বা 6) ব্যবহার করে আসল স্কেল থেকে HX711-এ লং রান করার জন্য। স্কেলের পাশে একটি RJ45 কনেক্টর এবং HX711-এ অন্যটি যোগ করুন। এখন আমরা যেকোনো পুরনো ইথারনেট ক্যাবল ব্যবহার করে দুটো সংযোগ করতে পারি।
HX711 এবং রাসবেরি পাই-এর মধ্যে, যেহেতু সেগুলো একে অপরের পাশে আছে, আমরা স্ট্যান্ডার্ড জাম্পার তার ব্যবহার করলাম।
সফটওয়্যার
রাসবেরি পাই ব্যবহার মানে আমি লিনাক্সে চলে যেকোনো জিনিস প্রায় সকল কিছু ব্যবহার করতে পারি সফটওয়্যারের জন্য।
প্রথম টুকরো হল GPIO-র মাধ্যমে HX711 앰প্লিফায়ারের সাথে ইন্টারফেস করার কোড।
যদিও অধিকাংশ HX711 প্রজেক্ট Arduino-র জন্য, আপনি সবও কিছু দিচেক GitHub রিপো পাবেন যাতে রাসবেরি পাই-এর জন্য HX711 কোড আছে, যেন পাইথনে লেখা এইটা।
HX711 উদাহরণ কোড ব্যবহার করে, আমি একটি ছোট পাইথন ইউটিলিটি লিখলাম যা পিরিয়ডিক ওজন রিডিং একটি ফাইলে লেখে যেটি আমরা Elasticsearch-এ শিপ করতে পারি। আমি এটি কনফিগ ফাইল থেকে কাজ করতে এক্সপ্যান্ড করলাম এবং কিছু টেস্টিং মোড যোগ করলাম, কিন্তু此之外 এটি বেশ সিম্পল কোড।
Elasticsearch-এ ডেটা শিপিং
পরবর্তী, আমাকে ডেটা Elasticsearch-এ শিপ করতে পড়ল।
আমি Filebeat ব্যবহার করলাম ওজন ফাইলগুলো পড়তে এবং ডেটা Elasticsearch-এ শিপ করতে। আপনি পাইথন স্ক্রিপ্ট থেকে সরাসরি Elasticsearch-এ লিখতে পারেন; বা Logstash ব্যবহার করে ফাইলগুলো পড়তে; বা সরাসরি স্ক্রিপ্ট কল করে অন-দ-ফ্লাই রিডিং পেতে। Filebeat সুপার লাইটওয়েট এবং সহজেই কম কাজে চলে।
Filebeat ব্যবহার করার একমাত্র ছোট জটিলতা হল Elastic ডিফল্টভাবে Raspberry Pi/ARM-এর জন্য বাইনারি প্রদান করে না। আমাকে এটি বিল্ড করতে পড়ল।
ভাগ্যভরে, Elastic সাইটের ইনস্ট্রাকশন খুব স্পষ্ট। যতক্ষণ আপনি Filebeat-এর যে ভার্সনটি ব্যবহার করতে চান সেটির সাথে মেলে এমন Go-এর সঠিক ভার্সন পিক করবেন, বিল্ডটি বেশ স্ট্রেইটফরওয়ার্ড হওয়া উচিত। (যেটি সাধারণত ডেভেলপার গাইডে কল আউট করা থাকে, সেই পেজের ডান পাশে সঠিক Beat ভার্সন সিলেক্ট করুন নিশ্চিত করুন।)
সকল কম্পোনেন্ট কাজ করলে, চূড়ান্ত ধাপ ছিল স্কেল রিডার স্ক্রিপ্ট এবং Filebeat কে systemd সার্ভিস হিসেবে কনফিগার করা এবং বুটে স্টার্টআপ করা।
ডেটা ইন্ডেক্সিং
আমাকে ওজন ডেটা Elasticsearch-এ ইন্ডেক্স করতে পড়ল। Filebeat ব্যবহার করে, আমি ডেটা Elasticsearch সাইডে ইনজেস্ট পাইপলাইন ব্যবহার করে পার্স করতে সিদ্ধান্ত নিলাম। একবার আবার, Logstash একটি অপশন, কিন্তু লক্ষ্য ছিল রাসবেরি পাই-এ(absolutely minimum load তৈরি করা যাতে আমি এটিকে লোকাল ড্যাশবোর্ড হিসেবে ব্যবহার করতে পারি এবং ভবিষ্যতে আরও সেন্সর (যেমন টেম্পারেচার) দিয়ে এক্সপ্যান্ড করতে পারি।
প্রতি কয়েক সেকেন্ডে, সিম্পল ওজন রিডার নিচের মতো লগ লাইন আউটপুট করে: "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 খুলতে পারলাম, কয়েকটি ইউজার সেটআপ করতে পারলাম, এবং তারপর ডেটা শিপিং শুরু করতে পারলাম। তার বাইরে, একমাত্র আসল প্রয়োজনীয়তা হল একটি ফাংশনাল Elasticsearch ক্লাস্টার Kibana-সহ।
শেষ কথা
সবকিছু সেটআপ ও ইন প্লেস থাকলে, আমার যা করতে পড়ল সেটি ছিল প্লাগ ইন করা।
Voila! এটা শুধু চলে।
আপনি নিজেই প্রাথমিক ফলাফল দেখতে পারেন:

আমরা এক সিম্পল গেজ পেলাম যেটি দেখাচ্ছে:
- কেগে বাকি কোল্ড ব্রু শতাংশ
- একটি Timelion ট্রেন্ডলাইন
- সাম্প্রতিক রিফিলের তারিখ
সিস্টেমে অনেক আরও অ্যাড-অনের জায়গা আছে, Canvas এবং Vega-এর মতো কুল নিউ প্রজেক্টসহ, কিন্তু ফিলহাল, এটি কাজ করে।