Relative tag addressing in a tag event script depends on the execution context of the event to know where it is in the tag tree. You are attaching the on_message function to be executed asynchronously by another subsystem, losing the necessary context. You will need to construct the necessary absolute tag path prior to defining on_message, so it will be available in its closure. Or pass it to on_message as a default argument.
No, that’s not a solution. You are using a four-second sleep in your tag event. You can get away with it once or twice, but you will eventually hang your tag groups.
I would expect you to have to supply a function that will be called to receive actual values as they come in (aka a listener). You are using a subscribe operation.