Choix d'un Widget ou d'un autre suivant conditions

Bonjour,
J’ai fait un Widget Info que je trouve moins performant que le bon vieux Rain du core, bien plus rapide.
Je vais donc le laisser. Mais j’ai du mal à renoncer à quelques états que j’avais prévu en dehors du niveau de remplissage. Considérez que c’était l’image du Rain avec un symbole par dessus pour:

  • Dire que mon contenant débordait;
  • Qu’il était presque vide;
  • Qu’il était vide;
  • Hors connexion ou problème.

Je suis dans le contexte d’un virtuel en disposition tableau avec une dizaine de lignes et colonnes.
Le plus simple serait dans que dans une case j’ai le widget Rain + un autre qui gère les cas de figure évoqués au dessus. Mais j’aimerais trouver mieux. En effet cela prend pas mal d’espace et donc pas génial au niveau look du virtuel.

Je crois me souvenir qu’on ne peut pas superposer deux widgets … et si cela se faisait, il faudrait gérer la transparence du fond de l’un deux.

Ce qui m’a amené à réfléchir à ce type de solution sans savoir trop quoi faire: C’est l’un ou l’autre qui est visible suivant une condition. Je vois deux possibilités (il y en a certainement plus):

  • dans mon virtuel, deux Infos qui pointent vers la même source. Une condition de scénario rend visible l’un ou l’autre;
  • Ce qui me paraitrait le plus élégant: Je crée un Widget. Dans mes tests je pourrais avoir #value# < 100 && #value# > 0 qui serait associé au Widget Rain. Les autres tests seraient associés aux images que j’ai créé.

Donc, il y a-t-il une possibilité ? Merci par avance.


Informations Jeedom

Core : 4.4.5 (V4-stable)
DNS Jeedom : non


Informations complémentaires
OS: raspbian 10 on RPI 3 B+ ; PHP: 7.3.31-1~deb10u5 ; Python: 3.7.3

Et tu as imaginé une valeur ternaire qui en fonction de la condition prend telle ou telle valeur ?

Une seule commande info et c,est la valeur qui évolue

Norbert

Bonjour @ngrataloup. Pas de problème avec un concept de valeur ternaire mais comment l’appliquer concrètement ?

J’en profite pour détailler ce que je fais. Peut-être que cela aidera.

Voilà mon virtuel:
image

Cela me permet de contrôler le système d’irrigation de ma terrasse. Les plus gros widgets Rain ce sont mes tonneaux que je mesure par des capteurs ultra son.

Mes fleurs sont hydratées par le dessous, dans des gouttières en plastique. Cela m’intéresse de connaitre le niveau de chacune. De même, cela m’intéresse de connaitre le taux d’humidité de différents bacs. Pour tout cela j’utilise 8 capteurs hygrométriques à effet capacitif. Pour info, il sont tous reliés au même D1 mini en passant par 2 ads1115 pour d’abord changer le signal d’analogique à numérique. Si cela vous intéresse j’en parle en bas de ce sujet:

Donc dans mon vituel il faut regarder les 3 dernières colonnes. La première des 3 c’est le niveau de mes gouttières. Sur la 1ere ligne, le Rain qui s’avère plus réactif que mon widget sur la 3 et 4 ligne. Sur la deuxième ligne on voit le Tile avec la valeur -100, c’est la valeur que j’ai défini pour le Hors Connexion. Les deux dernières colonnes c’est le widget perso qui me montre si les fleurs ont soif ou non ou ont trop les pieds dans l’eau. Ce widget c’est ok.

Donc pour mon besoin idéalement j’aurais besoin d’un widget qui fait l’équivalent du Rain + mes différents états autres:
Goutt_Hors_Con Goutt_Déborde Goutt_Presque_Vide Goutt_Vide

Comme je ne crois pas que cela soit possible, je vais faire un Widget qui traite de ces 4 cas.

Ensuite, à moins qu’on me propose plus élégant et simple, je vais mettre deux infos par signal chacun ayant un widget différent. Ce qui me fera en tout 8 infos de virtuel pour mes niveaux.

Je vais ensuite afficher l’un ou l’autre en utilisant un scénario.

En continuant mes recherches, j’ai trouvé l’astuce de @Alciol :
Mettre dans un bloc de code:
cmd::byId(Numéro ID)->setIsVisible(0)->save();
cmd::byId(Numéro ID)->setIsVisible(1)->save();

J’ai testé mais cela pose un problème avec le widget Rain. Il ne répond plus vraiment et le % a disparu. Le diagnostic me semble facile. Ce code est constamment appelé et donc la commande renvoyé tout le temps. Le widget ne doit pas avoir le temps de s’initialiser correctement.

Je pense que le plus facile serait d’intégrer une condition dans le code, si quelqu’un peut m’aider, pas à l’aise avec, ce serait du genre:
si byId(1111)->setIsVisible = 1 alors

cmd::byId(1111)->setIsVisible(0)->save();
cmd::byId(2222)->setIsVisible(1)->save();

Voilà, merci par avance pour votre aide et suggestions

----------------------PLUS TARD…
J’ai obtenu ce code par ChatGpt
// Récupérer la commande correspondant à l’ID 3388
$cmd_3388 = cmd::byId(3388);

// Vérifier si la commande est visible
if ($cmd_3388->isVisible()) {
// Exécuter les lignes de code pour masquer la commande 3388 et afficher la commande 3619
cmd::byId(3388)->setIsVisible(0)->save();
cmd::byId(3619)->setIsVisible(1)->save();
}

Sauf que cela ne fonctionne pas. Dans le log j’ai:
Call to undefined method virtualCmd::isVisible()

Et là ChatGPT me laisse en rade. Donc quelqu’un saurait comment récupérer l’état de visibilité de l’info de mon virtuel?

}

----------------PLUS TARD-----------------------
Les conseils de Copilot sont bons. Cela fonctionne:

// Récupérez l’état de la commande 3388
$etatCommande3388 = cmd::byId(3388)->execCmd();

// Vérifiez si l’état est égal à 0
if ($etatCommande3388 == 0) {
// Si l’état est égal à 0, désactivez la visibilité de la commande 3388
cmd::byId(3388)->setIsVisible(0)->save();
// Activez la visibilité de la commande 3619
cmd::byId(3619)->setIsVisible(1)->save();
}
-------------------------------PLUS TARD----------------------------------
Approche de la visibilité n’est pas bonne. Même invisible un widget occupe son espace. L’autre devenant visible parait au-dessus.

Alors je cherche une autre solution :frowning:

Hello

C’est état correspond a quoi comme valeurs ? pourquoi pas dupliquer le widget rain du core et lui apporter les modifications souhaité ?

… / … déplacé plus bas

ca marche,
je pensait que tu voulais un seul widget qui gère tous les états :

le widget rain modifié :
image

1 « J'aime »

Ah? Super merci! Effectivement je me suis demandé si cette possibilité existait, tu n’as pas rêvé.

J’ai fini par croire que c’était impossible à faire. Comment as tu fait, sans évidemment en faire une simple image ? Pour ma culture et des fois que …

J’ai décoché solution. Si ce que tu me proposes fait la job que j’attends, alors je ferais une réponse où les méthodes sont évoquées et que je cocherai comme solution. L’idée est évidemment que cela puisse être aussi utile à quelqu’un d’autre.

J’ai simplement modifier le widget core en y intégrant des icones selon la valeur reçu.

Je vais aller jeter un coup d’oeil
Je vais m’en faire une copie pour bidouiller sans casser l’original.

j’ai celui-ci de déja fait, autant que je te le partage :wink:

cmd.info.numeric.rain_nulll.html.txt (6,7 Ko)

1 « J'aime »

Il marche vraiment impeccable, c’est donc une autre approche … mais pas très idiot proof par rapport à l’autre méthode. Mais pour le bénéfice d’autres utilisateurs, peux tu nous dire ce que tu as modifié par étape ? J’ai ouvert NotePad++ mais si j’ai repéré un certain nombre de lignes, notamment dans le style, je suis certain que si j’essayais de remplacer le « Danger » par autre chose, j’explose tout. Ce serait donc sympa si tu pouvais nous expliquer comment le faire intelligemment en se référençant aux no de lignes du fichier que tu as envoyé, je pourrais enlever 1 ou 2 l à mon pseudo. :grin:

tous les style sont des ajouts.

Ligne 83
    color: var(--al-danger-color);

var(--al-danger-color); c’est une variable css mise a dispo dans le core pour le rouge d’un élément danger en fonction du thème, exemple pour le theme dark :

image


une animation :

L118 :
@keyframes blink-#uid# {
      0% {
        opacity: 1;
      }
      50% {
        opacity: 0.2;
      }
      100% {
        opacity: 1;
      }
    }

et l’appelle a l’animation :

L95 :
animation: blink-#uid# 1s infinite;

celle-ci durera 1seconde, donc a 500ms (50% de 1s) mon element sera d’opacity: 0.2 qui est défini dans le keyframes.

1 « J'aime »

Génial!!! Là c’est simplistique ! :star_struck:

Donc tant qu’on reste dans les clous, c’est à dire qu’on utilise cette variable css mise à dispo.

Cela doit être beaucoup plus compliqué, voir impossible d’amener sa propre image (genre mon débordement qui ressemble à un T Shirt) :roll_eyes:

Je vois que ta saisie d’écran est partielle. Donc où on trouve la liste complète de ces variables ?

Pour que cela paraisse dans une recherche, j’écris: Modifier un Widget core

À mon avis, il y aura beaucoup de likes sur cette solution

Je pense pas que ce soit impossible, mais sans doute plus compliqué effectivement.

:warning: Ne pas modifier ces fichiers, tu trouvera les variables dans le fichier core/themes/core2019_Dark/desktop/colors.css

1 « J'aime »

Voilà c’est formidable. Je ne me retrouve pas avec une solution mais deux. Pour les futurs intéressés, à vous de choisir. J’écris cette ultime message afin de le cocher comme solution … puisque je ne peux pas en cocher deux.

1ere solution: Dans un virtuel, faire deux (pour mon cas je n’avais pas besoin de plus) commandes infos qui ont la même source (je l’ai fait au travers un scénario). Je cherchais donc des lignes de code qui simulaient le cochage de « Afficher ». La suite des explications se trouve là. C’est @henribi qui m’est arrivé avec deux lignes de code très simples alors que l’AI me niaisais depuis 24h

2ième solution Elle se trouve un peu au dessus et proposée par @Phpvarious. :À priori, pour les nuls comme moi, ce n’est pas le premier réflexe d’aller jouer dans du code HTML. Mais si vous prenez son fichier (basé sur le Widget core: Rain (Le tonneau qui se remplie)) et que vous suivez les instructions qu’il a donné, ce ne sera pas la fin du monde. Je suppose qu’il y a la même possibilité avec la plupart des Widgets du core qui son animés et varient selon une valeur. Aux béotiens comme moi, alors n’oubliez pas de faire une copie du fichier HTML original avant de vous livrer à des modifs :stuck_out_tongue_winking_eye:

Merci encore à eux deux!

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.