สวัสดีครับ วันนี้ผมจะมารีวิวเซ็นเซอร์ในซีรี่ย์ Agrosense ซึ่งเป็นกลุ่มของเซ็นเซอร์ไร้สายที่รับส่งข้อมูลแบบ LoRaWAN ของ MakerFabs ครับ โดยคราวนี้ผมได้รับเซ็นเซอร์สำหรับการวัดข้อมูลสภาพแวดล้อมมา 4 ชุด และได้รับเกตเวย์ (gateway) สำหรับการรับส่งข้อมูลแบบ LoRaWAN มาเพิ่มอีก 1 ชุด ตามรายการด้านล่างนี้ครับ
- AgroSense LoRaWAN Barometric Pressure Sensor สำหรับการวัดความกดอากาศ (barometric pressure) สามารถวัดค่าได้ในช่วง 300 ถึง 1100 hPa (±0.12 hPa) มีความละเอียด 0.01 hPa
- AgroSense LoRaWAN Light Intensity Sensor สำหรับการวัดความเข้มแสง (light intensity) ในช่วง 1 ถึง 65535 lx (±1 lx) และความละเอียด ±20%
- AgroSense LoRaWAN Temperature & Humidity Sensor สำหรับการวัดอุณหภูมิในช่วง -40℃ ถึง 85℃ (±0.2℃ ) และความชื้นในช่วง 0 ถึง 100 %RH (±0.2%RH)
- AgroSense LoRaWAN Industrial Temperature Sensor วัดอุณหภูมิสำหรับงานอุตสาหกรรมในช่วง -40℃ ถึง 200℃ (±0.1 ℃) ความละเอียด ±0.4%
- อุปกรณ์สุดท้ายที่ได้รับคือ SenseCAP M2 LoRaWAN Indoor Gateway จาก Seeed Studio ซึ่งเป็นเกตเวย์สำหรับการเชื่อมต่อโหนด LoRaWAN ที่สามารถรับส่งข้อมูลกับ server ได้หลายแบบ รองรับความถี่ 865 ถึง 923 MHz
นอกจากคุณสมบัติการเขียนไปข้างบนนี้ เซ็นเซอร์ชุดนี้ก็มีคุณสมบัติบางอย่างที่เหมือนกันนั่นคือเข้ากันได้ (compatible) กับเครือข่าย LoRaWAN หลายราย เช่น AWS และ The Things Network, มีระยะการสื่อสารข้อมูลในเขตเมืองได้ 2 กิโลเมตร และ 5 กิโลเมตรในแนวสายตา, ทนทานต่อการใช้งานในสภาพแวดล้อมที่มีอุณหภูมิต่ำได้ถึง -40℃ และสูงสุดที่ 85℃ รวมทั้งกันน้ำที่ระดับ IP68 และส่วนของเซ็นเซอร์นั้นทำงานด้วยแบตเตอรี่ขนาด AAA 2 ก้อนและมีอายุการใช้งานได้นานอย่างน้อย 2 ปี นอกจากนั้นยังมีข้อมูล DEV EUI, APP EUI และ APP Key ให้พร้อมใช้ ซึ่งจะช่วยให้การติดตั้งทำได้สะดวกขึ้น
เปิดกล่อง
ตัวเซ็นเซอร์ชุดนี้มีช่วงความถี่ให้เลือกใช้งานได้ 2 ช่วง คือ EU868 และ US915 ในขณะที่ตัวเกตเวย์นั้นมีความถี่ให้เลือกใช้งานได้ 4 ช่วง คือ EU868, US915, AS923 และ AU915 ซึ่งผมได้เลือก US915 มาใช้ในการรีวิวครั้งนี้ ผมรออุปกรณ์ตัวอย่างประมาณหนึ่งสัปดาห์ก็ได้รับพัสดุกล่องใหญ่ส่งมาจากประเทศจีน ภายในบรรจุแยกอุปกรณ์มารวม 5 กล่อง แยกเป็นตัว gateway 1 กล่อง และ sensor 4 กล่อง ทั้งหมดเป็นกล่องกระดาษลูกฟูก แข็งแรงและแน่นหนาดีตามที่ควรจะเป็น
โดยกล่องที่บรรจุเซ็นเซอร์ทุกกล่องจะมีมอดูลเซ็นเซอร์อยู่ข้างใน 1 ตัว และสำหรับ AgroSense LoRaWAN Barometric Pressure Sensor และAgroSense LoRaWAN Temperature & Humidity Sensor จะมีเสาอากาศที่มีขั้วต่อแบบ SMA เพิ่มมาให้อีกกล่องละ 1 เสา
สำหรับตัว SenseCAP M2 LoRaWAN Indoor Gateway นั้นบรรจุมาในกล่องพร้อมด้วย AC/DC adaptor 12V 2000mAh และเสาอากาศ SenseCAP LoRa Antenna ระบุย่านความถี่ไว้ที่ 860 – 930 MHz และมีกำลังขยาย 3dBi
เตรียม Sensors
ผมเตรียมเซ็นเซอร์ชุดนี้ตามรายละเอียดที่แสดงไว้ในคู่มือคำแนะนำการใช้งานในเว็บไซต์ของ MakerFabs ซึ่งสิ่งที่ผู้ใช้ต้องทำหลัก ๆ ก็เพียงแค่ใส่แบตเตอรี่เท่านั้น และเนื่องจากตัวอย่างเซ็นเซอร์ที่ผมได้รับมา 4 ชุดนั้นมีอยู่ 2 ชุดที่มีเสาอากาศมาให้ ดังนั้นผมจึงเลือก AgroSense LoRaWAN Barometric Pressure Sensor และ AgroSense LoRaWAN Temperature & Humidity Sensor มาทดสอบเบื้องต้น ผมเริ่มด้วยการใส่เสาอากาศ ขันให้แน่นพอตึงมือ จากนั้นไขสกรูเปิดฝาด้านบนออก พบอุปกรณ์ภายในดังภาพด้านล่างนี้ครับ จากนั้นจึงใส่แบตเตอรี่ AAA 1.5V จำนวน 2 ก้อนเข้าไปในช่องใส่ หลังจากนั้นจึงอ่านคำแนะนำต่อก็พบว่าให้ทดลองกดปุ่ม RST ว่า LED บนบอร์ดติดหรือไม่ ผมทดลองทำตามพบว่า LED ติดก็น่าจะแสดงว่าอุปกรณ์พร้อมทำงานแล้ว
โดยครั้งแรกที่ผมทดลองใส่แบตเตอรี่นั้นผมไม่ได้สังเกตุให้ดีจึงไม่รู้ว่าอุปกรณ์ทำงานได้หรือยังเพราะตัวเซ็นเซอร์นี้ไม่มีสวิตซ์เปิด/ปิด แต่เมื่อทดลองถอดแล้วใส่แบตเตอรี่ใหม่ก็พบว่าเมื่อใส่แบตเตอรี่แล้ว LED จะกระพริบสั้นมาก ๆ 1 ครั้งเป็นสัญลักษณ์ให้เรารู้ครับ
เตรียม Gateway
SenseCAP Mate APP และ SenseCAP Portal สามารถติดตั้งได้ง่ายเพื่อควบคุม SenseCAP M2 LoRaWAN Indoor Gateway และต้องดำเนินการไม่กี่ขั้นตอน ตอนที่เขียนรีวิวนี้ผมพบว่าลิงค์ที่จะให้กดไป SenseCAP Portal ที่มีอยู่นั้นชี้ไปที่ Discord และใช้งานไม่ได้ ดังนั้นผมจึงต้องไปค้นหาด้วย search engine เพิ่มและพบว่าในหน้าเว็บไซต์ของ Seeed Studio มีรายละเอียดมากกว่า ลิงค์ไปยัง SenseCAP Portal ใช้งานได้ และมีคู่มือเป็น pdf ให้อ่านหลายไฟล์ ดังนั้นเนื้อหาในหัวข้อนี้จึงเป็นผลจากการพยายามทำตามรายละเอียดในเอกสาร Quick Start for SenseCAPGateway&Sensors ครับ
ขั้นตอนแรกของผมก็คือต่อเสาอากาศเข้ากับตัวเกตเวย์จากนั้นผมต่อ adaptor จ่ายไฟให้เรียบร้อยก็พบว่า LED ด้านบนจะแสดงสีเขียวและกระพริบช้า ๆ ซึ่งหมายถึงอุปกรณ์กำลังบูตอยู่ หลังจากนั้นจะแสดงสีแดงซึ่งหมายความว่ายังเชื่อมต่ออินเตอร์เน็ตไม่ได้ ตามคู่มือบอกว่าเราสามารถเข้าไปตั้งค่าเกตเวย์ได้ทั้งแบบใช้สาย LAN เชื่อมเกตเวย์เข้ากับเราเตอร์โดยตรง หรือเราอาจจะเปิดโหมดการทำงาน AP ของเกตเวย์ได้ด้วยการกดปุ่มด้านหลังของเกตเวย์ค้างไว้ 5 วินาทีหรือจนกว่าไฟจะกระพริบช้า ๆ เราก็จะได้ Wi-Fi AP มาใช้งาน โดยชื่อของ AP นี้จะมีรูปแบบเป็น SenseCAP_xxxxxx โดย xxxxxx เป็นข้อมูล 6 หลักสุดท้ายของ MAC address ของอุปกรณ์ที่แสดงไว้ที่ป้ายด้านหลังของเกตเวย์ ซึ่งผมได้ทดลองทำทั้ง 2 แบบและสามารถใช้คอมพิวเตอร์และสมาร์ทโฟนเชื่อมต่อกับเกตเวย์ได้โดยไม่มีปัญหาใด ๆ และหลังจากเตรียมเครือข่ายเรียบร้อยแล้ว ผมจึงเปิดเว็บเบราเซอร์แล้วเพื่อ login เข้าระบบโดยใช้ข้อมูล username และ password ซึ่งจะพิมพ์ไว้ที่ฉลากด้านหลังของตัวเกตเวย์เช่นเดียวกัน
หลังจาก login เข้าสู่ระบบได้แล้วผมก็พบกับหน้าแรกที่แสดงภาพที่น่าจะแปลความได้ว่ายังไม่มีการเชื่อมต่ออินเตอร์เน็ต และมีข้อมูลสถานะอื่น ๆ ตามตัวอย่างในภาพด้านล่างนี้ครับ
ดังนั้นผมจึงทำตามคู่มือต่อเพื่อพยายามเชื่อมเกตเวย์เข้ากับอินเตอร์เน็ต โดยผมไปที่หน้า Network แล้วเลือก Wireless เพื่อสแกนหา SSID ที่ต้องการใช้งาน เมื่อพบ SSID ที่ต้องการแล้วจึงเลือก Join Network เสร็จแล้วใส่ข้อมูลที่จำเป็น จากนั้นกดปุ่ม submit แล้วกดปุ่ม Save & Apply เพื่อระบบนำค่าไปใช้ หลังจากรอสักครู่ก็พบว่าเกตเวย์เชื่อมต่อเข้ากับ AP ของผมเรียบร้อย สังเกตุพบว่าสถานะของ LED นั้นแสดงสีเขียวค้างซึ่งหมายความว่าตัวเกตเวย์ออนไลน์ได้แล้ว
หลังจากนั้นผมจึงไปตั้งค่า LoraWAN Network Settings เพื่อกำหนดเครือข่ายปลายทางที่จะส่งค่าไป โดยมีตัวเลือก 4 แบบประกอบด้วย SenseCAP, Packet Forwarder, Basic Station และ Local Network Server ซึ่งผมพบว่าค่าตั้งต้นกำหนดไว้เป็น SenseCAP ตามตัวอย่างในภาพด้านล่างนี้
ทดสอบการเชื่อมต่อด้วย SenseCAP Mate และ SenseCAP Portal
เนื่องจากในเว็บไซต์และคู่มือแนะนำให้ทดลองเชื่อมต่อและกำหนดค่าต่าง ๆ ด้วย SenseCAP Mate ดังนั้นผมจึงทดลองดาวน์โหลดและติดตั้งโปรแกรม SenseCAP Mate ลงบทสมาร์ทโฟนของผมที่ใช้ระบบปฏิบัติการ Android หลังจากนั้นจึงพยายามสมัครสมาชิก ครั้งแรกที่ทดลองผมพบว่าการสมัครสมาชิกใหม่นั้นทำได้สำเร็จ แต่ผมสามารถเข้าสู่ระบบไม่ได้ (ผมไม่ได้ตรวจหาสาเหตุและผมลืม capture หน้าจอไว้) ดังนั้นผมจึงทดลองใช้คอมพิวเตอร์ทำการสมัครสมาชิกใหม่กับเว็บไซต์ SenseCAP Portal โดยตรง และครั้งนี้พบว่าสามารถเข้าระบบได้ เมื่อเข้าไปครั้งแรกก็พบกันหน้า dashboard ของ SenseCAP Portal ตามภาพด้านล่างนี้
หลังจากนั้นผมจึงนำ username และ password มาทดสอบใช้งานบนสมาร์ทโฟนอีกครั้ง ครั้งนี้ผมสามารถเข้าสู่ระบบได้ และหลังจากนั้นจึงเพิ่มข้อมูลเกตเวย์เข้าไปในระบบ ซึ่งก็สามารถทำได้โดยไม่พบปัญหาใด และเห็นข้อมูลสถานะของเกตเวย์เป็นออนไลน์ได้ตามภาพด้านล่างนี้
เสร็จแล้วผมจึงกลับเข้าหน้าต่างหลักของ SenseCAP Portal แล้วค้นหาอุปกรณ์ด้วยการใส่ข้อมูลที่จำเป็นของเกตเวย์ซึ่งพบว่าระบบสามารถแสดงข้อมูลเกตเวย์ ได้ตามที่ควรจะเป็นตามภาพด้านล่างนี้ และผมทดสอบการใช้งานตัวเกตเวย์ใน SenseCAP Portal เพียงเท่านี้ ส่วนการทดลองอื่น ๆ นั้นผมจะนำไปทดสอบต่อใน The Things Network (TTN) ตามรายละเอียดในหัวข้อต่อไปนี้ครับ
เตรียม The Things Network
ลำดับต่อมาเป็นการทดสอบการใช้งานอุปกรณ์ที่ได้รับทั้งหมดกับ The Things Network โดยขั้นแรกคือผมต้องสร้าง Application ใน The Things Network ขึ้นมาใหม่ โดยในตัวอย่างนี้ผมกำหนดชื่อ Application เป็น kp-test-app-2024 และเมื่อกรอกข้อมูลต่าง ๆ เสร็จแล้วจะได้หน้าต่างตามภาพด้านล่างครับ
หลังจากนั้นผมจึงกลับไปที่ตัวเกตเวย์ เพื่อตั้งค่า LoRaWAN Network Settings โดยเปลี่ยน Mode มาเป็น Packet Forwarder แล้วเพื่อให้อุปกรณ์ส่งข้อมูลต่ไปยัง The Things Network โดยผมนำข้อมูล Application ID และข้อมูลอื่น ๆ จาก The Things Network มากรอก เสร็จแล้วกด Save & Apply ตามภาพด้านล่างนี้
ขั้นตอนต่อไปเป็นการ Register gateway โดยผมนำค่า Gateway EUI ของอุปกรณ์มากรอกให้ครบ ใช้ชื่อ default ที่ระบบกำหนดมาให้ และเลือก Frequency plan เป็น United States 902-928 MHz, FSB 2 (used by TTN) เสร็จแล้วกด Register gateway
หลังจากนั้นจึงเพิ่มเซ็นเซอร์เข้าไปใส่ระบบ โดยการกลับไปที่หน้า Application เพื่อเลือก Application ID ที่สร้างไว้ จากนั้นกดปุ่ม Register end device แล้วกรอกข้อมูลต่าง ๆ ที่จำเป็นของเซ็นเซอร์แต่ละตัว โดยขั้นตอนการเตรียมเซ็นเซอร์ดูได้จากเว็บไซต์ของ MakerFabs ซึ่งมีพารามิเตอร์ที่ต้องกรอกเหมือนกันทุกชุดตามข้อมูลด้านล่างนี้
- Frequency plan: United States 902-928 MHz, FSB 2 (used by TTN)
- LoRaWAN version: LoRaWAN Specification 1.0.2
- Regional Parameters version: RP001 Regional Parameters 1.0.2
สำหรับข้อมูลในส่วน Provisioning information ของเซ็นเซอร์แต่ละตัวนั้นจะได้จากการนำค่า EUI/KEY ของเซ็นเซอร์มากรอก โดยตามด้านล่างนี้ จากนั้นกด Register end device
- APP EUI <–> JoinEUI
- DEV EUI <–> DevEUI
- APP KEY <–> AppKey
หน้าหลักของ end device มีให้เรากำหนดพิกัดของอุปกรณ์ได้ด้วย ดังนั้นผมจึงทดลองกำหนดพิกัดแบบ manual โดยวางอุปกรณ์ไว้แถว ๆ ที่ทำงานตามภาพด้านล่าง เสร็จแล้วกลับไปที่หน้าหลักของ end device รอสักครู่ก็พบว่า The Things Network สามารถรับข้อมูลจากอุปกรณ์ได้เรียบร้อยดี
หลักจากนั้นจึงกลับไปที่หน้าหลักของเกตเวย์ใน The Things Network แล้วรอสักครู่ผมก็เห็นข้อมูลวิ่งในกรอบ Live data ซึ่งแสดงว่าการตั้งค่าของอุปกรณ์ต่าง ๆ สมบูรณ์ ระบบทำงานได้เรียบร้อย ตามภาพด้านล่างนี้ครับ
ทดสอบดึงข้อมูลจาก The Things Network ด้วย Python
เท่าที่ค้นหาคร่าว ๆ ผมพบว่าถ้าผมต้องการเก็บบันทึกข้อมูลไว้ที่ The Things Network และจะนำมาใช้งานภายหลังได้นั้น ผมจะต้องมี API Key และจะต้องเปิดการใช้งาน Storage Ingetration ใน The Things Network ดังนั้นผมจึงไปที่ Applications → API keys แล้วกดปุ่ม + Add API key จากนั้นกรอกข้อมูลที่จำเป็นให้ครบก็จะได้ API Key มาใช้งาน
สำหรับการเปิด Storage Integration นั้นทำได้ด้วยการไปที่ Applications → Integrations → Storage Integration แล้วกดเปิดการใช้งาน โดยระบบจะแสดง URL endpoint สำหรับการเรียกใช้งานมาให้เราคัดลอกไปใช้ ซึ่งใน URL endpoint ก็มีจุดที่จะต้องทำ app-id, device-id และ type มาแก้ไขอีกคร้ังหนึ่งตามภาพตัวอย่างด้านล่างนี้ครับ
หลังจากปล่อยให้ end devices ส่งข้อมูลมาเก็บไว้ใน The Things Network มากพอสมควรแล้ว ผมก็ได้ทดสอบการดึงข้อมูลจาก The Things Network มาใช้งาน โดยการรีวิวนี้ผมเลือกที่จะทดลองกับภาษา Python โดยพยายามที่จะทดสอบด้วยการใช้เพียงแค่คลังโปรแกรมพื้นฐานอย่างเช่น Requests, JSON และ base64 เท่านั้น โดยโค๊ดตัวอย่างด้านล่างนี้แสดงส่วนของการส่งข้อความร้องขอตามข้อมูล endpoint ที่จดไว้ข้างบน และนำค่า API key ของ The Things Network เพิ่มเข้าไปในส่วน Bearer Autherization และค่าอื่น ๆ อีกเล็กน้อยที่ HTTP request header ครับ
ข้อมูลที่ The Things Network ตอบกลับมานั้นอยู่ในรูปแบบ JSON ซึ่งผมพบปัญหาเล็กน้อยคือรายการข้อมูลแต่ละรายการที่ส่งมานั้นไม่ได้จัดเก็บเป็น array ตามรูปแบบปกติของ JSON แต่จะแบ่งแต่ละรายการด้วยการขึ้นบรรทัดใหม่ หลังจากจัดการปัญหาส่วนนี้แล้วผมจึงสกัดข้อมูลการตรวจวัดที่ต้องการออกมา ข้อมูลส่วนนี้จะอยู่ในส่วนของ frm_payload
ที่จะเป็นสตริงที่ encoded แบบ base64 ดังนั้นผมจึงต้อง decode ออกมาเป็น byte array ก่อน โดยข้อมูล byte array ที่ decode ได้จะแตกต่างกันไปขึ้นอยู่กับเซ็นเซอร์แต่ละตัว สำหรับข้อมูลโดยละเอียดของการแปลความ byte array นี้จะอยู่ในเว็บไซต์ของ MakerFabs ครับ
โค๊ดตัวอย่างด้านล่างนี้ผมนำข้อมูลความกดอากาศ อุณหภูมิ และความชื้นสัมพัทธ์มาใช้งาน สำหรับโครงสร้าง byte array ของเซ็นเซอร์วัดความกดอากาศจะมีรูปแบบตามตารางด้านล่างนี้ ไบต์ที่ 2 เมื่อนำมาหารด้วย 10 จะได้ค่าโวลต์ของแบตเตอรี่ และตัวข้อมูลความกดอากาศนั้นจะอยู่ที่ไบต์ 3 – 6 ซึ่งเมื่อนำข้อมูลทั้ง 24 บิตมาประกอบกันเป็นตัวแปรแบบ int32 และหารด้วย 100 แล้วจะได้ค่าความกดอากาศในหน่วย hPa ที่ต้องการ สำหรับอุณหภูมิและความชื้นสัมพัทธ์นั้นจะอยู่ที่ไบต์ที่ 3-4 และไบต์ที่ 5-6 ตามลำดับ โดยค่าทั้งสองจะเป็นค่าแบบ int16 และเมื่อหารด้วย 10.0 เพื่อให้ได้ค่าสุดท้ายที่นำไปใช้ได้ตามต้องการ
1 2 3 4 5 6 7 8 9 10 11 12 |
barometric pressure data: ... { ... "received_at": "2024-06-18T12:57:42.875943203Z", "uplink_message": { "frm_payload": "ABseAJnj/AAA", ... }, }, ... } |
โค๊ดตัวอย่างด้านล่างนี้ผมนำข้อมูลความกดอากาศ อุณหภูมิ และความชื้นสัมพัทธ์มาใช้งาน สำหรับโครงสร้าง byte array ของเซ็นเซอร์วัดความกดอากาศจะมีรูปแบบตามตารางด้านล่างนี้ ไบต์ที่ 2 เมื่อนำมาหารด้วย 10 จะได้ค่าโวลต์ของแบตเตอรี่ และตัวข้อมูลความกดอากาศนั้นจะอยู่ที่ไบต์ 3 – 6 ซึ่งเมื่อนำข้อมูลทั้ง 24 บิตมาประกอบกันเป็นตัวแปรแบบ int32
และหารด้วย 100 แล้วจะได้ค่าความกดอากาศในหน่วย hPa ที่ต้องการ สำหรับอุณหภูมิและความชื้นสัมพัทธ์นั้นจะอยู่ที่ไบต์ที่ 3-4 และไบต์ที่ 5-6 ตามลำดับ โดยค่าทั้งสองจะเป็นค่าแบบ int16
และเมื่อหารด้วย 10.0 เพื่อให้ได้ค่าสุดท้ายที่นำไปใช้ได้ตามต้องการ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
import requests import json import base64 def decode_ttn_payload(x): y = base64.b64decode(x) return y def extract_temp_hum_value(b): seq = int.from_bytes(b[0:2], byteorder='big', signed=False) bat = int.from_bytes(b[2:3], byteorder='big', signed=False)/10.0 rh = int.from_bytes(b[3:5], byteorder='big', signed=False)/10.0 tem = int.from_bytes(b[5:7], byteorder='big', signed=False)/10.0 return seq, bat, rh, tem def extract_baro_pres_value(b): seq = int.from_bytes(b[0:2], byteorder='big', signed=False) bat = int.from_bytes(b[2:3], byteorder='big', signed=False)/10.0 atm = int.from_bytes(b[3:7], byteorder='big', signed=False)/100.0 return seq, bat, atm def main(): n_data_limit = 800 target_date = "2024-06-17" start_time = "{:}T00:00:00Z".format(target_date) end_time = "{:}T23:59:59Z".format(target_date) params = { "start": start_time, "end": end_time, } params = {} app_id = "123456" api_key = "ABCDEF" #target_device_id = "agrosense-baro-pres-sensor" target_device_id = "agrosense-temp-hum-sensor" url = "https://kptest.nam1.cloud.thethings.industries/api/v3/as/applications/{:}/devices/{:}/packages/storage/uplink_message?limit={:}&order=received_at".format( app_id, target_device_id, n_data_limit) headers = {"Authorization": "Bearer {:}".format(api_key),} response = requests.get(url, headers=headers, params=params) if response.status_code == 200: try: data_str = response.text data_array = data_str.split("\n") n_data = len(data_array) f_out = open("output_{:}.txt".format(target_device_id), "w") for i in range(0, n_data, 1): if(len(data_array[i]) < 10): continue data_json = json.loads(data_array[i]) result = data_json["result"] end_device_ids = result["end_device_ids"] device_id = end_device_ids["device_id"] received_at = result["received_at"] uplink_message = result["uplink_message"] frm_payload = uplink_message["frm_payload"] decoded_payload = decode_ttn_payload(frm_payload) received_datetime = received_at.split("T") if(device_id == "agrosense-baro-pres-sensor"): seq = extract_baro_pres_value(decoded_payload) ... elif(device_id == "agrosense-temp-hum-sensor"): seq = extract_temp_hum_value(decoded_payload) f_out.write("{:},{:},{:},{:},{:},{:},{:},{:}\n".format( received_datetime[0], received_datetime[1][0:10], device_id, frm_payload, seq[0], seq[1], seq[2], seq[3],)) print("{:} | {:} | {:<28s} | {:} | {:}".format( received_datetime[0], received_datetime[1], device_id, frm_payload, seq)) ... f_out.close() except Exception as error: print("cannot convert to json") print(error) else: ... if __name__ == "__main__": main() |
1 2 3 4 5 6 7 8 9 10 |
2024-06-18 | 01:46:52.573543338Z | agrosense-temp-hum-sensor | AA0fA7kBDwAA | (13, 3.1, 95.3, 27.1) 2024-06-18 | 02:46:52.323918900Z | agrosense-temp-hum-sensor | AA4eA5cBGgAA | (14, 3.0, 91.9, 28.2) 2024-06-18 | 03:46:52.445668763Z | agrosense-temp-hum-sensor | AA8eA5oBHgAA | (15, 3.0, 92.2, 28.6) 2024-06-18 | 04:46:52.740698025Z | agrosense-temp-hum-sensor | ABAeA2gBJgAA | (16, 3.0, 87.2, 29.4) 2024-06-18 | 05:46:52.693714321Z | agrosense-temp-hum-sensor | ABEeAzABLwAA | (17, 3.0, 81.6, 30.3) 2024-06-18 | 06:46:52.675825826Z | agrosense-temp-hum-sensor | ABIeAwcBNgAA | (18, 3.0, 77.5, 31.0) 2024-06-18 | 07:46:52.979343272Z | agrosense-temp-hum-sensor | ABMeAwQBOAAA | (19, 3.0, 77.2, 31.2) 2024-06-18 | 08:46:52.684594983Z | agrosense-temp-hum-sensor | ABQeAvsBOgAA | (20, 3.0, 76.3, 31.4) 2024-06-18 | 09:46:52.744680435Z | agrosense-temp-hum-sensor | ABUeAtsBOwAA | (21, 3.0, 73.1, 31.5) ... |
อื่น ๆ
สภาพภายนอกและภายในมอดูล
ตัวกล่องของเซ็นเซอร์ AgroSense ชุดที่ผมได้รับเป็นพลาสติก โดยรวมมีความแข็งแรงดี ตัวกล่องออกแบบมาให้เป็นแบบฝาประกอบบน/ล่างโดยมีแผ่นยางกันน้ำความหนาประมาณ 2 มิลลิเมตรแทรกไว้ระหว่างกลาง ข้อมูลชื่อผู้ผลิต รุ่นของผลิตภัณฑ์และสัญลักษณ์อื่น ๆ นั้นสกรีนไว้ที่ฝาด้านบน สำหรับตัวกล่องด้านล่างจะมีสติกเกอร์แสดงข้อมูล EUI/KEY ต่าง ๆ แปะไว้ที่ขอบด้านหนึ่ง ส่วนขอบกล่องอีกด้านเป็นชื่อ รุ่น และรหัสของผลิตภัณฑ์ ซึ่งภายในกล่องจะมีสติกเกอร์สำรองให้เราอีก 2 แผ่นด้วย สำหรับการเปิดกล่องนั้นทำได้ด้วยการไขสกรูที่อยู่ตามมุมทั้ง 4 ตัว ซึ่งกรณีของผมนั้นไขไม่ยาก เปิดออกมาได้ง่าย ตัวแผ่นยางกันน้ำติดอยู่กับฝาด้านบน ส่วนที่เหลือด้านล่างเป็นส่วนที่บรรจุอุปกรณ์ทั้งหมด
ในกรณีของผมนั้นตัวแผงวงจรมี soldermask สีแดง มี silkscreen ข้อความสีขาว ด้านบนมีแผงใส่ถ่านขนาด AAA 1.5V 2 ก้อน ด้านบนบอร์ดมี LED 1 ดวง มีปุ่มกดให้ 2 ปุ่ม ปุ่มเล็กเป็น RST กับปุ่มใหญ่ USER นอกจากนั้นก็มี connector J1 และ J3 สำหรับให้ต่อเซ็นเซอร์อีก 2 ช่อง ปลายสายของ J1/J3 จะต่อออกจากกล่องโดยมี ซึ่งเอาไว้ต่อกับเซ็นเซอร์ที่จะมีสายต่อไปภายนอกกล่องผ่าน cable grand หุ้มไว้เพื่อป้องกันน้ำ สำหรับขั้วต่อเสาอากาศบนบอร์ดนั้นเป็นแบบ IPEX ซึ่งผู้ผลิตได้ต่อไปยัง connector แบบSMA ที่ไขไว้กับตัวกล่องแข็งแรงได้ดี
ผมถอดสกรูที่ยึดบอร์ดกับตัวกล่อง ถอดเสาอากาศและถอดเซ็นเซอร์ออกเพื่อตรวจสอบด้านล่างของบอร์ด พบว่า chip ใหญ่สุดที่ด้านล่างบอร์ดคือ ASR6601CB จากการค้นหาข้อมูลพบว่าเป็น SoC สำหรับการสื่อสารไร้สายแบบ LPWAN นอกจากนั้นก็จะมี connector P1 ซึ่งมีการสรีนเป็น VCC, GND, TXD, RXD, BOOT, RST, และ RX แต่ว่าผมไม่พบรายละเอียดการใช้งานเพิ่มเติม
ระยะทาง
สำหรับการทดสอบระยะทางนั้นผมทำการทดสอบที่ที่ทำงาน โดยวางเกตเวย์ไว้ที่ลานเอนประสงค์หน้าคณะวิทยาการคอมพิวเตอร์และเทคโนโลยีสารสนเทศ มหาวิทยาลัยราชภัฏรำไพพรรณี แล้วกดปุ่ม USER เพื่อให้เซ็นเซอร์ส่งข้อมูลไปให้ เกตเวย์และจดบันทึกค่า RSSI และค่า SNR ที่รายงานโดย The Things Network ไว้ เบื้องต้นพบว่าเมื่อเกตเวย์และเซ็นเซอร์อยู่ใกล้ ๆ กันประมาณ 1 เมตรนั้นผมอ่านค่า RSSI และ SNR ได้ประมาณ -23dB และ 13.5 ตามลำดับ จากนั้นผมจึงไปยังจุดต่าง ๆ ตามภาพด้านล่างทั้งหมด 5 จุด แต่ละจุดรอประมาณ 1 ชั่วโมง
จุดที่ไกลที่สุดที่ทดสอบส่งข้อมูลได้คือจุด C ซึ่งมีระยะทางประมาณ 290 เมตรจากเกตเวย์ ส่วนจุด D และ E นั้นส่งข้อมูลมาหาเกตเวย์ไม่ได้ อย่างไรก็ดีการทดสอบนี้ผมใช้เสาอากาศและค่า default ต่าง ๆ ของเกตเวย์ตามที่ผู้ผลิตกำหนดมาให้โดยไม่ได้ปรับแต่งอะไรเพิ่มเติม รวมทั้งช่วงที่ทดสอบนี้เป็นฤดูฝน ตอนที่ผมไปถึงจุด A และ B นั้นฟ้าค่อนข้างโปร่ง แต่พอเดินทางถึงจุด C ก็เริ่มมีฝนตกเบา ๆ และเมื่อไปถึงจุดที่เหลือนั้นฝนก็ตกลงมาค่อนข้างหนักแล้ว ผมจึงไม่ได้ทดสอบต่อ อย่างไรก็ดีการทดสอบของผมครั้
แบตเตอรี่
การรีวิวนี้ผมใช้แบตเตอรี่ Panasonic ALKALINE AAA LR03 1.5V ผลิตเมื่อ 02-2024 ซื้อจากร้านสะดวกซื้อ ผมทดสอบเปิด AgroSense LoRaWAN Temperature & Humidity Sensor เมื่อวันที่ 18 มิถุนายน เวลาประมาณ 08:45 น. ตอนเริ่มทำงานค่าแรกที่ระบบรายงานคือ 3.1 โวลต์ (วัดเองด้วยมัลติมิเตอร์ได้ค่า 3.25 โวลต์) ทดสอบเปิดต่อเนื่องไว้จนถึง 5 มิถุนายน เวลาประมาณ 20:26 น. รวมเวลาประมาณ 17 วัน ระบบรายงานแบตเตอรี่ประมาณ 2.3 โวลต์ (วัดเองด้วยมัลติมิเตอร์ได้ค่า 2.44 โวลต์) ซึ่งผมได้ดึงค่าจาก The Things Network มาวาดเป็นกราฟได้ตามภาพด้านล่าง แต่เซ็นเซอร์อีกตัวที่เปิดไว้คู่กันตลอดเวลาคือ AgroSense LoRaWAN Barometric Pressure Sensor กลับใช้พลังงานไปน้อยว่า ค่าที่ระบบรายงานออกมาตั้งแต่วันแรกจนถึงวันล่าสุดนั้นยังคงที่ที่ 3.0 โวลต์เท่าเดิม (วัดเองด้วยมัลติมิเตอร์ได้ค่า 3.22 โวลต์)
ทาง Makerfabs ได้อธิบายกับผมว่าในกรณีของ AgroSense LoRaWAN Temperature & Humidity Sensor นั้นอาจจะเกิดปัญหาบางอย่
สรุป
โดยสรุปแล้วอุปกรณ์ต่าง ๆ ที่ทดสอบในครั้งนี้ใช้งานได้ง่าย และทำงานได้ตามที่ควรจะเป็น เพียงแต่ผมสับสนกับการติดตั้ง/ตั้งค่าในช่วงต้น ๆ เนื่องจากเป็นการใช้งานอุปกรณ์ LoRaWAN ครั้งแรกเลยไม่คุ้นกับคำศัพท์ทางเทคนิคบางคำ ค่อนข้างกังวลว่าจะ setup อุปกรณ์ยาก หรือจะเกิดปัญหาด้าน hardward หรือ software ที่ไม่คุ้นบ้างหรือเปล่า แต่รวม ๆ แล้วใช้เวลาประมาณ 20 – 30 นาทีก็พอจะทำความเข้าใจและทำการติดตั้งต่อไปโดยไม่พบปัญหาสำคัญอะไรอีกเลย
ข้อกวนใจเล็ก ๆ น้อย ๆ อย่างนึงของตัวเกตเวย์ก็คือผมพบว่าเกตเวย์ยังมีการส่งข้อมูลไป SenseCAP Portal อยู่ตลอดเวลาถึงแม้ว่าผมจะไปกำหนด Mode ของ LoraWAN Network Settings เป็น Packet Forwarder เพื่อส่งข้อมูลไป The Things Network แล้วก็ตาม และจากการสังเกตุข้อมูลในหน้าต่าง Device Status Data ของ SenseCAP Portal นั้นพบว่าอุปกรณ์ส่งสถานะทุก ๆ 5 นาทีครับ
อีกอย่างหนึ่งคือทางผู้ผลิตแจ้งผมว่าข้อมูลที่เซ็นเซอร์ส่งออกไปนั้นเป็นข้อมูลที่อุปกรณ์ตรวจวัดไว้ก่อนหน้าการส่งข้อมูล 1 ชั่วโมง เช่น ข้อมูลที่ส่งเมื่อเวลา 10:00 นั้นจะเป็นข้อมูลที่ตรวจวัดได้เมื่อเวลา 09:00 ดังนั้นผู้ใช้จึงอาจจะต้องระวังในการนำไปใช้เนื่องจากไม่ใช่ข้อมูลเวลาจริง ณ ขณะที่จะส่งข้อมูล โดยทางผู้ผลิตแจ้งว่ากำลังปรับปรุงเวอร์ชันใหม่ให้สอดคล้องกับการทำงานแบบเวลาจริงมากขึ้นครับ
ผู้ที่สนใจสามารถสั่งซื้อ Agrosense LoRaWAN ชุดนี้ได้จากเว็บไซต์ของผู้ผลิต โดยเซนเซอร์ Barometric Pressure Sensor, Light Intensity Sensor, Temperature & Humidity Sensor, Industrial Temperature Sensor มีราคาเท่ากันตัวละ $24.9(~900฿)$24.9(~900฿) และเกตเวย์ SenseCAP M2 ราคา $99.00(~3,600฿)
สุดท้ายนี้ผมต้องขอขอบคุณ MakerFabs ที่ส่งอุปกรณ์ชุดนี้มาให้ทดสอบครับ
I am an assistant professor in surveying engineering and geographic information systems at Rambhai Barni Rajabhat University. My primary research areas include digital image/audio processing, digital photogrammetry, AI, IoT, and UAV. I am open to other subjects as well.