Micron Document
PubSub and Meshtastic Callback issues

I don't know why, but you cannot use a closure for callbacks when subscribing to Meshtastic events. It took me days to figure out. Also, the parameter name in pubsub callbacks really matter. Even for positional arguments.

closures are broken

Update: seems to be an issue in pypubsub.

This doesn't work:

T282828
Tff7b72import T7ee787meshtastic
Tff7b72from T7ee787pubsub Tff7b72import Te6edf3pub

Tff7b72class T56d364FooTb4b4b4:
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ff_on_recvTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72pass T8b949e# body here to do something with packet

Te6edf3pubTff7b72.Td2a8ffsubscribeTb4b4b4(Te6edf3_on_recvTb4b4b4, Ta5d6ff"Ta5d6ffmeshtastic.receiveTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface Tff7b72= Te6edf3meshtasticTff7b72.Td2a8ffserial_interfaceTff7b72.Td2a8ffSerialInterfaceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/ttyACM0Ta5d6ff"Tb4b4b4)


Or more precisely, it will work right up until it exits from the T383838start method. Then, mysteriously, it will no longer work.

Instead, it needs to be more like this:

T282828
Tff7b72import T7ee787meshtastic
Tff7b72from T7ee787pubsub Tff7b72import Te6edf3pub

Tff7b72class T56d364FooTb4b4b4:
Tff7b72def Td2a8ffon_recvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72pass T8b949e# body here to do something with the packet

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3pubTff7b72.Td2a8ffsubscribeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffon_recvTb4b4b4, Ta5d6ff"Ta5d6ffmeshtastic.receiveTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface Tff7b72= Te6edf3meshtasticTff7b72.Td2a8ffserial_interfaceTff7b72.Td2a8ffSerialInterfaceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/ttyACM0Ta5d6ff"Tb4b4b4)


names matter

Another head-scratcher: when subscribing to "meshtastic.connection.established" you MUST name the arguments exactly.

This works:

T282828
Tff7b72def Td2a8ffon_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4, Te6edf3topicTff7b72=Te6edf3pubTff7b72.Td2a8ffAUTO_TOPICTb4b4b4)Tb4b4b4:
Tff7b72pass T8b949e# do something here


But this does not work:

T282828
Tff7b72def Td2a8ffon_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifaceTb4b4b4, Te6edf3topicTff7b72=Te6edf3pubTff7b72.Td2a8ffAUTO_TOPICTb4b4b4)Tb4b4b4:
Tff7b72pass T8b949e# do something here


And the exception is weird:

ERROR:root:Unexpected error in deferred execution <class 'pubsub.core.topicargspec.SenderMissingReqdMsgDataError'>
Traceback (most recent call last):
File "/nix/store/lz6fkq96sgg6xv9gb6a0wjv446mhnkm1-python3.11-meshtastic-2.3.4/lib/python3.11/site-packages/meshtastic/util.py", line 244, in _run
o()
File "/nix/store/lz6fkq96sgg6xv9gb6a0wjv446mhnkm1-python3.11-meshtastic-2.3.4/lib/python3.11/site-packages/meshtastic/mesh_interface.py", line 650, in <lambda>
lambda: pub.sendMessage(
^^^^^^^^^^^^^^^^
File "/nix/store/rhzqg6ih8wmmh6sfpk43vbxw050gbscz-python3.11-pypubsub-4.0.3/lib/python3.11/site-packages/pubsub/core/publisher.py", line 216, in sendMessage
topicObj.publish(**msgData)
File "/nix/store/rhzqg6ih8wmmh6sfpk43vbxw050gbscz-python3.11-pypubsub-4.0.3/lib/python3.11/site-packages/pubsub/core/topicobj.py", line 433, in publish
self._getListenerSpec().check(msgData)
File "/nix/store/rhzqg6ih8wmmh6sfpk43vbxw050gbscz-python3.11-pypubsub-4.0.3/lib/python3.11/site-packages/pubsub/core/topicargspec.py", line 222, in check
raise SenderMissingReqdMsgDataError(
pubsub.core.topicargspec.SenderMissingReqdMsgDataError: Some required args missing in call to sendMessage('meshtastic.connection.established', interface): iface

Tags: python, index, meshtastic

Tags
Navigation





created: 2024-09-14

(re)generated: 2026-07-17