Versatile and flexible Python State Machine library - Micropython Port

finite, state, machine, automaton, fsm, hsm, pda, micropython, finite-state-machine, fsm-library, micropython-esp32, mit, mit-license, python
pip install upysm==0.3.9


pysm - Python State Machine

Versatile and flexible Python State Machine library.

https://travis-ci.org/pgularski/pysm.svg?branch=master https://coveralls.io/repos/github/pgularski/pysm/badge.svg?branch=master https://api.codacy.com/project/badge/Grade/6f18f01639c242a0b83280a52245539d Code Health Documentation Status

Implement simple and complex state machines

It can do simple things like this:


Or somewhat more complex like that:


Python State Machine

The State Pattern solves many problems, untangles the code and saves one's sanity. Yet.., it's a bit rigid and doesn't scale. The goal of this library is to give you a close to the State Pattern simplicity with much more flexibility. And, if needed, the full state machine functionality, including FSM, HSM, PDA and other tasty things.


  • Provide a State Pattern-like behavior with more flexibility (see Documentation for examples)
  • Be explicit and don't add any magic code to objects that use pysm
  • Handle directly any kind of event or input (not only strings) - parsing strings is cool again!
  • Keep it simple, even for someone who's not very familiar with the FSM terminology


  • Finite State Machine (FSM)
  • Hierarchical State Machine (HSM) with Internal/External/Local transitions
  • Pushdown Automaton (PDA)
  • Transition callbacks - action, before, after
  • State hooks - enter, exit, and other event handlers
  • Entry and exit actions are associated with states, not transitions
  • Events may be anything as long as they're hashable
  • States history and transition to previous states
  • Conditional transitions (if/elif/else-like logic)
  • Explicit behaviour (no method or attribute is added to the object containing a state machine)
  • No need to extend a class with State Machine class (composition over inheritance)
  • Fast (even with hundreds of transition rules)
  • Not too many pythonisms, so that it's easily portable to other languages (ie. JavaScript).
  • Micropython support


Install pysm from PyPI:

pip install pysm

or clone the Github pysm repository:

git clone https://github.com/pgularski/pysm
cd pysm
python setup.py install


Read the docs for API documentation and examples - http://pysm.readthedocs.io/

See Unit Tests to see it working and extensively tested.

Micropython support

The library works with pyboards!:

import upip