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.
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.
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) )
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
que tu peut cocher ainsi sur un widget tu pourra faire apparaître le temps écouler depuis le derniers changement d’une commande.
exemple :
voilà il y a bien sur plein d’autres méthodes …
Bonne journée
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.
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 …
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
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.
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.
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.