Its hard to say for sure without seeing the other DoFns here, but it looks to me like you're yielding unkeyed output from WaitUntilDevicesExist, and then calling a GroupByKey (or similar operation) in GroupMessagesByShardedKey. Instead of just yielding the message, should you be doing something like the following?
yield shard_id, message
I think Number of components does not match number of coders. is basically saying that the coders are expecting a key/value pair, and you're only passing them a value.