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
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#
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 …
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 ?
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 …
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
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.
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.
<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>