Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

การสร้างระบบแจ้งเตือนมาตราส่วนถัง

การสร้างระบบแจ้งเตือนมาตราส่วนถัง

ในบล็อกที่แล้ว ฉันได้ให้รายละเอียดเกี่ยวกับวิธีการใช้น้ำหนักของถังกาแฟสกัดเย็นในสำนักงานของเราเพื่อส่งการแจ้งเตือน Slack เพื่อแจ้งให้เราทราบเมื่อเราใกล้หมดและต้องการเติมถังกาแฟแบบเย็น

ในตอนที่ 2 ของซีรีส์สองตอนนี้ ฉันจะแสดงให้คุณเห็นว่าฉันสร้างมาตราส่วนได้อย่างไร โดยหลักแล้ว ฉันต้องการบางสิ่งบางอย่างโดยที่ไม่มีเวลาและเงินลงทุนมากนัก และไม่มีสิ่งใดที่ตรงกับความต้องการของเราอยู่แล้ว

ข้อกำหนดการตั้งค่าถัง Elasticsearch

ก่อนอื่น ฉันต้องแยกย่อยข้อกำหนดสำหรับโปรเจ็กต์:

  • ราคาถูก (<$100)
  • ดูแลและให้อาหารน้อยที่สุด
  • จัดการจากระยะไกล
  • รายงานระดับถังอย่างง่ายดาย
  • กำหนดทุกครั้งที่มีการสกัดเย็นจากถัง (เป้าหมายที่ยืดออก)
  • ที่สำคัญที่สุดคือต้องใช้เวลาน้อยที่สุด*

*ฉันมีงานประจำและการสร้างเครื่องชั่งถังไม่อยู่ในรายละเอียดงานของฉัน

การวิจัยเบื้องต้น

ความท้าทายแรกคือการคิดให้ออกว่าไม่เพียงแต่จะรวบรวมข้อมูลบนถังได้อย่างไร แต่ยังต้องรวบรวมข้อมูลใดบ้าง

โครงการโอเพ่นซอร์สบางโครงการมีไว้สำหรับถังตรวจสอบ และหลังจากการวิจัยเพียงเล็กน้อย วิธีหลักสองวิธีในการวัดก็คือ

  • น้ำหนัก
  • ใช้เครื่องวัดอัตราการไหล

สิ่งที่มีอยู่แล้วส่วนใหญ่ใช้เครื่องวัดอัตราการไหล การพิจารณาว่าถังนั้น “ว่างเปล่า” หรือไม่ด้วยอัตราการไหลนั้นยากกว่าเล็กน้อย และคุณจำเป็นต้องมีการแทรกแซงจากผู้ใช้เพื่อพิจารณาว่าถังนั้นมีการเปลี่ยนแปลงเมื่อใด นอกจากนี้ยังต้องวางอุปกรณ์ในสายกาแฟจริงซึ่งมีปัญหาที่อาจเกิดขึ้นเอง

ดังนั้น แม้จะไม่มีตัวอย่างให้ยืม เราก็เริ่มด้วยเครื่องชั่งและใช้น้ำหนักเพื่อกำหนดระดับถัง

ขนาดถัง

สำหรับฮาร์ดแวร์ที่มีมาตราส่วนจริง ฉันมองหาโซลูชันที่ไม่มีวางจำหน่ายทั่วไปที่สามารถเชื่อมต่อกับคอมพิวเตอร์ขนาดเล็ก เช่น Raspberry Pi มี WiFi และ Bluetooth มากมาย แต่ส่วนใหญ่ไม่ได้อ่านอย่างต่อเนื่อง หรือใช้พลังงานจากแบตเตอรี่ หรือความยุ่งยากในการเชื่อมต่อ เครื่องชั่งเฉพาะถังมีอยู่สองสามเครื่อง แต่ราคาแพงเกินไป

ฉันต้องไป DIY อีกครั้ง

ฉันมีประสบการณ์ในการสร้างด้วย Raspberry Pi ดังนั้นฉันจึงต้องใช้ฮาร์ดแวร์เพื่อสร้างมาตราส่วนด้วย ฉันพบชุดโหลดเซลล์ขนาด 50 กก. พร้อมแอมพลิฟายเออร์ HX711 ใน Amazon สำหรับกรณีการใช้งานนี้อย่างแท้จริง

มีข้อมูลอ้างอิงมากมายสำหรับการสร้างมาตราส่วน Arduino ด้วย HX711 แต่มีน้อยกว่ามากสำหรับ Pi โชคดีที่ฉันพบบทช่วยสอนจาก Instructables ควบคู่ไปกับ Github repo จากผู้ใช้ tatobari ที่รวมยูทิลิตี้ python HX711 บางส่วนที่เหมาะกับการเรียกเก็บเงิน

สถาปัตยกรรมโดยรวม

ก่อนอื่น ฉันต้องสร้างแผนผังง่ายๆ ว่าระบบโดยรวมจะมีลักษณะอย่างไร:

การสร้างระบบแจ้งเตือนมาตราส่วนถัง

การประกอบฮาร์ดแวร์

ความท้าทายแรกคือการหาเครื่องชั่งที่บางพอที่จะวางไว้ใต้ถังและยังคงพอดีกับถังที่แข็งแรงพอที่จะไม่งอภายใต้น้ำหนักของถังขนาด 150 ปอนด์

ฉันลองใช้การออกแบบและวิธีต่างๆ มากมายเพื่อเสริมสเกล แต่ก็ไม่เสถียรหรือเพิ่มความหนามากเกินไปจนทำให้เกิดแรงกดบนท่อบนได้ในที่สุด

โครงสร้างขั้นสุดท้ายประกอบด้วยตะแกรงตะแกรงแบบเก่า ช่องเหล็ก c ชิ้นเล็กๆ จากร้านฮาร์ดแวร์เพื่อเสริมตะแกรง และเทปพันสายไฟ และสายรัดซิป
การสร้างระบบแจ้งเตือนมาตราส่วนถัง การสร้างระบบแจ้งเตือนมาตราส่วนถัง

มันไม่สมบูรณ์แบบ แต่ในที่สุดก็ตรงตามข้อกำหนดการออกแบบทั้งหมดของเรา (ใครมีโซลูชันที่แข็งแกร่งกว่านี้อยู่ในใจ)

กำลังเดินสาย

เราจำเป็นต้องเชื่อมต่อบอร์ด HX711 กับ Raspberry pi ผ่านพิน GPIO 4 พิน และสเกลกับบอร์ด HX711 ผ่านสายไฟสี่เส้นจาก Wheatstone bridge (ดูคำแนะนำ)

เครื่อง Kegerator มีพื้นที่จำกัดมาก และอาจค่อนข้างหยาบเมื่อโหลดและยกเลิกการโหลดถัง ดังนั้นจึงไม่ใช่การตัดสินใจที่ดีที่จะหา HX711 และราสเบอร์รี่ pi เข้ากับถัง แต่เราวาง Raspberry Pi และ HX711 ไว้ข้างๆ นอก kegerator โดยใช้สายเคเบิลมาตรฐาน (cat 5 หรือ 6) ตัวเก่าที่ดีเพื่อให้ทำงานได้นานขึ้นจากสเกลจริงไปยัง HX711 เพิ่มขั้วต่อ RJ45 ที่ปลายด้านหนึ่งและ HX711 ที่ปลายอีกด้านหนึ่ง ตอนนี้เราสามารถใช้สาย  Ethernet แบบเก่าเพื่อเชื่อมต่อทั้งสองได้

ระหว่าง HX711 กับ Raspberry pi เนื่องจากพวกมันอยู่ติดกัน เราจึงใช้สายจัมเปอร์มาตรฐาน

ซอฟต์แวร์

การใช้ Raspberry Pi หมายความว่าฉันสามารถใช้อะไรก็ได้ที่ทำงานบน Linux สำหรับซอฟต์แวร์

ชิ้นแรกคือรหัสสำหรับเชื่อมต่อกับแอมพลิฟายเออร์ HX711 ผ่าน GPIO

แม้ว่าโครงการ HX711 ส่วนใหญ่จะมีไว้สำหรับ Arduino แต่คุณยังคงสามารถหาที่เก็บ GitHub ได้ในปริมาณที่เหมาะสมด้วยรหัส HX711 สำหรับ Raspberry Pi เช่นอันนี้ที่เขียนด้วยภาษา Python

เมื่อใช้โค้ดตัวอย่าง HX711 ฉันเขียนยูทิลิตี้ Python ขนาดเล็กที่เขียนการอ่านน้ำหนักเป็นระยะไปยังไฟล์ที่เราจัดส่งไปยัง Elasticsearch ได้ ฉันขยายมันให้ทำงานจากไฟล์ปรับแต่งและรวมโหมดการทดสอบสองสามโหมด แต่นอกเหนือจากนั้นมันเป็นโค้ดที่ค่อนข้างง่าย

ส่งข้อมูลไปยัง Elasticsearch

ต่อไป ฉันต้องส่งข้อมูลไปยัง Elasticsearch

ฉันใช้ Filebeat เพื่ออ่านไฟล์น้ำหนักแล้วส่งข้อมูลไปยัง Elasticsearch คุณสามารถเขียนโดยตรงไปยัง Elasticsearch จากสคริปต์ Python หรือใช้ Logstash เพื่ออ่านไฟล์ หรือเรียกสคริปต์โดยตรงเพื่ออ่านได้ทันที Filebeat มีน้ำหนักเบามากและต้องการงานน้อยที่สุด

ความซับซ้อนเพียงเล็กน้อยของการใช้ Filebeat คือ Elastic ไม่ได้จัดเตรียมไบนารีสำหรับ Raspberry Pi/ARM ตามค่าเริ่มต้น ฉันต้องสร้างมันขึ้นมา

โชคดีที่คำแนะนำในไซต์ Elastic ค่อนข้างชัดเจน ตราบใดที่คุณเลือก Go เวอร์ชันที่ถูกต้องซึ่งตรงกับเวอร์ชันของ Filebeat ที่คุณต้องการใช้ บิลด์ควรตรงไปตรงมา (แม้ว่าโดยทั่วไปจะมีระบุไว้ในคู่มือสำหรับนักพัฒนาซอฟต์แวร์ อย่าลืมเลือกเวอร์ชัน Beat ที่ถูกต้องที่ด้านขวาของหน้านั้น)

เมื่อส่วนประกอบทั้งหมดทำงาน ขั้นตอนสุดท้ายคือกำหนดค่าสคริปต์ตัวอ่านมาตราส่วนและ Filebeat เป็นบริการ systemd และให้เริ่มทำงานเมื่อเปิดเครื่อง

การจัดทำดัชนีข้อมูล

ฉันจำเป็นต้องจัดทำดัชนีข้อมูลน้ำหนักนั้นใน Elasticsearch เมื่อใช้ Filebeat ฉันตัดสินใจแยกวิเคราะห์ข้อมูลทางฝั่ง Elasticsearch โดยใช้ไพพ์ไลน์การส่งผ่านข้อมูล อีกครั้ง Logstash เป็นตัวเลือก แต่เป้าหมายคือการสร้างโหลดขั้นต่ำที่แน่นอนบน Raspberry Pi ดังนั้นฉันจึงสามารถใช้เป็นแดชบอร์ดในพื้นที่และอาจขยายได้ในภายหลังด้วยเซ็นเซอร์เพิ่มเติม (เช่นอุณหภูมิ)

ทุกๆ สองสามวินาที ตัวอ่านน้ำหนักแบบธรรมดาจะแยกบรรทัดบันทึกดังนี้:“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 }}"
  	}
	}
  ]
}

ผลลัพธ์คือเอกสารทุก ๆ สองสามวินาทีที่มี "น้ำหนัก" ทศนิยมและการประทับเวลา พร้อมด้วยข้อมูลเมตาต่างๆ ที่ Filebeat รวมไว้ (ซึ่งเราสามารถใช้ในภายหลังได้หากเราขยายไปยังหลายถัง)

คลัสเตอร์ Elasticsearch

ObjectRocket ทำให้ส่วนนี้ง่ายมาก เนื่องจากฉันสามารถสร้างคลัสเตอร์พื้นฐาน เปิด ACL สองสามตัว ตั้งค่าผู้ใช้สองสามราย จากนั้นเพียงแค่เริ่มข้อมูลการจัดส่ง นอกเหนือจากนั้น ข้อกำหนดที่แท้จริงเพียงอย่างเดียวที่นี่คือคลัสเตอร์ Elasticsearch ที่ใช้งานได้กับ Kibana

ปิดท้าย

เมื่อตั้งค่าและจัดวางทุกอย่างเรียบร้อยแล้ว ทั้งหมดที่ฉันต้องทำคือเสียบปลั๊ก

โว้ว! มันก็แค่วิ่ง

คุณสามารถเห็นผลลัพธ์เบื้องต้นได้ด้วยตัวคุณเอง:

การสร้างระบบแจ้งเตือนมาตราส่วนถัง

เราลงเอยด้วยมาตรวัดง่ายๆ เพื่อแสดงให้เราเห็น:

  • เปอร์เซ็นต์การชงเย็นที่เหลืออยู่ในถัง
  • เส้นแนวโน้มของ Timelion
  • วันที่เติมล่าสุด

ระบบมีที่ว่างสำหรับส่วนเสริมอีกมากมาย ด้วยโปรเจ็กต์ใหม่เจ๋งๆ เช่น Canvas และ Vega แต่สำหรับตอนนี้ก็พร้อมทำงานแล้ว