<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def tell(self, data, timeout=10, mime=None):
 """Order a remote control to do something. Tell is confirmed in that you will receive a notification of the success or otherwise of the action at the far end via a callback `Example` #!python data = {"thermostat":18.0} retval = r_thermostat.tell(data, timeout=10, mime=None) if retval is not True: print("Thermostat not reset - reason: {reason}".format(reason=retval)) Returns True on success or else returns the reason (string) one of: #!python "timeout" # The request-specified timeout has been reached. "unreachable" # The remote control is not associated with an agent # or is not reachable in some other way. "failed" # The remote control indicates it did not perform # the request. Raises [IOTException](./Exceptions.m.html#IoticAgent.IOT.Exceptions.IOTException) containing the error if the infrastructure detects a problem Raises [LinkException](../Core/AmqpLink.m.html#IoticAgent.Core.AmqpLink.LinkException) if there is a communications problem between you and the infrastructure `data` (mandatory) (as applicable) The data you want to share `timeout` (optional) (int) Default 10. The delay in seconds before your tell request times out. `mime` (optional) (string) See: [share()](./Point.m.html#IoticAgent.IOT.Point.Feed.share) """

        evt = self.tell_async(data, timeout=timeout, mime=mime)
        # No point in waiting longer than supplied timeout (as opposed to waiting for sync timeout)
        try:
            self._client._wait_and_except_if_failed(evt, timeout=timeout)
        except IOTSyncTimeout:
            return 'timeout'
        return True if evt.payload['success'] else evt.payload['reason']