You're looking at doing some "event driven programming". The
arriving MQTT messages are telling your system what to do, but as
you grow the system, there will be other sources of events from
sensors, timers, etc. You want to handle these events as quickly as
possible and return control so that you're always responsive to new
That means you need to do the actual processing of the events
outside of callbacks. Typical ways to do this, depending on your
language of choice, are with event loop libraries, threads, and
Timers in Python are pretty easy. Just give an amount of time (in
seconds) and a callback function, and the function will be called
after the specified amount of time.
Tracking your internal progress as a state machine is a great way to
deal with all of this.
t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
So, basically, in the callback that receives MQTT messages, set a
timer to fire some time later. Keep a reference to the timer, "t",
in case an event arrives indicating that the action should be
canceled before the timer fired. In that case, you call:
On 10/5/19 3:10 PM, Carl Karsten wrote:
opps, sorry, I thought this list was specifically for
I'm using Python.
> You basically have to avoid calling sleep
and use timers instead.
this sounds funny asking, but What is a timer?
Years ago I used a gui desktop database app designer,Â I
dragged a "timer widget" onto the form and type in the
function it should call every X amount of time.
I understand what that did, I understand i need something
like that, but in this context I have no idea how I should
I have a few guesses, like check for events in a loop.Â
maybe add a sleep so the cpu has some cycles to do other
things (no sure what other things are needed, pretty sure
incoming network traffic will take priority? also pretty sure
this is not a problem I should be trying to solve. Â I am sure
it has been solvedÂ 100's of times.
I also guess "event loop" is a thing I need.Â Which I also
comprehend and could implement one from scratch if I needed
to, but I hope I don't need to.
Carl Karsten <carl@xxxxxxxxxxxxxxxx>
> When the door opens, the light should stay on for 60
> or if the button is pressed, turn the light off 30
> every door open resets the 60 seconds.
> (this is the simplified version that I think is the
root of my problem)
This is not an MQTT issue, but I can see it comes up often
that want to use MQTT.
> I can't do "on, sleep(60), off" because that will block
If the main control program calls sleep, it will ignore all
for that time.Â So don't do that :-)
> and when the button is pressed, if the door opens again
that should disable
> the "off in 30" thing.
A further complexity is humans asking for lights to be in
and automatic rules at the same time.Â In this case I think
you want a
virtual light controlled by the human and a virtual light
the rules and the real light to be the OR of those.
> Is there a tutorial page or something I should be
This is really a fundamental programming issue; you are
finite state machine with timers.
There are arguably two approaches to this sort of thing,
threads and async.Â ÂIt will seems that threads are easier,
they just look easier and async is actually easier, when you
as "work to get a 100% reliable system".
Frameworks that are set up for your problem include
(but this is Lua on ESP8266,
Â probably not where you should run the controller)
but really you sound like you are starting down the path of
reinventing a home automation system, so have a look at
Yes, but this system is 'special' otherwise we wouldn't be
making it :p
We might be right. not my call.Â What I am sure of is
someone will make something better some day.Â might be me!
Is this what I should be doing?
async def main():
paho-dev mailing list
To change your delivery options, retrieve your password, or unsubscribe from this list, visit