I have been experimenting with using an ElectronicControlUnit without any ControllerApplication, a technique which is mentioned here (and also the first Quick start example on the front page).
There is a line of commentary in the subscribe function saying:
Note: TP.CMDT will only be received if the destination address is bound to a controller application.
Looking at the code in j1939_21.py lines 500-518 (and comparable code in j1939_22.py), and backed up by my experiments, I think that the comment should probably say:
Note: TP.CMDT will only be received if device_address is not None.
I have found it possible to receive TP without using a CA, by passing a device_address argument to subscribe.