รีวิว ระบบชาร์จรถให้น้องแมวแบบ หาทำ (ตอนจบ)

ตอนที่เราเริ่ม Project นี้ แน่นอนว่า เพื่อน ๆ ทุกคนบอกว่า มึง มัน หา ทำ ชิบ หาย ไอ้ เ_ย แน่นอนว่า Who cares???? ฮ่า ๆ เอาดิวะ แมร่งคนจริงมันต้อง หา ทำ ดิ ใจ เ ก เ ร อะ ไม่รู้จักเหรอ เรามาต่อกันเลยละกัน ใครยังไม่ได้อ่านตอนแรกไปอ่านก่อนนะ

ระบบป้องกันอุณหภูมิ

เรื่องของการป้องกันตัวระบบไฟฟ้า พวก RCBO มันก็ป้องกันในหลาย ๆ เรื่องแล้วละ แต่เรื่องที่เรากังวลคือ ไฟไหม้ เอาจริง ๆ คือ เราเห็นในกลาย ๆ คลิป แล้วก็คือน่ากลัวอยู่นะ แล้วเราโหลดกำลังสูง ๆ อย่าง 7 kW เอาจริง ๆ คือ เยอะกว่าเครื่องทำน้ำอุ่นอีก โหลดนานกว่าเยอะด้วย ทำให้เกิดความร้อนมหาศาลเลย ทำให้เราเลือกที่จะใช้ Hardware ง่าย ๆ คือ ESP8266 กับ DHT22 ในการวัดอุณหภูมิ กับความชื้นแบบง่าย ๆ ในตู้

ส่วนถ้าเอาในรายละเอียดจริง ๆ ไม่มีอะไรเลย คือ เราต่อ ESP8266 เข้ากับบ้านด้วย WiFi 2.4 GHz ทั่ว ๆ ไป แล้วต่อไปที่ MQTT Broker ที่เราเปิดขึ้นมาเป็น Server ในบ้าน ซึ่งแน่นอนว่า Home Assistant มี Integration ที่สามารถ Subscribe Toptic ที่เรากำหนดได้ ทำให้เราสามารถที่จะเชื่อมต่อมันได้แบบง่าย ๆ เลย ถามว่า แล้วทำไมเราไม่ใช้ ESPHome ละมันง่ายกว่า จริง ๆ คือ มันเสถียรสู้เราเขียนเองไม่ได้ และเราไม่อยากมานั่ง Debug ESPHome ด้วย เลยใช้ของเราเองนี่แหละง่ายดี ไม่ต้องเครียดอะไรเยอะ มันอยู่ใน Local ไม่ได้น่ากลัวเท่าไหร่

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

ทำให้เกิดคำถามว่า ชิบหาย แล้วเท่าไหร่ถึงจะเรียกว่าสูงละ เพราะมันขึ้นกับความเที่ยง และ ความแม่นของ Sensor เราอีก ดังนั้น เราเลยพยายามสร้าง Baseline ขึ้นมา โดยเราก็ Record อุณหภูมิเรื่อย ๆ แล้วเอามาเทียบกับอุณหภูมิหน้าบ้านเหมือนกัน ดูว่าความต่างเป็นเท่าไหร่ ง่าย ๆ เลย เราก็หาค่าเฉลี่ยไปเรื่อย ๆ ถ้ามันมากกว่า 1SD เราก็จะแจ้งเตือน แล้วถ้ามันมากกว่า 2SD เราจะสั่งปิดทันที ถามว่า 1 กับ 2 มาจากไหน จริง ๆ

คือถ้าเราสมมุติว่า ความต่างของอุณหภูมิมันอยู่ใน Normal Distribution การที่เราบอกว่า +- 1SD เท่ากับว่า เรา Cover ไป 68% ของเหตุการณ์ทั้งหมดแล้วนะ แต่ถ้าเราบอกว่า +-2SD ก็คือกดไป 95% ของทั้งหมดแล้ว กับตามที่เราวัดมา ข้อมูลทั้งหมดของเราก็อยู่ในช่วง +-1SD จริง ๆ ไม่ถึงด้วย ทำให้เราตั้งช่วง +1SD เป็นตัว Baseline ถ้าเกินให้เตือนทันที และ ถ้ามากกว่า +2SD ให้เตือนแล้วตัดเลย เพื่อป้องกันอันตราย ถึงจะเป็น False Alarm ก็เถอะ แต่เครื่องมันรู้ได้แค่นี้ ดีกว่าไหม้จริง ฮ่า ๆ

ระบบป้องกันรั้ว

ที่บ้าน พึ่งเปลี่ยนมาใช้รั้วไฟฟ้า ก็คือ สามารถกดปิดเปิดจาก Remote ได้ โดยที่เราไม่ต้องไปเลื่อนเอง เวลาเราเอารถเข้าไปจอดชาร์จจะได้ไม่ต้องมาเปิดเอง มันขี้เกียจแหละ ดูออก เราข้ามเรื่องของการ เอาประตูนี่ Integrate เข้า Smart Home นะ ไว้ตอนหน้าเลย แต่เรามีปัญหา เพราะว่า ตอนนี้ถ้าเราเอารถเข้าไปเสียบเนี่ย ตูดรถมันจะเกินรั้ว ทำให้ถ้าเราไปเผลอกดปิดรั้ว อาจจะไปโดนรถได้ ไม่อยากให้เกิดขึ้นแน่ ๆ ดังนั้น เราจะต้องเขียนอะไรออกมาจัดการ

ซึ่งเราก็คิดไม่ออกเหมือนกันว่าจะทำยังไงดี จริง ๆ คือ เราสามารถใช้ Sensor ไปติดได้ แต่ว่า เราไม่อยากเดินสาย มันยุ่งยากมากไหนจะสายข้อมูล และ สายไฟอีก หาทำโดนแม่ด่าแน่นอน ดังนั้น เราอาจจะต้องหาวิธีอื่นมาช่วย ซึ่ง พอดีว่า เรามีกล้องวงจรปิดส่องอยู่หน้าบ้านพอดี เราก็แค่เอาภาพจากกล้อง Feed เข้า Image Recognition Model เท่านั้นเอง แล้วเขียนเป็น Sensor กลับมาให้ Home Assistant เท่านั้นเอง พวกนี้มันเป็น Pre-Trained Model เราไม่ต้องทำอะไร แค่เอาว่า เจอ Car เราก็พอละ ไม่ให้ปิดผ่าน App เท่านั้นเอง ให้กด Remote เอาง่าย ๆ

แต่เราขอ Refine เพิ่มหน่อย เพราะ การใช้ Model พวกนี้ มันกินทรัพยากรเครื่องหนักมาก ทำให้เราไม่โอเคเท่าไหร่ เปลืองไฟฟฟฟฟฟฟ เราเลยเลือกที่จะยอมให้มี Update Interval อยู่ ทำให้มันไม่ต้องยิงไปทุก Frame มันเลือกที่จะมี Interval แล้วยิง Frame นั้นไป Downside ของวิธีนี้ก็คือ กว่าที่ค่ามันจะ Update ก็จะใช้เวลาหน่อย ซึ่งของเราจริง ๆ ก็อยู่หลัก นาทีเดียวเท่านั้นเอง เลยไม่ได้เดือนร้อนอะไร

Design ระบบการชาร์จเมื่อไฟ Solar เหลือ

ส่วนของการชาร์จเมื่อพลังงานจาก Solar เหลือ ดูเหมือนจะง่าย ๆ คือ ถ้าเราเห็นว่า พลังงานมันเหลือ เราก็เสียบเข้าไปได้เลยสินะ จริง ๆ แล้วมันมีอะไรมากกว่านั้นนิดหน่อยคือ ถ้าเราสังเกตค่าพลังงานที่เราได้มา บางวัน ที่มีเมฆเยอะ เราจะเห็นว่า ค่าพลังงานมันเหวี่ยงขึ้นลงเยอะมาก ๆ ทำให้ถ้าเราทำแค่เช็คเฉย ๆ เลย แตก ได้เจอ รถชาร์จไป 30 วิ แล้วหยุดแล้ววนไปเรื่อย ๆ แน่นอน ดังนั้นมันจะต้องมีกลไกอะไรบางอย่างมาเพื่อทำให้ Optimise ให้เงื่อนไขมันซอฟลงหน่อย แต่ก็ยังทำให้เราลดการใช้ไฟจากการไฟฟ้าให้ได้มากที่สุดอยู่ดี

วิธีที่ง่าย ๆ คือ เราอาจจะเอา Data Point เช่น ของสัก 30 - 60 วินาที มาหาค่าเฉลี่ยมั้ย ทำให้เราเห็นว่า ถึงแม้ว่า เมฆจะบังอยู่แปบนึง แต่ Data Point หลังจากที่เราเฉลี่ยออกมา มันก็จะไม่วิ่งขึ้น ๆ ลง ๆ จนทำให้ที่ชาร์จแตกแล้วนั่นเอง แต่มันก็ยังแอบมีปัญหาเยอะ ทำให้อีกวิธีที่เราเลือกใช้คือการ Apply Savitzky-Golay Filter แน่นอนว่าใน Home Assistant มันไม่มีน่ะสิ เราก็แค่เขียน Integration รับค่าพลังงานเข้าไปแล้วคืนกลับมาเป็น Sensor ที่ผ่าน Savitzky-Golay Filter แล้วก็เป็นอันเรียบร้อย เราก็เอาไปเข้าเงื่อนไข การ Limit แล้วละ

ทำให้คำถามต่อไปคือ เราจะรู้ได้ยังไงว่า ไฟเหลือแค่นี้ถึงจะชาร์จได้ ถ้าเอา Ideal แบบไม่โดนเลยคือ เราก็น่าจะต้องเหลือไฟ 7 kW ถึงจะเริ่มชาร์จได้แบบโอกาสดึงจาก Grid ต่ำมาก แต่เอาจริง ๆ ระบบ Solar Cell มันมีกันย้อน หมายความว่า Solar Inverter มันจะมี Smart Metre แขวนไว้อยู่ เพื่ออ่านไฟจากเส้น Main ให้เป็น Net Zero หรือก็คือ ถ้าเราใช้ไม่หมด มันก็จะลดกำลังการผลิต เพื่อป้องกันไฟย้อนกลับไปที่ Grid นั่นเอง อันนี้เป็นเรื่องที่ต้องทำเนอะ ไม่งั้นเดี๋ยวการไฟฟ้าฟาดเข้าให้ ไม่รู้ละ

ทำให้ปัญหามันมาเลย ว่า แล้วเราจะเอายังไงดีละ โอเคแหละ เรารู้นะว่า Inverter มันจำกัดการผลิตพลังงานเมื่อไหร่ เพราะสถานะที่เครื่องให้กลับมามันบอกเราเลย แต่มันไม่ได้บอกว่า ความจริงแล้วมันได้เท่าไหร่กันแน่ โอเคแหละ วิธีนึงคือการลองปิดกันย้อน แต่แหม่ การไฟฟ้ากินหัวชั้นพอดี ไม่ได้ป่ะ แต่เรารู้เรื่องนึงว่า ยิ่งแสงเข้มเท่าไหร่ พลังงานที่เราจะได้ก็จะเยอะขึ้นจนถึง Limit ของมันนั่นเอง ดังนั้นวิธีคือเราก็เก็บค่าแสงเทียบกับค่าการผลิตเอาสิ ถ้าเราทำแบบนี้ เราก็พอที่จะสร้าง Model สำหรับการ Predict ค่าพลังงานจากแสงได้แล้ว แต่เอาเข้าจริง โลกความเป็นจริงมันกวนตีนเรากว่านั้นเยอะ มันมี Noise เยอะอยู่ ทำให้ตอนแรกเรา Mislead อยู่ว่า มันจะขึ้นเป็น Linear แต่ความเป็นจริงแล้วมันไม่ได้แบบนั้นตลอดเวลา เพราะแผง Solar Cell บ้านเรามันมีหลายทิศ และจำนวนไม่เท่ากัน ทำให้เราจะต้องเอาเรื่องของมุมพระอาทิตย์ เข้ามาช่วยด้วย ก็ทำให้เราสามารถใช้ Linear Regression โง่ ๆ นี่แหละทำได้เลย ไม่ต้องทำ Deep Learning อะไรให้เสียเวลา แต่เราก็จะ Cap ไฟสูงสุดไว้ที่ 5.5 kW (ถ้า Model ตีกว่ามากกว่า 5.5 ก็จะตันที่ 5.5 kW) เพราะเรารู้ว่าระบบเราไม่มีทางผลิตเกินได้แน่นอน นั่นแหละ เราก็พอจะรู้ละว่า จริง ๆ แล้ว ณ เวลานี้ มันน่าจะผลิตได้เท่าไหร่ แบบคร่าว ๆ

พอรู้แล้วว่า ค่าพลังงานที่ Solar จะผลิตได้เป็นเท่าไหร่แบบ ประมาณ อะนะ คำถามคือ เมื่อมันเกินแล้ว เราจะเอาเกินเท่าไหร่มาเป็นเงื่อนไขในการทำให้เริ่มชาร์จ อะอันนี้สนุกละ เรารู้แล้วว่า ยิ่งเราชาร์จเยอะ โอกาสที่เราจะพลาด เราจะดึงไฟจาก Grid เยอะมากขึ้นแน่นอน และเมื่อเราเริ่มแล้วเราไม่ควรที่จะหยุด ๆ ติด ๆ เพราะจะทำให้ Charger และ รถ เสียหายได้ ดังนั้น เริ่มแล้วถอยไม่ได้แล้ว หรือ ที่เราคิดก็คือ มีโอกาสถอยได้ครั้งเดียว หรือก็คือ เริ่มแล้วเราหยุดปุ๊บ ระบบจะต้องหยุด ไม่กลับมากดต่อเว้นแต่ผู้ใช้จะกด คำถามคือ หยุดเมื่อไหร่ดีที่สุด เมื่อไหร่ถึงจะรู้ว่า ชิบหายแล้วแน่นอน

ย้อนกลับไปที่ การที่จะมีแดดออกกัน การที่แดด ออกอะ ส่วนนึงคือ มันต้องเป็นตอนกลางวัน หรือก็คือ พระอาทิตย์มันเลยขอบฟ้าขึ้นมา อันนี้ชัวร์ ไม่จริงให้ตบเลย แต่นอกจากนั้นละ คือ อะ เรารู้ว่า ถ้าฝนตก แดด ออกยากมากแน่ ๆ ทำให้มันนำไปสู่ Model ในการประมาณกำลังไฟจาก Solar Cell แล้ว ตัวแปรที่เราฟิคได้คือ ทิศ และ จำนวน ของแผง และกำลังสูงสุดของ Inverter ตัวแปรต้นคือ Factor ที่เราจะวัดได้ ในที่นี้เราใช้ อุณหภูมิ ความชื้น ความดัน และ แสง เพื่อให้ได้ตัวแปรตามเป็นกำลังไฟที่น่าจะผลิตได้ในช่วงเวลานั้น ๆ นอกจากนั้น ถ้าก่อนหน้านี้ฝนตก มันก็อาจจะทำให้พลังงานในรอบปัจจุบันมันตกด้วย แปลว่า Data Point ก่อนหน้ามีผลต่อ Predicted Data Point ในรอบปัจจุบัน และ เราไม่รู้ว่าฝนจะตกเมื่อไหร่ ดังนั้นแมร่ง Non-Linear Problem แน่นอนทำให้เราเลือกที่จะใช้ LSTM (Long-Short Term Memory) ที่เป็น RNN ในการสร้าง Model ออกมา ทำให้เราพอจะ Predict ค่าการผลิตเฉลี่ยแต่ละชั่วโมงโดยเอาข้อมูลจริงก่อนหน้าใส่เข้าไปด้วย ก็ได้ละ

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

จริง ๆ แล้ว พวกที่ชาร์จ เราสามารถสั่งตัว Pin นึงในหัว Type 2 บอกรถให้มันดึงกำลังสูงสุดที่เท่าไหร่ เหมือนจะต้องไป Tap Pin Control Pilot (CP) เลยกำลังคิดว่า เราจะดัดแปลงเอา ESP8266 มาเสียบ แล้วเราก็โปรแกรมให้ก่อนจะเข้า Stage Charge เราก็ลอก State ของตัว Charger แล้วพอหลังจากนั้น เราก็ทำให้เราสามารถสั่ง State จากฝั่งเราได้แทนอะไรแบบนั้น แต่ยังไม่ทำเร็ว ๆ นี้แน่ ๆ ไม่งั้นหมดประกันแน่ ๆ

ถามว่า แล้วทำไมเราไม่ทำเครื่องชาร์จเอง เอ่อออ เรามาสาย AI แหละ ให้เราประกอบเครื่องใช้ไฟฟ้า เกรงว่า จะ ไม่ รอด ไม่ก็ไม่เหลือบ้านแน่ ๆ ดังนั้น เราก็จะไม่หาทำถึงเบอร์นั้นแหละ

Interface Design

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

เพื่อให้เราไม่ต้องนอนข้างถนน เราต้องออกแบบระบบ ให้มันเข้าใจได้ง่าย ใช้งานง่ายตามไป ดังนั้นเราต้องเริ่มจากการออกแบบ Flow การใช้งานก่อน (โอเคแหละ จริง ๆ ไอ้นี่ควรอยู่ตอนที่ 1 แต่ก็นะ เหอะ ๆ ตอนนั้นมันเพ้ออะ) ก็คือ เราเสียบสายเข้ากับรถ เข้า App แล้วกดเริ่มชาร์จ เสร็จ ก็ถอดสายออกเป็นอันจบ แต่ถ้าเรามาดูจริง ๆ จากการทดลอง โอเค เรื่องของขั้นตอนการเสียบสาย ก็ได้อยู่ แต่ขั้นตอนที่ไม่สนุกสุด ๆ คือ การกดเข้าไปใน App แล้วเริ่มชาร์จ ขนาดเราเอง บางครั้งเรายังรู้สึกว่ามันยากเลย แน่นอนว่า แม่ไม่น่าจะเอนจอยเท่าไหร่

ทำให้เราจะต้องออกแบบ เมนูที่เข้าใจง่าย ๆ หน่อย เราเลยทำเป็นปุ่มง่าย ๆ คือ เรามี Wall Charger กับ Power Plug สำหรับเสียบ Emergency Charger กดเพื่อเลือกเลยว่า เราจะชาร์จผ่านอันไหน

ปัญหาต่อมาคือ เมื่อเรากดเริ่มชาร์จไปคือมันจะไปเปิด Breaker ที่ต่อกับ Wall-Charge มันจะต้องใช้เวลาสักพักในการให้ระบบเริ่มทำงาน แล้วจ่ายไฟเข้ากับรถ ทำให้เราเลือกที่จะเปิด Notification เมื่อรถเริ่มได้รับไฟเต็ม ๆ เข้าไป เวลาเรากดเปิด มันจะได้มี Feedback อะไรกลับมาบ้าง ไม่งั้น มันจะเหมือนกับเรากดแล้ว ต้องชะโงกหัวไปดูที่เครื่อง มันเสียเวลา

จากนั้น Interface ที่เติมเข้ามา และ แสดงเฉพาะเมื่อเราชาร์จอยู่คือ เซ็ตข้อมูลการชาร์จใน Session ปัจจุบัน แสดงพวก Power, Delivered Energy, Current, Voltage และที่สนุกคือ Added Range หรือระยะทางที่ได้เพิ่มมาจากการชาร์จ

ตัวข้อมูล 4 ตัวแรก มันก็เป็นข้อมูลทั่ว ๆ ไปแหละ เพื่อให้เราพอจะ Diagnostics ถึงความผิดปกติ และ คำนวณพลังงานที่จ่ายให้รถไป แต่แน่นอนว่า มันแอบเข้าใจยากไปหน่อย เราเลยพยายามทำให้ง่ายขึ้น โดยการเปลี่ยนเป็นระยะทางที่เราได้เข้ามาแทน โดยคำนวณง่าย ๆ เรารู้ว่า 60 kWh เราได้ 500 km ทำ Cross-Multiplication เราก็จะรู้ว่า 1 kWh วิ่งได้เท่าไหร่ แค่นั้นเอง

จากนั้นข้างล่าง ก็จะเป็น ตัวเลือกการชาร์จแล้ว ว่าเราอยากจะ Limit การชาร์จแบบไหน โดยเราจะเลือกได้ว่า เอาจนกว่าจะเต็ม, จะเพิ่มเป็น Percentage ที่เราคุยกันเมื่อตอนก่อน หรือจะเป็นเอาแค่ตอนที่ Solar Cell ผลิตได้เกิน จากนั้น ตัวเลือกด้านล่าง ก็จะโผล่ขึ้นมาตามโหมดที่เราเลือกเพื่อให้มันไม่รกไป เรายอมยุ่งยากเขียน Condition เพิ่ม แต่ก็ทำให้เรียบง่ายขึ้นเยอะมาก

ตอน Implement จริง ๆ เราก็ใช้งาน Mushroom Theme ที่ตอนนี้ใน Home Assistant คนกำลังติดกันงอมแงมเลย ซึ่งแมร่งสวยจริง ทำออกมาแล้วดูเรียบง่ายจริง ๆ

สรุป

และนี่แหละ ก็คือความ หา ทำ ของเรากับการทำให้ที่ชาร์จมัน Smart ขึ้นมา ไม่รู้ว่าจะเรียกว่า Smart หรือ หา ทำ บ้า บอ หรืออะไรดีเหมือนกัน แต่ก็สนุกนะ จริง ๆ มันจะมีรายละเอียดพวกเรื่องของการคำนวณที่เยอะมาก ๆ กับพวกการออกแบบ Model ต่าง ๆ เช่นพวกเรื่อง LSTM with Attention แต่เราขอตัดออกละกัน ไม่งั้นจะยาวเป็นเล่ม ใน Version ต่อ ๆ ไป เราอยากจะรับค่าจาก OBD2 กลับไปแสดงผลด้วย น่าจะสนุกกว่าเดิม ทำให้เราได้ข้อมูลมาคิดอะไรอีกเยอะมาก ๆ ไว้ถ้าทำได้ แล้วเราจะมาอัพเดทอีกละกันเนอะ