public override async Task <RequestResponse> ExecuteRequest(Service service2, ApiLibs.Request request)
        {
            var coapRequest = new Com.AugustCellars.CoAP.Request(ConvertToMethod(request.Method))
            {
                UriPath = request.EndPoint
            };

            if (request.Content != null)
            {
                coapRequest.SetPayload(AddBody(request.Content));
            }

            // this is done on purpose to handle ObserveDevice from DeviceController
            if (request is WatchRequest watch)
            {
                coapRequest.MarkObserve();
                coapRequest.Respond += (object sender, ResponseEventArgs e) =>
                {
                    watch.EventHandler?.Invoke(coapRequest.Response);
                };
            }

            if (request is EndPointRequest <object> a)
            {
                coapRequest.EndPoint = a.DTLSEndPoint;
            }

            Task <Response> requestTask = new Task <Response>(() =>
            {
                return(_coapClient.Send(coapRequest));
            });

            requestTask.Start();

            Response resp = await requestTask;

            if (resp == null)
            {
                throw new Exception("Request timed out");
            }

            var responseApiLibs = new RequestResponse((System.Net.HttpStatusCode)MapToHttpStatusCode(resp.StatusCode), resp.StatusCode.ToString(), resp.UriQuery, "", resp.ResponseText, resp, request, service2);

            if (resp.IsTimedOut)
            {
                throw new RequestTimeoutResponse(responseApiLibs).ToException();
            }

            return(responseApiLibs);
        }