Cómo crear en Jeedom un virtual de amanecer/anochecer sin usar un plugin
- Tutorial paso a paso para crear un periférico de "Sol" en Jeedom, para conocer la hora del amanecer y el anochecer, sin recurrir a un plugin.
Los virtuales son uno de los pilares fundamentales de la solución Jeedom. Por ello, son uno de los platos fuertes de la Formación Oficial Jeedom.
Si eres usuario de Jeedom y aún no usas virtuales en tu sistema, deberías plantearte dedicarle tiempo a esto porque sin lugar a dudas te estás perdiendo mucho de lo bueno que ofrece Jeedom.
En Jeedom se puede -y se debe- usar virtuales para muchas cosas, como por ejemplo para separar en varios periféricos un mismo multisensor, al contrario para unificar en un mismo periférico varios dispositivos, para crear macros, para crear acciones sobre valores, para sustituir más fácilmente periféricos Z-Wave cuando se estropean… y también para usar funciones matemáticas avanzadas.
Jeedom pone a nuestra disposición una serie de funciones de cálculo y matemáticas de gran utilidad, que nos permiten hacer muchísimas cosas, por no decir de todo, y que están explicadas en su documentación oficial (en francés, eso sí).
Pero además, en Jeedom podemos usar funciones y expresiones de PHP, lo que nos da aún más posibilidades, de todo tipo.
Para ilustrar lo que estoy diciendo, en este nuevo articulo os planteo un reto: crear un periférico virtual de “SOL”, es decir un periférico que nos diga a qué hora amanece y a qué hora anochece, sin tener que usar un servicio online ni tampoco ningún plugin.
Será por tanto un periférico virtual totalmente autónomo, basado exclusivamente en funciones y expresiones matemáticas, que no dependa de la conexión a Internet. Veamos…
Paso 1 – Creación del virtual
Doy por supuesto que tienes el plugin “Virtuel” instalado en tu Jeedom. Si no es así, no hace falta que te diga que lo primero que debes hacer es instalarlo a través del Market Jeedom y activarlo.
Para crear nuestro virtual, nos iremos en el menú superior a Plugins / Programación / Virtual y luego pulsaremos en “+” (Añadir).
Como con cualquier otro periférico en Jeedom, le pondremos un nombre y rellenaremos los distintos campos de la ventana de configuración, sin olvidarnos de marcar las casillas “Activar” y “Visible”.
En cuanto al Cron, yo lo he puesto para que actualice los valores “info” de mi virtual cada 15 minutos, porque me interesa hacerlo así en este caso concreto.
Una vez creado el virtual, nos iremos a la pestaña “Comandos” y crearemos dos comandos de tipo “información”, que usaremos para indicar a Jeedom la latitud y la longitud de nuestra posición (es obvio que para calcular la hora del amanecer y el anochecer, Jeedom tiene que conocer nuestra posición en el planeta).
Para nuestro ejemplo, he elegido como localización la Puerta del Sol de Madrid:
Para conocer tu posición exacta y sacar la longitud y la latitud correspondientes, Google Maps es tu amigo. Sólo tienes que introducir tu dirección, te saldrá señalada en Google Maps y entonces con el botón derecho del ratón sólo tienes que elegir la opción “Qué hay aquí” para que el todo poderoso Google te muestre abajo las coordenadas.
Sólo te quedará copiar la latitud y la longitud y pegarlas en tu virtual, en los comandos de información que acabamos de crear (como puedes ver en la penúltima imagen anterior).
No hace falta que mostremos esos dos comandos en la interfaz de Jeedom, ni que los “historicemos”, por ello no he marcado esas casillas.
Paso 2 – Cálculo de las horas de amanecer y anochecer
A continuación, vamos a crear en nuestro virtual otros dos comandos de tipo “información”, que llamaremos respectivamente “Amanece a las” y “Anochece a las”. Así quedaría nuestro virtual:
Como te habrás dado cuenta ya a estas altura, la “chicha” está en la fórmula que he introducido en el campo “cálculo” de esos nuevos comandos de mi virtual. Esa fórmula no es mía, obviamente, usa una expresión de PHP que permite calcular la hora del amanecer y del anocher en base a las coordenadas.
La fórmula para calcular la hora del amanecer es la siguiente:
date_sunrise(#timestamp#,1,#[Taller][SOL MADRID][Latitud]#,#[Taller][SOL MADRID][Longitud]#,90+35/60, date("Z",#timestamp#)/3600)
Ni que decir que [Taller][SOL MADRID][Latitud] y [Taller][SOL MADRID][Longitud] son los valores de latitud y longitud de mi virtual y si se llama así es porque lo he llamado así (si llamas a tu virtual y/o a esos comandos de otra manera, es obvio que lo tendrás que cambiar, pero recuerda la que interfaz de Jeedom te ayuda con el botón “buscar dispositivo”).
La fórmula para calcular la hora del anochecer es muy similar, lógicamente:
date_sunset(#timestamp#,1,#[Taller][SOL MADRID][Latitud]#,#[Taller][SOL MADRID][Longitud]#,90+35/60, date("Z",#timestamp#)/3600)
Esto es suficiente para calcular ambas horas, la del amanecer y la del anochecer.
En este caso sí que queremos mostrar los comandos en la interfaz de Jeedom, y quizá también historizarlos. El resultado que obtenemos en forma de widget en Jeedom es éste (en V3):
Perfecto, ya vemos la hora del amanecer y del anochecer en la interfaz de usuario de Jeedom. Eso está muy bien, pero a la hora de crear escenas no nos va a servir de mucho. ¿Que por qué? Pues porque Jeedom entiende las horas, sí, pero no con este formato, sino con otro.
Me explico. Para Jeedom las 07h34 es un valor numérico, concretamente 734. Por la misma regla de tres, las 19h15 para Jeedom se corresponden con el valor 1915.
Bueno, no pasa nada, podemos usar otras funciones para obtener la hora de amanecer y anochecer en el formato que entiende Jeedom.
Para ello, vamos a crear otros dos comandos de tipo “información” en nuestro virtual, que llamaremos respectivamente “valor_amanecer” y “valor_anochecer”. Nuestro virtual quedaría así:
Una vez más, lo importante aquí es la función y la fórmula que estamos usando para convertir la hora a un formato entendible por Jeedom de cara a la creación de escenas.
La fórmula es ésta en ambos casos:
str_replace(":","",#[Taller][SOL MADRID][Amanece a las]#)
str_replace(":","",#[Taller][SOL MADRID][Anochece a las]#)
Perfecto. Ya tenemos las horas de amanecer y anochecer en un formato que podremos usar para crear escenas en Jeedom.
No hace falta que mostremos esos comandos en la interfaz de Jeedom. Lo que sí hace falta ahora es que sepamos cómo usarlos en una escena para bajar las persianas a la hora del anochecer, por poner solo un ejemplo. Te dejo que lo pienses, porque este post no va sobre esto concretamente…
Paso 3 – Vayamos un poco más lejos
Ahora que tenemos un virtual estupendo para conocer la hora del amanecer y el anochecer sin ayudas externas, y que podemos incluso crear escenas sobre esa base, te propongo un nuevo reto: hacer que el widget de nuestro virtual en Jeedom nos indique en todo momento si es de día o de noche…
Para ello, vamos a añadir, otra vez, otros dos comandos de tipo “información” en nuestro virtual. Los llamaremos esta vez “calculo_amanecer” y “calculo_anochecer”.
Si te propongo este reto, no es únicamente porque puede quedar vistoso en el dashboard de Jeedom un widget de este tipo, o en un diseño, sino porque vamos a aprender a usar un “operador ternario” en Jeedom. ¡¡¡Sí, porque Jeedom permite usar “operadores ternarios”!!!
Un operador ternario, explicado así rápido y yendo al grano, es una fórmula que si se cumple devuelve un valor y si no se cumple devuelve otro valor.
La sintaxis que debemos usar para los operadores ternarios en Jeedom es ésta:
(fórmula) ? "valor si cierto" : "valor si falso"
Si aplicamos esto en nuestro ejemplo, en nuestro virtual de “SOL”, para saber si por la mañana hemos superado o no la hora del amanecer, nuestro operador ternario sería el siguiente:
(#[Taller][SOL MADRID][valor_amanecer]# > #time#) ? "0" : "1"
¿Qué significa esto? Pues que si la hora del amanecer que nosotros hemos calculado con nuestro virtual es superior a la hora actual, entonces el valor de ese comando será 0, y en el caso contrario será 1.
Dicho de otra manera, si aún no ha amanecido, ese comando tendrá valor 0.
Si aplicamos esto en nuestro ejemplo, pero esta vez para saber si por la noche hemos superado o no la hora del anochecer, entonces usaremos esta fórmula:
(#[Taller][SOL MADRID][valor_anochecer]# > #time#) ? "1" : "0"
Que es como decir que si aún es de día, el valor de ese comando será 1 y si ya es de noche, el valor será 0.
El resultado en nuestro virtual sería éste:
Por tanto, con estos dos nuevos comandos, ya sabemos si es de día o no por la mañana y si es de día o no por la tarde. ¿Pero cómo combinar estos dos valores para saber, en cualquier momento, si es de día o de noche?
Piénsalo, es muy sencillo en realidad… Los dos últimos comandos que hemos creado, que nos indican si es de día o de noche por la mañana y por la tarde, pueden tener dos valores cada uno, que son 0 o 1.
Si multiplicamos esos dos valores, sabremos a ciencia cierta en cada instante si es de día o de noche. (ya que 1 multiplicado por 1 es 1 y 1 multiplicado por cero es cero… ¿me explico?).
#[Taller][SOL MADRID][calculo_amanecer]# * #[Taller][SOL MADRID][calculo_anochecer]#
Total, crearemos un último comando en nuestro virtual, que llamaremos “Ahora es”, que mostraremos en el widget (ahora sí nos interesa mostrarlo), y que podrá tener el valor 1 (cuando sea de día) o el valor 0 (cuando sea de noche). Además, ese valor nos será muy útil y sencillo a la vez, a la hora de crear escenas, como por ejemplo que sólo se encienda una luz con detección de movimiento si es de noche.
Nuestro virtual quedará, por tanto, así:
A poco que sepas personalizar un widget, puedes hacer que se vea así finalmente tu virtual de sol en la interfaz de tu Jeedom:
En Jeedom V4, podría tener este aspecto nuestro widget de SOL:
Conclusiones
El virtual que hemos creado en este articulo, no es más que un ejemplo. No digo que no sea útil, de hecho puede serlo y mucho, pero en realidad lo que quiero demostrar con él son varias cosas:
- Los virtuales son un pilar de Jeedom, ¡úsalos!
- Los virtuales son la mejor forma, a mi juicio, de sacar partido a las funciones de cálculo y funciones matemáticas de Jeedom y de PHP, porque si bien tienen su complejidad, una vez creados los virtuales correspondientes, es mucho más fácil usar las funciones a través de virtuales en escenas.
- Dedícale a tiempo a las funciones de Jeedom y piensa en todo lo que te pueden aportar funciones como “tendance” por ejemplo (tendencia, un concepto muy potente), o “LastStateDuration”, para saber desde cuanto tiempo un periférico tiene un valor concreto (una puerta abierta, una luz encendida…).
Espero que te hayan sido útiles estas orientaciones. Piensa que se pueden hacer cosas mucho mejores y mucho más útiles, sólo es cuestión de creatividad…
Genial tutorial, yo no lo habría explicado mejor.
Tu explicas esto y mucho más 😉
Uuuum no sabia que se podían usar operadores ternarios!!! Que buena! Gracias!!
Genial explicación!
Desconocía la opción de los operadores ternarios! Habrá que probarlo!
En mi caso utilizo bastante los virtuales y las funciones. Una serie de pequeños tutos como este, con ejemplos sobre el uso de las funciones matemáticas y demás, seria genial!
Gracias
¡Gracias! Habrá nuevos posts sobre funciones y virtuales… Saludos.
Muy interesante si.
Yo tampoco sabría que se podían usar funciones de php en los comandos.
Gracias.
Muy interesante y descriptivo!. Y muy bien explicado. Muchas gracias.
Sólo una pequeña corrección: En las informaciones virtuales «valor_amanecer» y «valor_anochecer» has puesto la misma expresión en los dos caso. Es evidente la corrección… pero por si hay algún despistado…
Cierto. ¡Gracias por el aviso!
Completísimo y yo intentando usar Helitrope par esto mismo!
Tengo que ponerme a ello pero me lo volveré a leer despacito e iré haciéndolo, pero me asalta una duda, no hay manera de referirte al “objeto actual” es decir usas [Taller][SOL MADRID] así que a la que le cambies el nombre al padre o al virtual, o le cambias de padre dejará de ir…
P.D. Deduzco que LastStateDuration y tendance se usarán en escenarios.
Si le cambias el nombre al dispositivo, o lo cambias de habitación, no pasa nada, se actualiza la base de datos y por lo tanto cualquier referencia hecha al dispositivo en cuestión. Prueba y lo verás. Héliotrope es un plugin estupendo, pero no es fácil de configurar. Las funciones las puedes usar en escenas y también en virtuales. De hecho a mi me gusta usarlas casi siempre en virtuales, porque luego su uso en escenas a través de un virtual es más sencillo, creo yo.
Saludos.
Ya veo que me preocupaba por nada suelo usar enlaces relativo en todo lo que puedo.
Heliotropo es difícil de configurar aún no estoy seguro que el mio este bien pero me da datos y parece que cuadran pero la guía/documentación parece súper interesante pero se me hace cuesta arriba por el idioma.
Supongo que hasta para latitud y longitud podrías haber usado variables o se pueden sacar de Ajustes – Sistema – Configuración – Información?
En efecto, ese apartado de “Informaciones” está pensado para eso. Aunque no puedes usar esa latitud y longitud que pones ahí en virtuales mediante “tags”. Está pensado eso para que los desarrolladores lo puedan usar en plugins. La ventaja de hacerlo “manual” introduciendo latitud y longitud, es que luego te es muy sencillo duplicar el virtual y tener más de uno para distintas ubicaciones: por ejemplo para tu vivienda principal y tu segunda vivienda (porque con Jeedom Link puedes “linkar” los dos Jeedom que tienes en 2 viviendas, y controlarlo todo desde uno de ellos). Saludos.
No pude hacerlo :(, me aparecio amanece a las 0 y anochece a las 0 ahora es 0 y con icono de acelerómetro
Revisa los subtipos de los comandos, son muy importantes. Y revisa también las fórmulas, que no tengas errores de sintaxis. Saludos.
Una pregunta, si quiero que un escenario se active 30minutos antes de la puesta de sol. (Para encender luces por ejemplo) ¿Como podría hacerlo? Ya que si resto 30, habrá días en los que si por ejemplo la hora de anochecer es 1905 (formato que entiende Jeedom) nos dara 1875, hora que no existe.
Gracias y muy buen tutorial
Acabo de encontrar la solución, por lo que me contesto a mi mismo:
funcion:
time_op(time,value)Te permite hacer operaciones a tiempo, con tiempo=tiempo (ej: 1530) y valor=valor para sumar o restar en minutos.
Un saludo
Exacto Tomás. Lo mejor, por tanto, es crear uno o varios comandos adicionales en tu virtuale, añadiendo o restando tiempo según tus necesidades. Saludos.