private bool isError(JArray result, out GatewayError err)
        {
            var jToken = LookupValue(result, "error");

            err = JsonConvert.DeserializeObject <GatewayError>(jToken.ToString());
            return(jToken != null);
        }
        public async Task SendAsync(object sensorMessage, Action <object> onSuccess = null,
                                    Action <IotApiException> onError = null, Dictionary <string, object> args = null)
        {
            HttpResponseMessage response = await executeMsg(sensorMessage);

            var str = await response.Content.ReadAsStringAsync();

            object res = JsonConvert.DeserializeObject(str);

            if (res is JArray)
            {
                var          result = JsonConvert.DeserializeObject <JArray>(str);
                GatewayError err    = null;

                if (isError(result, out err))
                {
                    onError?.Invoke(new IotApiException(":( An error has ocurred!", err));
                }
                else
                {
                    throw new IotApiException("Do not know meaning of this response", result);
                }
            }
            else if (res is JObject)
            {
                List <Device> devices = new List <Entities.Device>();

                foreach (var prop in ((JObject)res).Properties())
                {
                    var dev = JsonConvert.DeserializeObject <Device>(prop.Value.ToString());
                    dev.Id = prop.Name;
                    devices.Add(dev);
                }

                onSuccess?.Invoke(devices);
            }

            throw new NotImplementedException();
        }