[Astuces]Traiter les multiples d'unités automatiquement (Kilo, Mega etc)

Bonjour,

Confronté à un petit souci d’affichage, à partir de valeurs mqtt qui remontent les infos de stockage (octets), j’ai fais quelques adaptations pour prendre en compte automatiquement les multiples d’unités.
Idéalement, ça devrait être une fonction automatique du core mais comme ce n’est pas le cas, voilà de quoi faire pareil chez vous…

Ajoutez des fonctions à la fin du fichier user.function.class.php. Idéalement utilisez le plugin Jeexplorer…

	public static function autoIdUnit($_valueId, $_decimal=99, $_space = False){
		$cmd=cmd::byId(trim($_valueId,'#'));
		$val=$cmd->execCmd();
		$unit=$cmd->getUnite();
		return self::autoValueString($val,$_decimal,$unit,$_space);
	}

	public static function autoValueString($_value, $_decimal=99, $_unit = '', $_space = False){
		$info=self::autoValueArray($_value, $_decimal, $_unit, $_space);
		return $info[0].$info[1];
	}
	
	public static function autoValueArray($_value, $_decimal=99, $_unit = '', $_space = False){
		$_unit=str_replace ("\"","",$_unit);
		$_unit=str_replace ("\'","",$_unit);
		$exclude=array('°C','°K');
		if(in_array($exclude,array($_unit)) !== false){
			return array(round($_value,$_decimal),$_unit);
		}else{
			$mod=($_unit =='o' ? 1024 : 1000);
			$_unit=($_unit =='o' ? 'i'.$_unit : $_unit);
			$prefix = [$_unit,'K'.$_unit, 'M'.$_unit, 'G'.$_unit, 'T'.$_unit];
			$myval = self::autoValueFormat($_value, $mod, count($prefix)-1);
			return array(round($myval[0],$_decimal),($_space ? ' ' : '') . $prefix[$myval[1]]);
		}
	}

	private static function autoValueFormat($_value, $_mod = 1000, $_maxdiv = 10){
		$val=floatval($_value);
		$div=0;
		while($val > $_mod && $div <$_maxdiv){
			$val=floatval($val/$_mod);
			$div++;
		}
		return array($val,$div);
	}

Créer votre virtuel et sa commande (info type numérique de préférence) et définissez sa mise en forme. N’oubliez pas d’y indiquer l’unité…

Créer maintenant une commande info type ‹ autre ›… Sinon ça ne marche pas bien…

  • Utilisez la fonction autoIdUnit()
  • Ne remplissez pas l’unité (celle-ci ne peut pas être utilisée)
  • Choissez un format d’affichage du widget de ‹ type line ›

Les paramètres de la fonction sont les suivants :

  1. L’ID de la commande (au format #[Maison][tmp][Brut]#)
  2. Le nombre de décimal
  3. L’ajout d’un espace entre le nombre et l’unité => True/False

Enregistrez le virtuel et voilà !!
image

Informations supplémentaires :

  • Pour les octets (unité o), la division est faite automatiquement par 1024 et non par 1000
  • Prise en charge de l’unité, Kilo, Mega, Giga et Terra
  • En fonction du widget, Jeedom affiche ou non les informations complètement, notamment les unités
  • Il est probablement possible de faire ça avec du CSS, ici en plus la fonction autoValueString() peut-aussi être utilisée dans les scénarios par exemple
  • La config de la capture d’écran

C’est pas parfait, mais ça fait le job facilement

Il faudrait donc mieux utiliser comme unité Kio, Mio, Gio, etc …

Tout à fait… mais j’aime pas…
On peut de toute façon adapter :

	public static function autoValueUnit($_value, $_decimal=99, $_unit = '', $_space = False){
        $mod=($_unit =='o' ? 1024 : 1000);
        $_unit=($_unit =='o' ? 'i'.$_unit : $_unit);
        $prefix = [$_unit,'K'.$_unit, 'M'.$_unit, 'G'.$_unit, 'T'.$_unit];
        $myval = self::defineForm($_value, $mod, count($prefix)-1);
        return round($myval[0],$_decimal) . ($_space ? ' ' : '') . $prefix[$myval[1]];
    }

Il y a encore des tas d’unités un peu étranges, les °C par exemple, je suis pas certain qu’on dise 1.234 K°C… Quant au Kelvin …Joker
Bref, c’est une base de départ

Bon,

J’ai finalement intégré les fonctions directement dans la class cmd et posté le PR

ça ne fait que de l’affichage, les valeurs en base restent normales
L’arrondi est repris de la valeur ‹ Calcul et arrondi ›
image