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

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”.

Virtual Jeedom - Creación

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:

Virtual Jeedom - Latitud y Longitud

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.

Google Maps

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:

Virtual Jeedom - Cálculo de amanecer y anochecerComo 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):Widget Sol en Jeedom 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í:

Virtual Jeedom - Formato de la hora

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:

Virtual de Sol en Jeedom

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í:

Jeedom - Virtual Sol - dia noche

A poco que sepas personalizar un widget, puedes hacer que se vea así finalmente tu virtual de sol en la interfaz de tu Jeedom:

Virtual Sol Jeedom Widget

En Jeedom V4, podría tener este aspecto nuestro widget de SOL:

Periférico amanecer anochecer en Jeedom V4

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…

Philippe

Madrileño de adopción. Tecnófilo. Podcaster. Obsesionado por la domótica. Y unas cuantas cosas más, casi todas buenas. Keywords: viajes, libertad, amistad, amor, tecnología, pasión, equilibrio...


17 Respuestas

  1. Bull dice:

    Genial tutorial, yo no lo habría explicado mejor.

  2. Adriansinho dice:

    Uuuum no sabia que se podían usar operadores ternarios!!! Que buena! Gracias!!

  3. Gonzalo dice:

    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

  4. Cesar dice:

    Muy interesante si.
    Yo tampoco sabría que se podían usar funciones de php en los comandos.

    Gracias.

  5. Carles dice:

    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…

  6. Milor dice:

    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.

    • Philippe dice:

      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.

      • Milor dice:

        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?

        • Philippe dice:

          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.

  7. Diego Muñoz dice:

    No pude hacerlo :(, me aparecio amanece a las 0 y anochece a las 0 ahora es 0 y con icono de acelerómetro

  8. Tomas dice:

    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

  9. Tomas dice:

    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

    • Philippe dice:

      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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *