มิเตอร์ไฟฟ้าที่มีพอร์ต P1 น่ะ มันจะมีตัว MBUS master แบบพื้นฐานฝังอยู่ข้างใน คอยส่งข้อมูลมิเตอร์ (ที่เข้ารหัสไว้แล้ว) ออกมาเป็นระยะๆ มิเตอร์แบบนี้เจอได้ทั่วไปในหลายประเทศยุโรป เช่น ออสเตรีย นอร์เวย์ ถ้าอยากอ่านค่าจากมันล่ะก็ ต้องมีอุปกรณ์ที่เป็น MBUS slave ไว้รับข้อมูล วันนี้พี่จะมาสาธิตให้ดูว่าเราจะอ่านและถอดรหัสข้อมูลจากมิเตอร์พวกนี้ยังไง โดยใช้ MBUS slave shield สำหรับบอร์ด Arduino MKR และ Portenta ของเรา



วิธีต่อกับมิเตอร์:
มิเตอร์ไฟฟ้าหลายรุ่นจะมีพอร์ต MBUS ให้ผ่านช่อง RJ12 นะ สัญญาณ MBUS จะอยู่ที่ขาที่ 3 กับ 4 นี่แหละ เอาสายสองเส้นนี้ไปต่อกับขั้วต่อ (terminal block) ของ MBUS-Slave shield ได้เลย ไม่ต้องกังวลเรื่องขั้วบวกลบ เพราะ MBUS ฝั่ง slave มันไม่มีโพลาริตี้ จัดไปวัยรุ่น

กุญแจสำหรับถอดรหัส (Key for decryption)
ข้อมูลผู้ใช้ในโปรโตคอล MBUS นี่มันเข้ารหัสไว้ ถ้าอยากถอดรหัสล่ะก็ ต้องมีคีย์จากผู้ให้พลังงาน (พลังงานจังหวัด หรือการไฟฟ้านั่นแหละ) คีย์นี้ยาว 16 ไบต์ มักจะได้มาเป็นสายอักขระเลขฐานสิบหก (hex string) เอา string นี้ไปแปลงเป็นอาร์เรย์ของไบต์ แล้วเก็บไว้ในไฟล์ `key.h`
ตัวอย่างคีย์จากผู้ให้พลังงาน: 36C66639E48A8CA4D6BC8B282A793BBB
ในไฟล์ key.h ก็เขียนแบบนี้:
static const unsigned char KEY[] = {0x36, 0xC6, 0x66, 0x39, 0xE4, 0x8A, 0x8C, 0xA4, 0xD6, 0xBC, 0x8B, 0x28, 0x2A, 0x79, 0x3B, 0xBB};
ไลบรารีเพิ่มเติมที่ต้องใช้
ติดตั้งไลบรารีต่อไปนี้ผ่าน Arduino Library Manager ซะ
Arduino Crypto Library โดย Rhys Weatherley
รายละเอียดเทคนิคแบบจัดเต็ม
โปรเจคนี้ใช้โปรโตคอล M-Bus (Meter-Bus) ซึ่งเป็นมาตรฐานยุโรป (EN 13757) สำหรับอ่านค่ามิเตอร์จากระยะไกล พอร์ต P1 บนมิเตอร์ไฟฟ้าของคุณทำหน้าที่เป็น master คอยส่งเฟรมข้อมูลที่เข้ารหัสออกมาเป็นระยะๆ ส่วน Arduino ของเรา ที่ติดตั้ง MKR MBUS Slave Shield ไว้ ก็จะทำหน้าที่เป็น slave บนบัสนี้ คอยฟังสัญญาณ broadcast พวกนี้
ขั้นตอนการถอดรหัสสำคัญมาก คีย์ AES-128 ขนาด 16 ไบต์ที่ได้จากผู้ให้พลังงาน เอาไว้ใช้ถอดรหัสข้อมูล payload ภายในเฟรมข้อมูล M-Bus นั่นเอง Arduino Crypto Library จะเป็นตัวจัดการอัลกอริทึมการถอดรหัส AES ที่ซับซ้อนให้เรา ทำให้สเกตช์ของเราสามารถดึงค่าที่มนุษย์อ่านออกมาได้ เช่น ปริมาณการใช้พลังงานสะสม (kWh), กำลังไฟฟ้าปัจจุบัน (kW) และข้อมูลอื่นๆ จากมิเตอร์ (เช่น แรงดันไฟฟ้า ข้อมูลเฟส) ออกมาจากบล็อกข้อมูลที่ถอดรหัสแล้ว
พอได้ข้อมูลที่ถอดรหัสแล้ว เราก็เอาไปประมวลผลต่อได้เลย จะแสดงผลบนจอ local หรือส่งขึ้นคลาวด์ก็ได้ ถ้าอยากทำ IoT ละก็ บอร์ด Arduino MKR WiFi 1010Arduino IoT Cloud ได้แบบเนทีฟ ส่งตัวแปรต่างๆ เช่น กำลังไฟฟ้าตามเวลาจริง (real-time power) และพลังงานสะสม (cumulative energy) ขึ้นไปแสดงบนแดชบอร์ดบนคลาวด์ได้เลย รับรองทำแดชบอร์ดสำหรับบันทึกข้อมูลแบบ professional บนคอมหรือมือถือได้สบายๆ จะได้เห็นภาพว่าเรากินไฟไปเท่าไหร่ในแต่ละวัน แต่ละสัปดาห์ หรือแต่ละเดือน สู้งานนะน้อง
หมายเหตุ
โค้ดนี้ทดสอบกับมิเตอร์รุ่น Kaifa MA309M และ Sagemcom T210-D (ข้อมูลจาก Lower Austria, ออสเตรีย) ในประเทศหรือภูมิภาคอื่น (เช่น Vorarlberg, ออสเตรีย) โครงสร้างของข้อมูลผู้ใช้อาจแตกต่างออกไป และอาจจำเป็นต้องปรับแต่งโปรแกรมใหม่ ห้ามช็อตนะตัวนี้
