[Résolu] Chiffre après virgule dans un virtuel
[Résolu] Chiffre après virgule dans un virtuel
Bonjour,
Ces 2 commandes info (je précise toute 2 numériques) d'un même virtuel devrait donner le même résultat, mais le premier est avec 1 chiffre après la virgule (5.9) et le 2ème 2 chiffres après la virgule (5.92) comme je fais des calculs sophistiqués j'ai besoin de 2 chiffres après la virgule pour les champs calculs.
je traîne cela depuis longtemps sans trouver de réponse
round(#valeur#, 1) permet de passer de 2 à 1 et cela marche mais c'est l'inverse que je veux.
quelqu'un a-t-il une réponse?
Ces 2 commandes info (je précise toute 2 numériques) d'un même virtuel devrait donner le même résultat, mais le premier est avec 1 chiffre après la virgule (5.9) et le 2ème 2 chiffres après la virgule (5.92) comme je fais des calculs sophistiqués j'ai besoin de 2 chiffres après la virgule pour les champs calculs.
je traîne cela depuis longtemps sans trouver de réponse
round(#valeur#, 1) permet de passer de 2 à 1 et cela marche mais c'est l'inverse que je veux.
quelqu'un a-t-il une réponse?
Dernière édition par yves273 le 09 sept. 2018, 10:17, édité 1 fois.
Re: Chiffre après virgule dans un virtuel
bonjour
aprés analyse c'est la commande lastBetween qui arrondi
donc soit tu duppliques dans un virtuel historisé en multipliant par 1000
pour diviser ensuite (le plug teleinfo utilise la valeur w/W),
soit tu vas dans la bdd via scenario code,
ou si tu t'y connais une modification de fichier
voici le code de mon analyse "certainement à peaufiner"
avec #[test2][string][test]#
//$dateDebut = 'today';
//$dateFin = 'now';
#[Températures et Lux][Températures Pièces de Jour][Cuisine]#
$dateDebut = 'first day of this month0:00';
$dateFin = 'first day of this month12:00';
rapidement tu as 2 history en bdd
du jour history 5h du matin ou avant historyArch
va dans la configuration jeedom
OS / DB lance la Base de données (tu prends le risque!)
et en commande exemple
select datetime, value from `history` where `cmd_id`=2326
aprés analyse c'est la commande lastBetween qui arrondi
donc soit tu duppliques dans un virtuel historisé en multipliant par 1000
pour diviser ensuite (le plug teleinfo utilise la valeur w/W),
soit tu vas dans la bdd via scenario code,
ou si tu t'y connais une modification de fichier
voici le code de mon analyse "certainement à peaufiner"
Code : Tout sélectionner
//$commande = "#[test2][string][test]#"; // Nom Jeedom de la donnée à traiter.
$commande = "#[Températures et Lux][Températures Pièces de Jour][Cuisine]#"; // Nom Jeedom de la donnée à traiter.
// $virtuel = "";
//$dateDebut = 'today';
//$dateFin = 'now';
$dateDebut = 'first day of this month0:00';
$dateFin = 'first day of this month12:00';
// Quelques prétraitements
$commande = str_replace("#", "", $commande); // Supprimer les dièses de l'ID de la commande
$dateDebutSTR = date("Y-m-d H:i:s", strtotime($dateDebut)); // Transforme les dates en littéral pour SQL (utile si on utilise
$dateFinSTR = date("Y-m-d H:i:s", strtotime($dateFin)); // les expressions PHP dans les paramètres.
$duree ="nada";
// pour test api
$value = scenarioExpression::lastBetween($commande, $dateDebut, $dateFin);
$scenario->setLog("lastBetween : $value ");
// Requête SQL pour la date de la valeur minimale
// On recherche les valeurs dans la table history
$sql = "select value from `history` where `cmd_id`=$commande and `datetime` between '$dateDebutSTR' and '$dateFinSTR'";
// et
$sql = $sql." union all ";
// aussi dans la table historyArch
$sql = $sql."select value from `historyArch` where `cmd_id`=$commande and `datetime` between '$dateDebutSTR' and '$dateFinSTR'";
// On ne garde que la première valeur
$sql = "select value as leMoment from (".$sql.") as data order by leMoment limit 1";
$scenario->setLog("SQL = $sql");
$result = DB::Prepare($sql, NULL, DB::FETCH_TYPE_ROW);
$value = $result['leMoment'];
$scenario->setLog("dans la Bdd : $value ");
//$dateDebut = 'today';
//$dateFin = 'now';
sur une periode plus longue[2018-09-08 00:28:26][SCENARIO] Start : Scenario lance manuellement.
[2018-09-08 00:28:26][SCENARIO] Exécution du sous-élément de type [action] : code
[2018-09-08 00:28:26][SCENARIO] Exécution d'un bloc code
[2018-09-08 00:28:26][SCENARIO] lastBetween : 15.1
[2018-09-08 00:28:26][SCENARIO] SQL = select value as leMoment from (select value from `history` where `cmd_id`=2326 and `datetime` between '2018-09-08 00:00:00' and '2018-09-08 00:28:26' union all select value from `historyArch` where `cmd_id`=2326 and `datetime` between '2018-09-08 00:00:00' and '2018-09-08 00:28:26') as data order by leMoment limit 1
[2018-09-08 00:28:26][SCENARIO] avec SQL : 15.11
[2018-09-08 00:28:26][SCENARIO] Fin correcte du scénario
#[Températures et Lux][Températures Pièces de Jour][Cuisine]#
$dateDebut = 'first day of this month0:00';
$dateFin = 'first day of this month12:00';
reste à mettre dans un virtuel via event ou en variable[2018-09-08 00:39:29][SCENARIO] Start : Scenario lance manuellement.
[2018-09-08 00:39:29][SCENARIO] Exécution du sous-élément de type [action] : code
[2018-09-08 00:39:29][SCENARIO] Exécution d'un bloc code
[2018-09-08 00:39:29][SCENARIO] lastBetween : 22.5
[2018-09-08 00:39:29][SCENARIO] SQL = select value as leMoment from (select value from `history` where `cmd_id`=1062 and `datetime` between '2018-09-01 00:00:00' and '2018-09-01 00:39:29' union all select value from `historyArch` where `cmd_id`=1062 and `datetime` between '2018-09-01 00:00:00' and '2018-09-01 00:39:29') as data order by leMoment limit 1
[2018-09-08 00:39:29][SCENARIO] dans la Bdd : 22.49
[2018-09-08 00:39:29][SCENARIO] Fin correcte du scénario
rapidement tu as 2 history en bdd
du jour history 5h du matin ou avant historyArch
va dans la configuration jeedom
OS / DB lance la Base de données (tu prends le risque!)
et en commande exemple
select datetime, value from `history` where `cmd_id`=2326
- Pièces jointes
-
- bdd.png (74.81 Kio) Consulté 5713 fois
Re: Chiffre après virgule dans un virtuel
Merci winhex,
Je regarde ce que je suis capable de faire.
Je regarde ce que je suis capable de faire.
Re: Chiffre après virgule dans un virtuel
Pour le moment j'ai opté pour la 1ère solution cela marche mais c'est un peu lourd.
Cela m'oblige a repenser la gestion de mes historiques, ce sera pour plus tard et avec du code peut-être...
Cela m'oblige a repenser la gestion de mes historiques, ce sera pour plus tard et avec du code peut-être...
Re: [Résolu] Chiffre après virgule dans un virtuel
pour info
entre la solution code et modif fichier core
il existe une possibilité de creation commande aussi (en natif jeedom offre cette possibilité sans doc). qui serait la plus simple pour utilisation mais pas pour la creation (jamais fait).
édit pour exemple
viewtopic.php?t=38654
doc abrégé sur cette option voir 6
https://jeedom.github.io/core/fr_FR/sce ... nchor-1-15
entre la solution code et modif fichier core
il existe une possibilité de creation commande aussi (en natif jeedom offre cette possibilité sans doc). qui serait la plus simple pour utilisation mais pas pour la creation (jamais fait).
édit pour exemple
viewtopic.php?t=38654
doc abrégé sur cette option voir 6
https://jeedom.github.io/core/fr_FR/sce ... nchor-1-15
Re: [Résolu] Chiffre après virgule dans un virtuel
tu mets 2 (au lieu de 1) à la ligne 610
configuration / OS/DB / editeur de texte / core / class / scenarioExpression.class.php
configuration / OS/DB / editeur de texte / core / class / scenarioExpression.class.php
- Pièces jointes
-
- lastBetween.png (193.16 Kio) Consulté 5655 fois
Re: [Résolu] Chiffre après virgule dans un virtuel
Merci winhex
waouh... c'est pas de mon niveau sans passer beaucoup de temps à comprendre mais j'essaierai plus tard (je pars 15 jours)
dans ta première réponse:
mon souci est le suivant et peut-être event y répondrait
j'ai bien un virtuel avec mes valeurs à 2 chiffres après la virgule, le résultat est commandé par un scénario à 0h mais toutes les 5 mn cette même valeur calculée s'historise et l'option "ne pas répéter" n'y fait rien, je ne dois pas avoir compris quelque chose.
je n'ai besoin d'historiser qu'une valeur par jour, j'ai bien lu sur un sujet ta façon d'historiser par variable (historiser la valeur de base, la stocker et calculer sur une variable sans stocker le résultat et faire des traitements complémentaire sur un historique de base réduit à un mois je crois)
moi je souhaite un historique sur une année (et comparatif sur l'année précédente) et à partir de la donnée de base et dans cas le traitement est lourd mais ça marche, cela serait plus léger de le faire avec une valeur par jour.
waouh... c'est pas de mon niveau sans passer beaucoup de temps à comprendre mais j'essaierai plus tard (je pars 15 jours)
dans ta première réponse:
tu parles de event dans plusieurs de tes réponses dans le forum mais je n'ai pas trouvé d'endroit où cela est documenté.reste à mettre dans un virtuel via event ou en variable
mon souci est le suivant et peut-être event y répondrait
j'ai bien un virtuel avec mes valeurs à 2 chiffres après la virgule, le résultat est commandé par un scénario à 0h mais toutes les 5 mn cette même valeur calculée s'historise et l'option "ne pas répéter" n'y fait rien, je ne dois pas avoir compris quelque chose.
je n'ai besoin d'historiser qu'une valeur par jour, j'ai bien lu sur un sujet ta façon d'historiser par variable (historiser la valeur de base, la stocker et calculer sur une variable sans stocker le résultat et faire des traitements complémentaire sur un historique de base réduit à un mois je crois)
moi je souhaite un historique sur une année (et comparatif sur l'année précédente) et à partir de la donnée de base et dans cas le traitement est lourd mais ça marche, cela serait plus léger de le faire avec une valeur par jour.
Re: [Résolu] Chiffre après virgule dans un virtuel
Excuse moi winhex
en première lecture je n'avais pas compris que tu avais trouvé la solution sans passer par un virtuel + scénario
je n'avais jamais utilisé cette possibilité de l'éditeur de texte d'où mon réflexe de prudence de l'inconnu.
c'est top, j'imagine qu'il faudra faire attention à chaque changement de version de jeedom?
merci si tu peux me répondre sur la question posée sur mon message précédent même si c'est un peu hors sujet.
en première lecture je n'avais pas compris que tu avais trouvé la solution sans passer par un virtuel + scénario
je n'avais jamais utilisé cette possibilité de l'éditeur de texte d'où mon réflexe de prudence de l'inconnu.
c'est top, j'imagine qu'il faudra faire attention à chaque changement de version de jeedom?
merci si tu peux me répondre sur la question posée sur mon message précédent même si c'est un peu hors sujet.
Re: [Résolu] Chiffre après virgule dans un virtuel
moi non plus c'était l'occaz de tester
j'ai fait 2 3 boulettes lors du test création de cmd
(jeedom vide par oublie de } ) j'utilisais 2 onglets (modif,test)
je pense aussic'est top, j'imagine qu'il faudra faire attention à chaque changement de version de jeedom?
pour ça que j'essayais la commande perso mais je ne suis pas encore au point (peu d'exemple)
et de reproduire "lastBetween" par une nouvelle commande ne suffit pas.
pour ton message précédent faut que je prenne le temps (tranquille) pour étayer ma reponse
Re: [Résolu] Chiffre après virgule dans un virtuel
la fonction Eventmon souci est le suivant et peut-être event y répondrait
on peut la faire en scénario code (vu que mon 1er sujet utilisé cette fonction) voir le suje code simplifié tu as des exemples
en + du scénario code se serai 2 lignes
dans un scénario action
Event / ton équipement info / valeur
dans le paramètre avancé d'une info/action
ex info :
plus petit que 2 durant 0 mn
action (écrire event) ton équipement et ton info (calcul, valeur d'une autre info une variable qui s'incremente,...)
prends un détecteur de porte
une info sans action
la pile s'arrête sur ouvert
tu fais un Event sur ta porte valeur 0
te voilà avec la porte fermé en attendant de changer la pile
l'avantage d'event de pouvoir changer la valeur sans entraîné l'action
dans l'info virtuel soit tu metsj'ai bien un virtuel avec mes valeurs à 2 chiffres après la virgule, le résultat est commandé par un scénario à 0h mais toutes les 5 mn cette même valeur calculée s'historise et l'option "ne pas répéter" n'y fait rien,
une variable ou rien
rien c'est ton scénario qui inscrit via Event
si tu mets un calcul même si celui est sur le mois dernier il sera recalculer à chaque fois que ton équipement changé d'État
sauf (sans scenario) dans le virtuel tu as un system de cron ( 1 0 * * * tous les jours à 00h01)
tu n'as pas vu le virtuel je croisj'ai bien lu sur un sujet ta façon d'historiser par variable (historiser la valeur de base, la stocker et calculer sur une variable sans stocker le résultat et faire des traitements complémentaire sur un historique de base réduit à un mois je crois)
moi je souhaite un historique sur une année (et comparatif sur l'année précédente) et à partir de la donnée de base et dans cas le traitement est lourd mais ça marche, cela serait plus léger de le faire avec une valeur par jour.
c'est les variables où calcul variable * tarif
donc cela change ou se calcul que lorsque le scénario met à jour les variables
soit 1 fois par jour
Re: [Résolu] Chiffre après virgule dans un virtuel
Merci
Je n'ai pas tout compris mais je testerai à mon retour dans 2 semaines
Je n'ai pas tout compris mais je testerai à mon retour dans 2 semaines
Re: [Résolu] Chiffre après virgule dans un virtuel
pour avoir 2 chiffres après la virgule la modification est à faire à la ligne 642 avec la version 3.3 de jeeedomtu mets 2 (au lieu de 1) à la ligne 610
configuration / OS/DB / editeur de texte / core / class / scenarioExpression.class.php
Re: [Résolu] Chiffre après virgule dans un virtuel
Bonjour,
Pour éviter de faire la modif à chaque version de Jeedom, vous pourriez copier la fonction lastBetween et la coller dans le fichier data/user.function.class.php, la renommer en par exemple MylastBetween, faire la modif de l'arrondi et appeler cette nouvelle fonction dans vos scénarios.
Cette fonctionnalité de Jeedom est décrite là: https://jeedom.github.io/core/fr_FR/sce ... nchor-1-15
Ex:
Pour éviter de faire la modif à chaque version de Jeedom, vous pourriez copier la fonction lastBetween et la coller dans le fichier data/user.function.class.php, la renommer en par exemple MylastBetween, faire la modif de l'arrondi et appeler cette nouvelle fonction dans vos scénarios.
Cette fonctionnalité de Jeedom est décrite là: https://jeedom.github.io/core/fr_FR/sce ... nchor-1-15
Ex:
Re: [Résolu] Chiffre après virgule dans un virtuel
merci jpty
c'est vrai que c'est ennuyeux de faire la modif après chaque version
je ne me suis pas encore risqué à la programmation peut-être je devrais me lancer
c'est vrai que c'est ennuyeux de faire la modif après chaque version
je ne me suis pas encore risqué à la programmation peut-être je devrais me lancer
Re: [Résolu] Chiffre après virgule dans un virtuel
Bonjour,
Merci pour la solution proposée
Afin d’avoir 2 décimales en retour de la fonction lastBetween
J’ai bien dupliqué la fonction d’origine lastBetween en MylastBetween en modifiant le retour de fonction
return round($historyStatistique[‘last’], 1); par return round($historyStatistique[‘last’], 2);
cela donne le code suivant :
public static function MylastBetween($_cmd_id, $_startDate, $_endDate) {
$cmd = cmd::byId(trim(str_replace(’#’, ‘’, $_cmd_id)));
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
return ‘’;
}
$_startDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_startDate)));
$_endDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_endDate)));
$historyStatistique = $cmd->getStatistique($_startDate, $_endDate);
if(!$historyStatistique[‘last’]){
return ‘’;
}
return round($historyStatistique[‘last’], 2);
}
Cette fonction fonctionne correctement dans le fichier
core / class / scenarioExpression.class.php
pour ne pas faire la modif a chaque changement de version j'ai bien mis cette fonction dans le fichier user.function.class.php et cela donne une erreur 500 a l’exécution !
les lignes provocant l’erreur sont :
$_startDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_startDate)));
$_endDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_endDate)));
Quelqu’un aurait une explication ou une piste ?
Merci pour la solution proposée
Afin d’avoir 2 décimales en retour de la fonction lastBetween
J’ai bien dupliqué la fonction d’origine lastBetween en MylastBetween en modifiant le retour de fonction
return round($historyStatistique[‘last’], 1); par return round($historyStatistique[‘last’], 2);
cela donne le code suivant :
public static function MylastBetween($_cmd_id, $_startDate, $_endDate) {
$cmd = cmd::byId(trim(str_replace(’#’, ‘’, $_cmd_id)));
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
return ‘’;
}
$_startDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_startDate)));
$_endDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_endDate)));
$historyStatistique = $cmd->getStatistique($_startDate, $_endDate);
if(!$historyStatistique[‘last’]){
return ‘’;
}
return round($historyStatistique[‘last’], 2);
}
Cette fonction fonctionne correctement dans le fichier
core / class / scenarioExpression.class.php
pour ne pas faire la modif a chaque changement de version j'ai bien mis cette fonction dans le fichier user.function.class.php et cela donne une erreur 500 a l’exécution !
les lignes provocant l’erreur sont :
$_startDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_startDate)));
$_endDate = date(‘Y-m-d H:i:s’, strtotime(self::setTags($_endDate)));
Quelqu’un aurait une explication ou une piste ?
Re: [Résolu] Chiffre après virgule dans un virtuel
Pouvez-vous SVP mettre votre code dans une balise code ( bouton </> ) pour le rendre lisible ?
Il me semble que vous n'avez pas mis de vraies apostrophes 0x29 'mais 2 caractères spéciaux (utf8 0x8028 et 0x8029). ‘ ’
Quel éditeur de texte utilisez-vous ?
Il me semble que vous n'avez pas mis de vraies apostrophes 0x29 'mais 2 caractères spéciaux (utf8 0x8028 et 0x8029). ‘ ’
Quel éditeur de texte utilisez-vous ?
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités