Acceder

Ver la Versión Completa : [ SOLUCIONADO ] Como detectar si una variable contiene un valor numérico?


cace0353
25/02/15, 19:03:57
En mi proyecto de que el móvil me avise yendo en coche si supero la velocidad de un tramo (medida por GPS), digo la velocidad y el programa la identifica. Si digo "ochenta" la variable tiene el valor "80" y, a partir de este momento me avisa si paso de 80.
Hasta aquí funciona correctamente...

Peeeero, si estoy hablando con alguien y se pronuncia otra palabra puede ocurrir:
a) El móvil no la entiende y me pide que repita (no hay problema)
b) El móvil SI que entiende la palabra y, como no tiene ningún valor numérico, el programa se para y se acabó el invento...

He pensado controlarlo a través de la acción prueba y examinando el valor de la variable sslength. Si la longitud de la variable es mayor de 3 caracteres (esto me permitiria dar valores de velocidad hasta 999 Km/h!) no acepta el valor y manda de nuevo la ejecución de la tarea al inicio. Pero si la palabra es corta (p.e. Si, No, hoy, más, ten....) estoy en las mismas.

Alguien conoce algún mecanismo de control propio de Tasker o tiene una posible solución poqué ya ha pasado otra vez por esto?

z3us
25/02/15, 19:19:43
Mete una condición doble if : variable mayor que cero, y variable menor que 200, por ejemplo
http://tapatalk.imageshack.com/v2/15/02/25/f892d261b20d21163ac7dd71b0f9c6d6.jpg

cace0353
25/02/15, 19:36:21
Mete una condición doble if : variable mayor que cero, y variable menor que 200, por ejemplo

Si, pero esto me sirve si la variable contiene un valor numérico...

Si la variable és un texto (porqué el micrófono ha pillado una palabra al vuelo: p.e. "hoy") siempre me dará error.
Habrá identificado la palabra, pero al no tener valor numérico, se me jode le invento!

A lo que me referia es a meterle alguna condición para verificar que la palabra dicha tiene, efectivamente, valor numérico, y si no, que vuelva a pedirme la entrada...

z3us
25/02/15, 19:39:25
Si la variable no es un número tampoco se cumple el if. La tarea sólo se ejecutará si la variable es un número entre cero y 200. Creo que es lo que buscas

Por ejemplo, esta tarea, me salta perfectamente el flash «no numérica»

http://tapatalk.imageshack.com/v2/15/02/25/5db8c25c87170438c6b1dcde000e9627.jpg

P D: Siento poner capturas de la tarea, a pesar de las recomendaciones del foro, pero creo que en este caso es más práctico así

cace0353
25/02/15, 20:12:36
Gracias z3us, tiene sentido… lo probaré así substituyendo el segundo "flash" por un "ir a etiqueta" de manera que me vuelva a preguntar.

Si xuta pondré un solucionado!

Enviat des del meu Nexus 5

cace0353
25/02/15, 21:48:38
Ya está, lo marco como solucionado.

Lo que he hecho es:

- Etiqueta
- Coger lo que se diga al micrófono (5 seg.)
- Asignar el valor cogido a una variable %temporal
- IF %temporal > 0 & <200
- operacion 1
- operacion 2
- ....
-ELSE
- Ir a Etiqueta
- End IF

El bucle se repite hasta que "pilla" un valor numérico entre 0 y 200

Problema resuelto, gracias!

mlesir
25/02/15, 22:29:02
Yo lo enfocaría por la vía de buscar/reemplazar. Se puede utilizar regex para que te coja el lo que coincida con un carácter numérico de las dos cifras obviando lo demás (posibles palabras que se te cuelen). Luego un if para que si la variable donde metes la coincidencia esta vacía repita el reconocimiento de voz.

cace0353
26/02/15, 11:35:39
Yo lo enfocaría por la vía de buscar/reemplazar. Se puede utilizar regex para que te coja el lo que coincida con un carácter numérico de las dos cifras obviando lo demás (posibles palabras que se te cuelen). Luego un if para que si la variable donde metes la coincidencia esta vacía repita el reconocimiento de voz.

Hola @mlesir (http://www.htcmania.com/member.php?u=763408), gracias por estar al quite y ayudar como siempre....

No he utilizado nunca Regex, pero en la página de la Wikipedia he encontrado un enlace para testear expresiones.

Yo necesito leer en la variable %VOICE un número entre 10 y 200, si el resultado no es correcto (porqué no he dicho nada, he dicho una palabra que no es un número o bien que el número que he dicho está fuera del rango 10-200), que me repita de nuevo la pregunta.

La expresión que he testeado es la siguiente: (\1*\d\d)
Pero esto, en el ejemplo de testeo web, me encuentra cualquier número, aunque tenga 7 cifras...
Yo, en mi ignorancia, leo la expresión que he escrito así: que el número empiece con un 1 (o no, para los valores inferiores a 100) y luego que tenga dos dígitos más.

Que hago mal?

sowed
26/02/15, 18:55:44
Que usos más curiosos le dais a tasker [emoji3]
Personalmente soy de la opinión de si hay algo que hace bien x tarea para que voy a hacerla yo... por eso lo que hago es que tasker me lanza radardroid (lo pille en una oferta gratis en amazon) cuando voy en el coche y el ya se encarga de avisarme... pero he de reconocer que la idea es buena.
Te digo, por si no lo sabes, que también hay programas que con la cámara leen las señales y te van avisando.
De todas formas seguiré el post que siempre se aprenden cosas que pueda aplicar a otros perfiles.

mlesir
26/02/15, 19:42:14
Empecemos pq yo se regex a nivel de batalleo. Exactamente no se pq no te funciona. Lo de la barra seguido del 1 no se que significa, pero como te digo mas abajo yo consulto otra pagina ( habrá diferentes regex?). El asterisco le dice que se repita una o mas veces, de ahí quizás que te coja toda la ristra de números.
En cualquier caso aquí tienes la tarea que he empleado para sacar la expresión correcta que tienes en la acción 2. A costado mas de lo que pensaba!
Solo tiene un pero, que te coge también los números entre 200 y 299. Pero si lo quieres pulir seguro que sabes hacerlo a partir de aquí.

TAREA REGEX:
A1: Establecer variable [ Nombre:%Aaa_ResultadoDeVoz A:155 Palabra 145 90 palabra Calcular:Apagado Añadir:Apagado ]
A2: Buscar y Reemplazar Contenido de Variable [ Variable:%Aaa_ResultadoDeVoz Buscar: ((\s|^)[1,2]\d{2}(\s|$))|((\s|^)\d{2}(\s|$))
Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Encendido Almacenar Coincidencias En:%Coincidencia Reemplazar Coincidencias:Encendido Reemplazar Con: ]
A3: Flash [ Texto:%Coincidencia1 Largo:Apagado ]

EXPLICACION:

Mediante la barra | le indicamos que hay dos opciones. O sea es como utilizar OR. Estas dos opciones las enmarcamos entre paréntesis para que las trate como un grupo de lo contrario seria como en matemáticas la diferencia entre estas dos expresiones:
45/34+5*10 o esta otra (45/34+5)*10

En una de las opciones tratamos el caso de que sea un numero de tres digitos: ((\s|^)[1,2]\d{2}(\s|$)) Desgranado....:

(\s|^): subgrupo con dos opciones o bien un espacio en blanco "\s" o bien el inicio del texto "^".

[1,2]: un carácter que sea o un 1 o un 2
seguido de...

\d: un caracter de dígito
{2}: repetido exactamente 2 veces ( podía usar también "\d\d")
seguido de...

(\s|$): subgrupo con dos opciones o bien un espacio en blanco "\s" o bien el final del texto "$".

Ahora vamos con el grupo para números de dos dígitos: ((\s|^)\d{2}(\s|$)) Desgranado:

(\s|^): subgrupo para indicarle q debe empezar el texto o bien tener un espacio.

\d{2}: Cualquier dígito que se repita exactamente dos veces.

(\s|$): subgrupo para indicarle que coincida con el final del texto o con un espacio en blanco.

Hasta aquí fenómeno pero me he dado cuenta de que hay un problema con (\s|$) y (\s|^). Si %VOICE contiene: " palabra 120 palabra" en %Coincidencia nos va a meter " 120 " con un espacio delante y otro detrás pq le hemos dicho que lo busque.

Y aquí viene uno de "mis" mejores descubrimientos q ya he mencionado en algún post: los fabulosos Look Around Assertions ( vienen explicados en el enlace mas abajo). Básicamente indican que busque pero NO lo incluya. Justo lo que necesitamos. Así que a los subgrupos les añadimos el look around:

(?<=(\s|^)): busca en el inicio de la coincidencia un espacio o el principio del texto pero no lo incluye.

(?=(\s|$)): busca en el final de la coincidencia un espacio o el final del texto pero no lo incluye.

Como veis es súperutil para coger de cualquier texto justo lo que queremos. Básico para los http get en mi opinión.

Total, que la cosa quedaria así:

((?<=(\s|^))[1,2]\d{2}(?=(\s|$)))|((?<=(\s|^))\d{2}(?=(\s|$)))

Para aprender regex mirate también esta pagina:

http://developer.android.com/reference/java/util/regex/Pattern.html

Es a la que remite tasker y es la "oficial".

Si como Tasker se considera un juego y como dice alguno ha sustituido al candy crush en sus ratos libres, regex es un minijuego dentro de otro. A mi me vicia! Creo que a ti y a Caravantes os tiene que apasionar.

cace0353
26/02/15, 20:25:41
Empecemos pq yo se regex a nivel de batalleo. Exactamente no se pq no te funciona. Lo de la barra seguido del 1 no se que significa, pero como te digo mas abajo yo consulto otra pagina ( habrá diferentes regex?). El asterisco le dice que se repita una o mas veces, de ahí quizás que te coja toda la ristra de números.
En cualquier caso aquí tienes la tarea que he empleado para sacar la expresión correcta que tienes en la acción 2. A costado mas de lo que pensaba!
Solo tiene un pero, que te coge también los números entre 200 y 299. Pero si lo quieres pulir seguro que sabes hacerlo a partir de aquí.

TAREA REGEX:
A1: Establecer variable [ Nombre:%Aaa_ResultadoDeVoz A:155 Palabra 145 90 palabra Calcular:Apagado Añadir:Apagado ]
----
----
----
Para aprender regex mirate también esta pagina:

http://developer.android.com/reference/java/util/regex/Pattern.html

Es a la que remite tasker y es la "oficial".

Si como Tasker se considera un juego y como dice alguno ha sustituido al candy crush en sus ratos libres, regex es un minijuego dentro de otro. A mi me vicia! Creo que a ti y a Caravantes os tiene que apasionar.

Muchísimas gracias mlesir, me has apabullado. Y dices que estás en nivel de batalleo. Pues yo estaré recogiendo las botas el "chester", el cinto y la gorra para entrar al CIR.

Voy a dedicar un tiempo a esto cuando pueda. De momento el programa funciona si le doy a la tecla de la velocidad deseada o si digo la palabra correcta (cincuenta, sesenta, ciento veinte, etc.) procuraré pronunciar alto y claro para que me entienda el aparatejo...

Sigo en la brecha y me temo que me estoy reenganchando a Tasker (como recluta aún).

Aunque haya un programa que ya hace lo que quieres, es mucho más gratificante para el ego hacerlo a tu manera... Se podria revisar la expresión "tener un hijo, plantar un árbol y escribir un libro" poniendo en lugar de escribir un libro "hacer un programa" (si funciona mejor...!)

Un cordial saludo y gracias de nuevo

sowed
26/02/15, 22:16:32
Muchísimas gracias mlesir,
Aunque haya un programa que ya hace lo que quieres, es mucho más gratificante para el ego hacerlo a tu manera... Se podria revisar la expresión "tener un hijo, plantar un árbol y escribir un libro" poniendo en lugar de escribir un libro "hacer un programa" (si funciona mejor...!)

Un cordial saludo y gracias de nuevo

por supuesto! no era una crítica... :sisi1:
simplemente que en este caso prefiero el programa porque no tengo que ir pendiente yo de las señales y no se me ocurre como mejorarlo ;-)

de todas formas lo principal es aprender, porque cada uno tiene unas necesidades pero todos podemos aprender de cualquier hilo para aplicarlo a nuestros programitas... me quito el sombrero con Caravantes, mlesir, contigo y alguno más... sois la leche :campeon:

cace0353
26/02/15, 23:06:20
Yo también uso Radardroid en combinacion con un navegador convencional (hace unos meses publiqué en el foro un proyecto en el que integraba estos programas con las tareas nombresitio, guardarposicion y volverasitio con una pequeña base de datos)
La idea de este programa surgió por dos razones practicas (aparte de la que he expuesto antes y que tiene un valor mas personal… ) :

1.- La nueva normativa que fija un valor tolerable sin sancionar de +8 km/h hasta 100 km/h y, a partir de ahí, un 10% mas de la maxima. Como sabes Radardroid solo contempla un % fijo.

2.- En zonas urbanas Radardroid te avisa de los radares que tienes en un radio determinado (en mi caso 500 m.) y me encuentro, p.e. en las Rondas de Barcelona, con vias paralelas en cantidad, que el cacharro no para… Si vas con alguien en el coche te apuntan a la lista de tipos raros. A menos que sea la parienta: esta ya te tiene por un caso irrecuperable (hay que reconocerlo!)

Enviat des del meu Nexus 5

sowed
27/02/15, 11:07:24
Jajaja...

Creo recordar que usé de base aquél proyecto para hacerme uno que me guarde la posición y que cuando le digo al móvil o al reloj "ir al coche" me abre el maps en modo peatón y me guía de vuelta al coche con instrucciones en la misma pantalla del reloj.
Creo que puse mi solución por allí también.

PD. Creo que a todos los del foro nos miran raro los amigos y parientes, pero a los de tasker más. [emoji23]

cace0353
27/02/15, 14:12:46
Añado otra razón:

3.- El programa està previsto para "cumplir estrictamente" con los límites. No se trata de ir a toda leche y frenar cuando tienes una alarma de radar cercano (fijo o posible móvil).
La idea es aprovechar la precisión del GPS para, aplicando los margenes que da la propia DGT, ir a la màxima velocidad "tolerada".
De esta manera te cubres también del helicóptero y de cualquier otro radar digamos "espontaneo"

PD. Dentro de unos dias lo cuelgo del foro en un nuevo hilo…

PPD. Ya esta colgado…
Enviat des del meu Nexus 5

m8ax
01/03/15, 03:30:28
para comprobar si la variable es numerica no lo he probado pero fijo k funciona, la variable la multiplicas por 2 pr ejemplo, si el resultado es mayor que 0 es k es numerica o no? Saludos.

GraphicAdventure
01/03/15, 05:55:23
Hay diferentes motores de regex que se designan flavors.
Tasker usa java flavor.
Para un rango de números no es aconsejable usar regex, pero no deja de ser instructivo y potencia las tareas, como bien dice mlesir.
Para ese rango entre 10 y 200 puedes usar esto:
\b(1?\d{2}|200)\b

cace0353
01/03/15, 09:42:05
Hay diferentes motores de regex que se designan flavors.
Tasker usa java flavor.
Para un rango de números no es aconsejable usar regex, pero no deja de ser instructivo y potencia las tareas, como bien dice mlesir.
Para ese rango entre 10 y 200 puedes usar esto:
\b(1?\d{2}|200)\b
Muchas gracias por tu aportación, GraphicAdventure !
Lo tendré en cuenta para futuros proyectos.

De todas formas creo que para este abandonaré esta opción porqué me ha aparecido un nuevo problema:

En casa, con wifi, funciona bién si pronuncio el término adecuado (sesenta, cien, cincuenta…), pero en ruta y si no voy por una zona con buena cobertura 3G, tampoco identifica la cifra por fallo en la conexión con los servidores de Google.

Habrà que pensar en un reconocimiento offline o bién, dando un paso que ahora me parece muy complicado, que la velocidad de cada ruta la extraiga automàticamente de alguna base de datos que ni conozco ni sé si existe.
De momento funciona bién con la selección manual de la velocidad.

Seguiré trabajando el tema y, si hago mejoras, las publicaré en el post del programa…

Enviat des del meu Nexus 5

z3us
01/03/15, 11:46:58
¿Has probado esto?
http://m.xatakandroid.com/tutoriales/como-activar-el-reconocimiento-de-voz-sin-conexion-en-android

Caravantes
01/03/15, 11:55:38
para comprobar si la variable es numerica no lo he probado pero fijo k funciona, la variable la multiplicas por 2 pr ejemplo, si el resultado es mayor que 0 es k es numerica o no?

Es una muy buena estrategia, para números positivos y superiores a cero, que es el caso planteado aquí. Es fácil adaptarla para que también incluya los negativos (comprobar si el resultado es distinto de 0). En otros casos será un inconveniente que no sirva para comprobar un valor numérico de cero, habría que meter una segunda condición o comprobación para chequear esa posibilidad.

GraphicAdventure
01/03/15, 14:27:18
Tienes que tener en tu móvil el icono "Ajustes de Google".
Vas a Búsqueda y Google Now/Voz/Reconocimiento de voz sin conexión.
A mi me funciona bien offline.
Sí no capta bien los números por extenso, dilos numéricamente.
En vez de veinte, di dos cero.

cace0353
01/03/15, 14:40:34
Tienes que tener en tu móvil el icono "Ajustes de Google".
Vas a Búsqueda y Google Now/Voz/Reconocimiento de voz sin conexión.
A mi me funciona bien offline.
Sí no capta bien los números por extenso, dilos numéricamente.
En vez de veinte, di dos cero.

Gracias, @GraphicAdventure

Lo pruebo en ruta y te digo.

En mi Nexus 5 tengo la opción "Cerca en domini local" (Búsqueda en dominio local) que debe corresponderse con la búsqueda offline...

cace0353
01/03/15, 14:44:16
¿Has probado esto?
http://m.xatakandroid.com/tutoriales/como-activar-el-reconocimiento-de-voz-sin-conexion-en-android

Gracias z3us, buscando por Google ya habia encontrado esta opción, pero en mi Nexus 5 no me sale en Reconocimiento de voz.

Sin embargo en los ajustes de Google sí que hay la opción de la búsqueda local.

Lo probaré esta tarde, a ver...

cace0353
01/03/15, 14:52:42
Es una muy buena estrategia, para números positivos y superiores a cero, que es el caso planteado aquí. Es fácil adaptarla para que también incluya los negativos (comprobar si el resultado es distinto de 0). En otros casos será un inconveniente que no sirva para comprobar un valor numérico de cero, habría que meter una segunda condición o comprobación para chequear esa posibilidad.

Gracias Caravantes.

De hecho esta parte ya está resuelta y funciona (si hay buena cobertura 3G) con la condición:

IF %var > 0 & %var < 200
Establecer variable: %Max a %var: Calcular activado
ELSE
ir a etiqueta <preguntar velocidad>
EndIF

El problema que tengo ahora es otro: reconocer la voz offline (está en fase de solución, ver posts anteriores).

En otro nivell: intentaré que la fijación de la velocidad sea automática para cada via, como he apuntado en el hilo de presentación del programa.

cace0353
02/03/15, 09:42:03
Si os parece bien seguimos en el hilo del programa que motivó la apertura de éste, ya que el tema de detectar si una variable contiene un valor numérico ha quedado resuelto con aportaciones varias e interesantes:

http://www.htcmania.com/showthread.php?t=979350 (http://www.htcmania.com/showthread.php?t=979350)

(Algún moderador que cierre el hilo, por favor)