Ce Forum passera en lecture seule en janvier 2020
Image
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

[Résolu] Chiffre après virgule dans un virtuel

De l'installation à l'utilisation venez discuter de JEEDOM au quotidien
Répondre
yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

[Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 07 sept. 2018, 17:08

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)
virtuel decimal.jpg
virtuel decimal.jpg (49.54 Kio) Consulté 1438 fois
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.

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: Chiffre après virgule dans un virtuel

Message par winhex » 08 sept. 2018, 00:54

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"

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 ");
avec #[test2][string][test]#
//$dateDebut = 'today';
//$dateFin = 'now';
[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
sur une periode plus longue
#[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';
[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
reste à mettre dans un virtuel via event ou en variable

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
bdd.png (74.81 Kio) Consulté 1420 fois

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: Chiffre après virgule dans un virtuel

Message par yves273 » 08 sept. 2018, 07:41

Merci winhex,

Je regarde ce que je suis capable de faire.

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: Chiffre après virgule dans un virtuel

Message par yves273 » 09 sept. 2018, 10:16

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...

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par winhex » 09 sept. 2018, 10:49

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

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par winhex » 09 sept. 2018, 17:20

tu mets 2 (au lieu de 1) à la ligne 610
configuration / OS/DB / editeur de texte / core / class / scenarioExpression.class.php
Pièces jointes
lastBetween.png
lastBetween.png (193.16 Kio) Consulté 1362 fois

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 10 sept. 2018, 10:43

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:
reste à mettre dans un virtuel via event ou en variable
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é.

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.

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 10 sept. 2018, 11:11

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.

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par winhex » 10 sept. 2018, 14:26

yves273 a écrit :
10 sept. 2018, 11:11
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.
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)
c'est top, j'imagine qu'il faudra faire attention à chaque changement de version de jeedom?
je pense aussi

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

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par winhex » 10 sept. 2018, 18:03

mon souci est le suivant et peut-être event y répondrait
la fonction Event
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
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,
dans l'info virtuel soit tu mets
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)
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.
tu n'as pas vu le virtuel je crois
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

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 11 sept. 2018, 07:41

Merci

Je n'ai pas tout compris mais je testerai à mon retour dans 2 semaines

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 24 avr. 2019, 07:44

tu mets 2 (au lieu de 1) à la ligne 610
configuration / OS/DB / editeur de texte / core / class / scenarioExpression.class.php
pour avoir 2 chiffres après la virgule la modification est à faire à la ligne 642 avec la version 3.3 de jeeedom

jpty
Timide
Messages : 333
Inscription : 01 juin 2018, 10:54
Localisation : Nancy

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par jpty » 24 avr. 2019, 09:16

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:
MylastBetween.png
MylastBetween.png (109.26 Kio) Consulté 883 fois

yves273
Timide
Messages : 322
Inscription : 18 janv. 2016, 11:13

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par yves273 » 24 avr. 2019, 20:34

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

JMPJEEDOM
Timide
Messages : 47
Inscription : 09 janv. 2016, 18:32
Localisation : PICARDIE

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par JMPJEEDOM » 20 déc. 2019, 12:32

Bonjour,
Merci pour la solution proposée :D
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 ?

jpty
Timide
Messages : 333
Inscription : 01 juin 2018, 10:54
Localisation : Nancy

Re: [Résolu] Chiffre après virgule dans un virtuel

Message par jpty » 20 déc. 2019, 18:20

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 ?

Répondre

Revenir vers « Utilisation »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités