![]() |
|
Tasker Para hablar de todo lo relacionado con la aplicación tasker |
«
Tema Anterior
|
Siguiente tema
»
|
Herramientas |
#21
|
Creo que lo puedes hacer con muchas menos de 20 acciones.
![]() Sin meditarlo mucho (posible cagada)...
Si no la he vuelto a cagar eso son cuatro/cinco acciones. ![]() La pega que veo es que luego no podrás partir fácilmente ese array paralelo por una hora concreta. La solución; ![]() Última edición por WillyWeb Día 26/11/21 a las 16:47:07 |
|
#22
|
Me puese al tema unas horas después de soltar mi idea inicial pero no llegué a contar mis avances.
![]() La historia comenzó descargando el JSON. Arreglando el temas de las comas. Y usando "Array Merge" para conseguir ese array "paralelo" (%pyh) de 24 elementos (uno por hora) con la forma "xxx.xx €/MWh de hh-hh" o similar. Lo siguiente que hicimos fue ordenar ese array para facilitar la localización de los mejores precios/horas, pero antes vamos a evitar momentos poco convenientes por el motivo que sea (ausencia, siesta, etc). Código:
MÉTODO 1 Establecer Array [ %evitar=12,03,04,02 y separador=, ] Procesar Array [ %evitar Orden Alfabético Inverso ] Para [ %pos en %evitar() ] Sacar de Array [ %pyh el elemento %pos ] Fin Para ![]() Supongamos que en la siguiente lista queremos eliminar los elementos 01 y 02... 123.45 de 01-02 < 234.56 de 02-03 < 345.67 de 03-04 456.78 de 04-05 Al quitar el 01 la lista queda así.. 234.56 de 02-03 345.67 de 03-04 < 456.78 de 04-05 Y como se puede observar el 02 ya no es el mismo de antes. ![]() Eso lo evitamos quitando los elementos en orden inverso (desde abajo). Espero que se entienda. ![]() Otro acercamiento sería establecer las horas que nos %valen en lugar de las que queremos %evitar. Código:
MÉTODO 2 Establecer Variable [ %valen=12,3,4,2 ] Establecer Array [ %pyh=%pyh(%valen) y seperador=, ] ![]() ¿Tema resuelto? Pues no. Ambos métodos tienen un pequeño fallo cuya detección y reparación dejo en vuestras manos. Pero vamos, que tampoco es imprescindible. ![]() Última edición por WillyWeb Día 01/12/21 a las 12:06:36 |
Gracias de parte de: | ||
#23
|
||||
|
||||
Estoy pendiente de continuar con la tarea del hilo en cuanto pueda; la pelota está en mi tejado.
Pero de momento os cuento otra cosa relacionada. Un amigo tiene una casa con un termo eléctrico. La casa no tiene Wifi y por diferentes motivos no resulta oportuno hacer enlace desde el smartphone ni otras maniobras. O sea que no hay posibilidad de poner un enchufe "inteligente" con Wifi ni nada similar. Hay que buscar una solución más sencilla. Hemos comprado un programador horario para que el termo solo esté encendido uno o dos ratos al día, en los momentos en que la electricidad suele tener precios normalmente bajos. En la página https://www.esios.ree.es/es/pvpc he consultado los precios de la electricidad de los últimos 30 días. He anotado en una hoja de cálculo cuáles han sido las horas que me han parecido significativamente baratas de cada madrugada-mañana (AM) y de cada tarde-noche (PM). Luego he aplicado una suma para saber cuáles horas han sido las más ventajosas, en promedio mensual. En AM (y en el total diario de 24 horas), la hora de electricidad más barata suele ser de 4 a 5, seguida por poca diferencia de 3 a 4. En PM la hora más barata suele ser de 15 a 16. Estadística horas electricidad barata.jpg De momento vamos a programar para que el termo reciba electricidad de 4 a 5 y de 15 a 15:20. Con el uso habrá que ir viendo si ese plan es adecuado. Si ocurre más de un día que en algún rato se acaba el agua caliente habrá que ampliar el horario de carga eléctrica y/o subir la temperatura del termo, que es regulable -hasta 80 grados máximo- y de momento está configurado solo a 70 grados. Por el contrario, si ocurre que pasan las semanas y en todo momento hay agua caliente de sobra se podría probar a reducir el horario de carga eléctrica y/o bajar la temperatura del termo; bajar la temperatura del termo significaría que el agua alcanza la temperatura prevista en menos tiempo y entonces deja de calentar, por lo que también habrá menos consumo eléctrico. Según el manual del termo, los 80 grados (el máximo) suelen alcanzarse tras hora y media, aunque eso también depende de la temperatura del agua de entrada; en función de esa referencia, me ha parecido oportuno programar una hora y veinte minutos para llegar a 70 grados. Se agradecen comentarios y opiniones si alguien tiene una idea que pueda mejorar el planteamiento descrito. Cuento todo esto de forma detallada porque lo ideal sería que nuestra tarea Tasker hiciese algo similiar (dar corriente a un termo eléctrico en ciertos ratos, por medio de un enchufe inteligente conectado a Internet), pero adaptándose cada día a las horas en que los precios sean más baratos, que como se ha visto en la tabla anterior, no siempre son las mismas horas. Última edición por Caravantes Día 05/12/21 a las 13:59:37 |
#24
|
|||
Cita:
![]() Cita:
Código:
Establecer Array [ %mejor = 24 elementos a 0 ] Para [ %offset 0:-6 ] Parse/Format Date And Time [ Tipo: Now Output: yyyy-MM-dd Variable: ymd Offset: Días = %offset ] Solicitud HTTP [ https://api.esios.ree.es/archives/70/download_json?locale=es&date=%ymd ] Buscar y Reemplazar en Variable [ Variable: %http_data Buscar: (\d),(\d) Reemplazar Con: $1.$2 ] Arrays Merge [ Entrada: %http_data[PCB] de %http_data[Hora] Salida: %pyh ] Procesar Array [ %pyh Tipo: Orden Numérico, Coma-Flotante ] Para [ %ind 1:3 ] Buscar y Reemplazar en Variable [ Variable: %pyh(%ind) Buscar: \d\d$ Almacenar en Array: %hhh ] Sumar a Variable [ %mejor(%hhh1) +1 ] Fin Para Fin Para Flash [ %mejor() ]
La aclaración... Recuerda que en los datos que descargamos la primera hora (00-01) está en el elemento 1 del array, la segunda (01-02) está en el 2... y así sucesivamente. Ya te habrás dado cuenta de que el segundo número de esa pareja equivale al índice del array en el que está guardado el valor. Al ir incrementando el contenido de ese índice estaremos contando las veces que esa hora es la mejor. Y si al final el valor más alto está en el índice 5 eso querrá decir que la mejor hora es de 04-05. Dime que lo has entendido. No soy capaz de explicarlo más claro con menos palabras. ![]() Un par de cositas más... Me he dado cuenta de que al retroceder en el tiempo la segunda mejor hora va cambiando. Eso me hace pensar que no es buena idea analizar mucho más de una semana para no desvirtuar la estimación. En mis pruebas me encontré con que algunas veces aparecen "empates" que, aunque pueden hacer pensar que las horas señaladas son igual de buenas, resulta que se dan como consecuencia de que una es tantas veces tercera como otra segunda. Ese error se puede "mitigar" dando un peso diferente a cada posición cambiando el +1 de la acción "Sumar a Variable" por esto otro... 4-%ind Cita:
![]() |
#25
|
||||
|
||||
Cita:
Perfectamente explicado y entendido. Muchas gracias. Yo también había pensado que una tarea Tasker podría hacer esto. De hecho, creo recordar que en algún otro hilo se hablaba de una tarea Tasker que directamente iba generando una hoja de cálculo en drive (aunque igualmente me sirve generar un fichero TXT local con los valores separados por punto-y-coma; luego es bien fácil convertir eso a Excel), pero pensé que una tarea de ese tipo terminaría liándome más tiempo que hacer la tabla a mano, como lo he hecho, que me ha llevado solo unos 15 minutos. |
Gracias de parte de: | ||
#26
|
Hola a todos! Después de dos años de un casi abandono del foro (que no de Tasker pues alguna cosilla he hecho) entré la semana pasada y me interesó el tema propuesto. Me lo leí de cabo a rabo y copié el código colgado por @Caravantes en el post #14. Funcionaba!
A partir de él empecé a elaborar mi propio proyecto para conseguir que el programa me proporcionara datos y opciones para elegir en que horas era más favorable poner en marcha los grandes consumidores domésticos. Todo ello a partir de una escena en 2400x1080 cuyo enlace al xml es: https://pastebin.com/9KnAQxpd De entrada, y a la vista de lo que se ha propuesto, detecto dos maneras de enfocar el tema: 1.- Obtener una hora u horas que habitualmente són más baratas para ajustar un programador al que se enchufe el aparato en cuestión. He visto dos opciones de hacerlo un par de post más arriba y creo que esto acabaria aquí ya que no hay una gestión contínua de los datos. Aparte de esto me permito dos observaciones: a) en ocasiones hay cortes de luz (al menos donde yo vivo) y la programación queda "desplazada" con el peligro de que el desplazamiento horario nos llevara a un horario "caro". b) Los sábados y domingos acostumbran a ser más "baratos" y por tanto lo ideal sería recurrir a un programador diario de 7 dias alimentado con bateria recargable desde el propio enchufe (bastante más caros). 2.- Que el programa nos proporcione las mejores horas en un rango especificado configurable (p.e. de 8 a 24 ó incluso total de 0 a 24) de manera que seleccionemos manualmente las horas (o pareja de horas consecutivas por si el ciclo de utilización es más largo) y nos establezca un perfil con una alarma para avisarnos. Más adelante, una vez encontrado el procedimiento para activar el enchufe por WiFi, seria fácil modificar el mismo perfil para que iniciara la conexión de la base automáticamente. Este és, pués, el código basado en el que he referido, notablemente ampliado para las nuevas prestaciones y que incorpora las siguientes funciones: - El dia cuyos datos se muestran en el recuadro de encabezamiento y los precios máximo y mínimo del dia. - Mostrar los precios para las 24 horas ordenados por horas en una lista a la izquierda de la pantalla y en la que se han oscurecido las horas transcurridas (una pijadilla...). - Mostrar en un recuadro el precio/hora actual y la posición o "ranking" en la relación de precios ordenados de menor a mayor. El color de fondo (verde, amarillo, rojo) se corrresponde con el "ranking". - Selección del horario hábil para el que se mostrarán los resultados ordenados por precio. - Mostrar la lista ordenada por precios de las horas en el horario seleccionado en un menú "scrollable" - Mostrar la pareja de horas consecutivas con un precio más favorable (recuadro indicado 2H). - Seleccionar dos alarmas pulsando en el recuadro correspondiente: una para 1 hora y otra para 2 horas. Estas alarmas se indican al lado del icono del reloj. Pueden eliminarse con una pulsación larga sobre la hora. - Cambiar, a partir de las 21 h. entre mostrar los precios para hoy y para mañana pulsando sobre el icono de actualizar que está programado como conmutador continuo. El código que adjunto en formato texto está bastante comentado pero en catalán. No creo que suponga un problema. Los nombres de variables del código original se han mantenido. Código:
Tarea: Gestio Tarifes <Obtenim la data d'avui %data_consulta en format "yyyy-MM-dd"> A1: Parse/Format DateTime [ Tipo de Entrada: Now (Current Date And Time) Output Format: yyyy-MM-dd Formatted Variable Names: %data_consulta Output Offset Type: Ninguno Continuar Tarea Tras Error:Encendido ] Si (if) [ %data_consulta ~ %* ] A2: Solicitud HTTP [ Método: GET URL: https://api.esios.ree.es/archives/70/download_json?locale=es&date=%data_consulta Tiempo Límite (Segundos): 30 Structure Output (JSON, etc): Encendido ] A3: Buscar y Reemplazar en Variable [ Variable: %http_data Buscar: (\d),(\d) Reemplazar Coincidencias: Encendido Reemplazar Con: $1.$2 ] A4: Si (if) [ %Prima ~ %* ] A5: Establecer Variable [ Nombre: %Prima A: 8 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A6: Establecer Variable [ Nombre: %Nona A: 24 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A7: Fin Si (end if) A8: Establecer Variable [ Nombre: %hora A: %TIME Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A9: Separar Variable [ Nombre: %hora Separador: . ] A10: Establecer Variable [ Nombre: %hora A: %hora1 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A11: JavaScriptlet [ Código: var verd = "#FF005A29"; var vermell = "#92FF0000"; var color = "#FFEF9013"; Salida Automática: Encendido Tiempo Límite (Segundos): 45 ] <Obtenim la data actual %avui_barres en format "dd/MM/yyyy"> A12: Parse/Format DateTime [ Tipo de Entrada: Now (Current Date And Time) Output Format: dd/MM/yyyy Formatted Variable Names: %avui_barres Output Offset Type: Ninguno Continuar Tarea Tras Error:Encendido ] <Obtenim la data de la consulta feta en format "dd/MM/yyyy"> A13: Establecer Variable [ Nombre: %dia_barres A: %http_data[Dia](1) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] <Fem que %pyh sigui la matriu amb els preus per les 24 hores del dia i després els ordenem per PREU…> A14: Arrays Merge [ Nombres: %http_data[PCB] %http_data[Hora] Merge Type: Simple Ensamblador: de Salida: %pyh ] A15: Procesar Array [ Matriz de Variables (array): %pyh Tipo: Orden Numérico, Coma-Flotante ] <Matriu amb tots els preus i hores ordenats per HORES tal com surten del JSON per mostrar-les a la columna de l'esquerra…> A16: Arrays Merge [ Nombres: %http_data[PCB] %http_data[Hora] Merge Type: Simple Ensamblador: €/MWh de Salida: %total ] <Per veure les hores ja passades i mostrar-les en un menú enfosquit sobreposat i només si la data es avui…> A17: Establece Array [ Matriz de Variables (array): %passades Valores: %total(:%hora) Separador: , ] Si (if) [ %hora > 0 & %dia_barres ig %avui_barres ] <Calcular els preus màxim i mínim del dia…> A18: Establecer Variable [ Nombre: %pmax A: %pyh(<) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A19: Establecer Variable [ Nombre: %pmin A: %pyh(>) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] <Si ja ha passat la primera hora fixada inicia la llista ordenada d'hores més barates a partir l'hora %prima…> A20: Si (if) [ %hora > %Prima & %dia_barres ig %avui_barres ] A21: Establecer Variable [ Nombre: %prima A: %hora+1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A22: En Otro Caso (else) A23: Establecer Variable [ Nombre: %prima A: %Prima+1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A24: Fin Si (end if) <Matriu de PREUS per les hores seleccionades de %Prima a %Nona…> A25: Establece Array [ Matriz de Variables (array): %pre_pers Valores: %http_data[PCB](%prima:%Nona) Separador: , ] <Matriu de les HORES seleccionades…> A26: Establece Array [ Matriz de Variables (array): %hora_pers Valores: %http_data[Hora](%prima:%Nona) Separador: , ] A27: Arrays Merge [ Nombres: %pre_pers %hora_pers Merge Type: Simple Ensamblador: de Salida: %seleccio ] <Ordena la llista de Preu/hora des de l'hora actual fins l'hora %Nona…> A28: Procesar Array [ Matriz de Variables (array): %seleccio Tipo: Orden Numérico, Coma-Flotante ] A29: Establecer Variable [ Nombre: %result A: - - - - Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] Si (if) [ %result ~ %* ] <------------------------- INICI Determinació DUPLA hores més barates> A30: Ancla A31: Establecer Variable [ Nombre: %limit A: %Nona-1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] <Salta la determinació de la DUPLA d'hores si només en queda una….> A32: Ir A [ Tipo: Etiqueta de Acción Etiqueta: ---------------------------- FINAL Determinació dues hores més barates ] Si (if) [ %seleccio(#) ~ 1 ] A33: Si (if) [ %hora < %limit | %dia_barres !~ %avui_barres ] A34: Establecer Variable [ Nombre: %penult A: %seleccio(#)-1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A35: Establecer Variable [ Nombre: %minim A: 999.99 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A36: Para (for) [ Variable: %pri Ítems: 1:%penult Structure Output (JSON, etc): Encendido ] A37: Establecer Variable [ Nombre: %seg A: %pri+1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A38: Sección de Variable [ Nombre: %seleccio(%pri) De: 1 Longitud: 6 Encajar: Encendido Almacenar Resultado En: %primera ] A39: Sección de Variable [ Nombre: %seleccio(%seg) De: 1 Longitud: 6 Encajar: Encendido Almacenar Resultado En: %segona ] A40: Establecer Variable [ Nombre: %suma A: %primera+%segona Calcular: Encendido Dígitos de Redondeo Máximos: 2 Structure Output (JSON, etc): Encendido ] A41: Si (if) [ %suma < %minim ] A42: Establecer Variable [ Nombre: %minim A: %suma Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A43: Establecer Variable [ Nombre: %result A: %seleccio(%pri) %seleccio(%seg) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A44: Establecer Variable [ Nombre: %hora_inici A: %seleccio(%pri) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A45: Separar Variable [ Nombre: %hora_inici Separador: de ] A46: Separar Variable [ Nombre: %hora_inici2 Separador: - ] A47: Fin Si (end if) A48: Fin Para (end for) A49: Establecer Variable [ Nombre: %hora_inici A: %hora_inici21:00 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A50: Fin Si (end if) <---------------------------- FINAL Determinació dues hores més barates> A51: Ancla <Cerca el preu de l'hora actual…> A52: Para (for) [ Variable: %cont Ítems: 0:24 Structure Output (JSON, etc): Encendido ] A53: Si (if) [ %pyh(%cont) ~ * de %hora-* ] A54: Establecer Variable [ Nombre: %valor_actual A: %pyh(%cont) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A55: Separar Variable [ Nombre: %valor_actual Separador: de ] A56: Establecer Variable [ Nombre: %preu_actual A: %valor_actual1 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A57: Establecer Variable [ Nombre: %hora_actual A: %valor_actual2 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] <surt del bucle per poder posar %cont com a valor del ranking d'hores mes barates….> A58: Ir A [ Tipo: Etiqueta de Acción Etiqueta: Hora trobada ] A59: Fin Si (end if) A60: Fin Para (end for) <Hora trobada> A61: Ancla A62: Establecer Variable [ Nombre: %color A: %verd Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] Si (if) [ %cont < 9 ] A63: Establecer Variable [ Nombre: %color A: %vermell Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] Si (if) [ %cont > 16 ] A64: Establecer Variable [ Nombre: %Alarma1 A: - - Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] Si (if) [ %Alarma1 ~ %* ] A65: Establecer Variable [ Nombre: %Alarma2 A: - - Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] Si (if) [ %Alarma2 ~ %* ] A66: Destruir Escena [ Nombre: Q_ELECT Continuar Tarea Tras Error:Encendido ] A67: Mostrar Escena [ Nombre: Q_ELECT Mostrar Como: Diálogo, Fondo Muy Oscurecido Posición Horizontal: 100 Posición Vertical: 100 Animación: Derecha Continuar Tarea Inmediatamente: Encendido Allow Outside Boundaries: Encendido Blocking Overlay +: Encendido Overlay +: Encendido ] Última edición por cace0353 Día 08/12/21 a las 23:48:03 |
Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
#27
|
|
Cita:
![]() Y la tarea tiene una pinta y unas funcionalidades impresionantes. ![]() |
Gracias de parte de: | ||
#28
|
Lo siento :-(. Hay un error en la selección del grupo de dos horas más barato. Tal como está escrito siempre saldràn seleccionadas las dos primeras horas de la lista, aunque no sean consecutivas por horas, porque la suma serà inferior a cualquier otro par!.
Revisando esta parte. El resto funciona correctamente… Última edición por cace0353 Día 09/12/21 a las 22:29:40 |
Gracias de parte de: | ||
#29
|
||||
|
||||
Hola Cace; encantado de verte y más encantado de que intervengas con una aportación tan fantástica y completa. Gracias.
Cita:
Cita:
Por otro lado, tanto un termo eléctrico como un sistema de calefacción puede mantener una eficacia razonable si recibe alimentación eléctrica al menos una vez al día. Hace años tuve tarifa nocturna y usaba un programador de ese tipo para que el termo eléctrico tomase energía de 7 a 8 de la mañana; el agua del termo se mantenía caliente todo el día. También tenía acumuladores térmicos que se "calentaban" por la noche e iban soltando el calor a lo largo de la jornada. Pero es impensable que cosas de este tipo puedan "cargarse" solo durante el fin de semana. Aunque sería más barato, para el martes el agua del termo ya no estaría caliente y los acumuladores térmicos ya habrían soltado el 90% del calor que hubieran acumulado, por lo que cada semana te quedarías varios días sin agua caliente y/o sin calefacción. |
#30
|
Bueno, el error se debia a que calculaba la dupla de horas más baratas a partir de la matriz ordenada por los precios en lugar de hacerlo con la ordenada por las horas.
He modificado la sección del código donde se determina este par de horas. Para ello he definido de nuevo la matriz de precios de las horas restantes en A31 (%restants). Por tanto, y en resumen: aparece una acción nueva (A31) y se cambian las referencias a la matriz %seleccio por %restants. El resto de código permanece igual. Código:
<------------------------- INICI Determinació DUPLA hores més barates> A30: Ancla <Llista de Preu/hora des de l'hora actual fins l'hora %Nona ORDENAT PER HORES…> A31: Arrays Merge [ Nombres: %pre_pers %hora_pers Merge Type: Simple Ensamblador: de Salida: %restants ] A32: Establecer Variable [ Nombre: %limit A: %Nona-1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] <Salta la determinació de la DUPLA d'hores si només en queda una….> A33: Ir A [ Tipo: Etiqueta de Acción Etiqueta: ---------------------------- FINAL Determinació dues hores més barates ] Si (if) [ %restants(#) ~ 1 ] A34: Si (if) [ %hora < %limit | %dia_barres !~ %avui_barres ] A35: Establecer Variable [ Nombre: %penult A: %restants(#)-1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A36: Establecer Variable [ Nombre: %minim A: 999.99 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A37: Para (for) [ Variable: %pri Ítems: 1:%penult Structure Output (JSON, etc): Encendido ] A38: Establecer Variable [ Nombre: %seg A: %pri+1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A39: Sección de Variable [ Nombre: %restants(%pri) De: 1 Longitud: 6 Encajar: Encendido Almacenar Resultado En: %primera ] A40: Sección de Variable [ Nombre: %restants(%seg) De: 1 Longitud: 6 Encajar: Encendido Almacenar Resultado En: %segona ] A41: Establecer Variable [ Nombre: %suma A: %primera+%segona Calcular: Encendido Dígitos de Redondeo Máximos: 2 Structure Output (JSON, etc): Encendido ] A42: Si (if) [ %suma < %minim ] A43: Establecer Variable [ Nombre: %minim A: %suma Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A44: Establecer Variable [ Nombre: %result A: %restants(%pri) %restants(%seg) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A45: Establecer Variable [ Nombre: %hora_inici A: %restants(%pri) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A46: Separar Variable [ Nombre: %hora_inici Separador: de ] A47: Separar Variable [ Nombre: %hora_inici2 Separador: - ] A48: Fin Si (end if) A49: Fin Para (end for) A50: Establecer Variable [ Nombre: %hora_inici A: %hora_inici21:00 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A51: Fin Si (end if) <---------------------------- FINAL Determinació dues hores més barates> A52: Ancla El programa debe completarse con el perfil o perfiles necesarios para que te avise a las horas de conectar los aparatos que hubieras programado en la escena. Si se logra activar un enchufe por WiFi podria ejecutarse automáticamente la tarea (sin escena) a las 00:00 y que ella se encargara de arrancar los aparatos a la hora más favorable... Última edición por cace0353 Día 10/12/21 a las 00:37:19 |
Gracias de parte de: | ||
#31
|
|
Cita:
Partes de un subconjunto de los datos originales en su orden natural (por horas). Creas el array "paralelo" (nombre pendiente de patente) que recorres hasta el penúltimo elemento sumando el precio de cada hora con el de la siguiente. Y si esa suma resulta ser el valor más bajo encontrado ya tienes localizadas las dos horas consecutivas con el mejor precio ... ¿correcto? ![]() Código:
%min = 1000 Para [ %aaa de 1:23 ] %bbb = %aaa + 1 %sum = %http_data[PCB](%aaa) + %http_data[PCB](%bbb) %xxx = %aaa [ SI %sum < %min ] %min = %sum [ SI %sum < %min ] Fin Para %bbb = %xxx + 1 %aaa = %http_data[PCB](%xxx) de %http_data[Hora](%xxx) %bbb = %http_data[PCB](%bbb) de %http_data[Hora](%bbb) ![]() Si quieres analizar un rango concreto de horas solo tienes que modificar el "1:23" del bucle (o usar variables). Y si quieres un rango de más de dos horas los cambios tampoco son complicados. ![]() Última edición por WillyWeb Día 12/12/21 a las 12:52:56 |
Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
#32
|
Pensaba que el algoritmo anterior ya era lo más simple posible, pero cuando lo he probado en Tasker me he dado cuenta de que se podía mejorar ligeramente. Y sí, confieso que los "retazos" de código que voy proponiendo para este proyecto los escribo sin haberlos probado antes.
![]() Al tema... Código:
%min = 9999 Para [ %ind1 de 1:23 ] Establecer Múltiples Variables [ Nombres: %ind2,%pre1,%pre2 Valores: %ind1+1,%http_data[PCB](%ind1),%http_data[PCB](%ind2) Calcular: Sí ] Establecer Múltiples Variables [ Nombres: %res1,%res2,%min Valores: %ind1,%ind2,%pre1+%pre2 Calcular: Sí ] [ SI %pre1+%pre2 < %min ] Fin Para |
Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
#33
|
Ostras WillyWeb, desconocia totalmente lo de asignar multiples variables en Tasker con una única instrucción. Siempre lo hacia con un javascriplet de múltiples lineas.
Mañana, cuando tenga un rato, lo pruebo! He vuelto a pescar un pez! ![]() |
Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
#34
|
Bueno, parece que nadie se atreve con el paso final.
![]() Se supone que ya tenemos las horas "buenas" y ahora toca encender/apagar el termo, lavaplatos, radiador o lo que sea. ¿Con qué?
¿Cómo?
Me suena que de esto ya hemos hablado antes. ![]() Bueno, ir mirando esas cosas. Por cierto, ojo con la corriente máxima que pueda aguantar el enchufe (o interruptor) elegido. Si no lo tenéis claro lo estudiamos con calma. **EDITO** En algunos casos el enchufe WiFi no es una opción porque es necesario pulsar un botón físico para que el aparto se ponga en marcha. Entonces hace falta un chisme como este... SwitchBot junto con SwitchBot Hub Mini. O como estos otros... https://www.amazon.es/Riiai-Interrup.../dp/B095YMVHFX https://es.aliexpress.com/item/1005003535335637.html https://es.aliexpress.com/item/1005003061028654.html Última edición por WillyWeb Día 12/12/21 a las 21:22:01 |
#35
|
|
Cita:
a) Calcula sólo a partir de la hora actual hasta la hora fijada como %Nona (normalmente las 24:00 pero configurable en la escena mediante un "consulta de variable"). b) Hay un condicional SI para ejecutar esta parte de código desde la primera hora %Prima si se está mostrando la lista del dia sigüiente (como opción conmutable en la escena a partir de las 21:00) c) He añadido unas instrucciones adicionales para separar la primera hora del grupo y darle el formato HH:MM que se asigna a la variable global %Alarma2 y que, mediante el correspondiente perfil activará un aviso o arrancará el enchufe WiFi... Ajunto el código entre las dos Anclas o comentarios que deberia substituirse con el ahorro de 8 acciones... Código:
<------------------------- INICI Determinació DUPLA hores més barates> A30: Ancla A31: Establecer Variable [ Nombre: %limit A: %Nona-1 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] <Salta la determinació de la DUPLA d'hores si només en queda una….> A32: Ir A [ Tipo: Etiqueta de Acción Etiqueta: ---------------------------- FINAL Determinació dues hores més barates ] Si (if) [ %seleccio(#) ~ 1 ] A33: Si (if) [ %hora < %limit | %dia_barres !~ %avui_barres ] A34: Establecer Variable [ Nombre: %minim A: 9999 Calcular: Encendido Dígitos de Redondeo Máximos: 1 Structure Output (JSON, etc): Encendido ] A35: Para (for) [ Variable: %pri Ítems: %hora:%limit Structure Output (JSON, etc): Encendido ] A36: Establecer Múltiples Variables [ Nombres: %seg,%pre1,%pre2 Valores: %pri+1,%http_data[PCB](%pri),%http_data[PCB](%seg) Calcular: Encendido Dígitos de Redondeo Máximos: 2 Structure Output (JSON, etc): Encendido ] A37: Establecer Múltiples Variables [ Nombres: %res1,%res2,%minim Valores: %pri,%seg,%pre1+%pre2 Calcular: Encendido Dígitos de Redondeo Máximos: 2 Structure Output (JSON, etc): Encendido ] Si (if) [ %pre1+%pre2 < %minim ] A38: Fin Para (end for) A39: Fin Si (end if) A40: Establecer Variable [ Nombre: %hora_inici A: %http_data[Hora](%res1) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A41: Establecer Variable [ Nombre: %result A: %http_data[PCB](%res1)%http_data[Hora](%res1) %http_data[PCB](%res2) de %http_data[Hora](%res2) Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] A42: Separar Variable [ Nombre: %hora_inici Separador: - ] A43: Establecer Variable [ Nombre: %hora_inici A: %hora_inici1:00 Dígitos de Redondeo Máximos: 3 Structure Output (JSON, etc): Encendido ] <---------------------------- FINAL Determinació dues hores més barates> A44: Ancla A pesar de que las horas seleccionadas són correctas los precios mostrados en la escena no lo són, siempre muestra los de las últimas dos horas del bucle... Detectado el error de que no se muestran los precios mínimos he modificado la accion A41 y ya está resuelto... Última edición por cace0353 Día 13/12/21 a las 09:51:20 |
Gracias de parte de: | ||
#36
|
En A41 haces una suposición que no siempre es cierta. Al salir del bucle las variables %pre1 y %pre2 puede que no tengan el precio de las dos horas emparejadas. Si lo haces así...
%result = %http_data[PCB](%res1) de %http_data[Hora](%res1) %http_data[PCB](%res2) de %http_data[Hora](%res2) ...problema resuelto. Y para definir %hora_inici puedes hacer esto... %hora_inici = %http_data[Hora](%res1) Buscar y Reemplazar [ En: %hora_inici Buscar: -\d\d$ Reemplazar: :00 ] O esto otro... Sección de Variable [ %http_data[Hora](%res1) De:1 Longitud: 2 Almacenar en: %hora_inici ] %hora_inici = %hora_inici:00 Última edición por WillyWeb Día 12/12/21 a las 22:58:48 |
Gracias de parte de: | ||
#37
|
|
Cita:
Gracias… |
Gracias de parte de: | ||
#38
|
||||
|
||||
Cita:
Controlar relé Wifi desde tasker https://www.htcmania.com/showthread.php?t=1525110 Me ha parecido oportuno continuar esta parte de la conversación en ese hilo que ya existe dedicado a ese asunto. Quien quiera ir directamente a mi post, puede hacerlo en https://www.htcmania.com/showthread....0#post33388600 Gracias, Willy, por tus inestimabes aportaciones en ambos hilos. |
Gracias de parte de: | ||
#39
|
Me engancho de nuevo.
Para probar la propuesta de @WillyWeb para ejecutar el tramo de determinación de la dupla, cloné mi tarea y realicé los cambios en ella. Una vez funciona todo correctamente me parecia que la tarea modificada era màs lenta y he puesto controles de tiempo (%TIMEMS) al inicio y al final de este fragmento de código en ambas tareas guardando las salidas (%tiemp_fin - %tiemp_ini) en un archivo de texto en modo "Añadir nueva linea". He aquí los resultados para 5 ejecuciones alternadas: Cace0353: 72 WillyWeb: 437 Cace0353: 95 WillyWeb: 420 Cace0353: 115 WillyWeb: 405 Cace0353: 75 WillyWeb: 413 Cace0353: 111 WillyWeb: 396 Sorprendentemente el código mas "pedreste" ha resultado ser mas rapido de ejecución! De todas formas hemos aprendido cosas nuevas… Gracias! |
Gracias de parte de: | ||
|
#40
|
|
Cita:
![]() Está claro que esa acción de "Establecer Múltiples Variables" está poco pulida. Gracias por tomarte el tiempo de hacer la comprobación. Por cierto, tienes un cronómetro interno muy fino para deterctar diferencias de apenas 300 milisegundos. ![]() |
Gracias de parte de: | ||
Respuesta |
![]() |
||||||
|
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 21:35:33 (GMT +2)
HTCMania: líderes desde el 2007