|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
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; deja que lo piense un rato.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Ú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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Ú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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Última edición por Caravantes Día 05/12/21 a las 13:59:37. |
|
#24
|
||||
|
||||
![]() 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 Cuento todo esto de forma detallada porque lo ideal sería que nuestra tarea Tasker hiciese algo similar (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.
![]()
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#25
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| 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 ]
__________________
Me apasiona volar, pero con los pies en el suelo...
Ú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
|
||||
|
||||
|
Agradecimiento a las aportaciones de @WillyWeb que nos enseña a pescar...
![]() ![]() Y la tarea tiene una pinta y unas funcionalidades impresionantes.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| 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…
__________________
Me apasiona volar, pero con los pies en el suelo...
Ú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.
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#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...
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 10/12/21 a las 00:37:19. |
| Gracias de parte de: | ||
|
#31
|
||||
|
||||
|
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) , que saca las DOS mejores horas consecutivas del DÍA, momento ideal para poner una lavadora, el lavaplatos o encender el calentador.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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Ú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
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| 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!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| 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
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 12/12/21 a las 21:22:01. |
|
#35
|
||||
|
||||
|
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...
__________________
Me apasiona volar, pero con los pies en el suelo...
Ú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
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 12/12/21 a las 22:58:48. |
| Gracias de parte de: | ||
|
#37
|
||||
|
||||
|
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. ![]() Gracias…
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#38
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| 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!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
|
|
#40
|
||||
|
||||
![]() 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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||