Virtuel Infos numeriques Primaire et Secondaire

Bonjour,
Dans un widget que j’applique sur une Info type Numeric, j’aurais besoin de passer une seconde info numérique, liée a la premiere, différente et a utiliser dans un calcul.
Cas concret : calcul du Point de Rosée sur une valeur Humidité. Dans ce cas, j’ai besoin de la température associée à la valuer Humidité.
Une solution est de passer une Info type String avec les deux valeurs mais je perd alors (il me semble) les fonctionnalités automatiques Jeedom telles que que historique, courbes, etc liées a l’ Info type Numeric …

Quelqu’un aurait-il une idée pour solutionner cette question ?

Merci d’avance

Salut,

Jette un oeil au plugin « Rosée » de @JAG … il y a tout plein d’info dont la valeur du point de rosée et de l’humidité
Accessoirement le concept c’est quand même 1 valeur = 1 commande donc on dirait que tu pars sur une solution compliquée, voire inexploitable. Surtout pour un Widget qui n’est en principe que de l’affichage

Merci @naboleo,
Je n’ai pas de soucis pour calculer le point de rosée, c’était un exemple.
Je me demandais juste si il n’y avait pas une solution facile pour passer une ou d’autres valeurs numériques a un widget autre que la valeur principale ?

Pour illustrer, voici les widgets réalisés (et inspirés d’une réalisation de @ajja17orange que je remercie au passage).
Le widget Humidity affiche une info « Confort » issue du calcul du point de rosée.
Dans cet exemple, je passe une Info de type String mais je perds les fonctions associée à un type Numeric :lying_face:
D’ou ma question …?


1 « J'aime »

Les widgets s’appliquent sur les virtuels … Et ils exploitent tout ou un partie des données disponibles de les virtuels…
Donc il n’y a « rien à passer ». Et l’archivage se fait sur les données du virtuels… Donc tu peux tout à fait avoir un widget qui t’affiche un texte (résultat d’une comparaison d’une valeur par rapport à une échelle) et un virtuel qui lui est sous forme numérique et/ou texte.

Bref avec quelques copies de ton virtuel et le code du widget ça permettra d’y voir plus clair.
Et @ajja17orange a peut-être l’explication compléte

bonjour,

le retour est une valeur string d’où j’imagine ta question mais un widget numérique peut retourné un string
(il le fait bien avec une image)
si > 20 affiche image …
bien la se serait si la valeur (ou son resultat) condition =,>,< affiche le texte « abc »
et si tu clic pour l’historique tu aurais la valeur numerique

sinon tu peux très bien redirigé ton string sur un autre historique « numerique »
exemple

tu as sous chaque action (etat) une date string (mise en forme par une commande custom)
si je clic dessus j’ai l’historique de l’état

l’historique de la date est désactivé


j’ai un param optionnels l’id de se que je veux comme historique (l’etat)

et son vieux widget

<div class="tooltips cmd cmd-widget" data-type="info" data-subtype="string" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" style="display: block;">
	<center><span style="font-size : 12px;#hideCmdName#" class="cmdName">#name_display#</span> 
      <span class="state cursor">#state#</span></center>
	<script>
		jeedom.cmd.update['#id#'] = function(_options){
     $('.cmd[data-cmd_id=#id#]').attr('title', ','+_options.name_display+', Valeur du '+_options.valueDate+', collectée le '+_options.collectDate)
     $('.cmd[data-cmd_id=#id#] .state').empty().append(_options.display_value);
     $('.cmd[data-cmd_id=#id#] .state').on('click', function(){
  			$('#md_modal').dialog({title: "Historique ID #histo# #name_display#" });
  			$("#md_modal").load('index.php?v=d&modal=cmd.history&id=#histo#').dialog('open');
			});
			$('.cmd[data-cmd_id=#id#] .state').removeClass('label label-warning label-danger')
			if(_options.alertLevel == 'warning'){
				$('.cmd[data-cmd_id=#id#] .state').addClass('label label-warning');
			}else if(_options.alertLevel == 'danger'){
				$('.cmd[data-cmd_id=#id#] .state').addClass('label label-danger');
			}
		}
		jeedom.cmd.update['#id#']({name_display:"#name_display#",display_value:"#state#",valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
	</script>
</div>

Ok, c’est plus clair, merci
Donc on est bien d’accord tu as l’info #273# qui affiche le texte ET en parallèle l’info #48# qui représente ton état binaire et sert à l’historique… Et c’est uniquement le widget appliqué sur #273# qui « triche » en remplaçant l’historique de #273# par celui de #48#

exactement

Bonjour a vous deux @naboleo et @ajja17orange,

Et merci pour le temps passé à répondre à ma question.
C’est toujours super interessant de découvrir des astuces de contournement comme celle que tu nous décris « ajja ». Je vais voir si je m’en inspire pour solutionner mon widget.

N’en pêche que ma question initiale est plus générale et un peu différente.
Peut être mal exprimée initialement, j’essaye de nouveau :
Dans le code JS d’un widget appliqué a un virtuel, les valeurs importées sont :
#state# pour la valeur principale
#options widget# qui sont des données fixes déclarées dans le paramétrage de l’affichage virtuel
#xxx# d’autres valeurs crées par le core pour historique, etc, …
Comment et avec quel code JS pourrais-je importer (ou appeler) la valeur d’une donnée info située dans un autre virtuel ?
Je crains que ce soit une question super basique mais j’avoue ne pas savoir faire … :neutral_face:

Dans tous les cas, je garde précieusement ton exemple de manipulation d’historique que je réutiliserais surement.

Il doit y avoir une possibilité full JS mais pour le coup, je ne suis pas en mesure de te proposer cette solution. Et puis ça implique de coder dans le JS plein de trucs bien compliqués et en dur…
Personnellement, je ferai autrement :
Ajouter une info dans ton virtuel n°2 qui a pour valeur l’info du virtuel n°1 …Comme ça ton Widget dispose de tous les accès aux infos du virtuel n°2 sur lequel est appliqué…
Ensuite il faut gérer les historiques (pas forcement besoin de l’avoir 2 fois). Et les affichages … Mais tout ça c’est natif Jeedom

Oui tu as raison. C’est clairement plus propre de travailler sur un seul virtuel qui dispose de toutes les informations nécessaires.
Dans ce cas, tu saurais me donner la syntaxe du code JS a écrire dans le widget de l’InfoA du virtuel pour importer l’InfoB du même virtuel ?

Comme je le disais, c’est natif Jeedom, donc pas besoin de JS.
Voilà un exemple :
Mon virtuel nommé [Services][Suivi Météo] :


récupère la valeur de #[Services][Niveau Loire][Niveau Eau]#

Merci mais ce n’est pas cela que je cherche.
Dans l’exemple ci-dessous, j’ai le virtuel avec les deux temperatures :
InfoA = temperature du salon
InfoB = temperature de la chambre1

Dans le widget que je code en JS et que j’applique à l’InfoA, je veux afficher la somme des temperatures des deux pièces (insensé mais c’est juste pour l’exemple).

En JS dans le widget, je récupère l’InfoA avec le code :
var temperatureSalon = #state# ;

Mais quoi écrire (quelle syntaxe) pour obtenir l’InfoB ?
var temperatureChambre1 = ??? ;

C’est cela que je ne sais pas faire.
Une instruction JS qui utilise l’ID de l’InfoB ou mieux, une instruction qui utilise l’ID du virtuel ET le nom de l’InfoB ?
Mais si tu ne sais pas également, pas grave, c’était au cas ou … :slightly_smiling_face:

Peut être que quelqu’un d’autre va savoir ?

2 méthode
api js

mais je comprends plus car une simple addition d’équipement infoC en valeur suffit mais bon c’est un test

tu as aussi la méthode
en valeur infosA,infosB,infosC,…
ton widget va assigné chaque variable en séparant via « , »

tout un widget de météo existe sur l’ancien forum je te mettrai le lien plus tard

la 2eme méthode

https://forum.jeedom.com/viewtopic.php?f=50&t=1182&sid=a785f38f9d5402f57c647d5054b992a9&start=1160#p609163
widget page suivante

Bonsoir,

Je me joins à votre discussion ayant à faire quelque chose d’un peu similaire.

J’ai un widget purement décoratif qui est appliquer à un virtuel info\numérique qui affiche la température intérieure de la maison.

J’aimerais récupérer la valeur d’un 2éme virtuel info\numérique celui qui affiche la température de consigne du chauffage et faire une comparaison.

Le résultat de cette comparaison aurait une action sur mon widget

Exemple :

La température intérieure est de 20°, la température de consigne aussi a 20°, donc le widget applique un fond vert.

La température intérieure descend en dessous de la température de consigne de 0,5° ou plus le widget applique un fond rouge

Comment puis-je récupérer depuis le code de mon widget la valeur d’un autre virtuel et faire ma comparaison ?

Ou avez-vous une autre solution à me proposer ?

Bonjour,
Oui, c’est a quelque chose près le même besoin et la même recherche de code.

J’ai continué à creuser et je pense qu’un code possible à appliquer serait de la forme :

        jeedom.cmd.execute({ id: 'infoID',
          success:  function(resultat) {   
          var importedData = parseFloat(resultat);
      	$('.cmd[data-cmd_id=#id#]').find('.contMain#uid# .essai').empty().append(importedData);               
    	}                                 
      	});   
saisir ou coller le code ici

Je ne suis pas certain que c’est ce qu’il y a de plus optimisé pour notre solution mais je creuse cette piste.
Je travaille actuellement pour trouver le complément de code qui permettrait de retrouver d’une facon automatique l’infoID qui nous interresse. Je ne veux pas mettre l’infoID en dure dans le code du widget.

L’idéal serait évidement une instruction qui permet d’obtenir l’infoID à partir d’une string comme #[Devices][OS THGR810 - Bureau][Temperature]# mais ca, je ne sais pas faire ou pas encore :lying_face:

Bonjour Eridani78,

Merci pour cette piste.

Peut-être que nos expertes et\ou développeurs avertis pourrons nous conforter et nous aider dans cette démarche ?

Pour pouvoir fermer ce post que j’ai ouvert, je me répond à moi-même.

Voici la solution que j’ai trouvé pour répondre à mon besoin. Il y a peut être plus élégant.

Préambule
Dans l’API Jeedom, il existe les instructions php suivantes qui permettent d’accéder directement aux infos et commandes d’un virtuel :

  • cmd::byString($string); : Retourne l’objet commande correspondant ($string: Lien vers la commande voulue : #[objet][equipement][commande]# (ex : #[Appartement][Alarme][Actif]#)).
  • cmd::byId($id); : Retourne l’objet commande correspondant ($id : ID de la commande voulue).

Mais j’ai cherché et je n’ai pas trouvé l’équivalent lorsqu’on travaille en JavaScript (JS).

Alors, lorsque l’on est dans le code JS d’un widget appliqué sur un virtuel et que l’on veut accéder à une info située dans un autre virtuel, on peut passer par le DOM.
La condition étant, à priori, que les deux virtuels soient déclarés visibles.
Vous trouverez en exemple le code inséré dans mon widget pour réaliser cela.
Le code complet étant assez long, je ne montre ici que la partie des instructions qui décrivent ma solution.

Merci de nouveau a @ajja17orange, @naboleo et @nerixs… pour leurs interventions dans cet échange.

J’ai deux virtuels …


J’applique un widget sur le virtuel Humidity dans lequel j’ai besoin de réaliser un calcul qui a besoin de l’info Temperature située dans l’autre virtuel.

Et le code utilisé …

	<script>
		jeedom.cmd.update['#id#'] = function (_options) {
			var cmd = $('.cmd[data-cmd_id=#id#]');
			cmd.attr('title', 'Valeur du ' + _options.valueDate + ', collectée le ' + _options.collectDate)

			// Widget value or string value 
			var inputValue 				= _options.display_value;
			var humidity	 			= ($.isNumeric(inputValue)) ? parseFloat(inputValue) : 0.0;

			// Dew Point computation (temperature in °C, humidity in %) 
			var virtualHumidity 		= cmd.closest('div[data-eqtype~="virtual"]:contains("Humidity")');
			var virtualHumidityId 		= virtualHumidity.data('eqlogic_id');
			var virtualTemperature 		= cmd.closest('main').find('div[data-eqtype~="virtual"]:contains("Temperature")');
			var virtualTemperatureId 	= virtualTemperature.data('eqlogic_id');
			var virtualInfoName 		= '#name_display#';
			var virtualInfoId 			= virtualTemperature.find('.cmdName:contains("'+virtualInfoName+'")').closest('.cmd').data('cmd_id');

			jeedom.cmd.execute({ id: virtualInfoId,
				success: function(result) {
					var temperature 	= parseFloat(result);
					var dewPoint 		= Math.pow((humidity/100), 0.125)*((112+0.9*temperature))+(0.1*temperature)-112;
					dewPoint 			= roundDecimal(dewPoint, 1)

					$('.cmd[data-cmd_id=#id#]').find('.contMain#uid# .commentLine1').empty().css(selected).append('Dew Point  '+dewPoint+' °C');
				}
			});
		}
		jeedom.cmd.update['#id#']({ display_value: '#state#', valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#' });
	</script>
2 « J'aime »

merci
regarde je montre comment obtenir plein d’info (pour plus tard)

exécute sans résultat donne d’autre info
et d’une autre info à une autre info via api js tu as tous.

c’est brut (id en dur)

1 « J'aime »