Aide pour desigh HTML - Multiques Questions en continue

Bonjour,

Depuis 2020, je monte petit à petit mon jeedom. J’arrive à un moment où il faut mettre les mains dans le cambouie pour le design. je suis actuellement sur jeedomconnect mais je souhaite basculer sur les designs et l’appli jeedom V2 qui me convient.

donc pour ca je dois mettre les mains dans le HTML et Css. et la ca devient dur.
j’ai chercher pendant des semaines un type de design qui pourrais me plaire. simple, minimaliste et sobre. et voila celui qui m’a donné des idées.

j’ai donc commencé à écrire des tuiles en Html, et a vrai dire le rendu me plait vraiment.
mais les problèmes sont la :

  1. comment isoler les html les un des autres ? en effet quand je change la taille du carré, ca change la taille de tout les html de la page. j’imagine qu’il manque des div mais je n’arrive pas à les placer?
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Widget Porte et fenetre</title>
       <style>
        .carre {
            width: 150px; /* Largeur du carré */
            height: 150px; /* Hauteur du carré */
            background-color: black; /* Couleur de fond du carré */
            border-radius: 15px; /* Arrondir les coins */
            display: flex;
            flex-direction: column; /* Aligner les éléments verticalement */
            justify-content: flex-start; /* Aligner le contenu en haut */
            align-items: center; /* Centrer horizontalement */
            position: relative;
            padding-top: 10px; /* Espacement en haut pour le texte */

        }

        .texte {
            font-size: 20px; /* Taille du texte */
            color: white; /* Couleur du texte */
            font-family: Arial, sans-serif; /* Police du texte */
            margin-bottom: 20px; /* Espacement entre le texte et l'icône */
            
        }

        .carre i {
            font-size: 80px; /* Taille de l'icône */
            color: white; /* Couleur de l'icône */          
          }  
          
           </style>
</head>
<body>
         
    <div class="carre">
        <p class="texte">Porte d'entrée</p> <!-- Texte en haut centré -->
        <i class="fas fa-door-closed"></i> <!-- Icône centrée -->
       
    </div>
      </a>

   
</body>
</html>
  1. je voudrais afficher sur certains tuiles une valeurs binaires, numériques ou autres en bas a gauche de la tuile.
    j’ai vu dans la documentation que pour avoir une valeur dynamique et en temps réel il fallait utiliser le code dessous mais je n’arrive pas à le placer correctement dans mon widget.
<script>
    jeedom.cmd.addUpdateFunction('#id#', function(_options) {
      if (is_object(cmd = document.querySelector('.cmd[data-cmd_id="#id#"]'))) {
        cmd.setAttribute('title', ': ' + _options.valueDate + '<br>: ' + _options.collectDate)
        cmd.querySelector('.value').innerHTML = _options.display_value
        cmd.querySelector('.unit').innerHTML = _options.unit
      }
    }
    jeedom.cmd.refreshValue([{ cmd_id: '#id#', value: '#value#', display_value: '#state#', valueDate: '#valueDate#', collectDate: '#collectDate#', alertLevel: '#alertLevel#', unit: '#unite#' }])
</script>`Texte préformaté`
  1. en fonction du code du dessus et donc de la valeur afficher, sur certains widgets en html je souhaiterais changer l’icone FA. Idem je n’ai pas trouvé d’exemple pour m’inspirer.

pour conclure, j’ai choisis de faire un HTML par widget pour me simplifier la tache en terme de maintenance. Ayant des compétences limitées, c’est plus facile pour moi de lire le code.

Et voila ou j’en suis :slight_smile:


Ma première fierté malgré tout a été de réussir à faire des boutons accueil ou autres qui amène vers un design :slight_smile:

ce sont les premières questions que je dois résoudre avant d’avancer et de vous en poser d’autres.

Salut,

Pour la 1, tu attribues une classe « carre » pour le rendu css de tes tuiles (<div class="carre">).
Ce qui signifie que toutes tes tuiles vont suivre la définition de ton syle .carre.

Donc, si j’ai bien compris, tu dupliques le code que tu as donné, tu redéfinis à chaque nouvelle tuile le contenu de .carre. C’est donc la dernière tuile affichée qui va donner le contenu de ton style carre pour toutes les tuiles.
Au plus simple pour toi, il faudrait donc soit :

  • changer ‹ carre › avec un nom unique pour chaque tuile (‹ carrePorteEntree ›, ‹ carreBaieOuest ›', ‹ carreCuisine ›, …) pour modifier chacune des valeurs que tu souhaites pour chacun. Accessoirement, dans ce cas au lieu de
    , tu pourras mettre <div id="carrePorteEntree"> si chaque carré est unique et #carre i {.
  • ou laisser la classe carre et ajouter une autre classe spécifique pour chaque tuile, par exemple :
         .carrePorteFenetre {
            width: 200px !important; /* Largeur du carré */
            height: 200px !important; /* Hauteur du carré */
         }

    <div class="carre carrePorteFenetre">

Pour le point 2, tu parles toujours de tes tuiles du point 1 auxquelles tu voudrais une valeur dynamque.
Mais les widgets s’appliquent à une commande d’un équipement Jeedom. Ce qui n’est pas le cas ici.
Il faudrait donc passer par des virtuels pour tes tuiles et appliquer un widget à une commande de ton virtuel.

Pour le point 3, tu veux faire comme pour le cas 2. Même réponse.

J’ai donc l’impression que tu veux repartir de zéro pour maitriser ce que tu connais mais en utilisant Jeedom et ses possibilités sans savoir comment faire le lien. Tu risques de te heurter à pas mal de soucis comme ceux plus haut :slight_smile:

EDIT : je n’ai pas de menu correspondant à ce que tu souhaites mais si ça t’inspire, je peux te proposer mes menus :

En faisant ce hmtl, j’arrive à faire changer l’icone en fonction de l’info 1 ou 0

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Widget Porte et fenetre</title>
       <style>
        .carre {
            width: 150px; /* Largeur du carré */
            height: 150px; /* Hauteur du carré */
            background-color: black; /* Couleur de fond du carré */
            border-radius: 15px; /* Arrondir les coins */
            display: flex;
            flex-direction: column; /* Aligner les éléments verticalement */
            justify-content: flex-start; /* Aligner le contenu en haut */
            align-items: center; /* Centrer horizontalement */
            position: relative;
            padding-top: 10px; /* Espacement en haut pour le texte */

        }

        .texte {
            font-size: 20px; /* Taille du texte */
            color: white; /* Couleur du texte */
            font-family: Arial, sans-serif; /* Police du texte */
            margin-bottom: 20px; /* Espacement entre le texte et l'icône */
            
        }

        .carre i {
            font-size: 80px; /* Taille de l'icône */
            color: white; /* Couleur de l'icône */          
          }  
       .icon_red {
            color: red;
        }
    </style>
</head>
<body>
    <div class="carre">
        <p class="texte">Accueil</p>
      <i class="iconCmd"></i>
    </div>

    <script>
        // Fonction pour mettre à jour l'icône
     jeedom.cmd.addUpdateFunction('12161', function(_options) {
    const iconElement = document.querySelector('.carre .iconCmd'); // Cible l'icône dans le carré
    if (iconElement) {
        if (is_numeric(_options.value)) {
            if (parseFloat(_options.display_value) >= 1) {
                iconElement.innerHTML = '<i class="icon mdi-window-closed-variant"></i>';
            } else {
                iconElement.innerHTML = '<i class="icon icon_red mdi-window-open-variant"></i>';
            }
        }
    }
});


    </script>
</body>
</html>

sauf que l’image ne se calle pas correctement entre le widget que je veux et pourant ils ont les même valeurs.

image

j’ai l’impression qu’il n’arrive pas a retrouver ceci qui correspondant à l’image

        .carre i {
            font-size: 80px; /* Taille de l'icône */
            color: white; /* Couleur de l'icône */ 

entre les 2 les codes sont identiques sauf l’un à le script de changement d’icone et l’autre non

si je modifie dans les classe icon en ajoutant une icone elle se met au bon endroit à coté de l’autre.

<body>
    <div class="carre">
        <p class="texte">Accueil</p>
      <i class="fas fa-house-user iconCmd"></i>
    </div>

image

comment faire pour que la fenetre prenne la place.

Il ne faut pas redéfinir le contenu de ton code à chaque changement mais enlever ou supprimer le css icon_red :

const iconElement = document.querySelector('.iconCmd');
if (_options.display_value >= 1) {
    iconElement.classList.add('icon_red');
} else {
    iconElement.classList.remove('icon_red');
}

Par contre, il faut déclarer le logo de ta fenêtre dans le HTML avant car lui ne va pas être modifié :
<i class="iconCmd mdi-window-closed-variant"></i>

Mais avec cette méthode, tu vas rencontrer à nouveau le problème de ton premier post : tu vas changer toutes les tuiles avec des noms de classes identiques…

voir mon post ci-dessus.
Mais je crains que à vouloir refaire manuellement de zéro, tu risques de bloquer sur beaucoup de points.

Bon j’avance,
avec ce html je n’ai pas de problémes de class. j’ai tout ecris dans le meme html.

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Widget Porte et fenêtre</title>
    <style>
        /* Variables CSS pour configurer l'espacement */
        :root {
            --espace-horizontal: 10px; /* Espacement horizontal entre les widgets */
            --espace-vertical: 10px; /* Espacement vertical entre les widgets */
        }

        /* Conteneur principal en grille */
        .grid-container {
            display: grid;
            grid-template-columns: repeat(5, 1fr); /* 5 colonnes de largeur égale */
            gap: var(--espace-vertical) var(--espace-horizontal); /* Espacement vertical et horizontal */
            padding: 10px; /* Espacement autour de la grille */
            max-width: 400px; /* Largeur maximale de la grille */
        }

        /* Style des widgets */
        .carre {
            width: 150px; /* Largeur du carré */
            height: 150px; /* Hauteur du carré */
            background-color: black; /* Couleur de fond du carré */
            border-radius: 15px; /* Arrondir les coins */
            display: flex;
            flex-direction: column; /* Aligner les éléments verticalement */
            justify-content: flex-start; /* Aligner le contenu en haut */
            align-items: center; /* Centrer horizontalement */
            padding-top: 10px; /* Espacement en haut pour le texte */
        }

        .texte {
            font-size: 20px; /* Taille du texte */
            color: white; /* Couleur du texte */
            font-family: Arial, sans-serif; /* Police du texte */
            margin-bottom: 10px; /* Espacement entre le texte et l'icône */
        }

        .carre i {
            font-size: 60px; /* Taille de l'icône */
            color: white; /* Couleur de base de l'icône */
        }

        .icon_red {
            color: red !important; /* Couleur de l'icône lorsque active */
        }

        /* Espacement personnalisé entre les lignes */
        .custom-gap {
            grid-column: 1 / -1; /* Prend toute la largeur de la grille */
            height: 100px; /* Hauteur de l'espace personnalisé */
        }
    </style>
</head>
<body>
    <!-- Conteneur de la grille -->
    <div class="grid-container">
        <!-- Widget 1 à 10 -->
        <div class="carre">
            <p class="texte">Porte 1</p>
            <i class="iconCmd fas fa-door-closed" id="icon1"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 2</p>
            <i class="iconCmd fas fa-door-closed" id="icon2"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 1</p>
            <i class="iconCmd mdi mdi-window-closed-variant" id="icon3"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 2</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon4"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 3</p>
            <i class="iconCmd mdi-door-closed" id="icon5"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 4</p>
            <i class="iconCmd mdi-door-closed" id="icon6"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 3</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon7"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 4</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon8"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 5</p>
            <i class="iconCmd mdi-door-closed" id="icon9"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 6</p>
            <i class="iconCmd mdi-door-closed" id="icon10"></i>
        </div>

        <!-- Espacement personnalisé entre les lignes -->
        <div class="custom-gap"></div>

        <!-- Nouvelle ligne de widgets -->
        <div class="carre">
            <p class="texte">Porte 7</p>
            <i class="iconCmd mdi-door-closed" id="icon11"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte 8</p>
            <i class="iconCmd mdi-door-closed" id="icon12"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 5</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon13"></i>
        </div>
        <div class="carre">
            <p class="texte">Fenêtre 6</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon14"></i>
        </div>
    </div>

    <script>
          // Fonction pour mettre à jour l'icône
        function updateIcon(cmdId, iconId, iconClosedClasses, iconOpenClasses) {
            jeedom.cmd.addUpdateFunction(cmdId, function(_options) {
                const iconElement = document.getElementById(iconId);

                // Convertir les chaînes de classes en tableaux
                const closedClasses = iconClosedClasses.split(' ');
                const openClasses = iconOpenClasses.split(' ');

                if (_options.display_value >= 1) {
                    // Retirer les classes "fermées"
                    closedClasses.forEach(cls => iconElement.classList.remove(cls));
                    // Ajouter les classes "ouvertes"
                    openClasses.forEach(cls => iconElement.classList.add(cls));
                    // Ajouter la couleur rouge si nécessaire
                    iconElement.classList.add('icon_red');
                } else {
                    // Retirer les classes "ouvertes"
                    openClasses.forEach(cls => iconElement.classList.remove(cls));
                    // Ajouter les classes "fermées"
                    closedClasses.forEach(cls => iconElement.classList.add(cls));
                    // Retirer la couleur rouge si nécessaire
                    iconElement.classList.remove('icon_red');
                }
            });
        }

        // Fonction pour rafraîchir toutes les icônes
        function refreshIcons() {
            // Portes
            updateIcon('4122', 'icon1', 'fas fa-door-closed', 'fas fa-door-open');
            updateIcon('4127xx', 'icon2', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4130x', 'icon5', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4131x', 'icon6', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4134x', 'icon9', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4135x', 'icon10', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4136x', 'icon11', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4137xx', 'icon12', 'mdi-door-closed', 'mdi-door-open');

            // Fenêtres
            updateIcon('4126', 'icon3', 'mdi mdi-window-closed-variant', 'mdi mdi-window-open-variant');
            updateIcon('4129xx', 'icon4', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4132xx', 'icon7', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4133xx', 'icon8', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4138xx', 'icon13', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4139xx', 'icon14', 'mdi-window-closed-variant', 'mdi-window-open-variant');
        }

    </script>
</body>
</html>

Ce que je n’arrive pas à faire c’est le refresh au chargement de la page. je n’arrive pas à trouver sur le fourm un exemple de code.

Bonjour,

Tu n’appelles jamais ta fonction refreshIcons.
Tu dois ajouter à la fin de ton script : refreshIcons();

je l’ai mis, mais il ne fonctionne pas.

j’ai pas les états à jours sur le design. il se met à l’image de base .

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Widget Porte et fenêtre</title>
    <style>
        /* Variables CSS pour configurer l'espacement */
        :root {
            --espace-horizontal: 10px; /* Espacement horizontal entre les widgets */
            --espace-vertical: 10px; /* Espacement vertical entre les widgets */
        }

        /* Conteneur principal en grille */
        .grid-container {
            display: grid;
            grid-template-columns: repeat(5, 1fr); /* 5 colonnes de largeur égale */
            gap: var(--espace-vertical) var(--espace-horizontal); /* Espacement vertical et horizontal */
            padding: 10px; /* Espacement autour de la grille */
            max-width: 400px; /* Largeur maximale de la grille */
        }

        /* Style des widgets */
        .carre {
            width: 150px; /* Largeur du carré */
            height: 150px; /* Hauteur du carré */
            background-color: black; /* Couleur de fond du carré */
            border-radius: 15px; /* Arrondir les coins */
            display: flex;
            flex-direction: column; /* Aligner les éléments verticalement */
            justify-content: flex-start; /* Aligner le contenu en haut */
            align-items: center; /* Centrer horizontalement */
            padding-top: 10px; /* Espacement en haut pour le texte */
        }

        .texte {
            font-size: 17px; /* Taille du texte */
            color: white; /* Couleur du texte */
            font-family: Arial, sans-serif; /* Police du texte */
            margin-bottom: 10px; /* Espacement entre le texte et l'icône */
        }

        .carre i {
            font-size: 60px; /* Taille de l'icône */
            color: white !important; /* Couleur de base de l'icône */
        }

        .icon_red {
            color: red !important; /* Couleur de l'icône lorsque active */
        }

        /* Espacement personnalisé entre les lignes */
        .custom-gap {
            grid-column: 1 / -1; /* Prend toute la largeur de la grille */
            height: 100px; /* Hauteur de l'espace personnalisé */
        }
    </style>
</head>
<body>
    <!-- Conteneur de la grille -->
    <div class="grid-container">
        <!-- Widget 1 à 10 -->
        <div class="carre">
            <p class="texte">Porte d'entrée</p>
            <i class="iconCmd fas fa-door-closed" id="icon1"></i>
        </div>
        <div class="carre">
            <p class="texte">Baie Ouest</p>
            <i class="iconCmd fas fa-door-closed" id="icon2"></i>
        </div>
        <div class="carre">
            <p class="texte">Cuisine</p>
            <i class="iconCmd mdi mdi-window-closed-variant" id="icon3"></i>
        </div>
        <div class="carre">
            <p class="texte">Baie Est</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon4"></i>
        </div>
        <div class="carre">
            <p class="texte">Wc</p>
            <i class="iconCmd mdi-door-closed" id="icon5"></i>
        </div>
        <div class="carre">
            <p class="texte">Escalier</p>
            <i class="iconCmd mdi-door-closed" id="icon6"></i>
        </div>
        <div class="carre">
            <p class="texte">Chambre Parent</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon7"></i>
        </div>
        <div class="carre">
            <p class="texte">Chambre Armand</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon8"></i>
        </div>
        <div class="carre">
            <p class="texte">Bureau</p>
            <i class="iconCmd mdi-door-closed" id="icon9"></i>
        </div>
        <div class="carre">
            <p class="texte">Salle de bain</p>
            <i class="iconCmd mdi-door-closed" id="icon10"></i>
        </div>

        <!-- Espacement personnalisé entre les lignes -->
        <div class="custom-gap"></div>

        <!-- Nouvelle ligne de widgets -->
        <div class="carre">
            <p class="texte">Portail</p>
            <i class="iconCmd mdi-door-closed" id="icon11"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte de garage</p>
            <i class="iconCmd mdi-door-closed" id="icon12"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte jardin</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon13"></i>
        </div>
        <div class="carre">
            <p class="texte">Cabanon</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon14"></i>
        </div>
    </div>

    <script>
          // Fonction pour mettre à jour l'icône
        function updateIcon(cmdId, iconId, iconClosedClasses, iconOpenClasses) {
            jeedom.cmd.addUpdateFunction(cmdId, function(_options) {
                const iconElement = document.getElementById(iconId);

                // Convertir les chaînes de classes en tableaux
                const closedClasses = iconClosedClasses.split(' ');
                const openClasses = iconOpenClasses.split(' ');

                if (_options.display_value === 0) {
                    // Retirer les classes "fermées"
                    closedClasses.forEach(cls => iconElement.classList.remove(cls));
                    // Ajouter les classes "ouvertes"
                    openClasses.forEach(cls => iconElement.classList.add(cls));
                    // Ajouter la couleur rouge si nécessaire
                    iconElement.classList.add('icon_red');
                } else {
                    // Retirer les classes "ouvertes"
                    openClasses.forEach(cls => iconElement.classList.remove(cls));
                    // Ajouter les classes "fermées"
                    closedClasses.forEach(cls => iconElement.classList.add(cls));
                    // Retirer la couleur rouge si nécessaire
                    iconElement.classList.remove('icon_red');
                }
            });
        }

        // Fonction pour rafraîchir toutes les icônes
        function refreshIcons() {
            // Portes
            updateIcon('4122', 'icon1', 'fas fa-door-closed', 'fas fa-door-open');
            updateIcon('4127xx', 'icon2', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4130x', 'icon5', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4131x', 'icon6', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4134x', 'icon9', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4135x', 'icon10', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4136x', 'icon11', 'mdi-door-closed', 'mdi-door-open');
            updateIcon('4137xx', 'icon12', 'mdi-door-closed', 'mdi-door-open');

            // Fenêtres
            updateIcon('4126', 'icon3', 'mdi mdi-window-closed-variant', 'mdi mdi-window-open-variant');
            updateIcon('4129xx', 'icon4', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4132xx', 'icon7', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4133xx', 'icon8', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4138xx', 'icon13', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            updateIcon('4139xx', 'icon14', 'mdi-window-closed-variant', 'mdi-window-open-variant');
        }
        // Rafraîchir les icônes immédiatement au chargement de la page
        refreshIcons();
      
    </script>
</body>
</html>

pour le moment je teste uniquement les cde 4126 et 4122 avant de deployer completement

évite les xx, mets plutôt en commentaire. Pas sûr que jeedom apprécie ce genre d’ids de commande

Hey ben tu es courageux.

Vouloir faire en HTML / CSS ce que des applications comme plugin-jeedomconnect et plugin-jeemate font de manière simple et rapide.

Je te souhaite d’atteindre ton but, le chemin ne sera pas simple.

1 « J'aime »

tu peux essayer :

$(document).ready(function() {
refreshIcons();
});

non toujours pas

 // Fenêtres
            updateIcon('4126', 'icon3', 'mdi mdi-window-closed-variant', 'mdi mdi-window-open-variant');
           // updateIcon('4129xx', 'icon4', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            //updateIcon('4132xx', 'icon7', 'mdi-window-closed-variant', 'mdi-window-open-variant');
           // updateIcon('4133xx', 'icon8', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            //updateIcon('4138xx', 'icon13', 'mdi-window-closed-variant', 'mdi-window-open-variant');
            //updateIcon('4139xx', 'icon14', 'mdi-window-closed-variant', 'mdi-window-open-variant');
        }
        // Rafraîchir les icônes immédiatement au chargement de la page
       //refreshIcons();
      $(document).ready(function() {
		refreshIcons();
			});
    </script>
</body>
</html>

j’ai mis en commentaire les lignes avec id farfelue.

Il n’y avait pas de refresh de l’état des ouvertures au chargement de la page.

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Widget Porte et fenêtre</title>
    <style>
        :root {
            --espace-horizontal: 10px;
            --espace-vertical: 10px;
        }

        .grid-container {
            display: grid;
            grid-template-columns: repeat(5, 1fr);
            gap: var(--espace-vertical) var(--espace-horizontal);
            padding: 10px;
            max-width: 400px;
        }

        .carre {
            width: 150px;
            height: 150px;
            background-color: black;
            border-radius: 15px;
            display: flex;
            flex-direction: column;
            justify-content: flex-start;
            align-items: center;
            padding-top: 10px;
        }

        .texte {
            font-size: 17px;
            color: white;
            font-family: Arial, sans-serif;
            margin-bottom: 10px;
        }

        .carre i {
            font-size: 60px;
            color: white !important;
        }

        .icon_red {
            color: red !important;
        }

        .custom-gap {
            grid-column: 1 / -1;
            height: 100px;
        }
    </style>
</head>
<body>
    <div class="grid-container">
        <div class="carre">
            <p class="texte">Porte d'entrée</p>
            <i class="iconCmd fas fa-door-closed" id="icon1"></i>
        </div>
        <div class="carre">
            <p class="texte">Baie Ouest</p>
            <i class="iconCmd fas fa-door-closed" id="icon2"></i>
        </div>
        <div class="carre">
            <p class="texte">Cuisine</p>
            <i class="iconCmd mdi mdi-window-closed-variant" id="icon3"></i>
        </div>
        <div class="carre">
            <p class="texte">Baie Est</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon4"></i>
        </div>
        <div class="carre">
            <p class="texte">Wc</p>
            <i class="iconCmd mdi-door-closed" id="icon5"></i>
        </div>
        <div class="carre">
            <p class="texte">Escalier</p>
            <i class="iconCmd mdi-door-closed" id="icon6"></i>
        </div>
        <div class="carre">
            <p class="texte">Chambre Parent</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon7"></i>
        </div>
        <div class="carre">
            <p class="texte">Chambre Armand</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon8"></i>
        </div>
        <div class="carre">
            <p class="texte">Bureau</p>
            <i class="iconCmd mdi-door-closed" id="icon9"></i>
        </div>
        <div class="carre">
            <p class="texte">Salle de bain</p>
            <i class="iconCmd mdi-door-closed" id="icon10"></i>
        </div>

        <div class="custom-gap"></div>

        <div class="carre">
            <p class="texte">Portail</p>
            <i class="iconCmd mdi-door-closed" id="icon11"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte de garage</p>
            <i class="iconCmd mdi-door-closed" id="icon12"></i>
        </div>
        <div class="carre">
            <p class="texte">Porte jardin</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon13"></i>
        </div>
        <div class="carre">
            <p class="texte">Cabanon</p>
            <i class="iconCmd mdi-window-closed-variant" id="icon14"></i>
        </div>
    </div>

    <script>
        function updateElement(iconId, iconClosedClasses, iconOpenClasses, val) {
          const iconElement = document.getElementById(iconId);
          const closedClasses = iconClosedClasses.split(' ');
          const openClasses = iconOpenClasses.split(' ');

          if (val === 0) {
            closedClasses.forEach(cls => iconElement.classList.remove(cls));
            openClasses.forEach(cls => iconElement.classList.add(cls));
            iconElement.classList.add('icon_red');
          } else {
            openClasses.forEach(cls => iconElement.classList.remove(cls));
            closedClasses.forEach(cls => iconElement.classList.add(cls));
            iconElement.classList.remove('icon_red');
          }
        }

      	function updateIcon(cmdId, iconId, iconClosedClasses, iconOpenClasses) {
            jeedom.cmd.addUpdateFunction(cmdId, function(_options) {
				updateElement(iconId, iconClosedClasses, iconOpenClasses, _options.display_value)
            });

			jeedom.cmd.execute({
              id : cmdId,
              async: false,
              noCache: true,
              error: function(error) {
                console.log(`Erreur jeedom.cmd.execute(${cmdId})`)
              },
              success: function (data) {
                updateElement(iconId, iconClosedClasses, iconOpenClasses, data);
              }});
        }

        function refreshIcons() {
            // Portes
          	updateIcon('4122', 'icon1', 'fas fa-door-closed', 'fas fa-door-open');

            // Fenêtres
            updateIcon('4126', 'icon3', 'mdi mdi-window-closed-variant', 'mdi mdi-window-open-variant');
        }

        refreshIcons();
    </script>
</body>
</html>

J’ai mis à jour mon post si jamais tu veux t’en inspirer :slightly_smiling_face:
(Dsl je n’avais pas bcp de temps ces derniers jours)

super ca fonctionne. merci pour ton aide

1 « J'aime »

merci je vais regarder ca

1 « J'aime »

j’avance petit à petit

1 « J'aime »

ca a du bon d’avoir la grippe.
Fenetre et lumiere intérative…

Merc à @alexcrp pour le tuto.

et la page des ouvrants avec animation