PDA

Ver la Versión Completa : [ IDEA ] Sistema de estados únicos


GraphicAdventure
31/01/15, 11:28:18
Este sistema impide que esté activo más de 1 estado a la vez.
Esta idea no es nueva y supe de ella hace poco cuando leí el tema de Maid "Autómata de estados" que trata precisamente de esto, así que podéis leerlo en el siguiente enlace, porque no tiene desperdicio:
http://www.htcmania.com/showthread.php?t=775813

Lo que hice fue utilizarlo de una forma más simple con el mismo resultado y los propios perfiles de estados controlan el sistema junto con la variable %Profile.
Es muy sencillo y se puede aplicar a los perfiles actuales sin necesidad de cambiarlos.
Utilizo nombres en inglés, así que pongo las correspondencias a los términos utilizados.
Voy a tratar de los 5 siguientes estados por este orden:

Night (noche) -> Wifi Home (wifi casa) - > Cell Home (antena casa) - > Car (coche) - > Fuera

Los interpreto como niveles, siendo Fuera el nivel 0. Siguiendo el esquema es: 3 -> 2 -> 1 -> 1-> 0
Fuera no tiene perfil, para entrar en estado Fuera hay que limpiar la variable %Profile (no ajustada).
Fuera se interpreta como estar en la calle o en ningún estado.
Cell Home es un estado diferente a Fuera pero también es estar en la calle.
Si cogemos el coche dentro de Cell Home, Car sigue siendo nivel 1 porque al salir del coche entramos en Fuera.

Para que un perfil se active dentro de este sistema, se utiliza el contexto estado de variable con el nombre del perfil a activar y el que le precede en nivel.
En la tarea de entrada cambiamos %Profile a perfil a activar.
En la tarea de salida cambiamos %Profile a perfil precedente si no cambió de nivel.
La estructura es la siguiente:

Contexto:
- Estado de variable: %Profile ~ perfil_precedente/este_perfil
- Otros contextos

Tarea de entrada:
A1: Establecer variable: %Profile A: este_perfil

Tarea de salida:
Ax: Establecer variable: %Profile A: perfil_precedente (SI) %Profile ~ este_perfil

La tarea de entrada sube un nivel, la de salida baja. Al subir un nivel, hay que tener en cuenta que se ejecuta la tarea de salida del perfil actual.
Si hay acciones que no queremos que se ejecuten, hay que excluirlas o detener la tarea en algún punto con la condición %Profile !~ este_perfil.
Si estamos en el último nivel, no se necesita la condición en la acción Ax de la estructura de la tarea de salida.
Pero si uno quiere tener uniformidad se puede seguir siempre la misma pauta e incluirla.
Hay que tener cuidado al utilizar %PACTIVE o %Profile como condiciones. Puede no estar activo pero %Profile no haber cambiado.

Listo. No hay que hacer nada más.
A continuación pongo perfiles funcionales de los estados, analizando ciertas situaciones.
Eliminé acciones y datos que no interesan, dejando los perfiles más legibles.
Incluyo también un perfil que enciende el bluetooth solo si cogí el coche al salir de casa.
Para reducir el tiempo de activación del bluetooth, utiliza además como contexto las antenas que encontró en los últimos 30 segundos trás la desconexión del mismo.

GraphicAdventure
31/01/15, 11:28:52
Perfil: Night
Estado: Valor de variable [ %Profile ~ Wifi Home/Night ]
Hora: Desde 00:00 Hasta 06:59

Entrada:
A1: Establecer variable [%Profile A: Night]
A2: WiFi [ Establecer: Apagado ]

Salida:
A1: WiFi [ Establecer: Encendido ]
A2: Establecer variable [ %Profile A: Wifi Home ]

<S A2: siendo Night el último nivel, no hace falta poner la condición. Pero si uno quiere tener uniformidad se puede seguir siempre la misma pauta e incluirla.>



Perfil: Wifi Home
Estado: Conectado a Wifi
Estado: Valor de variable [ %Profile ~ Cell Home/Wifi Home ]

Entrada:
A1: Detener (if) [ %Profile ~ Wifi Home ]
A2: Establecer variable [ %Profile A: Wifi Home ]
A3: Secure Settings [ Clear Password ]

Salida:
A1: Esperar [ Segundos: 6 ]
A2: Detener (if) [ %PACTIVE ~ *,Wifi Home,* | %Profile !~ Wifi Home ]
A3: Secure Settings [ Set Password ]
A4: WiFi [ Establecer: Apagado ]
A5: Establecer variable [ %Profile A: Cell Home ] (if) [ %Profile ~ Wifi Home ]

<E A1: en caso de un microcorte. Importante: Al salir de Night va a impedir que se ejecute la tarea de entrada.
S A2: en caso de un microcorte y si Night se activa.>



Perfil: Cell Home
Estado: Antena cercana
Estado: Valor de variable [ %Profile No ajust. | %Profile ~ Cell Home ]

Entrada: (abortar tarea existente)
A1: Establecer variable [ %Profile A: Cell Home ]
A2: Esperar [ Minutos: 5 ]
A3: Detener (if) [ %PACTIVE !~ *,Cell Home,* ]
A4: WiFi [ Establecer: Encendido ]
A5: Esperar [ Segundos: 6 ]
A6: WiFi [ Establecer: Apagado ] (if) [ %Profile !~ Wifi Home ]
A7: Esperar [ Segundos: 6 ]
A8: Ir a acción [ Número: 2 ] (if) [ %PACTIVE ~ *,Cell Home,* ]

Salida:
A1: Limpiar variable [ %Profile ] (if) [ %Profile ~ Cell Home ]

<E A7: para ver si el bluetooth se conectó, a través del perfil Car Search. Si se conectó el estado es Car y no ejecuta A8.>



Perfil: Car Search
Estado: Valor de variable [ %Profile No ajust. &+ %Carout ~ 1 | %Profile ~ Cell Home &+ %Carout !~ 1 | %Carcellid ~ *%CELLID* ]

Entrada: (abortar tarea existente)
A1: Establecer variable [ %profile A: %Profile ]
A2: Esperar [ Segundos: 6 Minutos: 5 ]
A3: Detener (if) [ %Profile Ajustada & %Profile !~ Cell Home ]
A4: Bluetooth [ Establecer: Encendido ]
A5: Esperar [ Segundos: 6 ]
A6: Bluetooth [ Establecer: Apagado ] (if) [ %Profile !~ Car ]
A7: Ir a acción [ Número: 2 ] (if) [ %PACTIVE ~ *,Car Search,* ]
A8: Establecer variable [ %Carout A: 1 (if) [ %profile ~ Cell Home & %Profile ~ Car ]

<Este perfil solo enciende el bluetooth si cogí el coche al salir de casa.
Estado: Estoy diciendo que encienda el bluetooth si estoy en el estado Fuera y cogí el coche al salir de casa, o estoy en antena casa y no cogí el coche, o estoy en la antena dónde dejé el coche (si no es Cell Home).
Entrada: (abortar tarea existente): Permite guardar correctamente el valor de %Profile en %profile.
El perfil se va a ejecutar 2 veces seguidas si estoy en el coche y antena de casa porque al desactivar el bluetooth se queda en Fuera y se activa Car Search, justo seguido se activa Cell Home y se apaga Car Search porque %Carout ~ 1, inmediatamente se ejecuta la acción S A4 de Car que activa de nuevo Car Search.
La 1ª vez, la variable local %profile guarda el estado fuera. La 2ª vez guarda el estado Cell Home.
Si tuviera "abortar nueva tarea", la A8 no se ejecutaría.
E A2: Tarda 6 segundos más, para que el wifi se conecte primero.
E A3: Detiene si se activó wifi o cualquier otro perfil, pero no si está en estado Fuera o Cell Home.
Si Cell Home se desactivó durante la espera (A2), quiero que prosiga aunque Cell Home no esté activo, porque si cojo el coche en menos de 5 minutos (A2 tarda 5m) y salgo del área de antena de casa me quedo en estado Fuera pero dentro del coche.>



Perfil: Car
Estado: Bluetooth conectado
Estado: Valor de variable [ %Profile No ajust. | %Profile ~ Car/Cell Home ]

Entrada:
A1: Establecer variable [ %Profile A: Car ]
A2: Limpiar variable [ %Carcellid ]

Salida:
A1: Bluetooth [ Establecer: Apagado ]
A2: Limpiar variable [ %Profile ]
A3: Esperar [ Segundos: 1 ]
A4: Limpiar variable [ %Carout ] (if) [ %Profile ~ Cell Home ]
A5: Si (if) [ %Profile !~ Cell Home ]
A6: Establecer variable [ %Carcellid A: %CELLID Añadir: Encendido ]
A7: Establecer variable [ %Carcell A: 1 ]
A8: Esperar [ Segundos: 30 ]
A9: Limpiar variable [ %Carcell ]
A10: Fin si (End if)

<E A2: Borra las antenas cercanas que haya obtenido.
S A3: es necesaria para que Cell Home se active. La transición de estados no es rápida.
S A5 a A9: Cuando salgo del coche, guarda las antenas que encuentre durante 30 segundos y las utiliza como condición de antena cercana para encender el bluetooth.
S A6: Lleva una nueva línea después de %CELLID, para que guarde los valores separadamente.>

Perfil: Car Cell
Evento: Establecer variable [ %CELLID ]
Estado: Valor de variable [ %Carcell ~ 1 ]

Entrada:
A1: Establecer variable [ %Carcellid A: %CELLID Añadir: Encendido ]

<Lleva una nueva línea después de %CELLID, para que guarde los valores separadamente.>

breastvillage
31/01/15, 18:37:56
Qué propósito tiene esto ? Se ahorra batería o algo así ?

Lukevalci
31/01/15, 18:52:18
Jajajajajj, algo así !!!!!
Se puede llegar a ahorrar bastante batería haciendo que el teléfono active o desactive lo que te propongas al pasar de un perfil a otro

breastvillage
31/01/15, 19:05:34
Jajajajajj, algo así !!!!!
Se puede llegar a ahorrar bastante batería haciendo que el teléfono active o desactive lo que te propongas al pasar de un perfil a otro


Lástima que no domino mucho tema de programación, lo más que he logrado es que active reproductor música al conectar auriculares, y encender pantalla con sensor proximodad.:cry:

kenernest
01/02/15, 11:00:44
Buenas,

Yo planteo una duda de novato. Resulta que viendo el sistema me llama la atención esto:
Perfil: Cell Home
Estado: Antena cercana
Estado: Valor de variable [ %Profile No ajust. | %Profile ~ Cell Home

Como se pone " | ",? porque en mi tasker si pongo valor de variable no ajustado no puedo seleccionar nada mas

Gracias

josemaGL
01/02/15, 23:42:50
Dale al más (+) y añades otra variable, su condición y valor.

Caravantes
03/02/15, 04:25:06
Sistema de estados únicos

Fantástico, muchísimas gracias por compartirlo. En mi opinión, esto mejora el "Autómata de estados", sobre todo por su mayor sencillez que además facilita la comprensión y el mantenimiento de todo el conjunto. Bueno, supongo que en eso consiste la inteligencia colectiva: los desarrollos que hace uno sirven de base para un progreso mayor hecho por otro, y así sucesivamente. Felicitaciones y agradecimientos a los dos artistas: Maid450 y GraphicAdventure.

kenernest
07/02/15, 01:04:05
Ya esta aclarado el " | " que separa las descripciones es la condición O

angelob
14/05/15, 11:00:24
Hola GraphicAdventure, voy a intentar poner en marcha este sistema; lo veo más óptimo que el sistema que tengo montado.

Me surge la duda de un nuevo perfil "Trabajo", ¿cómo encajaría en este sistema de niveles?. Lo detecto por antenas cercanas, sería meterlo al mismo nivel que "wifi casa", o cómo?. También hay una segunda casa de mis padres, en la que tengo wifi, el tratamiento sería lo mismo, no?

saludos

kenernest
29/06/15, 00:54:10
Buenas, refloto este tema porque no doy para mas

Alguien me puede ayudar a íntegrar en este sistema la magnifica tarea de autoscan WiFi que esta en este hilo http://www.htcmania.com/showthread.php?t=734527

No se me ocurre como

Gracias

WillyWeb
29/06/15, 12:02:00
Hola kenernest :-)

Por lo que parece el sistema de AutoWifiScan de malkair intenta buscar/mantener la conexión a una WiFi conocida. Este "Sistema de estados únicos", entre otras cosas, conecta/desconecta la WiFi conforme a tus preferencias. En principio ambos sistemas deberían funcionar juntos sin problemas, pero tengo mis dudas porque en ambos veo controles similares para reaccionar a desconexiones eventuales, y me temo que podrían interferirse.

La pega creo que viene de que estos sistemas pretenden ser totalmente autónomos y dar una solución única y global a una colección de pequeños problemas.