โปรเจกต์ Shutdown เมื่อเกิด Power Blackout
เมื่อคุณสูญเสีย AC power ระบบ Backup จะเข้าทำงานแทนที่ โปรเจกต์นี้จะทำการ Shutdown อุปกรณ์ที่เปราะบางของคุณก่อนที่ UPS จะหยุดทำงาน
เมื่อคุณสูญเสีย AC power ระบบ Backup จะเข้าทำงานแทนที่ โปรเจกต์นี้จะทำการ Shutdown อุปกรณ์ที่เปราะบางของคุณก่อนที่ UPS จะหยุดทำงาน
หากคุณเป็นเหมือนผม คุณคงจะมีเครื่องสำรองไฟ (UPS) คอยปกป้องอุปกรณ์ที่มีค่าของคุณอยู่ แต่จะเกิดอะไรขึ้นเมื่อ UPS แบตเตอรี่หมด? หวังว่าคุณจะอยู่แถวนั้นเพื่อปิดทุกอย่างก่อนที่มันจะเกิดขึ้น หรือผู้ผลิตระบบสำรองไฟของคุณได้จัดเตรียมซอฟต์แวร์เพื่อปิด PC ของคุณไว้ให้แล้ว แต่สำหรับ Raspberry Pi (RPi) ล่ะ การที่ไฟดับอาจทำให้ระบบปฏิบัติการของ RPi เสียหายได้ ในโปรเจกต์นี้ ผมใช้ Home Assistant (HA) บน Raspberry Pi, MySensors และ Arduino power sensor เพื่อตรวจจับการสูญเสียพลังงาน AC และเริ่มขั้นตอนการปิดระบบสำหรับ RPi, PC และอุปกรณ์อื่นๆ ที่อาจได้รับความเสียหายในเครือข่ายของคุณ
วิธีการนั้นง่ายมาก คือมี Arduino AC power sensor ต่อเข้ากับ UPS ซึ่งจะตรวจจับไฟดับโดยการตรวจสอบแหล่งจ่ายไฟ 5VDC ที่เสียบอยู่กับเต้ารับที่ไม่ได้ต่อกับระบบสำรองไฟ และเมื่อตรวจพบแล้ว จะเริ่มกระบวนการทำงานร่วมกันระหว่าง Arduino และ HA เพื่อสั่งให้อุปกรณ์ในเครือข่ายปิดการทำงาน จากนั้นจึงปิด RPi โดยที่ Arduino จะยังคงได้รับพลังงานจาก UPS หากไฟฟ้ากลับมาใช้งานได้ปกติ Arduino จะทำการรีบูต Raspberry ที่ติดตั้ง Hassio ไว้ เมื่อ Raspberry เริ่มทำงานแล้ว Arduino จะส่งข้อความไปยัง Home Assistant (HA) เพื่อจ่ายไฟให้กับ PC ทำให้มันบูตขึ้นมา ซึ่งเป็นการเสร็จสิ้นการรีบูตระบบ กระบวนการเดียวกันนี้สามารถขยายเพื่อใช้กับการบูต PC จำนวนเท่าใดก็ได้
หากเราพิจารณาว่าระบบประกอบด้วย Arduino, Raspberry, เครือข่าย และ PC ที่เชื่อมต่ออยู่ ระบบจะมีสถานะดังต่อไปนี้:
จะเกิดอะไรขึ้นถ้าเครือข่ายล่มหลังจาก UPS พลังงานหมด? เมื่อไฟฟ้ากลับมาที่ Arduino มันจะเปิด Relay ที่จ่ายไฟให้ RPi ทันทีเพื่อให้ RPi บูตขึ้นมา นอกจากนี้ยังมีการหน่วงเวลาที่เพียงพอเพื่อให้ RPi บูตและเครือข่ายกลับมาใช้งานได้อีกครั้ง เมื่อ RPi ทำงานและรัน HA แล้ว Arduino จะสั่งให้ HA บูต PC โดยเพียงแค่เปิด Wemo Smart Plug ที่จ่ายไฟให้ PC
ใน Figure 1 ด้านล่างคือแผนภาพแสดงระบบ Power Monitoring โดยมีการออกแบบ Custom circuit board (แนบไฟล์ Fritzing มาให้แล้ว) เพื่อติดตั้ง Arduino Nano, Relay, NRF24 radio และวงจร rectifier แรงดันไฟฟ้า AC อย่างง่าย ตัว Nano จะตรวจสอบเอาต์พุตของวงจร rectifier เพื่อตรวจสอบว่าไฟฟ้า AC ในบ้านยังใช้งานได้ปกติหรือไม่ นอกจากนี้ Arduino ยังควบคุม Relay ซึ่งทำหน้าที่สลับการจ่ายไฟของ RPi เพื่อเปิดและปิด ในการรีบูต RPi จำเป็นต้องเปิดสวิตช์เท่านั้น การสื่อสารกับ RPi จาก Arduino ทำผ่านเครือข่าย MySensors mesh radio ส่วน RPi ที่รัน Home Assistant จะต้องเชื่อมต่อกับเครือข่ายเดียวกับ PC ที่ต้องการควบคุม โดยต้องระบุ IP Address ของ PC แต่ละเครื่องให้กับ Home Assistant ผ่านไฟล์ Yaml configuration

การประกอบฮาร์ดแวร์ของระบบเป็นเรื่องง่ายเพียงแค่ติดตั้งอุปกรณ์ลงบน Custom PCB และติดตั้งลงในกล่องที่พิมพ์จากเครื่องพิมพ์ 3D (มีไฟล์ FreeCAD ให้) ผมใช้ไฟล์ Fritzing ที่แนบมาและส่งออกไฟล์ Gerber สำหรับการผลิต จากนั้นผมส่งไปที่ JLCPCB (PCB Prototype & PCB Fabrication Manufacturer - JLCPCB) ซึ่งเป็นผู้ผลิตแผ่นวงจรในจีนที่ทำแผ่นวงจรในราคาไม่กี่ดอลลาร์และคิดค่าขนส่งประมาณยี่สิบดอลลาร์
เพื่อให้สามารถปิด PC ได้ ผมได้ติดตั้ง Add-on ที่ชื่อว่า RPC Shutdown ซึ่งเอกสารประกอบการติดตั้งเขียนไว้ดีมากและทำตามได้ง่าย คุณจะต้องตรวจสอบ IP Address ของ PC แต่ละเครื่องที่คุณต้องการปิด ข้อมูลนี้จะถูกใส่ไว้ในไฟล์ configuration ซึ่งเป็นส่วนหนึ่งของการติดตั้ง RPC และสามารถเข้าถึงและอัปเดตได้ที่นั่น สุดท้ายคุณจะต้องรวม Automation ที่จะปิด PC เมื่อจำเป็น ผมได้รวม Automation ที่ผมใช้อยู่ปัจจุบันไว้พร้อมกับโค้ดแล้ว
Figure 2 ด้านล่างแสดงแผนผังวงจรที่ใช้ในโปรเจกต์นี้ องค์ประกอบหลักของวงจรคือ Arduino, NRF24 radio และ Relay โดย Arduino จะสื่อสารกับ NRF24 radio เพื่อรับและส่งข้อมูลไปยังระบบ Home Automation (ในที่นี้คือ Home Assistant) วัตถุประสงค์หลักของวงจรนี้คือการควบคุม Relay ซึ่งจะเชื่อมต่อพลังงานไปยัง RPi ตัว Arduino จะได้รับพลังงานจาก UPS ดังนั้นแม้ว่าไฟฟ้า AC จะดับ Arduino และอุปกรณ์สำรองไฟอื่นๆ ทั้งหมดจะยังคงทำงานอยู่ RPi มีหน้าที่รับผิดชอบในการปิด PC ตามที่กำหนดผ่าน Home Assistant automation จากนั้น RPi จะปิดตัวเองลงผ่าน Automation อีกตัวหนึ่ง เมื่อกระบวนการนั้นเสร็จสิ้น Arduino จะเปิด Relay เพื่อตัดการจ่ายไฟไปยัง RPi โดย Arduino จะยังคงได้รับไฟตราบเท่าที่ UPS ยังจ่ายไหว เมื่อไฟฟ้ากลับมา Arduino จะปิด Relay เพื่อจ่ายไฟให้ RPi และเมื่อ RPi บูตเสร็จแล้ว มันจะรับช่วงต่อในกระบวนการเปิด PC ทั้งหมดที่กำหนดไว้

Board นี้ถูกออกแบบมาให้มีความอเนกประสงค์ในตัว เพราะปกติแล้วคุณต้องสั่งซื้ออย่างน้อย 5 PCBs ในแต่ละครั้ง แผ่นวงจรที่เหลือเหล่านั้นสามารถนำไปใช้กับโปรเจกต์อื่นๆ ได้ ด้วยเหตุนี้ ผมจึงจัดเตรียมจุดเชื่อมต่อสำหรับขั้วของ Relay ไว้ให้ นอกจากนี้ยังมี Header สำหรับ Analog Outputs และ Digital Outputs อีก 5 ช่องด้วย
แผ่นวงจรที่ผมสั่งผลิตมามีปัญหาตรงที่ลายวงจรที่กว้างที่สุดก็ยังดูเหมือนจะไม่สามารถจ่ายกระแสไฟได้เพียงพอ ทำให้ RPi แจ้งเตือนเรื่องแรงดันไฟฟ้าต่ำ (Low Voltage) เพื่อแก้ไขปัญหานี้ ผมจึงเพิ่มสายจัมเปอร์ 18 awg เชื่อมต่อขั้วของ Relay เข้ากับ 2.1 mm power plugs โดยตรง ซึ่งดูเหมือนจะแก้ปัญหาได้
ในโค้ดที่แนบมามีไฟล์ Yaml ที่ชื่อว่า "Power Monitor Test Automation" ซึ่ง Automation นี้จะตัดส่วนที่ปิดสวิตช์ Wemo ของ PC และส่วนที่ปิด RPi ออก ด้วยโค้ดนี้คุณสามารถทดสอบการประสานงานระหว่างฮาร์ดแวร์/ซอฟต์แวร์ของ Arduino และ Home Assistant ที่รันบน RPi ได้โดยไม่มีความเสี่ยงที่ระบบจะล่ม Automation จะส่งอีเมลไปยังบัญชี Google ของคุณ (ซึ่งสามารถตั้งค่าใน Home Assistant เป็นการแจ้งเตือนได้ - ดูเอกสารออนไลน์ของ Home Assistant) ดังนั้นคุณจึงสามารถรับข้อความเหล่านั้นได้แบบ Real-time ผ่านอุปกรณ์พกพาของคุณ
ผมได้รวมโปรแกรมทดสอบอย่างง่ายเพื่อตรวจสอบว่า Relay และ Analog Input บน PCB ทำงานได้อย่างถูกต้อง
ในการตรวจสอบการสื่อสารของวิทยุ (MySensors) กับ Home Assistant เพียงแค่โหลดซอฟต์แวร์ Arduino ที่เปิดใช้งาน #define MY_DEBUG ไว้ แล้วใช้ Serial Port เพื่อดูว่าวิทยุสื่อสารกับ Gateway ได้จริงหรือไม่
ในการทดสอบระบบของผม ผมต่อสวิตช์ Wemo เข้ากับปลั๊กพ่วงเพื่อให้เห็นได้ง่ายว่ามันเปิดหรือปิดอยู่ ผมต่อแหล่งจ่ายไฟ 5 Volt เข้ากับปลั๊กพ่วงตัวเดียวกันนั้น และเสียบขั้วต่อ 2.1 mm เข้ากับ Power Monitor's 5 Volt input จากนั้นผมเชื่อมต่อพอร์ตโปรแกรมของ Arduino Nano เข้ากับ PC ที่ใช้เขียนโปรแกรม โปรดทราบว่าการเสียบขั้วต่อ 2.1 mm เพียงอย่างเดียวจะทำให้ Arduino มีไฟเลี้ยงอย่างน่าตกใจแม้ว่าจะเชื่อมต่อกับ Analog Input เท่านั้น การเปิด Serial Port จะทำการรีเซ็ต Arduino โดยในโค้ดจะมีการ Print ข้อความออกมามากมายเพื่อให้คุณรู้สถานะ คุณจะเห็นว่าซอฟต์แวร์จะตรวจสอบไฟฟ้าและตัดสินว่าไฟมาปกติ ซึ่งจะทำให้มันรันผ่านกระบวนการบูตเครื่อง หากคุณเปิด Home Assistant บนเบราว์เซอร์ คุณสามารถสังเกตกระบวนการบูตได้ โปรดจำไว้ว่าส่วนที่เกี่ยวข้องกับการบูต Raspberry ดูเหมือนจะไม่ทำอะไรเลย เพราะในสถานการณ์จริง เมื่อทั้ง Raspberry และ PC ปิดอยู่ ส่วนแรกของกระบวนการกู้คืนคือการบูต Raspberry แต่แน่นอนว่าถ้า Raspberry ยังไม่บูต Home Assistant ก็จะใช้งานไม่ได้ ดังนั้นส่วนนี้ของกระบวนการจะเพียงแค่รอจนกว่าการสื่อสารกับ Home Assistant จะถูกสร้างขึ้น ซึ่งจะเกิดขึ้นได้ก็ต่อเมื่อ Raspberry บูตขึ้นมาจริงๆ เท่านั้น และจำไว้ว่าสวิตช์ Wemo จะไม่สามารถเปิดได้จนกว่า Home Assistant จะพร้อมทำงาน
ด้านล่างนี้คือภาพการตั้งค่าระบบสำหรับการทดสอบ แผ่นวงจรถูกติดตั้งในกล่องโดยมี Arduino Nano ติดตั้งอยู่บน Extension Board เพื่อให้เข้าถึงพอร์ต Micro USB ได้ มันถูกวางไว้ในตำแหน่งที่ห่างจาก RPi และ PC ตัว Automation ถูกปิดใช้งานตามที่อธิบายไว้ข้างต้น อย่างที่เห็น พลังงานที่จ่ายให้กับ RPi และจาก UPS ยังไม่ได้เชื่อมต่อ ดังนั้นการเปิดและปิด Relay จึงไม่มีผลกับ RPi แต่สามารถสังเกต LED สีแดงใกล้กับ Relay เพื่อตรวจสอบการทำงานได้ RPi กำลังทำงานและ HASS กำลังรันอยู่ ดังนั้นคุณสามารถสังเกตการทำงานของระบบได้ผ่านเบราว์เซอร์บนหน้าจอ Lovelace ที่กำหนดไว้ PC ต่อตรงกับแหล่งจ่ายไฟและเปิดทิ้งไว้ ในขณะที่สวิตช์ Wemo ต่อกับปลั๊กพ่วงเท่านั้น ซึ่งสามารถสังเกตการเปิดปิดได้เมื่อได้รับคำสั่งจาก HASS ส่วน Serial Port ถูกตรวจสอบผ่าน Arduino IDE หาก Arduino ถูกรีเซ็ต มันจะเข้าสู่กระบวนการ Power-up routine เมื่อสังเกตการทำงานบน Serial Port คุณจะเห็นการสื่อสารของ MySensors ขณะที่ระบบทดสอบและพบว่า RPi ทำงานอยู่แล้ว ณ จุดนั้น คุณจะเห็น Binary Sensor "PC transitioning" เปิดขึ้น หากคุณใช้การตั้งค่าเวลาในเวอร์ชันที่แนบมา ช่วงเวลาเปลี่ยนผ่านจะใช้เวลา 12 วินาที ซึ่งสามารถสังเกตได้ทั้งบน Serial Port และ Lovelace หลังจากช่วงเวลานั้น Serial Port จะระบุว่าระบบบูตแล้ว และ Lovelace จะแสดง "System Condition" เป็น "SystemOn" การดึงเซนเซอร์ 5V AC ออกจะทำให้ระบบเข้าสู่กระบวนการปิดระบบ การแสดงสถานะพลังงานบน Lovelace จะโชว์ว่าไฟดับ มีการนับเวลาถอยหลัง 12 วินาทีบน Lovelace หลังจากนั้น Transition flags จะแสดงว่า PC กำลังเปลี่ยนสถานะเพื่อปิดเครื่อง หลังจากผ่านไปอีก 12 วินาที Transition flags จะเปลี่ยนเป็นระบุว่า RPi กำลังปิดตัวลง และตัวนับเวลาจะนับไปอีก 12 วินาที ซึ่ง ณ จุดนั้น Relay จะเปิดออก และ LED จะดับลง กระบวนการปิดระบบเสร็จสมบูรณ์
อีกสองรายการที่ควรตรวจสอบคือ การที่ไฟฟ้ากลับมาในระหว่างช่วงหน่วงเวลาปิดระบบ หากเสียบเซนเซอร์ 5V AC กลับเข้าไป ระบบควรหยุดกระบวนการปิดระบบและกลับสู่สภาวะ "SystemOn" การทดสอบประเภทที่สองคือการปล่อยให้ระบบเข้าสู่กระบวนการ Power up หรือ Power down จากนั้นลองดึงเซนเซอร์ 5V AC ออกหรือเสียบกลับเข้าไป หากเกิดเหตุการณ์เช่นนั้น ระบบควรดำเนินกระบวนการที่เริ่มไว้แล้วให้เสร็จสิ้นก่อน จากนั้นจึงจะย้อนกลับและทำกระบวนการที่ตรงกันข้าม ดังนั้นหากกำลัง Power up อยู่แล้วคุณดึงปลั๊กออก ระบบจะทำกระบวนการ Power up ให้เสร็จก่อน แล้วจึงเข้าสู่กระบวนการปิดระบบ

การทำให้ระบบเริ่มทำงานอาจเป็นขั้นตอนที่น่ากังวล คุณจะกลัวสิ่งที่คุณพยายามหลีกเลี่ยงด้วยวงจรนี้ นั่นคือการปิด RPi อย่างไม่ถูกต้อง ขั้นตอนแรกคือต้องแน่ใจว่าทั้งสี่บรรทัดในโค้ดมีเวลาสำหรับการบูตและปิดระบบที่เพียงพอ เวลาที่ผมใช้อยู่แสดงไว้ด้านล่างนี้:
คุณต้องแน่ใจด้วยว่าบรรทัดในโค้ด Automation.yaml ที่สั่งปิด RPi และ PC ถูกคอมเมนต์ (commented out) ไว้ ซึ่งจะช่วยป้องกันการปิด RPi และ PC โดยไม่ตั้งใจได้ ตอนนี้อันตรายเพียงอย่างเดียวที่ค่อนข้างซีเรียสคือ คุณอาจเผลอตัดไฟจาก RPi หาก Arduino สั่งเปิด Relay แต่ความเสี่ยงนี้สามารถลดให้เหลือน้อยที่สุดได้
วิธีที่ผมพบว่าได้ผลคือ ให้เชื่อมต่อสายจัมเปอร์ของ RPi จาก Power jack 2.1 mm บน Board เข้ากับ RPi ที่ปิดอยู่ก่อน จากนั้นเชื่อมต่อสาย 5 Volt power sense เข้ากับแจ็คที่เหมาะสมบน Power Monitor PCB ตรวจสอบให้แน่ใจว่ามีไฟ 5 Volt จ่ายเข้ามาที่ Board ซึ่งทำได้ง่ายเพราะไฟจะจ่ายผ่าน Analog Input ของ Arduino และทำให้ LED ของ Arduino สว่างขึ้น สุดท้าย เชื่อมต่อแหล่งจ่ายไฟ 4 Amp เข้ากับ Power Jack บน Power Monitor PCB วิธีนี้จะจ่ายไฟให้ Arduino ก่อน ซึ่งในเวลาอันสั้นมันจะปิด Relay และจ่ายไฟให้ RPi
อย่าเพิ่งถอดสาย 5 Volt power sense ออก หากคุณทำเช่นนั้น การนับถอยหลังจะเริ่มขึ้น และเนื่องจาก Automation ถูกปิดไว้ RPi จะไม่ได้รับคำสั่งปิดระบบ แต่ Arduino จะรออย่างมีความหวังว่า RPi กำลังปิดตัวลง เมื่อ Arduino นับเวลาผ่าน RPI_SHUTDOWN_TIME มันจะตัดไฟ RPi ทันทีแม้ว่ามันจะยังปิดไม่เสร็จก็ตาม
เมื่อ RPi ทำงานแล้ว คุณสามารถไปที่ Home Assistant และเอาคอมเมนต์ออกจากไฟล์ Automation.yaml เพื่อให้ระบบทำงานได้อย่างสมบูรณ์
ใน Figure 4 ด้านล่าง แสดงระบบ Power Monitor ที่กำลังทำงานอยู่ ด้านบนของภาพจะเห็นขั้วต่อสายไฟ 2.1 mm สำหรับการตรวจสอบไฟ AC จะมีแหล่งจ่ายไฟ 5 VDC เสียบอยู่กับเต้ารับที่ไม่ได้ต่อระบบสำรองไฟ เมื่อไฟ AC ดับ สัญญาณ 5 VDC จะตกลงเป็นศูนย์เพื่อแจ้งสถานะไฟดับให้ Arduino Nano ทราบ ทางด้านขวาบนของภาพ UPS จะถูกเสียบเข้ากับแจ็ค 2.1 mm เมื่อเสียบแหล่งจ่ายไฟนี้แล้ว Arduino จะทำงาน มันจะปิด Relay ทันทีเพื่อจ่ายไฟให้กับแจ็ค 2.1 mm ตรงกลางที่เชื่อมต่อกับ RPi ผมใช้ RPi 4 ซึ่งต้องการกระแสไฟมากกว่า RPi 3 และบางครั้งอาจเกิดแรงดันไฟฟ้าต่ำจนทำให้เกิดการแจ้งเตือน แต่ผมก็ได้เพิกเฉยต่อสิ่งนี้โดยที่ยังไม่พบปัญหาที่เห็นได้ชัด

ณ จุดนี้ ผมได้ทำการทดสอบขั้นสุดท้าย เมื่อทุกอย่างพร้อมใช้งาน ผมได้ดึงสาย 5 Volt power sense ออกเพื่อจำลองเหตุการณ์ไฟ AC ดับ ผมสังเกตเห็นกระบวนการปิดระบบตามที่ต้องการ แม้กระทั่งรอเป็นชั่วโมงเพื่อให้การหน่วงเวลาปิดระบบสิ้นสุดลง ทุกอย่างทำงานตามที่ออกแบบไว้ ยอดเยี่ยมมาก!
หลังจากทดสอบทุกอย่างซ้ำแล้วซ้ำเล่า ผมมั่นใจว่าระบบจะให้การปกป้องตามที่ออกแบบไว้ แต่จนถึงตอนนี้ ผมยังไม่เจอเหตุการณ์ไฟดับจริงๆ จึงยังไม่เห็นการตอบสนองของระบบในสถานการณ์จริง
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย