Utilisation de l'heure dans un scénario

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

Le bloc SI utilise la meme syntaxe que le Testeur d’expression. => Pas de solution pour des expressions un peu complexes comme celle avec durationBetween de @scanab au dessus.

Plutôt que de passer par la recup des lever et coucher de soleil dans une commande de Jeedom, vous devriez aller voir du coté de la fonction php date_sun_info où avec les latitude et longitude, vous avez directement les timestamps des heures de lever et coucher du soleil.
https://www.php.net/manual/fr/function.date-sun-info.php

mktime avec uniquement les 2 arguments heure et minute fonctionne sans être lié au 1 juillet 2020.
https://www.php.net/manual/fr/function.mktime.php

Dit dés le départ !!!

Je présume que stateChangesBetween est dans la même classe.

Avec

$toto = scenarioExpression::stateChangesBetween("#[ma][commande][infoHistorisée]#","toto","yesterday","now");

J’ai une erreur:

 ERREUR PHP: [MySQL] Error code : 42S22 (1054). Unknown column 'toto' in 'where clause'  : SELECT count(*) as changes
FROM (SELECT t1.*
FROM (
SELECT *
FROM history
WHERE cmd_id=:cmd_id AND `datetime`>="2020-07-01 00:00:00" AND `datetime`<="2020-07-02 00:56:42"
UNION ALL
SELECT *
FROM historyArch
WHERE cmd_id=:cmd_id AND `datetime`>="2020-07-01 00:00:00" AND `datetime`<="2020-07-02 00:56:42"
) as t1
WHERE cmd_id=:cmd_id AND `datetime`>="2020-07-01 00:00:00" AND `datetime`<="2020-07-02 00:56:42"
) as t1
where  value = toto à la ligne 101 !

Il faut que la requête SQL soit de la forme where value = "toto"

La syntaxe est donc :

$toto = scenarioExpression::stateChangesBetween("#[ma][commande][infoHistorisée]#",'"toto"',"today","now");
1 « J'aime »

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