สวัสดีครับ เหล่าสาวก Smart Home ผู้ใช้ EV ทั้งหลาย! ผมเชื่อว่าหลายๆ ท่านคงตื่นเต้นกับเทรนด์ EV ที่กำลังมาแรงในขณะนี้ ผมเองก็เป็นหนึ่งในนั้น แล้วก็สอยมาแล้วเรียบร้อยกับพี่แมวน้อย Ora Good Cat สีเขียว

แน่นอนว่าการเป็นเจ้าของรถ EV มันไม่ได้จบแค่การขับขี่ แต่ยังรวมถึงการดูแลรักษา และการผสานรวมเข้ากับไลฟ์สไตล์ของแต่ละคน ในฐานะคนคลั่ง Smart Home ผมจึงเกิดไอเดียที่จะเชื่อมต่อพี่แมวน้อยเข้ากับระบบ Ecosystem ภายในบ้าน เพื่อเอาไว้คอย Monitor ข้อมูลรถแบบ Real-time ผ่าน Home Assistant (HA) ไม่ว่าจะเป็น % แบตเตอรี่ อุณหภูมิ หรือแม้แต่เลขไมล์

บทความนี้จะพาคุณดำดิ่งสู่โลกแห่ง IoT และ Smart Home ไปกับขั้นตอนการเชื่อมต่อ Ora Good Cat เข้ากับ Home Assistant ผ่านอุปกรณ์ WiCAN พร้อมเผยวิธีการ Decode ข้อมูลสุดปวดหัวที่ผมเจอมาเองกับตัว สำหรับแฟนๆ Smart Home รับรองว่าอ่านจบแล้ว คุณจะสามารถเอาไปใช้รถยนต์ของคุณได้ด้วยเช่นกัน ไม่ว่าจะเป็นรถยนต์ไฟฟ้าหรือรถเครื่องยนต์สันดาบ ขอเพียงแค่ต่อพอร์ต OBD2 และมีอุปกรณ์พร้อม
คำเตือน! บทความโคตร Geek
อุปกรณ์ที่ต้องใช้สำหรับโครงการนี้
ก่อนเริ่มต้น เรามาดูอุปกรณ์หลักๆ ที่ใช้ในโปรเจกต์นี้กันก่อน
- รถยนต์ไฟฟ้า: แน่นอนว่าพระเอกของงานนี้ก็คือรถยนต์ไฟฟ้า ในกรณีของบทความนี้คือ Ora Good Cat ของผมเอง ซึ่งถ้าคุณใช้รถยนต์รุ่นอื่นก็สามารถทำได้เช่นกัน เพียงแต่ข้อมูลที่ได้จากรถก็จะแตกต่างกันออกไป
- WiCAN: อุปกรณ์อ่านข้อมูลจาก OBD2 ที่สามารถที่เชื่อมต่อ WiFi แบบ Station ได้ เป็นเหมือนอุปกรณ์ IoT ทั่วไป เจ้าตัวนี้ทำหน้าที่เป็นสะพานเชื่อมระหว่างรถยนต์กับระบบ Home Assistant ของเรา
- Home Assistant: ศูนย์กลางควบคุม Smart Home Ecosystem ในบ้าน ถ้าใครยังไม่รู้จัก Home Assistant แนะนำให้ไปคำความเข้าใจกันก่อน มีคนอธิบายให้มากมายบน YouTube
- Node-RED: เครื่องมือช่วย Visual Programming สำหรับสร้าง Flow การทำงานโดยไม่ต้องเขียนโค้ด ไม่ต้องกลัวว่าจะใช้ยาก เพราะ Node-RED มีอินเทอร์เฟซที่ใช้งานง่าย แม้แต่ผู้เริ่มต้นก็สามารถเรียนรู้ได้ แต่อาจจะต้องมีพื้นฐานการเขียนโปรแกรมกันเสียหน่อย
- MQTT: โปรโตคอลสำหรับรับส่งข้อมูลแบบ Lightweight เหมาะสำหรับการใช้งานกับอุปกรณ์ IoT เช่น WiCAN
- MQTTX หรือ MQTT Explorer: สำหรับใช้อ่านข้อมูลที่ส่งไปมาบน MQTT เพื่อเอามาใช้ Debug นั่นเอง
- Car Scanner: แอปพลิเคชันบนมือถือสำหรับดูข้อมูลจาก OBD2 เราจะใช้แอปนี้ในการ Debug และ Decode ข้อมูลจากรถยนต์
จาก Bluetooth OBD2 สู่ WiCAN


หลายคนอาจสงสัยว่าทำไมต้องใช้ WiCAN ในเมื่อมี OBD2 แบบ Bluetooth อยู่แล้ว?
ตอนแรกผมก็ใช้ OBD2 แบบ Bluetooth เชื่อมต่อกับรถยนต์เพื่อดูข้อมูลผ่านแอป Car Scanner ซึ่งก็ใช้งานได้ดีในระดับหนึ่ง แต่ปัญหาคือสัญญาณ Bluetooth มักจะหลุดหายเวลาจอดรถชาร์จไฟที่บ้าน ทำให้ไม่สามารถ Monitor ข้อมูลรถได้อย่างต่อเนื่อง ส่วน OBD2 แบบ WiFi ก็มีปัญหาเรื่องใช้งานเข้ากับ Home Assistant ไม่ได้ เพราะจะต้องต่อกับมือถือแบบ 1-1 เท่านั้น
ด้วยเหตุนี้ ผมจึงมองหาทางเลือกอื่น และในที่สุดก็ได้พบกับ WiCAN อุปกรณ์สื่อสารผ่าน OBD2 ที่เชื่อมต่อ WiFi แบบ Station ได้เหมือนอุปกรณ์ IoT อื่นๆ ทำให้สามารถเชื่อมต่อกับ Home Assistant ได้อย่างราบรื่น
ติดตั้ง MQTT: สร้างศูนย์กลางรับส่งข้อมูลแห่งโลก IoT
MQTT เป็นโปรโตคอลสำหรับรับส่งข้อมูลแบบ Lightweight ทำงานแบบ Pub/Sub เหมาะสำหรับการใช้งานกับอุปกรณ์ IoT เช่น WiCAN ใน Home Assistant และอุปกรณ์อื่นๆ อีกหลายประเภท เราสามารถติดตั้ง MQTT Broker ได้โดยใช้ Add-on ชื่อ “Mosquitto broker”
ขั้นตอนการติดตั้ง:
- ไปที่เมนู “Supervisor” ใน Home Assistant
- เลือก “Add-on store”
- ค้นหา “Mosquitto broker” แล้วกด “Install”
- กำหนดค่า (ถ้าจำเป็น) แล้วกด “Start”
เพียงเท่านี้ เราก็จะมี MQTT Broker ไว้สำหรับรับส่งข้อมูลจาก WiCAN แล้ว
ติดตั้ง Node-RED: เครื่องมือทำ Visual Programming ง่ายๆ
Node-RED เป็นเครื่องมือสำหรับ Block Programming ที่ช่วยให้เราสามารถสร้าง Flow การทำงานได้โดยไม่ต้องเขียนโค้ด ใน Home Assistant เราสามารถติดตั้ง Node-RED ได้โดยใช้ Add-on ชื่อ “Node-RED”
ขั้นตอนการติดตั้ง:
- ไปที่เมนู “Supervisor” ใน Home Assistant
- เลือก “Add-on store”
- ค้นหา “Node-RED” แล้วกด “Install”
- กำหนดค่า (ถ้าจำเป็น) แล้วกด “Start”
เมื่อติดตั้งเสร็จแล้ว เราสามารถเข้าถึง Node-RED ได้ผ่านทางหน้า Add-ons ของ Home Assistant
ติดตั้ง WiCAN: เสียบสาย ซ่อนอุปกรณ์

การติดตั้ง WiCAN งั้นแสนง่าย เพียงแค่ทำตามขั้นตอนง่ายๆ ดังนี้
- เสียบ WiCAN เข้ากับ OBD2: เอาตัว WiCAN ไปเสียบเข้ากับพอร์ต OBD2 ในรถยนต์ โดยปกติแล้ว พอร์ต OBD2 จะอยู่ใต้พวงมาลัย
- ซ่อนสาย: เพื่อความสวยงาม เราสามารถเดินสายไฟไปซ่อนไว้ในกล่องฟิวส์

Tips:
- ควรศึกษาคู่มือรถยนต์ เพื่อหาตำแหน่งของพอร์ต OBD2 และกล่องฟิวส์
- ใช้สายรัด เพื่อจัดระเบียบสายไฟ และป้องกันการพันกัน
ตั้งค่า WiCAN: เชื่อมต่อ WiFi เชื่อมต่อ MQTT ให้เรียบร้อย
เมื่อติดตั้ง WiCAN เสร็จแล้ว เราก็ต้องเข้าไปตั้งค่า WiCAN ผ่านหน้าเว็บ ก็จะมีหน้า Interface ประมาณด้านล่านี้ให้เข้าไปตั้งค่ากัน สำหรับคู่มือตัวเต็มมีเขียนไว้ให้แล้วประมาณหนึ่งบนเว็บไซต์ผู้ผลิต https://meatpihq.github.io/wican-fw/config/wifi


จุดที่สำคัญคือ เราจะใช้ Protocol เป็น elm327 เพื่อให้ใช้กับแอป Car Scanner ได้
นอกจากนั้นก็ให้ตั้ง MQTT ให้เรียบร้อยด้วย โดยให้ไปสร้าง User บน Home Assistant แยกเฉพาะสำหรับ WiCan โดยเฉพาะให้เอามาใส่ที่นี่
อีกจุดที่สำคัญคือ MQTT elm327 log ผมงงหัวกับตรงนี้นานมาก ขอเล่าวิธีการใช้งานไว้ตรงนี้เลย
1. ถ้าตั้งเป็น Enable
– เราจะเห็นข้อมูลทั้ง tx และ rx (เดี๋ยวผมจะอธิบายให้ฟังในหัวข้อถัดไป)
– เราจะไม่สามารถส่ง tx เข้าไปได้เองทาง MQTT ได้
– MQTT Topic จะไปโผล่ใน elm327
– ใช้สำหรับการหาค่า tx ที่ต้องการ ใช้เฉพาะเวลาหาค่า tx เท่านั้น

2. ถ้าตั้งเป็น Disable
– เราจะเห็นข้อมูล rx ที่ส่งออกมาจากรถเท่านั้น
– สามารถส่ง tx เข้าไปทาง MQTT ได้ ทาง MQTT Topic wican/{wican_id}/can/tx
– MQTT Topic จะไปโผล่ใน wican/{wican_id}/can/rx ตามปรกติ
– ใช้สำหรับการใช้งานจริง ซึ่งเดี๋ยวจะพูดถึง Flow ในหัวข้อต่อไป

ว่ากันเรื่องการส่งข้อมูลระหว่างกัน มีกลไกอย่างไร
จากนี้เดี๋ยวเราจะมาเจาะลึกกันลงทีละขั้น แต่ก่อนอื่นต้องมาเริ่มจาก TX/RX กันก่อน
TX เป็นข้อมูลที่เราส่งเข้าไปเมื่อขอข้อมูลจากตัว WiCAN โดยจะสามารถ public ส่งเข้าไปได้ที่ MQTT Topic wican/{wican_id}/can/tx ตามที่ได้เคยบอกเอาไว้ด้านบน
RX เป็นข้อมูลที่ได้รับออกมาจากรถยนต์ แล้วตัว WiCAN จะ public ออกมาทาง MQTT Topic wican/{wican_id}/can/rx ซึ่งเราจะเอามาประมวลผลกันต่อใน Node-RED เพื่อเอาไปคำนวณเป็นค่าจริง แล้วส่งไปให้ Sensor ใน Home Assistant
แล้ว TX/RX หน้าตาเป็นอย่างไรล่ะ?
ตัวอย่าง TX และ RX ของ Battery SoC ที่ 58.1%
1 2 3 | tx: {"bus":"0","type":"tx","ts":21767,"frame":[{"id":1931,"dlc":8,"rtr":false,"extd":false,"data":[3,34,3,8,170,170,170,170]}]} rx: {"bus":"0","type":"rx","ts":21782,"frame":[{"id":1995,"dlc":8,"rtr":false,"extd":false,"data":[5,98,3,8,2,69,204,204]}]} |
ดูกันแล้วอาจจะ อิหยังวะ นี่คือ JSON ที่เราใช้ส่งเข้าไปใน MQTT Topic จากด้านบนตัวอย่างเนี่ย มันหมายความว่า ถ้าเกิดเราส่ง JSON แบบ tx ด้านบนเข้าไปนี่ ตัว WiCAN มันก็จะตอบ JSON แบบ rx กลับมานั่นเอง
มีส่วนที่เราจะต้องใส่ใจดังนี้
- type จะเป็นได้คือ “tx” หรือ “rx” ความหมายก็ตามตัวคงไม่อธิบายเพิ่ม
- ts ย่อมาจาก timestamp คือเวลาปัจจุบันที่ใช้จริง ซึ่งจะใส่อะไรก็ได้ ใช้สำหรับการ debug ส่วนตัวแนะนำให้ใส่ unix timestamp เอาไว้ เมื่อเวลาไปไล่ดู log จะได้ไล่เวลาได้ถูกต้อง
- frame อันนี้คือส่วนของตัวข้อมูลละ โดยจะมีไส้ในอีกดังนี้
- id เป็นเลข CAN ID ที่ถูกกำหนดออกมาโดยมาตรฐานการติดต่อ ซึ้งผู้ผลิตบางรายก็ไม่ได้ทำตามมาตรฐาน ดังนั้นก็เลยเป็นที่มาว่าทำไมเราต้องมาแกะกันเอง
- data เป็นข้อมูลที่เราจะต้องมาแกะกันนี่ล่ะ
ส่วน field อื่นๆ ไม่ได้ต้องใช้งาน ก็ลอกๆ ไปไม่มีปัญหา

ทีนี้เวลาเราจะใช้งาน ตัวอย่างเช่น ต้องการจะเอาค่า Battery SoC ออกมา ก็จะมีการทำงานตาม Diagram ข้างบนดังนี้
- Node-RED ทำการปั้นค่า JSON ที่จะส่ง ก็คือ {“bus”:”0″,”type”:”tx”,”ts”:{TIMESTAMP},”frame”:[{“id”:1931,”dlc”:8,”rtr”:false,”extd”:false,”data”:[3,34,3,8,170,170,170,170]}]} (โดยให้เปลี่ยน {TIMESTAMP} เป็นเวลาปัจจุบันเสีย)
จากนั้นทำการส่ง Payload ไปที่ MQTT Topic wican/{wican_id}/can/tx - MQTT Broker ทำการส่ง Payload เข้าไปที่ WiCAN
- WiCAN แปลง Payload เป็น CAN แล้วส่งเข้า OBD2 ของตัวรถ
- ตัวรถส่งค่าของ Sensor ในรถกลับออกมาให้ WiCAN ผ่านทาง CAN
- WiCAN ทำการปั้น Payload rx แล้วส่งเข้าไปที่ MQTT Broker
- Node-RED รับ rx แล้วเอามาประมวลผล
และนี่ตัวอย่างข้อความที่ Node-RED ได้รับ {“bus”:”0″,”type”:”rx”,”ts”:21782,”frame”:[{“id”:1995,”dlc”:8,”rtr”:false,”extd”:false,”data”:[5,98,3,8,2,69,204,204]}]} แลัวมันอ่านยังไง โคตรต่างดาว
อยากจะบอกว่ามันดาวโลกนี่ล่ะ ดาวคณิตศาสตร์นิดๆ คอมพิวเตอร์หน่อยๆ กลับมาเข้าเรื่อง วิธีการอ่านมีดังนี้
เขียนโปรแกรมดักเอาไว้ว่า ถ้าได้ rx ที่ id 1995 แล้วขึ้นต้น byte ด้วย [5,98,3] เป็นค่าของ SoC
ทำการอ่าน Byte พยายามแกะออกมาให้ได้ โดยเรารู้อยู่แล้วว่า ค่าที่เราต้องการคือ 58.1% จะแปลงค่า [5,98,3,8,2,69,204,204] นี่ล่ะคือความสนุกของ Project นี้
รอบนี้เพื่อความง่าย ผมขอเฉลยก่อน สูตรก็คือ [B4:B5]/10 หรือ ((B4*256)+B5)/10 หรือ ((2*256)+69)/10 = 58.1
ตัว B คือ Byte ที่เท่าไหร่ โดยนับเริ่มจาก 0
เห็นไหม ง่ายนิดเดียว 🙄 แต่ส่วนใหญ่สูตรก็หนีไม่พ้นแถวๆ นี้ล่ะ มันคือกราฟเส้นตรง ของ byte อะไรซะอย่าง (ถ้าเลขไม่เยอะก็ byte เดียว ถ้าเลขเยอะอาจต้องใช้ 2 btyes โดยเอาหลักแรกมาคูณ 256 เพราะมันเก็บข้อมูลได้หลักละ 256 ค่า แล้วก็เอามาต่อกับตัวต่อ) ถ้าหาค่าตรงไม่ได้ ก็อาจจะต้องคูณค่าสัมประสิทธิ์อะไรบางอย่างเข้าไป ความมันส์มันอยู่ตรงกันหาค่าพวกนี้นี่ล่ะ ระบบสมการตอนประถมได้ถูกใช้งาน
เอาเป็นว่า ได้ละ 1 sensor แบบคุณครูเฉลยคำตอบให้ เดี๋ยวหัวข้อต่อไปจะมาเจาะวิธีการได้มาซึ่งค่าที่ต้องการกัน
การหาค่า RX: Car Scanner บอก Sensor ไหน ต้องได้ค่าอะไร
แน่นอนว่า อยู่ๆ จะไม่มีการได้ค่า rx มาจากอากาศ เราต้องการใครสักคนช่วยเราก่อน ผู้รู้ของเราก็คือแอป Car Scanner นั่นเอง (ผมนี่อยากจะได้ data มากๆ จะได้ไม่ต้องมาตามแกะเอง)
ถ้าเปิดเข้าไปที่แอป เชื่อมต่อกับตัว WiCAN เรียบร้อยแล้วเนี่ย ก็คาดหวังว่าเราจะสามารถดู Sensors ต่างๆ ข้างในรถได้ โดยถ้ากดเข้าไปที่หน้า All Sensors ก็จะเห็นมาให้เลือกเยอะมาก สิ่งที่เราต้องการก็คือ เลือก Sensor ที่ต้องการสักตัว

หลังจากเลือก Sensor มา 1 ตัว ก็จะได้หน้าที่แสดงกราฟตามด้านล่าง

หลังจากนั้นให้ไปดูที่ wican/{wican_id}/can/rx บน MQTT Explorer เราจะได้รับข้อมูลกลับมาจำนวนเยอะมาก 1 record ที่มันแสดงขึ้นมา มันก็คือ 1 จุดข้างในกราฟที่ถูก plot นี่ล่ะ นั่นหมายความว่า Car Scanner มีการยิงข้อมูลเข้าไปรัวๆ นั่นเอง
จากนั้นก็ให้ทำการ Export ค่า JSON ที่ได้รับออกมา เอามาเทียบกับค่าแสดงบนแอป Car Scanner และหาทางแมพเข้าหากันให้ได้ เป็นอันจบวิธีการได้ค่า RX
การหาค่า TX: Car Scanner บอก Sensor ไหน ต้องส่งค่าอะไร
ในทำนองเดียวกันกับการหาค่า RX เราก็จะใช้ Car Scanner ในการหาค่า TX เช่นกัน แต่อย่างที่บอกไปข้างต้นว่า ถ้าเราไปตั้ง WiCAN MQTT Debug เป็น Disable ค่า TX จะไม่ออกมาด้วย เราจะต้องไปเปลี่ยนเป็น Enable ซะก่อน ซึ่งหลังจากที่ไปเปลี่ยนแล้ว Flow การทำงานจะเปลี่ยนไป ดังนี้

จุดแรกที่สำคัญคือ Topic ของ MQTT ที่ใช้รับจะเปลี่ยนไปเป็น eml327 แทนที่จะเป็น tx/rx และในโหมดนี้ เราจะไม่สามารถส่ง tx เข้าไปเองได้ ทำได้แค่รับข้อมูลเท่านั้น แต่ไม่เป็นไร เราแค่มาหาค่า tx
ทำการเปิด MQTT Explorer ตามปรกติ แล้วเลือก Sensor ที่ต้องการบน WiCAN จากนั้นดูข้อมูลที่มันพ่นๆ ออกมา มันจะสลับกันระหว่าง tx และ rx อธิบายลงลึกก็คือ มีการส่ง tx เข้าไปก่อน แล้วจึงได้ rx กลับออกมา
ที่เราต้องทำก็คือทำการเก็บ tx ที่ Car Scanner ใช้เอาไว้ ดู Pattern ซะหน่อยว่าตรงกับ rx ที่เราต้องการใช่หรือไม่ จากนั้นก็เปิดโหมด Debug ไปซะ
หลังจาก Diable Debug ใน WiCAN แล้ว กลับมาที่ MQTT Explorer ทำการ publish message แบบเดียวกันกับทีเก็บมาได้ โดยอาจจะเปลี่ยน ts ซะหน่อย เข้าไปที่ wican/{wican_id}/can/tx เราจะได้รับ rx ที่คาดหวังกลับมา ทำการเก็บ tx อันนี้เอาไว้ให้ดี เพราะจะต้องเอาไปใช้เขียนโปรแกรมใน Node-RED ต่อ
Node-RED: จัดการข้อมูล แปลงร่าง ก่อนส่งเข้า Home Assistant
หลังจากได้ข้อมูลที่ต้องการแล้ว เราก็จะใช้ Node-RED ในการจัดการข้อมูล เช่น แปลงรูปแบบข้อมูล กรองข้อมูล และคำนวณค่าต่างๆ ก่อนส่งต่อเข้า Home Assistant
เรื่องการใช้ Node-RED ผมขออนุญาตข้ามนะครับ ไปหาศึกษากันเอง แต่ถ้ามีพื้นฐาน Programming กันบ้างอยู่แล้วพอเห็น Diagram ก็น่าจะพอมองออก
แนะนำให้ดูภาพเต็มประกอบเพื่อจะได้เข้าใจในการอ่านรายละเอียดเพิ่มเติม

Flow ทำงานหลักของ Node-RED จะมา 2 ส่วน ได้แก่
1. การส่งค่า TX ให้กับ WiCAN
อันนี้ไม่ได้ซับซ้อนมาก โดยจะมีการทำงานเป็นอัตโนมัติทุก 10 วินาที เพื่อให้ได้ค่า Sensor ที่ต้องการกลับมาอย่างสม่ำเสมอ หน้าตาฟังก์ชั่นก็จะประมาณที่เห็น ผมเขียนรวบๆ เอาไว้แล้วใช้การสั่ง Switch Case เพื่อลดขนาน Code

1. การรับค่า RX จาก WiCAN มาประมวลผล
อันนี้จะมีความซับซ้อนหน่อย เพราะว่าคุณจะต้องเขียนโปรแกรมสำหรับแกะข้อมูลด้วย ซึ่งผมได้เขียนแนะนำเทคนิคการ Decode เอาไว้ที่ท้ายโพสนี้ อย่างไรก็ดี สำหรับ Flow การทำงานจะเป็นตามด้านล่างนี้
- Ora Good Cat -> WiCAN: เริ่มต้นที่ตัวรถยนต์ Ora Good Cat จะส่งข้อมูลต่างๆ ผ่านพอร์ต OBD2 ไปยังอุปกรณ์ WiCAN ที่เราติดตั้งไว้
- WiCAN -> WiFi -> MQTT: WiCAN จะทำหน้าที่แปลงข้อมูลจาก OBD2 เป็นข้อมูลดิจิทัล และส่งต่อผ่าน WiFi ในบ้าน ไปยัง MQTT Broker ที่ติดตั้งบน Home Assistant
- MQTT -> Node-RED: Node-RED บน Home Assistant จะ Subscribe รับข้อมูลจาก MQTT Topic ที่ WiCAN ส่งมา เช่น wican/{wican_id}/can/rx
- Node-RED: ข้อมูลดิบ จากรถยนต์จะถูกประมวลผลบน Node-RED โดยใช้ Nodes ต่างๆ เช่น
mqtt in
node: รับข้อมูลจาก MQTTswitch
node: กรองข้อมูลตามเงื่อนไขfunction
node: ทำการอ่านและประมวลผลข้อมูล การคำนวณค่าต่างๆ และจัดรูปแบบข้อมูลdebug
node: แสดงผลข้อมูลเพื่อ Debug
- Node-RED -> Sensor บน HA: Home Assistant จะรับข้อมูลที่ประมวลผลแล้ว เอาไป สร้าง และแสดงผลข้อมูลต่างๆ ของรถยนต์
สำหรับใครจะ Download Configuration ที่ผมมีไปใช้ Import ก็สามารถเอาไปใช้ได้เลยจากที่นี่ บอกก่อนว่ามันก็ยังมีความไม่สมบูรณ์อยู่นะ https://gist.github.com/spicydog/c57db3f4d2ceef86402438bcab844f1f
Home Assistant: แสดงผลข้อมูลรถยนต์บน Dashboard สุดเท่
ในที่สุด! เราก็สามารถแสดงผลข้อมูลต่างๆ ของพี่แมวน้อย เช่น % แบตเตอรี่ อุณหภูมิ เลขไมล์ บน Home Assistant ได้สำเร็จ ซึ่งตัว Node-RED จะเป็นการดำเนินการเรื่องนี้ให้ทั้งหมด เพียงแค่เรา config ค่าให้ถูกต้อง

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

จากจุดนี้ เวลาที่รถเข้ามาจอดที่หน้าบ้าน WiCAN ก็จะต่อ WiFi ให้โดยอัตโนมัติ แล้วตัว Node-RED ก็จะไป Request ข้อมูลมาแสดงผลบน Home Assistant ดูข้อมูลได้แบบ Real-Time กันไปเลย
แล้วที่ผมชอบที่สุดของจุดนี้ก็คือ เวลาที่รถชาร์จไฟที่หน้าบ้าน เราจะเห็น % แบตเตอร์รีแบบสดๆ ไปรวมกับเครื่องคิดเลขที่ทำขึ้นมาเองข้างล่างซ้าย ก็จะสามารถคำนวณได้เลยว่าอีกกี่ชั่วรถแบตจะเต็ม

แน่นอน สามารถดูข้อมูล Sensor ย้อนหลังได้ด้วย สามารถเอามาใช้ในการวิเคราะห์การขับและการทำงานของรถได้ อีกหน่อยอาจจะติดกับ Sensor ลมยาง ให้แจ้งเตือนว่าต้องเติมลมแล้วก็ยังได้ หรือใช้ Monitor อุณหภูมิของอุปกรณ์ต่างๆ
เทคนิคการ Decode RX เพื่อให้ได้ค่าตามที่ต้องการ
เอาล่ะ ตอนนี้น่าจะได้ Sensor สักตัวแล้ว เมื่อเราต้องการ Sensor ตัวอื่นๆ ก็จำเป็นจะต้องติดอาวุธเพิ่มกันก่อน เราควรจะหาหาค่า TX และ RX จาก WiCAN ได้กันแล้ว ขั้นต่อไปจะเป็นเรื่องของการวิเคราะห์ข้อมูลถอดรหัสล้วนๆ
หลักๆ การจะ Decode ออกมาได้เนี่ย เราจะต้องรู้ค่าทั้ง 2 ฝั่ง นั่นก็คือ ค่าที่ใช้แสดงผลจากแอป Car Scanner กับค่าที่ออกมาจาก WiCAN แล้วก็มาพยายามหาความสัมพันธ์กัน เก็บค่าจากแอปเทียบคู่กับค่า Byte ที่ได้ออกมาจริงสัก 2-3 ค่า เราก็พอจะเดาได้ละว่า Byte ที่เรากำลังมองหาคืออะไร อย่างไรก็ดี มันก็มีระดับความยากของมันอยู่
แค่เห็นก็เดาได้
บางครั้งมันก็ตรงไปตรงมาแบบ 1:1 บอก 100 ก็คือ 100 หรือ 80 ก็คือ 80 แค่หาตำแหน่ง Byte ที่ถูกต้องให้ได้ก็พอ ตัวอย่างเช่น State of Health (SoH) สามารถใช้ค่า 0-100 ได้เลย เพราะว่าค่าแต่ละ Byte มันเก็บข้อมูลได้ 0-255 นั่นเอง
มาเล่นเกมถอดตัวเลขกัน
บางทีมันก็ไม่ตรงไปตรงมาเสมอไป (ส่วนใหญ่เสียด้วยซิ) โดยเฉพาะค่าทีเป็นทศนิยม ตัวอย่างเช่นค่า SoC ที่ยกตัวอย่างไปด้านบน ค่ามันไล่จาก 0.0 – 100.0 โดยที่ step ของมันคือ 0.1 ดังนั้น ค่าจริงๆ ของมันจะต้องมี 1000 steps นั่นเอง แปลว่า byte เดียวไม่พอแล้ว ต้องใช้ถึง 2 ก็เลยเกิดเหตุ Expression ประมาณว่า [B1:B2] ขึ้นมี ซึ่งมันมีค่าเท่ากับ B1*256+B2 นั่นเอง ทีนี้หลังจากที่เราได้ค่าแบบ Byte มาแล้ว ก็ต้องหาว่าค่ามัน Diff จาก 0 เท่าไหร่ ก็หาค่าไปบวกเข้าไปซะให้มันตรงกัน สุดท้ายคือมันเป็นทศนิยม 1 ตำแหน่งใช้ไหม ก็ x0.1 เข้าไป ก็จะได้ค่าที่ต้องการ
มาดูตัวอย่างของ SoC กันอีกสักรอบ
58.1 = [5,98,3,8,2,69,204,204] = [B4:B5]/10 = (B4*256+B5)/10 = (2*256+69)/10 = 58.1
25.9 = [5,98,3,8,1,3,204,204] = [B4:B5]/10 = (B4*256+B5)/10 = (1*256+3)/10 = 25.9
มันก็เลยได้ว่า Expression: [B4:B5]/10 = (B4*256+B5)/10 คือคำตอบ
ยากแบบเริ่มจะตลกละ
มีค่าหนึ่งที่ผมใช้เวลาแกะนานมากเพราะ Car Scanner มันแปลงหน่วยมาให้ทำให้หาค่าจริงไม่เจอสักที นั่นก็คือ HV Power ก็คือกระแสไฟที่ไหลเข้าออก HV Battery นั่นเอง ที่ยากเพราะว่ามันมีได้ 2 หน่วยคือ kW กับ A นั่นเอง ผมไม่ได้เก็บตัวอย่างค่าเอาไว้ให้ แต่นี่คือ Expression ที่ผมแกะมาได้
-(((b[4]*256+b[5])*0.03425743)-274.108-0.05)
เห็นแล้วจะบ้า ความจริงมัน simplify ได้อะนะ แต่ผมอยากเก็บ mark เอาไว้ว่าค่ามันขยับทีละ 0.05 ก็เลยเลขแยกเอาไว้
เหตุที่มันยากขนาดนี้มันน่าจะเกิดจากหน่วยหลักที่มันให้มาน่าจะเป็น A นั่นเอง แต่ผมจะเอามาใช้เป็น kW ไง พอเลือกหน่วยผิด ชีวิตเปลี่ยน ทำให้ถอดค่ายากมาก แต่ก็ยังหามาได้อยู่ดี 🙂
เทคนิคการหาก็คือ พยายามหาให้ได้ว่า แต่ละ step มันขยับค่าใน car scanner เท่าไหร่กันแน่ เมื่อหาตัวคูณออกมาให้ได้ ซึ่งในที่นี้ก็คือ 0.034 นั่นเอง ทีนี้ก็หาว่า ที่ค่า 0 มันจะอยู่เลข Byte ที่เท่าไหร่ ก็ทำการ บวกหรือลบ ให้ได้ค่าตามที่เราคาดหวัง ส่วนที่ผมได้ค่าทศนิยมละเอียดมากออกมา มันเกิดจากผมได้ค่าจาก range ที่กว้างมาก ก็เลยเอามาเข้าระบบสมการหาค่าสัมประสิทธิ์ออกมานั่นเอง มันก็จะแม่นขึ้นอีกนิดหน่อย
เมื่อหลายค่าส่งมาใน rx เดียว ต้องพยายามดูพยายามแมพไปพร้อมๆ
มาลองอีกสักตัวอย่าง เป็นการที่ผมพยายามจะหาความดันลมยาง อันนี้จะซับซ้อนหน่อย เพราะผมพยายามแกะ 4 ตัวแปรในครั้งเดียว คือค่า rx ที่ได้มามันมีหลายค่าที่เรากำลังมองหาอยู่ด้วย ก็เลยทำให้ยาก ลองดูตัวอย่างไฟล์นี้ดู WiCAN – Ora Good Cat – Tire Sensors เนื่องจากมันเป็นทศนิยม แล้วก็ได้ไม่ขึ้นทีละ 0.1 ด้วย ก็เลยต้องพยายามแกะๆ ดู ทำให้ผมได้ความสัมพันธ์ (โดยประมาณ) แล้วเอาไปพล็อคข้อมูลใน Sheet ที่ชื่อ Mapping แล้วเอามาลองจำลองดู หลังจากนั้นจึงแกะออกมาเป็นสมการได้ว่า tire_pressure_front_right: b[7]*0.2-0.22 และ tire_pressure_front_right: b[7]*0.2-0.22 ประมาณนี้
มันกลายเป็นว่า แทนที่ค่ามันจะขึ้นทีละ 0.01 มันกลายเป็นขึ้นทีละ (ประมาณ) 0.2 แทน (บางทีก็ 0.19) ส่วนใครจะไปตรัสรู้ อันนี้ก็ต้องลองสังเกต pattern กันเอาเอง หมายถึงว่า เรามีการเก็บค่าจาก Car Scanner ออกมาจำนวนเยอะๆ แล้วดู Step ในการเพิ่มขึ้นของข้อมูล ลองพยายามหา Step ที่แคบที่สุด จากนั้นก็สมมุติว่าอันนั้นคือมีการขยับค่า +1 สำหรับ byte ที่เรากำลังมองหาอยู่ แล้วก็ Map ออกมา ก็จะได้ตารางอย่างที่ผมทำให้ดูเป็นตัวอย่าง

น่าจะพอหอมปากหอมคอ ที่เหลือก็ไปลุยด้วยกันครับ ตอนนี้ผมพยายามแกะกับผู้ผลิต WiCAN อยู่ที่นี่ https://github.com/meatpiHQ/wican-fw/issues/313 มีความหวังว่าอีกหน่อยอาจจะไม่ต้องมาแกะยากๆ แบบนี้กันอีก
สรุปโครงการ: Smart Home กับรถยนต์ EV
สำหรับ Smart Home Ecosystem ในบ้านผม ไม่ได้มีแค่พี่แมวน้อยนะ ยังมีอุปกรณ์อื่นๆ อีกเพียบ เช่น
- มิเตอร์วัดไฟเครื่องชาร์จ EV ใช้สำหรับดูปริมาณไฟที่ใช้งานแบบจริงๆ รวมถึงใช้ตัดไฟอัตโนมัติเมื่อรถยนต์ชาร์จไฟได้ตามที่ต้องการแล้ว
- เครื่องชาร์จไฟแบบที่ต่อ WiFi ได้ ทำให้สามารถควบคุมกระแสไฟที่จะชาร์จเข้าตัวรถได้ วันไหนอยากปล่อยยาวชาร์จช้าๆ ทั้งคืนก็ลดกำลังไฟลงมาได้
- กล้องวงจรปิดหน้าบ้าน เอาไว้ดูรถที่กำลังจอดชาร์จไฟให้อุ่นใจ (เพื่อ??)
ทั้งหมดนี้ทำงานร่วมกันอย่างมีประสิทธิภาพ ช่วยให้ชีวิตสะดวกสบายขึ้นเยอะเลย

เป้าหมายต่อไปและการอยากขอความร่วมมือ
เบื้องต้น Sensors ต่างๆ ผมก็ได้ตามที่ตัวเองต้องการแล้วล่ะ แต่ความจริงมันก็มี Sensor อีกหลายตัวที่อาจจะมีประโยชน์ ลองจินตนาการว่า ถ้าหาก WiCAN สามารถต่อ Internet ขณะที่รถวิ่งแล้วส่งสัญญาณกลับมาที่ HA ที่บ้านได้ เราก็จะสามารถ Monitor การขับรถได้ด้วยใช่ไหมล่ะ มันก็น่าสนใจ ดังนั้น Project นี้คงยังอีกยาวๆ อย่างไรก็ดี นี่คือรายการที่ผมอยากจะพัฒนาต่อในอนาคต
- ตั้ง Community เล็กๆ สำหรับแลกเปลี่ยนข้อมูลแก่กัน (จริงๆ ไปรวมตัวกันที่นี่ก็ได้ ORA Funky Cat)
- แกะ Sensors เพิ่มเติมตามที่สมาชิกในทีมสนใจ มาช่วยกันแกะ แล้วก็แบ่งปันกัน
- ศึกษาเรื่องการทำ AutoPID บน WiCAN เพื่อจะได้ตัด Node-RED ออกไปจากสมการ
- ต่อ WiCAN เข้ากับอินเทอร์เน็ต
ความจริงผมก็ยังเพิ่งเริ่มเข้าวงการนี้มาเหมือนกัน ถ้ามีใครเชี่ยวชาญเรื่อง CAN แล้วมีเวลาอย่างแบ่งปัน ก็รบกวนติดต่อเข้ามาให้ความรู้ผมหน่อยว่าสิ่งต่างๆ มันเชื่อมโยงกันอย่างไร ผมก็จะยินดีอย่างยิ่ง ทักเข้ามาได้เลยครับ
บทส่งท้าย สำหรับจุดเริ่มต้น
โครงการนี้ใช้เวลาทำประมาณสองเดือนครึ่ง ส่วนที่ยากที่สุดคือการแกะข้อมูล CAN จากรถ ต้องใช้ความพยายามอย่างมากในการเก็บข้อมูล หารูปแบบของข้อมูล แล้วก็เขียน Code บน Node-RED เพื่อเอามาแปลง แต่สุดท้ายก็สำเร็จจนได้ รู้สึกล้ำๆ สุดๆ
ส่วนตัวตอนนี้กำลังติดต่อกับผู้ผลิต WiCAN เพื่อบรรจุ Ora Good Cat ลงไปใน Database ของตัวอุปกรณ์ จะได้สามารถเชื่อมต่อกันได้โดยง่ายสำหรับคนต่อๆ ไป แล้วก็กำลังหาเพื่อนร่วมอุดมการณ์เพิ่มเติม เผื่อจะช่วยกันเก็บข้อมูล ถอดรหัส แล้วก็แบ่งปันกัน จะได้มี Sensors มาใช้งานกันเยอะๆ 🙂
หวังว่าบทความนี้จะเป็นประโยชน์สำหรับคนที่สนใจทำ Smart Home กับรถยนต์นะครับ ถ้ามีคำถามหรือข้อสงสัย คอมเมนต์ไว้ด้านล่างได้เลย หรือจะติดต่อมา FB ของผมก็ได้ ยินดีแลกเปลี่ยนประสบการณ์ครับ!
ขออนุญาตปิดท้ายด้วยข้อมูล Sensors เท่าที่ผมหามาได้ ณ วันที่ 2025-02-15 ครับ

ตารางนี้คืออะไร ใช้งานยังไง รอติดตามกันใน Part 2 นะครับ 🙂