code: def _write_handle(self, conn, handle, ack, value, timeout=1.0):
          conn_handle = conn
          char_handle = handle
          def write_handle_acked(event):
              if event.command_class == 4 and event.command == 1:
                  conn, _, char = unpack("<BHH", event.payload)
                  return conn_handle == conn and char_handle == char
          data_len = len(value)
          if data_len > 20:
              return False, {'reason': 'Data too long to write'}
          payload = struct.pack("<BHB%ds" % data_len, conn_handle, char_handle, data_len, value)
          try:
              if ack:
                  response = self._send_command(4, 5, payload)
              else:
                  response = self._send_command(4, 6, payload)
          except InternalTimeoutError:
              return False, {'reason': 'Timeout waiting for response to command in _write_handle'}
          _, result = unpack("<BH", response.payload)
          if result != 0:
              return False, {'reason': 'Error writing to handle', 'error_code': result}
          if ack:
              events = self._wait_process_events(timeout, lambda x: False, write_handle_acked)
              if len(events) == 0:
                  return False, {'reason': 'Timeout waiting for acknowledge on write'}
              _, result, _ = unpack("<BHH", events[0].payload)
              if result != 0:
                  return False, {'reason': 'Error received during write to handle', 'error_code': result}
          return True, None