Step away for a minute and look what happens
Just to be clear - my plugin does not have to be running and looking for a signal? It just has to test if gui.device_metadata_available is True before continuing - otherwise I will issue an error dialog to tell the user to wait and try again. (Actually I currently test if gui.device_manager.is_device_connected is True, and then I test if gui.device_manager.connected_device._main_prefix has a value because I think I used to test for just main_prefix but found that wasn't reset between connections so I test both - and now I'll add a 3rd test).
I understand it won't be perfect as there could be books to send to/sync with the device - but it will prevent the majority of issues that might happen.