Pb de caractère diff 2 dates

Hello,

Je tente de faire la différence de deux dates.

Dans les logs:

[2024-09-17 21:04:19][SCENARIO] - Exécution du sous-élément de type [condition] : if time_diff(date('j-m-Y H:i'), collectDate(#[Système][VMC][Vitesse actuelle]#, 'j-m-Y H:i') , j) <1
[2024-09-17 21:04:19][SCENARIO] DateTime::__construct(): Failed to parse time string ("17-09-2024 21:04") at position 0 ("): Unexpected character
[2024-09-17 21:04:19][SCENARIO] - Exécution du sous-élément de type [action] : else

Je n’arrive pas à mettre le doigt sur le l’erreur de syntaxe.

Merci

Salut

Avez-vous vu ce post ?

Antoine

Merci @Tonio16
Oui j’avais vu ce post et donc je me suis mis au meme format:

time_diff(date('Y-m-d H:i:s'), collectDate(#[Système][VMC][Vitesse actuelle]#, 'Y-m-d H:i:s') , j) <1

Mais toujours la meme erreur.

Mon collecte date parait bon:
Exécution du sous-élément de type [condition] : if collectDate(#[Système][VMC][Vitesse actuelle]#, 'Y-m-d Hs')  <1
[2024-09-18 09:41:52][SCENARIO] Evaluation de la condition : [" '2024-09-18 09:41:29'"  <1] = Vrai

Remplacer
collectDate(#[Système][VMC][Vitesse actuelle]#, 'Y-m-d H:i:s')
par
collectDate(#[Système][VMC][Vitesse actuelle]#,Y-m-d H:i:s)

Ce qui donne :
time_diff(date('Y-m-d H:i:s'), collectDate(#[Système][VMC][Vitesse actuelle]#,Y-m-d H:i:s) , j) <1

Merci.

J’ai toujours l’erreur en prenant ta suggestion:

- Exécution du sous-élément de type [condition] : if time_diff(date('Y-m-d Hs'), collectDate(#[Système][VMC][Vitesse actuelle]#,Y-m-d Hs) , j) <1
[2024-09-18 17:04:54][SCENARIO] DateTime::__construct(): Failed to parse time string ("2024-09-18 17:04:54") at position 0 ("): Unexpected character

Ok autre approche.
Si j’ai bien compris, tu souhaites savoir si l’age de la dernière valeur de ta commande #[Système][VMC][Vitesse actuelle]# est inférieur à un jour ?

Si c’est bien ce que tu veux, alors tu peux faire comme ça :

SI age(#[Système][VMC][Vitesse actuelle]#) < 86400

86400 étant le nombre de secondes en 24 heures.

oui en effet. J’ai mis 1 pour l’exemple mais c’est un peu plus compliqué, du coup il me faudrait la différence :slight_smile:

je pense qu’il doit exister une fonction scenario qui fait déjà ce dont vous envisagez (age, lastBetween, valueDate etc), au lieu de passer par time_diff qui n’est probablement utilisable que dans un bloc code.
Mais on aurait besoin d’infos sur ce que vous voulez vraiment faire pour pouvoir vous aider.

(Connaître la date du dernier changement d’état de la vmc ? depuis quand la VMC n’a pas changé de vitesse ? savoir si sa valeur a bien été collectée durant les X dernières minutes ? etc)

bonjour @Dreaky

Désolé pour le temps de réponse.

L’idée est de monitorer le délai entre le dernier changement de vitesse de la VMC et si celui ci est supérieur à 1j je mets dans le design un widget avec une couleur verte, si >2j meme widget mais avec couleur orange et si >3j en rouge.

Comme cette approche:

image

Du coup j’ai besoin de connaitre l’écart. :slight_smile:

Essaye avec :

SI stateDuration(#[Système][VMC][Vitesse actuelle]#) > 259200 ALORS
         Widget en rouge (> 3 jours)

SI stateDuration(#[Système][VMC][Vitesse actuelle]#) > 172800 ALORS
        Widget en orange (> 2 jours)

SI stateDuration(#[Système][VMC][Vitesse actuelle]#) > 86400 ALORS
        Widget en vert (> 1 jours)

La commande stateDuration retourne le nombre de secondes depuis le dernier changement de valeur de la commande passée en paramètre. Donc par exemple 172800 est le nombre de secondes pour 48h.

Merci en effet cela fonctionne.

Le seul hic c’est que j’ai 10 équipements, donc x3 cela fait lourd.
Si j’arrive à avoir la différence entre la date du dernier event et la date actuelle j’ai directement une valeur et ensuite pas besoin de ‹ if › le widget interprète directement:

image

La commande stateDuration est en soit déjà une différence (mais exprimé en secondes, et pas en jours).

Mon exemple des trois IF était un exemple. Pour avoir une différence en jour, il suffit de diviser le nombre de seconde de la commande par 86400 (nombre de seconde par jour). On aura un chiffre à virgule, correspondant à la différence du nombre de jours (donc si on récupère 1.33, ça veut dire qu’il s’est passé 1,33 jours (soit à peu près 1 jour et 8h) depuis le dernier changement de valeur).

je viens de comprendre, je tente qq chose et je te redis. Merci

Bonjour,

Il existe bien un soucis avec time_diff…

@Loic je me permet :wink:

Core 4.4.17 et 4.5

Lors de l’utilisation d’une fonction dans time_diff celle-ci est simple quoté :
0008|[2024-09-24 19:01:27] INFO : d1 = '2024-09-24 16:56:16'
même en plus double quoté (si expression::autoQuote est coché) :
0002|[2024-09-24 19:00:40] INFO : d1 = "'2024-09-24 16:56:16'"

Ne faudrait il pas supprimer les doubles et simples quotes avant d’envoyer dans le DateTime ?
ex :
$d1 = str_replace('"', '', str_replace('\'', '', self::setTags($_date1)));
$d2 = str_replace('"', '', str_replace('\'', '', self::setTags($_date2)));

Si on peut mais normalement php sait gérer avec la fonction date c’est bizarre que ça marche pas

En faite je doute qu’il sait géré ceci, pour schématisé c’est comme si il recevait :
$d1 = '\'2024-09-24 16:56:16\'';
ou
$d1 = '"\'2024-09-24 16:56:16\'"'; (autoQuote)

Effectivement la faut tout remplacer je regarderais demain

1 « J'aime »

@rjcb pour contourner tu peut faire comme ceci :

garde ton 1er élément :


mais remplace la valeur par
collectDate(#[Système][VMC][Vitesse actuelle]#, 'Y-m-d H:i:s')

par contre est-ce nécessaire que ce soit une variable ? un tag suffirait !


ajoute un nouveau tag (TimestampDiff) en dessous :
valeur : strtotime(date('Y-m-d H:i:s')) - strtotime(tag(DetectionVMC))


évidemment si tu as choisit de garder DetectionVMC en variable remplace tag par variable


Puis encore un dernier tag (DiffJour) en dessous :
valeur : floor(tag(TimestampDiff) / 86400)


Il te restera plus qu’a faire la condition sur ce dernier tag :
tag(DiffJour) < 1

image

Bonjour,

J’ai ouvert une issue pour le soucis [BUG] Issue with time diff · Issue #2915 · jeedom/core (github.com) et fait la correction, si vous pouviez valider (correction en alpha seulement).

je teste cela ce week end et je te tiens au jus