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
- 1.0 les déclencheurs
- 2. Les fonctions de comparaisons
- 3. Les Tags
- 4. Les fonctions de calculs
- 5. Fonction Mathématiques
- 6. Divers Fonctions PHP
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
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 :
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
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
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
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 utilisertrigger()
) : 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
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
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
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)
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 :
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=temps
, end=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
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 !
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
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
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 :