public async Task <string> DeviceRequestCommand(DialogflowRequest dialogflowRequest)
        {
            //identify device
            object deviceRequested = ConvertDialogflowResquestToObject(dialogflowRequest);

            if (deviceRequested == null)
            {
                return(FormatterSpeechResponse(dialogflowRequest, $"I'm sorry, {dialogflowRequest.QueryResult.Parameters.idDevice} was not found", false));
            }

            string jsonReturn = string.Empty;

            if (deviceRequested is SonoffDualR2)
            {
                //TODO: use pattern matching
                SonoffDualR2 sonoffRequest = ((SonoffDualR2)deviceRequested);
                if (ValidIdDeviceRequested(sonoffRequest.IdDevice))
                {
                    switch (sonoffRequest.SonoffModelEnum)
                    {
                    case DeviceEnum.SonoffDualR2:
                        jsonReturn = await SonoffDualR2ExecuteCommand(sonoffRequest);

                        return(FormatterSpeechResponse(dialogflowRequest, jsonReturn, true));

                    default:
                        break;
                    }
                }
            }
            return(FormatterSpeechResponse(dialogflowRequest, $"I'm sorry, {dialogflowRequest.QueryResult.Parameters.idDevice} was not found", false));
        }
        private object ConvertDialogflowResquestToObject(DialogflowRequest dialogflowRequest)
        {
            var device = GetInformationDeviceById(dialogflowRequest);

            if (device == null || device.Count() <= 0)
            {
                return(null);
            }

            var objectType = device.Where(x => x.Key.Equals("ModelDevice")).Select(y => y.Value).FirstOrDefault();

            //TODO: valid objectType (!=null)

            //VALID DEVICE AND OBJECTTYPE
            switch ((DeviceEnum)Enum.Parse(typeof(DeviceEnum), objectType, true))
            {
            case DeviceEnum.SonoffDualR2:
            {
                int _channel = 1;        //by default we use channel 1 (if is not mentioned in the object in appsettings.json
                int.TryParse(device.Where(x => x.Key.Equals("Channel")).Select(y => y.Value).FirstOrDefault(), out _channel);

                return(new SonoffDualR2()
                    {
                        IdDevice = device.Where(x => x.Key.Equals("IP_Address")).Select(y => y.Value).FirstOrDefault(),
                        SonoffChannel = _channel,
                        SonoffRequestCommandEnum = ConvertStringCmdToSonoffRequestCommandEnum(dialogflowRequest.QueryResult.Parameters.command)
                    });
            }

            default:
                return(null);
            }
        }
 public async Task <JsonResult> DeviceRequestCommand([FromBody] DialogflowRequest dialogflowRequest)
 {
     if (dialogflowRequest == null || string.IsNullOrEmpty(dialogflowRequest.QueryResult.Parameters.idDevice))
     {
         return(await FormatResposeDialogFlow("I'm sorry, but I didn't find the device"));
     }
     return(await FormatResposeDialogFlow(await service.DeviceRequestCommand(dialogflowRequest)));
 }
        private string FormatterSpeechResponse(DialogflowRequest dialogflowRequest, string response, bool trimResponse)
        {
            if (!trimResponse)
            {
                return(response);
            }

            response = response.Replace("\"", "").Replace("\\", "").Replace("}", "").Split(":")[1].ToLower();
            return($"{dialogflowRequest.QueryResult.Parameters.idDevice} was turned {response}");
        }
 private IEnumerable <IConfigurationSection> GetInformationDeviceById(DialogflowRequest dialogflowRequest)
 {
     return(repository.GetInformationDeviceById(dialogflowRequest.QueryResult.Parameters.idDevice));
 }