กดสั่งงานซ้ำ แล้ว automation ควรทำรอบไหนก่อน

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

คำเตือนว่ามีงานรันอยู่เป็นข้อมูลให้ทบทวนพฤติกรรม ไม่ควรถูกปิดทิ้งทันทีเพียงเพราะ log ดูรก ถ้าเกิดบ่อยอาจแปลว่า automation ใช้เวลานานกว่าจังหวะเหตุจริง หรือ mode ที่เลือกยังไม่ตรงการใช้งาน
restart ให้รอบใหม่แทนการทำต่อของรอบเก่า
restart หยุดรอบก่อนแล้วเริ่มรอบใหม่ตามเงื่อนไขที่ระบบรองรับ ตัวอย่างที่นึกภาพได้คือเปลี่ยนเวลารอให้เริ่มนับตามเหตุล่าสุด แต่ต้องออกแบบลำดับ action ให้การหยุดกลางทางมีความหมายที่ยอมรับได้
การหยุด script ไม่ได้ย้อนผลที่ทำไปแล้ว เช่น หากคำสั่งเปิดถูกส่งออกไปก่อนถึงช่วงรอ เมื่อรอบเก่าหยุด อุปกรณ์อาจยังเปิดอยู่ตามคำสั่งนั้น รอบใหม่จึงต้องรับผิดชอบว่าจากสภาพปัจจุบันควรทำต่ออย่างไร ไม่คิดว่าระบบคืนสภาพก่อนเริ่มให้เอง
เงื่อนไขของ automation มีผลกับการเริ่มใหม่ตามกติกา จึงควรอ่านส่วนนี้ด้วย ไม่ใช้คำว่า restart เป็นคำรับรองว่าทุก trigger จะหยุดรอบเดิมเสมอโดยไม่ต้องผ่านเงื่อนไขใด
ถ้างานมีหลายขั้นที่ต้องทำให้ครบเป็นชุด การหยุดกลางทางอาจต้องมีแผนชดเชยหรือเลือกโครงงานอื่นตามความต้องการ ไม่ให้รอบใหม่ทำขั้นที่สมมติว่ารอบก่อนจบครบแล้วทั้งที่ความจริงถูกตัดระหว่างทาง
queued รักษาลำดับ แต่ต้องดูอายุของงานที่รอ
queued ให้รอบใหม่รอหลังรอบก่อนตามลำดับที่ระบบรับเข้า จึงมีประโยชน์กับอุปกรณ์หรืองานที่ไม่ควรรับหลายคำสั่งพร้อมกัน แต่คำสั่งที่ถูกต้องตอนเข้าคิวอาจไม่เหมาะเมื่อถึงเวลาทำแล้ว

เช่น ผู้ใช้สั่งเปลี่ยนสถานะหลายครั้งติดกัน หากเก็บทุกครั้งไว้ครบ อุปกรณ์อาจไล่สถานะเก่าหลังจากคนต้องการเพียงค่าล่าสุด การรักษาทุกเหตุจึงต้องมาจากความหมายของงาน ไม่ใช่ถือว่าเข้าคิวแล้วดีกว่าทิ้งเหตุเสมอไป
เงื่อนไขการเข้าคิวถูกประเมินตามจังหวะที่เอกสารกำหนด หากต้องตรวจสภาพล่าสุดก่อนสั่งอุปกรณ์จริง ก็ควรมีขั้นตรวจในเส้นทางทำงานตามการออกแบบ ไม่สมมติว่าทุกเงื่อนไขถูกตรวจใหม่เหมือนกันทุกจุดหลังรอ
ควรกำหนดจำนวนรอบสูงสุดและพฤติกรรมเมื่อถึงขอบเขตด้วย เพราะคิวไม่ได้ทำให้อุปกรณ์ทำงานเร็วขึ้นเอง หากเหตุเข้าเร็วกว่ารอบที่ทำได้ต่อเนื่อง งานก็จะสะสมและมีความล่าช้าตามมา
parallel ต้องแยกทรัพยากรที่แต่ละรอบใช้
parallel เปิดให้มีหลายรอบทำงานตามขอบเขตที่กำหนด เหมาะกับสิ่งที่เป็นอิสระจากกันตามการออกแบบ แต่ถ้าทุกรอบกำลังเปลี่ยนตัวแปรหรือสั่งอุปกรณ์เดียวกัน เราก็ต้องมีวิธีตัดสินผลลัพธ์เมื่อคำสั่งมาทับกัน
รอบที่เริ่มก่อนอาจไม่ได้จบก่อนเสมอไป หากแต่ละรอบมีการรอหรืองานภายนอกต่างกัน จึงไม่ควรใช้ลำดับเวลาเริ่มแทนคำรับรองว่าผลสุดท้ายต้องเป็นของเหตุล่าสุด
ตัวแปรที่อ้างสถานะปัจจุบันกับข้อมูลจาก trigger ก็ควรถูกแยกตามความหมาย ถ้าต้องทำงานจากข้อมูลของเหตุหนึ่ง ให้รู้ว่าข้อมูลนั้นถูกเก็บเป็นของรอบใด ไม่อ่านสภาพใหม่ภายหลังแล้วเข้าใจว่าเป็นสิ่งที่เกิดตอน trigger เดิมเสมอไป
mode ของงานย่อยก็อาจเปลี่ยนผลได้
automation อาจเรียก script หรือบริการที่มีการจัดรอบของตัวเอง การเลือก mode ที่ชั้นบนจึงยังต้องดูว่าชั้นถัดไปทำงานรอจนจบหรือส่งต่อแล้วเดินหน้าทันที รวมถึงมีขอบเขตคิวหรือการยกเลิกอย่างไร
ควรวาดเส้นทางสั้นๆ ว่าเหตุเข้าแล้วใครถือการรอ ใครสั่งอุปกรณ์ และใครรู้ผลสำเร็จ เพื่อไม่ให้การตั้ง single ในจุดหนึ่งถูกเข้าใจว่าป้องกันงานซ้อนทั้งระบบ ทั้งที่งานย่อยยังทำต่ออยู่อีกทาง
การเริ่ม Home Assistant ใหม่หรือโหลด configuration ใหม่ก็เป็น lifecycle ที่ต้องตรวจหากงานมีช่วงรอ ไม่ควรคาดว่าคิวกับตำแหน่งรันทุกแบบจะคงอยู่เหมือนระบบบันทึกธุรกรรมถาวรโดยอัตโนมัติ
ลองเหตุใกล้กันแล้วอ่าน trace
ในชุดทดสอบ ให้กำหนดเหตุสองสามจังหวะที่ชัด เช่น เริ่มรอบใหม่ระหว่างกำลังรอ แล้วตรวจ trace กับสถานะอุปกรณ์จริงตาม mode ที่เลือก ไม่ทดสอบเพียงกรณีกดครั้งเดียวแล้วรอจนจบทุกครั้ง
เก็บด้วยว่ารอบใดถูกละ ถูกหยุด รอ หรือทำพร้อมกัน และเมื่ออุปกรณ์ไม่ตอบผลควรเป็นอย่างไร ข้อมูลนี้ช่วยปรับขั้นรอและสิ่งที่ต้องตรวจเพิ่มได้ตรงกว่าเปลี่ยน mode ไปเรื่อยๆ จนบังเอิญเห็นผลที่อยากได้ในรอบหนึ่ง
หลังเลือก mode แล้วควรอธิบายพฤติกรรมให้คนใช้คาดเดาได้ด้วย เช่น กดซ้ำแล้วเริ่มเวลาใหม่หรือไม่รับรอบเพิ่ม หากปุ่มเดิมเปลี่ยนความหมายตามการแก้ automation โดยไม่บอก คนในบ้านอาจกดซ้ำมากขึ้นเพราะคิดว่าคำสั่งแรกไม่ถึง แล้วทำให้อาการที่กำลังตรวจซับซ้อนขึ้นอีก
สรุป
automation mode คือการเลือกความหมายของเหตุใหม่ระหว่างงานเดิมยังไม่จบ single, restart, queued และ parallel จึงเหมาะกับผลลัพธ์คนละแบบ เมื่อดูอายุของงาน ผลที่ทำไปแล้ว และทรัพยากรร่วมให้ครบ พร้อมทดลองเหตุที่มาทับกัน เราจะสั่งงานได้ตรงความตั้งใจมากกว่าหวังว่าโหมดหนึ่งจะเหมาะกับทุก automation ครับ


