digraph G { reset [shape=box]; toggle [shape=diamond]; btn_toggle [shape=diamond]; cmd_toggle [shape=diamond]; card [shape=diamond]; card ->toggle; btn_toggle ->toggle; cmd_toggle ->toggle; all_states [shape=box]; opened [shape=box]; closed [shape=box]; opening [shape=box]; closing [shape=box]; timeout_after_open [shape=box]; timeout_after_close [shape=box]; manual_movement [shape=box]; error [shape=box]; reset -> closed [label="limit_closed"]; reset -> closing [label="limit_none"]; reset -> opened [label="limit_opened"]; error -> closed [label="limit_closed"]; error -> opened [label="limit_opened"]; error -> manual_movement [label="limit_none"]; manual_movement -> opening [label="cmd_open"]; manual_movement -> closing [label="cmd_close"]; manual_movement -> closing [label="toggle"]; opened -> closing [label="cmd_close"]; opened -> closing [label="toggle"]; closed -> opening [label="cmd_open"]; closed -> opening [label="toggle"]; opening -> opened [label="limit_open"]; closing -> closed [label="limit_close"]; closing -> timeout_after_close [label="timeout"]; opening -> timeout_after_open [label="timeout"]; timeout_after_open -> closing [label="cmd_close"]; timeout_after_open -> closing [label="toggle"]; timeout_after_open -> opened [label="limit_open"]; timeout_after_open -> closed [label="limit_close"]; timeout_after_close -> opening [label="cmd_open"]; timeout_after_close -> opening [label="toggle"]; timeout_after_close -> opened [label="limit_open"]; timeout_after_close -> closed [label="limit_close"]; all_states -> error [label="limit_both"]; }