Durée depuis dernier changement d'état

Bonjour,

J’utilise un shelly 1 pour piloter ma VMC, j’ai des scénarios qui tournent et un interrupteur zigbee pour l’activer du RDC j’ai tout de même conservé à l’étage un interrupteur classique (un bon vieux legrand) pour pouvoir le démarrer ou arrêter manuellement.

Tout cela fonctionne correctement.

Etant un peu perfectionniste je souhaiterai vérifier lorsque le moteur en manuellement et recevoir une alerte s’il tourne depuis plus de 3h par exemple (en cas de fausse manip).

Pour cela je récupére l’info du shelly de son dernier changement d’état (fonctionne sous deconz), par contre je n’arrive pa exploiter l’info renvoyée qui est sous la forme de :
Résultat de la commande : 2021-08-25T21:31:17
Comment en extraire l’heure 21h31mn. pour la comparer avec l’heure actuelle.

Merci

Bonsoir,

As-tu regardé plutôt du côté des fonctions adaptées à la récupération d’une durée pendant laquelle une commande a une certaine valeur ?

duration(commande, valeur, période)
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).

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

Bonsoir @FredD

ou tu peut aussi traduire ta date/heure en timestamp soustraire le timestamp de l’heure actuel
pour enfin la reconvertir en heures minutes secondes par exemple:
(Timestamp est : le nombre de Secondes depuis l’époque Unix (1er Janvier 1970, 0h00 00s GMT) )

date('H:i:s',strtotime('2021-08-25T21:31:17')-strtotime(now))

te restera plus qu’a remplacer par l’expression de ta commande


date('H:i:s',strtotime('#[objet][équipement][commande]#')-strtotime(now))

et a choisir parmis les differents format ce qui t’interesse comme dans l’exemple
ou j’ai mis

H:i:s
d 	Jour du mois, sur deux chiffres (avec un zéro initial) 	01 à 31
D 	Jour de la semaine, en trois lettres (et en anglais - par défaut : en anglais, ou sinon, dans la langue locale du serveur) 	Mon à Sun
j 	Jour du mois sans les zéros initiaux 	1 à 31
l ('L' minuscule) 	Jour de la semaine, textuel, version longue, en anglais 	Sunday à Saturday
N 	Représentation numérique ISO-8601 du jour de la semaine 	1 (pour Lundi) à 7 (pour Dimanche)
S 	Suffixe ordinal d'un nombre pour le jour du mois, en anglais, sur deux lettres 	st, nd, rd ou th. Fonctionne bien avec j
w 	Jour de la semaine au format numérique 	0 (pour dimanche) à 6 (pour samedi)
z 	Jour de l'année 	0 à 365
Semaine 	--- 	---
W 	Numéro de semaine dans l'année ISO-8601, les semaines commencent le lundi 	Exemple : 42 (la 42ème semaine de l'année)
Mois 	--- 	---
F 	Mois, textuel, version longue; en anglais, comme January ou December 	January à December
m 	Mois au format numérique, avec zéros initiaux 	01 à 12
M 	Mois, en trois lettres, en anglais 	Jan à Dec
n 	Mois sans les zéros initiaux 	1 à 12
t 	Nombre de jours dans le mois 	28 à 31
Année 	--- 	---
L 	Est ce que l'année est bissextile 	1 si bissextile, 0 sinon.
o 	La numérotation de semaine dans l'année ISO-8601. C'est la même valeur que Y, excepté si le numéro de la semaine ISO (W) appartient à l'année précédente ou suivante, cette année sera utilisée à la place. 	Exemples : 1999 ou 2003
Y 	Année sur 4 chiffres 	Exemples : 1999 ou 2003
y 	Année sur 2 chiffres 	Exemples : 99 ou 03
Heure 	--- 	---
a 	Ante meridiem et Post meridiem en minuscules 	am ou pm
A 	Ante meridiem et Post meridiem en majuscules 	AM ou PM
B 	Heure Internet Swatch 	000 à 999
g 	Heure, au format 12h, sans les zéros initiaux 	1 à 12
G 	Heure, au format 24h, sans les zéros initiaux 	0 à 23
h 	Heure, au format 12h, avec les zéros initiaux 	01 à 12
H 	Heure, au format 24h, avec les zéros initiaux 	00 à 23
i 	Minutes avec les zéros initiaux 	00 à 59
s 	Secondes avec zéros initiaux 	00 à 59
u 	Microsecondes. Notez que la fonction date() génèrera toujours 000000 vu qu'elle prend un paramètre de type entier, alors que la méthode DateTime::format() supporte les microsecondes si DateTime a été créée avec des microsecondes. 	Exemple : 654321
v 	Millisecondes. Même note que pour u. 	Exemple: 654
Fuseau horaire 	--- 	---
e 	L'identifiant du fuseau horaire 	Exemples : UTC, GMT, Atlantic/Azores
I (i majuscule) 	L'heure d'été est activée ou pas 	1 si oui, 0 sinon.
O 	Différence d'heures avec l'heure de Greenwich (GMT), sans deux-points entre les heures et les minutes 	Exemple : +0200
P 	Différence avec l'heure Greenwich (GMT) avec un deux-points entre les heures et les minutes 	Exemple : +02:00
p 	Identique à P, mais retourne Z au lieu de +00:00 	Exemple : +02:00
T 	Abréviation du fuseau horaire 	Exemples : EST, MDT ...
Z 	Décalage horaire en secondes. Le décalage des zones à l'ouest de la zone UTC est négatif, et à l'est, il est positif. 	-43200 à 50400
Date et Heure complète 	--- 	---
c 	Date au format ISO 8601 	2004-02-12T15:19:21+00:00
r 	Format de date » RFC 2822 	Exemple : Thu, 21 Dec 2000 16:01:070200
U 	Secondes depuis l'époque Unix (1er Janvier 1970, 0h00 00s GMT) 	Voir aussi time()

Ça c’est pour le Fun car dans Jeedom
dans l’outil widget du core tu a aussi une option
Capture d’écran du 2021-08-25 23-43-19
que tu peut cocher ainsi sur un widget tu pourra faire apparaître le temps écouler depuis le derniers changement d’une commande.

exemple :

cpt

voilà il y a bien sur plein d’autres méthodes …
Bonne journée

1 « J'aime »

Je m’incruste dans l’échange.
Tu pourrais nous dire comment on accède à ce core @olive ? Merci

C’est dans l’outil « Widget » intégré à Jeedom. Il suffit de cocher la case « Time widget »,
- c’est dans la partie Remplacement (là ou vous choisissez vos icones).
Cela ajoute une notion de temps sur le Widget.

1 « J'aime »

Oui bien sur il te faut faire un widget en passant par outils widget :
puis appliqué le widget a une commande

cequi peut - être difficile a lire :
<span style = "color:orange;font-size: 20px;"> #value#</span><span style = "color:orange;font-size: 15px;"> #unite#</span>

1 « J'aime »

Merci à vous 2 @olive et @Fabrice :+1: :+1:

Bonjour @FredD
Si ta demande, c’est de recevoir une alerte en cas de fonctionnement pendant plus de XX h,
le plus simple me semble de paramétrer une action sur valeur depuis plus de XXXmin, ceci est accessible sur ta commande état de ton shelly, onglet configuration (je ne sais pas si tu utilises un shelly 1 (on/off) ou 2.5 (off/vitesse 1/vitesse 2).

exemple de mon coté pour ma pompe de piscine (shelly1), où j’envoie un message si elle n’a pas tournée depuis plus de 1440min (si valeur == 0 depuis plus de 1440 min, alors …

tu dois pouvoir simplement faire ceci avec ta VMC, si valeur == 1 depuis plus de 3h (180min), alors envoyer un message

Norbert

1 « J'aime »

la commande age(commande) est très pratique et ne nécessite pas l’historisation de la commande.

a mettre dans une commande info/binaire, dans un virtuel, puis dans le paramètre de cette sommande, si == 1 pendant plus de 180mn, alors mettre les actions désirées

1 « J'aime »

Celle du widget non plus (pas d’histo)

le widget gère seulement l’affichage, c’est pas lui qui va lancer des actions si la commande passe à 1 pendant 3h ?

Le widget n’y est pour rien il affiche c’est tout le reste est dans la configuration de la commande


ou dans un scenario

oui, bien d’accord, c’est pour ca que je comprenais pas ton message, il faut bien une commande qui va donner la durée du dernier état, d’où l’intérêt de la commande « age » qui ne nécéssite pas l’historique comme les autres commandes

Bonjour Bison,
J’ai testé ta solution
J’ai créé une notification :
#[jMQTT][VMC Shelly1-01][Etat_Shelly1 01]#
La VMC est en manuelle depuis : lastStateDuration(#[jMQTT][VMC Shelly1-01][Etat_Shelly1 01]#,1) mn

La premiére ligne uniquement pour vérifier que la commande renvoie bien la valeur 1 : ce qui est le cas
La seconde ligne me renvoie -1 pourtant j’ai véifié il y a bien un historique

Est-ce que cette commande est repassée à 0 depuis l’activation de l’historique ? Parce que je pense que si y’a pas eu de modification ça ne fonctionne pas.

Finalement j’ai résolu en modifiant laststateduration par stateduration et j’ai le résultat voulue.

J’ai néenmoins une derniére question, pour avoir un affichage sympa je fais une division par 60 pour avoir des minutes par contre je passe par une variable, ma question est la suivante est-ilpossible de faire un calcul dans la partie message d’une notification? (à chaque fois je contourne le pb de cette façon est ce la plus adaptée??)

Merci à ngrataloup et Olive pour leurs idées je vais travailler ces pistes qui semblent prometteuses.

Merci.

Je fais la même chose que toi. La plupart du temps le calcul ne fonctionne pas dans le message et il faut donc passer par une variable.

Note au passage : utilise « tag » et non « variable » s’il n’y a pas besoin de conserver la variable en dehors du scénario

1 « J'aime »

Salut @FredD, indique plutôt mon premier post en résolution afin que ça serve aux suivant qui auraient la même demande que toi car ici l’histoire de la variable n’a pas de lien avec la demande d’origine.

A+

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.