Utilisation de l'heure dans un scénario

durationBetween refuse de calculer, cf copies d’ecran au dessus

Pas vu de copie d’écran avec durationBetween dans un bloc code de scénario.

non, il n’y en a pas, puisque je n’arrive pas à l’utiliser dans un bloc code… Je calcule ma variable date formatée dans un bloc code, et j’essaye de l’utiliser apres.
Mais si tu sais utiliser durationBetween dans un bloc code, je suis preneur !

durationBetween est dans la classe scenarioExpression

Sans scenarioExpression:: il y a une erreur dans le log d’exec du scénario:

[2020-07-01 18:43:54][SCENARIO] Call to undefined function durationBetween()

C’est bien ce que j’essaye de faire, mais mon resultat reste desespérément vide…
chez toi, le $duree801 est bien valué ?

Non pas encore parce que ma commande n’était pas historisée.
J’ai cette erreur dans le log d’exécution du scénario:

[2020-07-01 18:57:25][SCENARIO] Call to a member function getDatetime() on null

ca c’est parceque tu as historisé mais pas encore de valeur.
Pour forcer une valeur sans attendre qu’il y ai un changement, tu peux aller dans les parametres avancés de la commande, passer la gestion de repetition de valeur sur toujours, ensuite rafraichir ton objet meteo. ca va forcer une premiere valeur.
Apres, tu peux remettre la gestion de repetition de valeur par defaut.

En créant une entrée dans la table history, la variable Duree801 est créée:
image
et se met à jour quand j’exécute le scénario:
image
Donc pas de souci pour mettre scenarioExpression::durationBetween dans un bloc code

Je viens de trouver, je suis un boulet ! :sweat_smile:
Depuis tout à l’heure, je n’avais pas pris la bonne commande… Maintenant ça fonctionne. Je posterai le code complet pour ceux que ça interesse.
En tout cas, merci !

1 « J'aime »

Et voila :

// on recupere les heures de lever et coucher du soleil au format jeedom (614 pour 6h14)
$leverSoleil = cmd::byString('#[Ma maison][Meteo][Lever du soleil]#')->execCmd();
$coucherSoleil = cmd::byString('#[Ma maison][Meteo][Coucher du soleil]#')->execCmd();

// on formate ces heures au format Y-m-d H:i:s
$heuresLeverSoleil = round($leverSoleil / 100, 0);
$minutesLeverSoleil = $leverSoleil - ($heuresLeverSoleil*100);
$dateHeureLeverSoleilFormatee = date("Y-m-d H:i:s", mktime($heuresLeverSoleil, $minutesLeverSoleil, 0, date("m"), date("d"), date("Y")));

$heuresCoucherSoleil = round($coucherSoleil / 100, 0);
$minutesCoucherSoleil = $coucherSoleil - ($heuresCoucherSoleil*100);
$dateHeureCoucherSoleilFormatee = date("Y-m-d H:i:s", mktime($heuresCoucherSoleil, $minutesCoucherSoleil, 0, date("m"), date("d"), date("Y")));

// on compte le nombre de minute ou le soleil est lever
$nbMinutes = floor((mktime() - mktime($heuresLeverSoleil, $minutesLeverSoleil, 0, date("m"), date("d"), date("Y"))) / 60);

// on compte le nombre de minutes dans chaque plage de %age nuageux
$nbMinutes800 = scenarioExpression::durationBetween("#[Ma maison][Meteo][Numéro condition]#",800,$dateHeureLeverSoleilFormatee,"Now"); // nuages entre 0 et 11% du ciel selon la documentation de l'API : on retiendra 94.5% d'ensoleillement (100 - (11 - 0) / 2)
$nbMinutes801 = scenarioExpression::durationBetween("#[Ma maison][Meteo][Numéro condition]#",801,$dateHeureLeverSoleilFormatee,"Now"); // nuages entre 11 et 25% du ciel selon la documentation de l'API : on retiendra 82% d'ensoleillement (100 - (25 - 11) / 2 - 11)
$nbMinutes802 = scenarioExpression::durationBetween("#[Ma maison][Meteo][Numéro condition]#",802,$dateHeureLeverSoleilFormatee,"Now"); // nuages entre 25 et 50% du ciel selon la documentation de l'API : on retiendra 62.5% d'ensoleillement (100 - (50 - 25) / 2 - 25)
$nbMinutes803 = scenarioExpression::durationBetween("#[Ma maison][Meteo][Numéro condition]#",803,$dateHeureLeverSoleilFormatee,"Now"); // nuages entre 51 et 84% du ciel selon la documentation de l'API : on retiendra 32.5% d'ensoleillement (100 - (84 - 51) / 2 - 51)
$nbMinutes804 = scenarioExpression::durationBetween("#[Ma maison][Meteo][Numéro condition]#",804,$dateHeureLeverSoleilFormatee,"Now"); // nuages entre 85 et 100% du ciel selon la documentation de l'API : on retiendra 7.5% d'ensoleillement (100 - (100 - 85) / 2 - 85)

// On utilise le %age d'ensoleillement donné par l'api pour estimer un %age d'ensoleillement en fonction de la durée de la condition
$pourcentSoleil = ($nbMinutes800 / $nbMinutes) * 94.5;
$pourcentSoleil += ($nbMinutes801 / $nbMinutes) * 82;
$pourcentSoleil += ($nbMinutes802 / $nbMinutes) * 62.5;
$pourcentSoleil += ($nbMinutes803 / $nbMinutes) * 32.5;
$pourcentSoleil += ($nbMinutes804 / $nbMinutes) * 7.5;
$pourcentSoleil = round($pourcentSoleil, 2);

cmd::byString('#[Jardin][Sonde jardin][ensoleillement journalier]#')->event($pourcentSoleil);

Ce bloc code mis dans un scénario appelé régulièrement (10 minutes chez moi) va calculer tout au long de la journée le %age moyen d’ensoleillement de cette journée.

1 « J'aime »
  • Première étape transformation de 720 en 7h20 avec formatTime pour pas s’embêter avec les unités/heures
  • Deuxième étape remplacer le h par un :
  • Troisième étape concaténer un :00 à la fin de la chaîne précédente…

Ça doit tenir sur 1 ligne… Même pas besoin d’un bloc code. Suis sur le téléphone donc pas simple de donner plus de détails

c’est ta seconde étape, je vois pas comment la faire sans bloc code. De plus, ça ne résoud pas le problème de l’expression non analysée par Jeedom.
Donc je penses que la solution du bloc code est la meilleure.

Rhô… Tu es développeur normalement… => le remplacement c’est une fonction php str_replace()

C’est vrai, j’aime pas mettre directement du php hors bloc code, j’en oublie qu’on peut… Mais ça fonctionne pas toujours bien.

J’utilise ce genre de trucs souvent, pas eu de souci pour la prise par jeedom

c’est les imbrications de fonction ou il a du mal il me semble

par exemple ça

1 « J'aime »

Faut d’abord vérifier qu’individuellement les éléments sont corrects. Ensuite il faut utiliser la fonction durationBetween avec les valeurs en dur issues des éléments. Et seulement au final faire le test ci dessus

C’est ce qui a été fait au dessus.

Personnellement, je n’utilise plus le testeur d’expression en raison du langage qui n’est pas défini.

  • Chaine de caractères sans délimiteur.
  • Virgule uniquement pour séparer les arguments (explode fait dans le code)
  • Résultats dépendant des espaces à l’intérieur de l’expression

Essayez d’évaluer strlen("to,to")
image
Je passe le plus possible par un bloc code où le language est php

Pas vu les tests au dessus… =>téléphone…
Si le testeur est pas bon (ouais il y a des anomalies et c’est pas normal mais ça changera pas vu les retours de Loïc) on peut toujours passer par un log… Un bloc si