

งานในบ้านหลายอย่างมีช่วงรอ เช่น เปิดไฟไว้ชั่วคราวแล้วค่อยปิด หรือรอครบระยะก่อนแจ้งเตือน เราจึงอาจใช้ timer เพื่อแยกการนับเวลาออกจากขั้นทำงานอื่น และเห็นสถานะว่ากำลังนับหรือหยุดอยู่ได้ในระบบ
แต่พอ Home Assistant หยุดแล้วกลับมา คำถามไม่ได้มีเพียงเหลือเวลาเท่าไร หาก timer หมดอายุไปแล้วระหว่างที่ระบบไม่ทำงาน เราต้องรู้ด้วยว่างานที่ผูกกับจังหวะหมดเวลาจะถูกทำภายหลังหรือไม่ และควรถูกทำหรือเปล่าตามสภาพปัจจุบัน
การเก็บสถานะเวลาได้กับการทำผลหลังครบเวลาจึงต้องออกแบบคู่กันครับ ไม่ใช้คำว่า restore แล้วถือว่าทุก action ที่พลาดจะถูกชดเชยให้เอง
Timer ของ Home Assistant มีตัวเลือก restore สำหรับคืนสถานะกับเวลาตามการรองรับเมื่อระบบเริ่มใหม่ แต่เอกสารระบุว่า automation ที่ฟัง timer.finished จะไม่ถูก trigger ตอนเริ่มระบบ หาก timer หมดเวลาระหว่างที่ Home Assistant ไม่ได้ทำงาน
จึงเป็นไปได้ที่สถานะหลังกลับมาจะสะท้อนว่าไม่ได้กำลังนับแล้ว แต่ action ที่คาดว่าจะตาม event นั้นไม่เคยเกิด การมองเฉพาะการ์ด timer จึงยังตอบไม่ได้ว่างานปลายทางทำครบแล้วหรือยัง
ต้องแยกข้อมูลอย่างน้อยสองส่วน คือสภาพของเวลาและสภาพของงานที่รอเวลา เช่น มีงานค้างอยู่หรือทำไปแล้ว หากทั้งสองถูกยุบเป็นเพียง active กับ idle เราอาจแยก timer ที่หมดแล้วออกจาก timer ที่ไม่เคยเริ่มไม่ได้ตามสิ่งที่ต้องตรวจ

บางงานต้องอิงเวลาจริง เช่น สิ้นสุดการเปิดชั่วคราวตามกำหนดเดิม แม้ตัวควบคุมจะหยุดไปช่วงหนึ่ง ส่วนอีกงานอาจต้องการเวลาที่ทำงานต่อเนื่องหรือเวลาที่อุปกรณ์อยู่ในสถานะหนึ่งจริงๆ การปิดระบบระหว่างทางมีความหมายต่างกันในสองแบบนี้
ถ้างานต้องรู้ว่าสถานะยังต่อเนื่องระหว่างช่วงหยุด แต่ไม่มีข้อมูลจากอุปกรณ์ เราก็อาจไม่มีหลักฐานพอจะนับต่อได้อย่างแน่นอน การเก็บ timestamp ไม่ได้ยืนยันสิ่งที่เกิดทางกายภาพช่วงนั้นเอง จึงควรมีทางข้อมูลไม่พอหรือเริ่มนับใหม่ตามนโยบายที่เลือก
การตัดสินตรงนี้ควรมาก่อนเลือก helper จะได้ไม่ให้พฤติกรรม restore ของเครื่องมือกลายเป็นนิยามงานโดยปริยาย ทั้งที่คนใช้ต้องการให้ช่วงหยุดถูกจัดการอีกแบบหนึ่ง
หากเลือกอิงเวลาปฏิทิน อาจเก็บเวลาที่ตั้งใจครบกำหนดร่วมกับสถานะงาน ไม่เก็บเพียงระยะเวลาเริ่มต้นแล้วหวังว่าจะรู้จุดจบเดิมหลังบูตใหม่ เมื่อระบบกลับมาก็เทียบกำหนดกับเวลาปัจจุบันได้ตามกติกาที่ออกแบบ
Input Datetime เป็น helper ที่เก็บวันเวลาตามตัวเลือกได้ แต่ต้องอ่านการตั้งค่า restore ด้วย เอกสารระบุว่าถ้ากำหนด initial ที่ถูกต้องจะเริ่มด้วยค่านั้น มิฉะนั้นจึงคืนสถานะก่อนหยุด การใส่ initial แบบไม่ดูผลจึงอาจเปลี่ยนกำหนดที่ตั้งใจรักษาไว้ได้
การมีเวลาครบกำหนดยังต้องมีรอบงานหรือบริบทว่ามันเป็นของคำขอใด โดยเฉพาะเมื่อผู้ใช้เปลี่ยนเวลา ยกเลิกหรือเริ่มใหม่ ไม่เอา deadline เก่ามาทำผลกับงานใหม่เพียงเพราะ helper ยังมีค่าอยู่
การยกเลิกก็ควรทำให้สถานะงานกับกำหนดที่เกี่ยวข้องตรงกัน ไม่หยุดเฉพาะตัวนับแล้วปล่อย pending เดิมให้ขั้นกู้คืนหยิบไปทำต่อ ทั้งที่ผู้ใช้เปลี่ยนความตั้งใจไปแล้ว

ถ้าต้องการให้ตามงานที่เลยกำหนด ควรมีขั้นเริ่มระบบหรือกระบวนการตรวจที่อ่านงานค้างแล้วตัดสินว่าจะทำต่ออย่างไร ไม่อาศัย time trigger ในอดีตอย่างเดียวว่าจะกลับมายิงหลังบูตให้ทุกครั้ง
ก่อนทำ action ต้องตรวจว่างานยังไม่ถูกยกเลิก เงื่อนไขที่เกี่ยวข้องยังใช้ได้ และอุปกรณ์พร้อมตามระดับข้อมูลที่งานต้องการ ช่วงเริ่มระบบอาจมี entity ที่ยังไม่พร้อม จึงไม่ควรเปลี่ยน unknown ให้เป็นเงื่อนไขผ่านแล้วทำผลโดยไม่มีข้อมูลรองรับ
บางงานอาจควรทำทันทีเมื่อรู้ว่าพลาด บางงานควรแจ้งเตือนหรือรอคนตัดสิน เช่น การแจ้งเตือนที่เลยเวลาไปนานอาจหมดประโยชน์แล้ว ขณะที่งานคืนสถานะต้องดูว่าคนในบ้านได้เปลี่ยนความตั้งใจใหม่ระหว่างนั้นหรือไม่ จึงไม่มีนโยบายชดเชยหนึ่งแบบที่ตรงทุก timer
ขั้นตรวจหลังเริ่มระบบอาจถูกเรียกมากกว่าหนึ่งครั้ง หรือระบบหยุดหลังทำ action แต่ก่อนบันทึกผล จึงต้องออกแบบให้แยกงานเดิมกับงานใหม่ได้ และไม่สร้างผลซ้ำที่เปลี่ยนความหมายของสิ่งที่ต้องการ
ตัวอย่างเชิงความหมายคือคำสั่งตั้งไฟเป็นปิดต่างจากคำสั่ง toggle หากเรียก toggle ซ้ำ สถานะอาจกลับด้านจากรอบแรก ส่วนการตั้งเป้าหมายตรงๆ ยังต้องตรวจการนำส่งกับข้อมูลตอบกลับตามที่อุปกรณ์ยืนยันได้ การเลือก action จึงมีผลต่อทางกู้คืนด้วย
ไม่ควรทำเครื่องหมายว่างานเสร็จก่อนมีหลักฐานตามขั้นที่ต้องการเพียงเพื่อกันซ้ำ แต่หากส่งผลไปแล้วแต่คำตอบขาด ก็ต้องมีทางอ่านสถานะหรือจัดการความไม่แน่ใจ ไม่วนสั่งต่อทุกครั้งที่บูตโดยไม่มีขอบเขต
นาฬิกาที่ใช้เทียบกำหนดก็ต้องเป็นบริบทเดียวกัน โดยเก็บวันที่เมื่อความหมายของงานข้ามวันได้ ไม่ใช้เพียงเวลาในนาฬิกาแล้วเดาว่าหมายถึงวันนี้หรือพรุ่งนี้ และเมื่อผู้ใช้ปรับกำหนดต้องมีทางทำให้การตรวจรอบเก่าไม่กลับมาทำผลกับคำขอที่ถูกแทนแล้ว
ชุดตรวจควรมีการหยุดก่อนครบกำหนด กลับมาหลังครบ และหยุดระหว่างทำผลกับบันทึกสถานะ พร้อมกรณีผู้ใช้ยกเลิกหรือเปลี่ยนเวลา ตรวจทั้ง helper สถานะงานและอุปกรณ์ที่ใช้ทดสอบ ไม่ดูเพียงว่าตัวเลขนับกลับมาได้
ควรเก็บเหตุที่ตัดสินทำหรือไม่ทำในรอบตรวจนั้นตามข้อมูลที่มี เพื่อให้ตามได้ว่ากำหนดหมดแล้วแต่ action ไม่เกิดเพราะอะไร การตรวจลักษณะนี้ใช้ข้อมูลกับอุปกรณ์ทดลองตามงานที่อนุญาต และยังไม่ถือว่าเกิดผลกับบ้านจริงเพียงเพราะมีตัวอย่างโครงสร้างครบแล้ว
Timer ที่คืนสถานะหลังรีสตาร์ตยังต้องมีนโยบายของงานที่พลาดช่วงหมดเวลา เมื่อกำหนดความหมายของช่วงหยุด เก็บ deadline กับตัวตนงาน และตรวจสิ่งที่ค้างหลังเริ่มระบบได้ เราจะจัดการการทำต่อหรือยกเลิกตามข้อมูลปัจจุบัน พร้อมรักษาความต่างระหว่างเวลาที่หมดไปกับผลที่ถูกทำสำเร็จแล้ว