You are currently viewing Les Fonctions PHP dans les scénarios de la domotique Jeedom

Les Fonctions PHP dans les scénarios de la domotique Jeedom

Tags: Fonctions,PHP, Scénario domotique Jeedom

Attention article long, dense et complexe pour bien debuter assure toi d’avoir lu l’article sur les scénarios !

0.Contexte

Quand on commence jeedom, clairement il faut un temps d’adaptation et souvent ce temps commence par les galères alors on lit l’excellente documentation de jeedom qui nous détaille tout plein de chose, mais ça reste compliqué pour un novice.

Nous suivrons donc la trame de jeedom dans les grandes lignes disponible ici

Et parmis toutes ces difficultés vient les Fonctions dans jeedom… On va essayer de faire des exemples concret :

1.0 les déclencheurs

Avant toutes choses nous allons faire un rappel si intuitivement on peut choisir un déclencheur provoqué, programmé ou les deux en intuitif sur jeedom, il y a aussi d’autres fonctions possibles

1.1 Fonction lié au démarrage #start#:

Cette fonction permet d’être averti quand votre jeedom démarre l’hashtag se met directement en déclencheur

Et dans le scénario on met l’action qu’on veut exécuter

par exemple

Fonctions,PHP, Scénario domotique Jeedom

À chaque démarrage de mon jeedom je reçois donc une notification

1.2 Fonctions Lié a la sauvegarde

1.2.1 #begin_backup#

Ce hashtag permet d’être averti dès qu’une sauvegarde est en cours

par exemple :

Fonctions,PHP, Scénario domotique Jeedom

Du coup quand je lance ma sauvegarde :

1.2.2 #end_backup# 

Celui-ci intervient est le même que précédemment sauf qu’il s’actionne la fin de la sauvegarde !

1.3 Fonctions restauration

1.3.1 #end_restore#

cette fonction est sympa car elle intervient lorsqu’une restauration a eu lieu, par exemple j’ai fait le C*** avec mon jeedom (le problème dans jeedom est souvent situé entre le fauteuil et le clavier) et je lance une restauration, car c’est pas réparable.

Avec end restore du coup je peux recevoir une notification quand ma restauration est faite et pendant ce temps je peux finir mes tâches ménagères avant que ma femme ne rentre et voit que j’ai passé la journée sur le PC

Fonctions,PHP, Scénario domotique Jeedom

1.3.2 #begin_restore#

Idem, mais au début d’une restauration

1.4 Fonctions de mises a jour

1.4.1 #begin_update#

Je suis sur mon téléphone et je vois que mon jeedom a besoin d’une mise à jour

Si au préalable j’avais prévu un scénario avec begin update

Fonctions,PHP, Scénario domotique Jeedom
Quand je vais cliquer sur ma mise a jour depuis mon telephone je serai notifié que celle ci est en cours

1.4.2 #end_update#

Celle-ci permet d’être informé de la fin de la mise a jour

1.5 Fonction variable

Avec cet hashtag #variable(nom_variable)# on déclenche le scénario a chaque modification de la valeur de la variable.

Par exemple dans la première version de mon centre de gestion familiale

quand je clique sur mon virtuel

Cela influe sur ma variable et donc déclenche ce scénario
Fonctions,PHP, Scénario domotique Jeedom

1.6 Fonction utilisateur

Le hashtag #user_connect# permet de savoir quand quelqu’un se connecte sur jeedom mais pas spécifiquement

2. Les fonctions de comparaisons

Jeedom nous explique cela :

Opérateurs de comparaison et liens entre les conditions

Vous pouvez utiliser n’importe lequel des symboles suivant pour les comparaisons dans les conditions :

  • == : Egal à.
  • > : Strictement supérieur à.
  • >= : Supérieur ou égal à.
  • < : Strictement inférieur à.
  • <= : Inférieur ou égal à.
  • != : Différent de, n’est pas égal à.
  • matches : Contient. Ex : [Salle de bain][Hydrometrie][etat] matches "/humide/".
  • not ( …​ matches …​) : Ne contient pas. Ex : not([Salle de bain][Hydrometrie][etat] matches "/humide/").

Vous pouvez combiner n’importe quelle comparaison avec les opérateurs suivants :

  • && / ET / et / AND / and : et,
  • || / OU / ou / OR / or : ou,
  • ^ / XOR / xor : ou exclusif.

Nous allons le mettre en pratique dans les tags !

3. Les Tags

de nombreux tags sont inscit dans jeedom

  • #seconde# : Seconde courante (sans les zéros initiaux, ex : 6 pour 08:07:06).
  • #hour# : Heure courante au format 24h (sans les zéros initiaux). Ex : 8 pour 08:07:06 ou 17 pour 17:15.
  • #hour12# : Heure courante au format 12h (sans les zéros initiaux). Ex : 8 pour 08:07:06.
  • #minute# : Minute courante (sans les zéros initiaux). Ex : 7 pour 08:07:06.
  • #day# : Jour courant (sans les zéros initiaux). Ex : 6 pour 06/07/2017.
  • #month# : Mois courant (sans les zéros initiaux). Ex : 7 pour 06/07/2017.
  • #year# : Année courante.
  • #time# : Heure et minute courante. Ex : 1715 pour 17h15.
  • #timestamp# : Nombre de secondes depuis le 1er janvier 1970.
  • #date# : Jour et mois. Attention, le premier nombre est le mois. Ex : 1215 pour le 15 décembre.
  • #week# : Numéro de la semaine.
  • #sday# : Nom du jour de la semaine. Ex : Samedi.
  • #nday# : Numéro du jour de 0 (dimanche) à 6 (samedi).
  • #smonth# : Nom du mois. Ex : Janvier.
  • #IP# : IP interne de Jeedom.
  • #hostname# : Nom de la machine Jeedom.
  • #trigger# (deprecié, mieux vaut utiliser trigger()) : Peut être le nom de la commande qui a déclenché le scénario :
    • api si le lancement a été déclenché par l’API,
    • schedule c’est si il a été lancé par une programmation,
    • user si il a été lancé manuellement,
    • start pour un lancement au démarrage de Jeedom.
  • #trigger_value# (deprecié, mieux vaut utiliser triggerValue()) : Pour la valeur de la commande ayant déclenché le scénario

Bon On détaille :

3.1 Les tags temporels

3.1.1 Les tags temporels dans une variable

3.1.2 Timestamp

Timestamp est une mesure en seconde du temps écoulé depuis 1970.

Cela permet par exemple de faire une comparaison d’un référentiel de temps par rapport a un autre

Exemple :

J’ai un détecteur de mouvement Aqara dans ma véranda qui me joue un son sur une gateway Xiaomi. Seul souci ils peuvent me lancer deux fois une alarme en moins de 20 seconde. La fonction timestamp peut me permettre de voir si le dernier déclenchement etait inferieur a 20 seconde et donc eviter de m’importuner pour rien

Dans cet exemple j’enregistre le timestamp de dedéclenchementas une variable mouvementv et au prochain déclenchement il vérifiera que le time stamp au moins un différentiel de 20 seconde via #timestamp#> (variable(mouvementv)+20)

3.2 Les tags Trigger

3.2.1 Trigger déclencheurs

Permet de valider si la condition d’api, d’user de programmation ou de démarrage de jeedom à lancer le scénario

3.2.2 Trigger value

Permet de savoir quel est la valeur qui a déclenché le scénario

Dans l’exemple le déclencheur est une température supérieure a 10

Dans notre exemple le scénario a été déclenché a 21.8

3.3 Tags divers

Le tag #ip# et le tag #hostname#

4. Les fonctions de calculs

4.1 Fonction Maximum , Moyenne et Minimum

  • average(commande,période) et averageBetween(commande,start,end)Donnent la moyenne de la commande sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP) :

Par exemple averageBetween(#[cellier][Linky][Consommation Jour]#,2020-01-01 00:00:00,2021-01-01 00:00:00)

Cela donne la moyenne de la consommation journalière du 1 janvier 2020 au 01 janvier 2021

  • min(commande,période) et minBetween(commande,start,end) : Donnent le minimum de la commande sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP) :

Par exemple min(#[cellier][Linky][Consommation Jour]#,2020-01-01 00:00:00)

Cela donne le minimum de ma consommation journalière depuis le 1er janvier 2020 a minuit

  • max(commande,période) et maxBetween(commande,start,end) : Donnent le maximum de la commande sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP) :

Par exemple max(#[cellier][Linky][Consommation Jour]#,2020-01-01 00:00:00)

Cela donne le maximum de ma consommation journalière depuis le 1er janvier 2020 a minuit

4.2 Fonctions Duration

4.2.1 Duration

duration(commande, valeur, période) et durationbetween(commande,valeur,start,end) : Donnent la durée en minutes pendant laquelle l’équipement avait la valeur choisie sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP) :

Par exemple duration(#[Chauffage][Chauffage lit][Etat]#,1,10 days ago)

Cela me donne combien de temps mon chauffage du lit était allumé sur les 10 derniers jours

4.2.2 Duration Between

durationbetween(commande,valeur,start,end)

Par exemple cela me donne combien de temps mon chauffage du lit était allumé entre hier et maintenant

4.2.3 State duration

stateDuration(commande) : Donne la durée en secondes depuis le dernier changement de valeur. Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique. Retourne -2 si la commande n’est pas historisée.

Dans notre scénario cela nous donne depuis combien de temps a eu lieu le dernier changement de valeur

stateDuration(#[Lumière ines][Interrupteur ines ][Etat gauche]#)

4.2.4 Last change state duration

lastChangeStateDuration(commande,valeur) : Donne la durée en secondes depuis le dernier changement d’état à la valeur passée en paramètre. Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique. Retourne -2 si la commande n’est pas historisée

Dans ce scénario la fonction nous dit depuis combien de temps s’est écoulé depuis que mon interrupteur est passé sur 1

lastChangeStateDuration(#[Lumière ines][Interrupteur ines ][Etat gauche]#,1)

4.2.5 Last state duration

lastStateDuration(commande,valeur) : Donne la durée en secondes pendant laquelle l’équipement a dernièrement eu la valeur choisie. Retourne -1 si aucun historique n’existe ou si la valeur n’existe pas dans l’historique. Retourne -2 si la commande n’est pas historisée

Avec cette fonction je peux savoir dans cet exemple combien de temps ma lumière a été allumée

lastStateDuration(#[Lumière ines][Interrupteur ines ][Etat gauche]#,1)

4.3 statistics

statistics(commande,calcul,période) et statisticsBetween(commande,calcul,start,end) : Donnent le résultat de différents calculs statistiques (sum, count, std, variance, avg, min, max) sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP) :

par exemple statistics(#[Jardin][Temperature VNI][Temperature]#,max,Last year)

Cela me donne la température max de ma sonde de VMI dans le jardin sur la dernière année. Si je remplace max par Avg cela me donne une moyenne… je peux faire une somme, le nombre, les variations, le minimum, etc.

On peut par exemple l’appliqué pour avoir une idée de sa consommation journalière

Cela me donne ma moyenne de consommation journalière

On peut l’utiliser par exemple pour calculer la somme de consommation d’un equipement sur une journée

par exemple statistics(#[Cellier][Chauffe Eau][Puissance]#,sum,1d)

4.4 Tendances

tendance(commande,période,seuil) : Donne la tendance de la commande sur la période (period=[month,day,hour,min] ou expression PHP)

Renvoi -1 si celle-ci est à la baisse, 0 si elle est égale et +1 si elle augmente

Dans ce scénario cela me donne la tendance de ma température sur les deux dernières heures

Cette fonction ne marche pas toujours avec tous les équipements chez moi et donc je l’utilise peu préférant par exemple un calcul avec last between

4.5 State change

stateChanges(commande,[valeur], période) et stateChangesBetween(commande, [valeur], start, end) : Donnent le nombre de changements d’état (vers une certaine valeur si indiquée, ou au total sinon) sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP)

Cet exemple me donne le nombre de fois ou la valeur à changer depuis le dernier jour

stateChanges(#[Lumière ines][Interrupteur ines ][Etat gauche]#, Last day)

Celui ci combien de fois mas prise à été allumé depuis le dernier lundi

stateChanges(#[Lumière ines][Interrupteur ines ][Etat gauche]#,1, Last Monday)

4.6 Last between

lastBetween(commande,start,end) : Donne la dernière valeur enregistrée pour l’équipement entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP)

Dans notre cas on fera une tendance sur les 3 derniers jours pour voir si notre consommation augmente ou baisse

Dans le testeur d’expression cela nous donne

Donc ma consommation entre aujourd’hui et hier est de 31.9 et il y a 30 jours la valeur était de 27.4 donc j’ai consommé 4.5 KW supplémentaire

4.7 Max et Min between

Max et min beetween permette de calculer la valeur max ou min d’un élément entre deux périodes

Moi, je veux voir l’écart d’humidité de ma salle de bain sur une journée

maxBetween(#[Salle de bain parentale][VMILINK-810018d5SDB][Humidité]#, now – 7 days, now) – minBetween(#[Salle de bain parentale][VMILINK-810018d5SDB][Humidité]#, now – 7 days, now)

Il y a donc un variation de 43.3 pourcent d’humidité dans la journée

4.8 Variable

variable(mavariable,valeur par défaut) : Récupère la valeur d’une variable ou de la valeur souhaitée par défaut :

Dans ce cas la valeur renvoyé est 1, car c’est le score de gryffondor, si la variable avait été vide il aurait été de 0, car c’est ma valeur souhaitée par défaut

4.9 Scenario

scenario(scenario) : Renvoie le statut du scénario. 1 en cours, 0 si arrêté et -1 si désactivé, -2 si le scénario n’existe pas et -3 si l’état n’est pas cohérent. Pour avoir le nom “humain” du scénario, vous pouvez utiliser le bouton dédié à droite de la recherche de scénario.

Dans mon exemple je veux savoir si le scénario est actif (en cours ou arrêté)pour exécuter l’action qui me donne mon temps de chauffage

Il faut retrouver le chemin du scénario

Et si t’es une grosse faignasse comme moi :

Il suffit de déclencher le scénario désiré depuis un scénario de test :

on sauvegarde et hop il apparait sur l’onglet général du scénario de test :

4.9.1 Last scenario execution

lastScenarioExecution(scenario) : Donne la durée en secondes depuis le dernier lancement du scénario :

Ici on vérifie depuis combien de temps m’as maison ne change pas de mode, si elle est sur le même mode depuis 3 jours, c’est qu’elle est en mode absent, au bout de 4 jours si je ne lui ai pas indiqué que je partais en vacances elle le fait automatiquement

lastScenarioExecution([Attitude Maison][Scénarios][Changement de mode]) > 259200

4.11 Collect Date

collectDate(cmd,[format]) : Renvoie la date de la dernière donnée pour la commande donnée en paramètre, le 2ème paramètre optionnel permet de spécifier le format de retour (détails ici). Un retour de -1 signifie que la commande est introuvable et -2 que la commande n’est pas de type info

Dans cet exemple je regarde quand ma commande a été mis a jour

4.12.Eq Enable

eqEnable(equipement) : Renvoie l’état de l’équipement. -2 si l’équipement est introuvable, 1 si l’équipement est actif et 0 s’il est inactif

Si je veux savoir si mon chauffage est actif pour lancer un scénario qui me donne ma consommation de chauffage journalière

4.13 Tag

tag(montag,[defaut]) : Permet de récupérer la valeur d’un tag ou la valeur par défaut si il n’existe pas

Pour cela je vous laisse voir l’article sur les tags

4.14 Name

name(type,commande) : Permet de récupérer le nom de la commande, de l’équipement ou de l’objet. Type vaut soit cmd, eqLogic ou object.

Bon celui la je n’ai jamais trouvé l’utilité

4.15 Last communication

lastCommunication(equipment,[format]) : Renvoie la date de la dernière communication pour l’équipement donnée en paramètre, le 2ème paramètre optionnel permet de spécifier le format de retour (détails ici). Un retour de -1 signifie que l’équipment est introuvable.

Dans cet exemple on voit que mon thermomètre du salon à communiquer pour la dernière fois aujourd’hui a 19h10

5. Fonction Mathématiques

5.1 random

  • rand(1,10) : Donne un nombre aléatoire de 1 à 10.
  • randText(texte1;texte2;texte…​..) : Permet de retourner un des textes aléatoirement (séparer les texte par un ; ). Il n’y a pas de limite dans le nombre de texte.

La fonction random rand et rand ont déjà été traité dans l’article de la love machine

5.1.2 random color

randomColor(min,max) : Donne une couleur aléatoire comprise entre 2 bornes ( 0 => rouge, 50 => vert, 100 => bleu).

Cette fonction est sympa pour changer de couleur des leds avec un code hexa

par exemple :

5.2 Trigger

5.2.1 Trigger(commande)

trigger(commande) : Permet de connaître le déclencheur du scénario ou de savoir si c’est bien la commande passée en paramètre qui a déclenché le scénario.

Dans ce cas précis je vérifie si c’est bien mon interrupteur qui déclenche mon scénario

5.2.2 triggerValue

triggerValue(commande) : Permet de connaître la valeur du déclencheur du scénario.

Mon déclencheur est le thermomètre de ma chambre

Du coup je peux savoir à quelle valeur le scénario a été déclenché

5.3 Round

round(valeur,[decimal]) : Donne un arrondi au-dessus, [decimal] nombre de décimales après la virgule.

Par exemple si vous avez un thermomètre qui vous donne trop d’information et que vous voulez juste la valeur arrondie a une décimal

Mo, thermomètre affiche 21.98

round(#[Température chambre][Temperature haut chambre][Température]#,2) donne :

round(#[Température chambre][Temperature haut chambre][Température]#,2) donne :

5.4 Odd

odd(valeur) : Permet de savoir si un nombre est impair ou non. Renvoie 1 si impair 0 sinon.

Dans l’exemple je vérifie avec la date du jour, (nous étions le 12) si nous sommes bien un jour pair

5.5 Median

median(commande1,commande2…​.commandeN) : Renvoie la médiane des valeurs.

J’aime bien cette fonction notamment pour avoir une médiane de luminosité ou comme dans l’extrait de température

Mes températures du bas sont celles-ci :

Ma fonction mediane me donne :

5.6Time

5.6.1 time_op

time_op(time,value) : Permet de faire des opérations sur le temps, avec time=temps (ex : 1530) et value=valeur à ajouter ou à soustraire en minutes.

Certainement la fonction la plus importante dans ma domotique notamment pour la gestion de mes volets

Dans cet exemple on va prendre l’arrosage de mon jardin, le time op me permet de déclencher l’arrosage 60 minutes avant le lever du soleil et 30 minutes après que celui-ci ce soit coucher :

5.6.2 Time between

time_between(time,start,end) : Permet de tester si un temps est entre deux valeurs avec time=temps (ex : 1530), start=tempsend=temps. Les valeurs start et end peuvent être à cheval sur minuit.

Je n’avais jamais pris le temps de tester cette fonction avant ce tuto et pourtant il remplace allègrement l’utilisation de deux time >= X et time <=X

il est 22h15 au moment du test

5.6.3 time diff

time_diff(date1,date1[,format]) : Permet de connaître la différence entre 2 dates (les dates doivent être au format AAAA/MM/JJ HH:MM:SS). Par défaut (si vous ne mettez rien pour format), la méthode retourne le nombre total de jours. Vous pouvez lui demander en secondes (s), minutes (m), heures (h). Exemple en secondes time_diff(2018-02-02 14:55:00,2018-02-25 14:55:00,s)

Dans cet exemple cela m’indique le nombre de jours avant Noël !

Fonctions,PHP, Scénario domotique Jeedom

5.6.4 Formattime

formatTime(time) : Permet de formater le retour d’une chaine #time#.

Un classique et indispensable pour transformer une heure en format HHMM et HH h MM

Fonctions,PHP, Scénario domotique Jeedom

5.6.5 Floor

floor(time/60) : Permet de convertir des secondes en minutes, ou des minutes en heures (floor(time/3600) pour des secondes en heures)

On peut simplement diviser ces secondes en minutes, mais les résultats sont approximatifs (130/60 =2.16) avec floor on est plus adapté floor(130/60) =2

6. Divers Fonctions PHP

6.1 Gmdate

gmdate — Formate une date/heure GMT/CUT

A l’usage cela permet de savoir combien d’heure ou de jour représente tant de minute

Par exemple je m’en sers dans mon bilan de chauffage journalier

Fonctions php domotique Jeedom
Fonctions php domotique Jeedom

Voici quelques exemples :

gmdate(‘G\\hi’,3800) : vous donne le resultat en heure et minutes : 1h03

gmdate(‘G\hi\ms\s’,3800) vous donne le resultat heure , minute et secondes : 1h03m20s

gmdate(‘z\jG\hi\ms\s’,100500) vous donne le resultat jour, heure , minute et secondes : 1j3h55m00s

6.2 Substr

substr — Retourne un segment de chaîne

A l’usage cela permet de supprimer des caractères pour par exemple enlever des lignes avant ou après une info pour pouvoir l’exploiter

j’en ai déjà parlé dans la tuto tasker pour récupérer les info d’un sms de mon camping car

Prenons un exemple concret :

je pars de la commande « Loic de youdom ! »

si je veux garder que le point d’exclamation

je demande de garder la phrase à partir du 15ᵉ caractère (les espaces sont compté !!!) :

substr(« Loic de youdom ! », 15)

je peux aussi garder le premier caractère en partant de la fin :

substr(« Loic de youdom ! », -1)

Si je veux garder youdom !

substr(« Loic de youdom ! », 8) donc je garde a partir du 8 eme caractère en partant du debut

Je veux garder a partir du 8 eme caractère en partant de la fin

substr(« Loic de youdom ! »,-8)

Si je veux garder juste loic

Je n’enlève rien au début d’où le 0, et j’enlève les 12 derniers caractères en partant de la fin

substr(« Loic de youdom ! », 0,-12)

Si je veux garder juste le de

J’enlève les 5 premiers caractères en partant du début et les 9 derniers en partant de la fin

substr(« Loic de youdom ! »,5, -9)

6.3 Str replace

str_replace — Remplace toutes les occurrences dans une chaîne

par exemple je veux remplacer le i de loic de youdom par rien

str_replace(‘i’, »,Loic de youdom !) : attention il s’agit de deux apostrophes l’une à côté de l’autre et pas d’un guillemet !!! Cela donne Loc de youdom !

si je veux remplacer le i par un m

str_replace(‘i’,’m’,Loic de youdom !) donne Lomc de youdom !

Comme je l’ai dit il remplace toutes les occurrences donc

Si j’utilise

str_replace(‘o’,’m’,Loic de youdom) cela donne Lmic de ymudmm

En espérant que vous aurez survécu à cet article plutôt dense !

N’oubliez pas la vie est une fete

Loïc

Pour en parler :

Loïc phoenix castillo

Passionné par informatique dès mon plus jeune âge, j'ai arrêté à mes 21 ans pour me consacrer à mes études d'infirmier et faire la fête. Maintenant père de famille, je me réinvestis dans la domotique ! Bref le kif ! Rédacteur en chef de Youdom