Utilisation de l'heure dans un scénario

Tu a activé l’historique de ta commande ?

Bonjour,
L’expression est trop compliquée pour Jeedom.
Faites vos calculs en php dans un bloc code au début du scénario et définissez une variable avec le résultat du calcul.
Dans la suite du scénario, n’utilisez que cette variable

j’aimerai bien, c’est d’ailleurs comme ca que j’ai calculé ma variable. Mais jeedom refuse l’utilisation de cette variable justement…
Et je n’arrive pas à utiliser la fonction durationBetween dans le bloc code PHP

Mettre le résultat de durationBetween dans une variable ne fonctionne pas ?

oui
blabla ← ça c’est pour avoir assez de caractères por etre autoriser à poster ma reponse…

1 « J'aime »

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