Widget N State Switch V4 plugin mode

outdated - mise à jour pour le plugin mode dans un msg plus bas

Bonjour,
Je suis codeur et j’ai rendu le système (3 State Switch) évolutif, à savoir un « N State Switch » dynamique en fonction d’une seule variable #texte# à mettre dans la commande, qui contient une liste des textes séparés par une virgule (par ex: « ON;OFF;AUTO » pour l’exemple précédent) (je l’ai testé avec les 6 positions du chauffage « OFF;H.G;ECO;T-2°;T-1°;CONF » )
Le principe est simple et je vous ai mis plein de commentaires, voici le code :slight_smile: par contre j’ai des lacunes en CSS, je suis preneur de toute amélioration du reste :wink: il est en vertical; à voir si ça intéresse qq1 de le mettre horizontal?

image

MultiStatsSwitch.txt (2,5 Ko)

3 « J'aime »

voici le widget multi state en mobile, idem que mon post précédent il faut mettre toutes les valeurs possibles dans la variable #texte# du virtuel, ainsi les 2 widgets (mobile et desktop) fonctionnent bien sur le même virtuel: MultiSwitchMobile.txt (3,0 Ko)

image

1 « J'aime »

bonjour
j’ai mis en place le version mobile, le widget apparaît bien cependant les données ne sont pas rafraîchies ni dans un sens ni dans l’autre

Bonjour @MarcF est ce qu’il y a des msg ou erreurs dans la console du navigateur (F12) ?

A priori pas d’erreur (après je ne suis pas un specialiste du debug)
j’ai testé sous firefox et chrome
De plus a chaque ouverture je perds le surlignage qui était activé
fermeture
image
ouverture
image

montre voir s’il y a un msg dans le log, qui ressemble a ça:
creating elements classSwitch6Wayscmd495__110562553__ with input[type=radio][name=keycmd495__110562553__][value=5] checked
puis ça:
{cmd_id: "495", value: "5", display_value: "5", valueDate: "2020-04-01 12:21:17", collectDate: "2020-04-01 12:21:17"}
est-ce que tu a utilisé ce widget sur une commande de type virtuel / slider ? ha et quelle version de jeedom ?

Hello les gars,

Vu que c’est un widget différent, êtes vous d’accord pour que je vous bascule sur un nouveau sujet dédié à ton widget @pifou ?

oui ok pour moi

2 « J'aime »

Rien de parlant dans la partie analyse/log
si tu peux préciser ou chercher ailleurs

concernant la version jeedom, je suis en 4.047
et le virtuel
image

Ha, oui j’aurais du le préciser, j’ai développé le widget en v3 et il y a quelque syntaxe à modifier pour la v4… Je ne saurais pas t’aider plus, je n’ai jamais testé v4 mais il y a des tas de messages sur le forum (trop, peut être…)

ARFFF
je comprends mieux
vivement que tout le monde passe en V4

j’avoue que pour l’instant je suis pas pressé de changer, vu les débats sur le forum…
Mais si tu arrive à faire marcher le widget tu pourra me nous le partager ici stp :slight_smile: je l’ajouterais dans le post initial.

Hello pifou,
Je déterre le sujet
J’ai le même pb que MarcF. Lorsque je clique sur une valeur celle-ci apparait bien en surbrillance mais si je rafraichi l’écran je perds le surlignage de l’élément sélectionné.
Je précise que je suis en V3.3.56 et je ne vois a priori aucune erreur sur la console du navigateur (Firefox)
(idem avec Chrome)

en revanche j’ai des erreurs dans les logs hppt à chaque fois que je sélectionne un choix (je viens de remarquer que j’ai les mêmes erreurs avec le widget de Salvialf :dizzy_face:…)
http.error.txt (6,9 Ko)

Bonjour,
Pour le coup, je suis passé en v4 depuis longtemps, ça ne résoud pas tout, mais au moins on a tous les mêmes problèmes :smiley:
Pour ton erreur, on dirait que tu devrais renvoyer un tableau avec comme index « slider »… Ton virtuel est bien un slider ?

Bonjour pifou et merci pour ta réponse
oui il s’agit bien d’un virtuel de type slider

Bonjour,

J’ai mis à jour le widget pour l’utiliser sur un équipement du plugin « mode ». En effet je voulais utiliser ce module, parce que le slider c’est un numérique, et tester un chiffre dans mes scénarios pour savoir quel mode est activé ce n’était pas la meilleure idée…

Donc, plugin « mode », on crée un équipement, on crée tous les modes qu’on veut… Et on applique ce widget sur la commande « info » de l’équipement:

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="string" data-template="default" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
  <fieldset><legend style="font-weight:bold;font-size:12px;visibility:#hide_name#">#name_display#</legend>
    <div class="classSwitch6Ways#uid#">loading...</div>
  </fieldset>
  <template>
    <p>Appliquer ce widget sur un équipement du plugin mode. Masquer les commandes, ne laisser visible que celle d'info.</p>
  </template>
  <script>
  // string.format: '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
  // result: 3.14 {0} {3.14} a{2}bc foo
  String.prototype.format = function () {
    var args = arguments;
    return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
      if (m == "{{") { return "{"; }
      if (m == "}}") { return "}"; }
      return args[n];
    });
  };
  
  utils = {}
  // rechercher l'id de la commande selon la classe...
  utils.searchIdByClass = function(classes, obj){
    for(const p in obj){
      if(classes.includes(obj[p].color)) return p;
    }
    return "";
  }

    // cmds contient id et color de chaque commande:
    var cmds#uid# = {}
 
    // affichage de la valeur sélectionnée + date collecte + date valeur
    jeedom.cmd.update['#id#'] = function(_options) {
      // clean selected class
      $(".classSwitch6Ways#uid# label").removeClass("ui-checkboxradio-checked");
      var cmd = $('.cmd[data-cmd_id=#id#]');
      cmd.attr('title', '{{Date de valeur}} : '+_options.valueDate+'<br/>{{Date de collecte}} : '+_options.collectDate);
      cleanText = _options.value.replace(/<\/?[^>]+(>|$)/g, ""); // remove html tags
      if(cleanText == ''){
        cleanText = _options.value.replace(/<i class="([^"]+)".*/g, "$1"); // class de l'option dans balise <i>
        cleanText = utils.searchIdByClass(cleanText.split(' '), cmds#uid#);
      }
      // ajouter la classe sur le label
      $("#label" + cmds#uid#[cleanText].id).addClass("ui-checkboxradio-checked");
    }

    console.log('commande #name# état #state# le #valueDate# (collecte #collectDate#) (uid=#uid#)');
    // récupérer l'objet (eqLogic) concerné - 1er traitement asynchrone
    jeedom.eqLogic.byId({id: '#eqLogic_id#',
      success: function(result){
        // enregistrer toutes les commandes (les modes) et les couleurs
        result.configuration.modes.forEach(mode => cmds#uid#[mode.name] = {id: 0, color: mode.modecolor});
        // rechercher toutes les commandes de l'objet - 2e traitement asynchrone
        jeedom.eqLogic.getCmd({id: '#eqLogic_id#',
          success: function(result){
            var index = 0;
            // vider le div 'loading...'
            $(".classSwitch6Ways#uid#").empty();
            // template à appliquer sur chaque commande
            var html = '<input type="radio" name="key{0}" id="key{1}{0}" value="{3}"/><label id="label{1}{0}" for="key{1}{0}">{2}</label>';
            result.forEach(cmd => {
              // filtrer les commandes qui ne sont pas des modes du plugin mode
              if(cmds#uid#[cmd.logicalId] != undefined){
                // enregistrer l'id de l'input de chaque commande
                cmds#uid#[cmd.logicalId].id = '{1}{0}'.format('#uid#', index);
                // utiliser le nom ou l'icône de la commande
                var label = cmd.display.icon ? cmd.display.icon : cmd.logicalId;
                // ajouter le template html dans le div
                $(".classSwitch6Ways#uid#").append( $.parseHTML(html.format('#uid#', index, label, cmd.id)));
                // ajouter la classe couleur sur le label
                $('#label{1}{0} > i'.format('#uid#', index)).addClass(cmds#uid#[cmd.logicalId].color);
                // on click: execute jeedom command
                $('#key{1}{0}'.format('#uid#', index)).on('click', function(){
                  jeedom.cmd.execute({id: cmd.id});
                });
                index+=1;
              }})
            // remove radio button
            $( ".classSwitch6Ways#uid# input" ).checkboxradio({icon: false});
            // mode horizontal
            $('.classSwitch6Ways#uid# label').css('display','inline');

            // update widget avec la valeur courante
            jeedom.cmd.update['#id#']({display_value: '#state#', value: '#state#',  valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#'})
          },
          error: function(x, status, error){
            console.log('Error calling #eqLogic_id# commands {0} {1}'.format(status, error))
          }
        });
      }
    });
     
  </script>
  <style>
.classSwitch6Ways#uid# {
  margin:5px 5px 5px 5px;
  padding: 0px;
  color:#D0D0D0;
  border:solid 1px #5B5B5B;
  font-size:1em;
  font-weight:bold;
  line-height:2em;
  border-radius:0.3em;
  background:grey;
  position:relative;
  display:block;
  box-shadow:0px 2px 2px 0px rgba(0, 0, 0, 0.75) inset,0px 2px 2px 0px rgba(255, 255, 255, 0.5);
}
.classSwitch6Ways#uid# label {
  cursor:pointer;
  position:relative;
  display:block;
  -webkit-transition: 300ms ease-out;
  -moz-transition: 300ms ease-out;
  transition: 300ms ease-out;
  padding: 0 1em;
  border:none;
}
.classSwitch6Ways#uid# .ui-checkboxradio-checked {
  border:solid 0.5px red!important;
  color:red;
  text-shadow: 1px 1px 3px #000;
}
    
  </style>
</div>

Le code est assez long et complexe, je l’ai abondamment commenté et si vous avez des améliorations / optimisations je suis preneur :slight_smile:
Je rajouterais un paramètre pour le passer en mode vertical, voici le rendu pour le mode horizontal qui récupère les icones paramétrés dans chaque commande du plugin, j’ai masqué toutes les autres commandes pour ne laisser que la commande « info » (qui est pour le coup aussi une commande):
image