Aide création dashboard dans design personnalisé (bonnes pratiques)

Salut à tou(te)s,

Je me suis (enfin!) lancé dans la grande aventure des designs,
après avoir apprivoisé Jeedom pendant +/- 2 ans :wink:

Pour l’instant, je m’attaque à la « landing page » du dashboard (= 1ère page) qui centralisera toutes les infos les plus importantes pour la famille, immédiatement dispos sur la tablette.

Je me suis basé sur la référence très inspirante pour moi de Mads Kristensen (prévu au départ chez lui pour le système domotique Smarthing…):


Donc, sur ma page de design, j’ai ajouté un bloc « texte/html » sur toute la page (qui lui-même appelle le code CSS rangé dans un fichier nommé « menu.css » dans le repertoire « menu2 » situé à la racine du dossier « html » sur le RPI…)
Pour ceux que cela intéresse, vous pouvez checker les blocs codes assez basiques ci-dessous (work in progress bien sûr, pas forcément propre ni optimisé :sweat_smile:)

Code HTML :

<LINK href="menu2/menu.css" rel="stylesheet" type="text/css">

  
  <div class="grid-container">
    
  	<div class="grid-item item1">1 (Thermostat principal)</div>
  	<div class="grid-item item2">2 (Chauffage)</div>
  	<div class="grid-item item3">3 (Ambiance 1)</div>  
  	<div class="grid-item item4">4 (Musique)</div>
  	<div class="grid-item item5">5 (Lumières)</div>
  	<div class="grid-item item6">6 (Ambiance 2)</div>
    
    <div class="grid-item item7">7 (Lave linge RDC)</div>
  	<div class="grid-item item8">8 (Météo)</div>
  	<div class="grid-item item9">9 (Lave Linge SSOL)</div>  
  	<div class="grid-item item10">10 (Sèche linge SSOL)</div>
  	<div class="grid-item item11">11 (Scenario)</div>
  	<div class="grid-item item12">12 (Alarme intrusion)</div>
    
    <div class="grid-item item13">13 (Ouvertures)</div>
  	<div class="grid-item item14">14 (Caméras)</div>
  	<div class="grid-item item15">15 (Courrier)</div>  
  	<div class="grid-item item16">16</div>
  	<div class="grid-item item17">17 (Scenario)</div>
  	<div class="grid-item item18">18 (Conso Elec)</div>
    
       <div class="grid-item item13">19 (Conso Eau)</div>
  	<div class="grid-item item14">20 (Disponible)</div>
  	<div class="grid-item item15">21 (Poubelles)</div>  
  	<div class="grid-item item16">22 (Calendrier)</div>
  	<div class="grid-item item17">23 (Maintenance)</div>
  
  
    
</div>
  

Code CSS :

.grid-container {
  display: grid;
  gap: 5px;
  background-color: #434343;
  padding: 5px;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  grid-template-rows: auto;
  width: 1440px;
  height: 900px;
}

.grid-item {
  background-color: #656066;
  text-align: center;
  padding: 20px;
  font-size: 20px;
}

.item1 {
  grid-column: 1 / span 2;
  grid-row: 1;


}

.item7 {

  background-color: red;

}

.item8 {
  grid-column: 1 / span 2;
  grid-row: 2;
}


.item4 {
  grid-column: 4 / span 3;
  grid-row: 1 / span 3;
}

.item16 {
  grid-column: 5 / span 2;
  grid-row: 4 / span 2;
}


Cela donne pour l’instant le résultat ci-après :

Graphiquement, cela prend forme : mais c’est aussi à ce moment là que les ennuis commencent :wink:

Plusieurs questions :

1 - J’essaye de faire du responsive design (pour adapter à différents modèles de tablettes), grâce notamment à la propriété css « grid ».
Je ne me fais pas trop de soucis sur l’adaptibilité des petits carrés aux différentes résolutions d’écran, si on considère grosso modo qu’on utilisera des tablettes en mode portrait ratio 16:10 (pour l’instant, j’ai retenu 1440 x 900 px de résolution globale pour mes essais…).

Peut-on afficher (et interagir) avec x3 tablettes en même temps, qui affichent le même dashboard ?
Ou faut-il préparer x3 dashboard différents avec leur propres url différenciées ?
= Que se passe-t-il si A interragit sur le dashboard avec la tablette 1, pendant que B fait la même chose avec la tablette 2 ?

2 - Pour chaque « case » visible, j’ai une gentille balise <div> html qui m’attend sagement, et qui ne demande qu’à contenir des infos.
Mon soucis principal : comment intégrer un widget ou virtuel de Jeedom proprement à l’intérieur d’une case ?
Pour l’instant, il est possible d’ajouter des équipement sur ma page de design, mais il le sont forcément « par dessus » ce que j’ai commencé à construire (c’est normal car c’est le principe de l’assistant de création de design…)

Comment basculer les infos et actionneurs des widgets / virtuels à l’intérieur de mes <div> ?
Est-ce une bonne approche ?

J’ai regardé avec l’inspecteur web de mon navigateur la structure des widgets générés par Jeedom au moment de l’ajout sur la page de design, c’est assez complexe = cela fait appel à pas mal de dépendances…
Exemple ci-dessous pour « juste 2 valeurs », un mini widget d’une sonde de temperature / hygro :
Capture d’écran, le 2022-12-31 à 02.04.04

Code associé :

Merci par avance pour votre aide et vos conseils avisés :wink:
Au plaisir

PS: Jeedom v4.3.12 DIY RPI4

3 « J'aime »

Bonjour, test l’appli jeedomconnect avec son plug bien plus simple.

Sinon en jouant du zoom largeur,hauteur si ça modifie pas trop ton rendu « étriqué » sur tes différentes tab

Ex

Je défini une div/class/id dans le squelette et via un autre HTML/texte je recherche l’info via l’API js et j’attribue à div/class/id

Exemple info

Idem action

Idem graphique

Testeur d’expression

Ect,ect

Tu as de quoi t’amuser

Salut @ajja17orange,
merci beaucoup pour tes conseils ! :wink:

Il faut que je regarde, penses-tu qu’avec cette solution Jeedomconnect je puisse atteindre mon objectif assez minimaliste niveau design ?

J’ai toujours peur d’être un peu limité en passant par un plugin ou une appli toute faite qui aura forcément ses menus et logiques d’ergonomies que je ne pourrai pas modifier…

Le truc génial chez Mads c’est la tuile qui devient rouge quand il faut intervenir par exemple (machine à laver, etc). C’est tout bête mais couplé avec la sobriété du reste, ça devient très efficace.
On est pas perdu sur un tableau de bord de Boeing :sweat_smile:

D’autant que derrière chaque tuile je prévois d’autres choses / pages par la suite :wink:
Même si c’est du travail et du temps, ça ne me gêne pas d’aller assez loin dans la personnalisation…

C’est aussi pour moi le moyen d’optimiser au plus proche en fonction de notre maison, usages et besoin. Un moyen aussi de garantir un super WAF :upside_down_face:

Oui l’idée du responsive c’est dans une certaine mesure de s’adapter à la majorité des tablettes 10-11”, car quitte à coder, autant faire un truc un peu flex (plus pratique en cas de renouvellement matos et même pour d’autres intéressés…).

Évidemment, je ne me lancerai pas dans un truc qui s’adapte à des config trop hétérogènes (smartphone + tablette + ordi…), ce n’est pas non plus mon métier :sweat_smile:

Merci pour ta clarification, c’est effectivement ce à quoi je songeai.

Penses-tu que cela peut avoir une incidence sur la fluidité / vitesse générale d’affichage sur la tablette de faire des multiples appels API ? (En comparaison a juste incorporer les équipements prévus par Jeedom depuis la page de conception des designs).

Aussi cela peut-il surcharger le RPI4 d’une quelconque manière à l’usage ? (A priori non, j’imagine que Jeedomconnect & Co font pareil pour l’accès aux infos ?)

Merci :pray:

Je peux pas trop te parler du plug vu que je dois testé mais j’ai vu l’intégration de tableau HTML donc ?

Le temps sera identique pour moi vu que c’est pareil un widget ou HTML utilisation identique de l’API js… voir moin : de mémoire un vieux sujet avec une image en fond d’écran et des widget minimaliste placé ne nécessitent pas de création ici ou la.
Mais jeedom passe les widgets dans un cache (rafraîchir la page après modif) donc ?

De mon retour d’experience lors de création de widget complexe « liste » l’appel a des class CSS selon la valeur va plus vite que x Eva et multiple fonction CSS via script dans l’interaction/actu donc j’imagine que dans l’affichage aussi puisque le CSS est en mémoire
Enfin c’est se que j’en ai compris,
mais là c’est du domaine du pro

Ça en script a chaque changement 1 seconde

1 « J'aime »

Mon avancement en image :

J’utilise fontawesome 5 free (déjà dans jeedom) pour les icônes, pour gagner du temps.
(Plus tard à voir si design perso avec des img en remplacement…)

Pour l’instant que des infos « statiques » pour bâtir la trame, non encore reliées à Jeedom, ce sera dans un second temps :wink:

2 « J'aime »

pour test sans savoir si ça tiens dans le temps
j’ai crée un fichier html à la racine jeedom
et j’ai collé se qui me semble primordiale pour l’appel API js
et j’y ai glissé une commande
le rendu
image

le code
<!DOCTYPE html>
<html lang="en-US">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="3rdparty/jquery/jquery.min.js?md5=7c14a783dfeb3d238ccd3edd840d82ee"></script>
<script type="text/javascript" src="3rdparty/jquery.utils/jquery.utils.js?md5=5152edffcc6cadb34fb9910b3c93dca7"></script>
<script type="text/javascript" src="core/php/getResource.php?file=core/js/jeedom.class.js&md5=6dc08121ef96ce318243dd72de161148&lang=fr_FR"></script>	
<script>
		jeeFrontEnd.clientDatetime = new Date();
		JEEDOM_PRODUCT_NAME = 'Jeedom';
		JEEDOM_AJAX_TOKEN = '';
	</script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/core.js&md5=b087014af58c0e606e7588b57b67c4e8&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/private.class.js&md5=7d06f01f4819c93aa4a9e2b80a374a1c&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/eqLogic.class.js&md5=6e3a48aebc4e91a5451052afa6a7432e&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/cmd.class.js&md5=56df4555b34819df61ce6b053e2d2c5b&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/object.class.js&md5=92715da47a9b3ba63e1bdd18dac6b575&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/scenario.class.js&md5=0576bf0bfef76590e8cb763f016d59f7&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/plugin.class.js&md5=c275364df1190566dff030384966b733&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/message.class.js&md5=8bff6dc19f6978b76e3c8f7d4a0bceb0&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/view.class.js&md5=8bd59ffe8dee8999fe7eb9ef54b3955b&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/config.class.js&md5=0a7566eed39fc0233380ca09ce950b23&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/history.class.js&md5=e6f8bd900be60b823ab53db1608a2424&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/cron.class.js&md5=d61977d8be9402c20207bf2e51ce2456&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/security.class.js&md5=ee399333f713c039ee05b09d2de6a756&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/update.class.js&md5=c126f0195fb6fd0c3942fb84bf23b0ee&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/user.class.js&md5=620bd782fb11fe98dd56fedb278eaba8&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/backup.class.js&md5=e906de63f766eb0cf7982da5ee89bd83&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/interact.class.js&md5=30c9ba2f8cc6cf1dce3a4627e4ba00a5&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/update.class.js&md5=c126f0195fb6fd0c3942fb84bf23b0ee&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/plan.class.js&md5=4208f75c71897570bf87b19b6e392959&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/plan3d.class.js&md5=3ad717f811e8b52d72caba991962f79e&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/log.class.js&md5=dcb53305ba741be3b7407220744ca64f&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/repo.class.js&md5=d426beee9007bd37fb166619cd35ee60&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/network.class.js&md5=169fd474dcdc04609f4cd102c3089e28&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/dataStore.class.js&md5=b59d90149a89dd10893b78c305eb299a&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/cache.class.js&md5=3b662366c131949d9a061b9c99d04595&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/report.class.js&md5=6cf883728ead7362308e5fb159ee63d2&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/note.class.js&md5=93323372d4cf4b2ef126d081b787870e&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/listener.class.js&md5=08183f2d24a8eab7e0a0b65e6d1a1865&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/widgets.class.js&md5=e1cc49838bf3ad3bd2b1e8acc1c34b62&lang=fr_FR"></script>
	<script type="text/javascript" src="core/php/getResource.php?file=core/js/timeline.class.js&md5=4fa19540bd68d6a9962afa3044d47f94&lang=fr_FR"></script>
	<script type="text/javascript" src="3rdparty/nouislider/nouislider.js?md5=c5899740ad142d6671024f7b47413100"></script>
	<script type="text/javascript" src="3rdparty/bootstrap/bootstrap.min.js?md5=2f34b630ffe30ba2ff2b91e3f3c322a1"></script>
	<script type="text/javascript" src="3rdparty/jquery.ui/jquery-ui.min.js?md5=b0ee8c444fc35533f27e4a3c808493d6"></script>
	<script type="text/javascript" src="3rdparty/jquery.ui/jquery.ui.datepicker.fr.js?md5=f602aeb67566df46868b698beff905f6"></script>
	<script type="text/javascript" src="3rdparty/jquery.ui-touch-punch/jquery.ui.touch-punch.min.js?md5=73ebb9142822e4e184ae5caf8266d9be"></script>
	<script type="text/javascript" src="3rdparty/jquery.toastr/jquery.toastr.min.js?md5=b90b48659b33201bdc9e84dacb1efb98"></script>
	<script type="text/javascript" src="3rdparty/bootbox/bootbox.min.js?md5=467fe508d765524c798276dea5445997"></script>
	<script type="text/javascript" src="3rdparty/highstock/highstock.js?md5=975cc3b63f66280c1bf433ce2d48a200"></script>
	<script type="text/javascript" src="3rdparty/highstock/highcharts-more.js?md5=75b23d7eee9c57e62e6d86786592848b"></script>
	<script type="text/javascript" src="3rdparty/highstock/modules/solid-gauge.js?md5=3eb8608b564b29b3569525b366a8ea09"></script>
	<script type="text/javascript" src="3rdparty/highstock/modules/exporting.js?md5=cc8d952ef697b3c4405f9af3cd6b5986"></script>
	<script type="text/javascript" src="3rdparty/highstock/modules/offline-exporting.js?md5=73898de1e2e582dc5bdafd63220d80c8"></script>
	<script type="text/javascript" src="3rdparty/jquery.at.caret/jquery.at.caret.min.js?md5=2b2418fc5274f872fd366941855147ab"></script>
	<script type="text/javascript" src="3rdparty/jwerty/jwerty.js?md5=910ca201adac76aa8b8bd51ceddf9357"></script>
	<script type="text/javascript" src="3rdparty/jquery.packery/jquery.packery.js?md5=13f935f898fe84c42567dd609f0c4ce4"></script>
	<script type="text/javascript" src="3rdparty/jquery.lazyload/jquery.lazyload.js?md5=5c01d7aff077b4ed0804b71c2e3ab4a1"></script>
	<script type="text/javascript" src="3rdparty/jquery.tooltipster/js/tooltipster.bundle.min.js?md5=a92b74d6787afb5e34d749ce45d2eeb2"></script>
	<script type="text/javascript" src="3rdparty/codemirror/lib/codemirror.js?md5=906c69f4cd75a847061ca8925cd4c790"></script>
	<script type="text/javascript" src="3rdparty/codemirror/addon/edit/matchbrackets.js?md5=0b6e5e59b34f51f8086bd1e39092bc12"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/htmlmixed/htmlmixed.js?md5=c5e1660e5df7066b0a82eb374c91f964"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/clike/clike.js?md5=22ec39a6a342bcc6291c65b924984c3c"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/php/php.js?md5=7c448560cfc9e8c06ba2c13dc3b85209"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/xml/xml.js?md5=e7180867a4312e2e75b2d87253b631d4"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/javascript/javascript.js?md5=7f3360019e83913ec0a90c738c8e1a84"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/css/css.js?md5=0cb3d98d007054d1430105fedf2a09b5"></script>
	<script type="text/javascript" src="3rdparty/codemirror/mode/python/python.js?md5=1c1e3f8cd05fed087c70463244142050"></script>
	<script type="text/javascript" src="3rdparty/jquery.fileupload/jquery.ui.widget.js?md5=3d0f0f5ca5d86c5a4b4fc33cda374a17"></script>
	<script type="text/javascript" src="3rdparty/jquery.fileupload/jquery.iframe-transport.js?md5=f371e8d9f57329f90114d7b52dd5c7a4"></script>
	<script type="text/javascript" src="3rdparty/jquery.fileupload/jquery.fileupload.js?md5=621acae28fe70d4976263a8ea7f8dd12"></script>
	<script type="text/javascript" src="3rdparty/jquery.tablesorter/jquery.tablesorter.min.js?md5=411633a8bb75d440b6045fee64dece95"></script>
	<script type="text/javascript" src="3rdparty/jquery.tablesorter/jquery.tablesorter.widgets.min.js?md5=52132005045d37dd7d2baa0356b40305"></script>
	<script type="text/javascript" src="3rdparty/jquery.tablesorter/parsers/parser-input-select.min.js?md5=956147b4f9354872dac628378ab95019"></script>
	<script type="text/javascript" src="3rdparty/datetimepicker/jquery.datetimepicker.js?md5=b173cdb373ef26c58e45b89992d7a336"></script>
	<script type="text/javascript" src="3rdparty/jquery.cron/jquery.cron.min.js?md5=d2abd106f6fa1a7689b192c8059379b6"></script>
	<script type="text/javascript" src="3rdparty/jquery.contextMenu/jquery.contextMenu.min.js?md5=5e9c2229b6c8833662932ec82ae63487"></script>
	<script type="text/javascript" src="3rdparty/autosize/autosize.min.js?md5=ad0656589d34c18cd55206d4fd2bc0d7"></script>
	<script type="text/javascript" src="3rdparty/moment/moment-with-locales.min.js?md5=65a5016e8598f76b25ff443edb362e62"></script>

	<script src="3rdparty/snap.svg/snap.svg-min.js"></script>
</head>
<body>
  <div class="Eridani78">test
<script>
jeedom.cmd.getHumanCmdName({
	id:'651',
	success:  function(data) {
       $('.Eridani78').text(data);
       var recup_id=data;

 
// var expression1 =  'maxBetween(#[résumé][Heliotrope][Altitude du Soleil]#,Today,Now)';
		var expression1 =  'maxBetween('+recup_id+',Today,Now)';
		
      	jeedom.scenario.testExpression({
		expression: expression1,
		success:  function(data) {
              $('.Eridani78').append(" = "+data.result);
              }
		})
	}
})
</script>
</div>
</body>
</html>

avec ça on code sa page en responsive.

Merci beaucoup @ajja17orange pour ton aide précieuse !
Cela va m’être utile pour la suite :wink:

Pour l’instant, j’en suis toujours avec ma trame / structure en html + css purs, histoire de tout bâtir dans un premier temps.
En second temps, il faudra que je remplace les info statiques mises « pour meubler » le design par des vrais valeurs en temps réel reliée à Jeedom… Ce sera une autre paire de manches :sweat_smile:

Donc, dans l’ordre, mon avancement du jour :

  1. J’ai bossé sur une « tuile type » avec un principe simple (repris en partie de ma référence du 1er post) = un logo central un peu grand, un titre blanc en haut centrée et une constellation de data possibles haut + bas en demi-ton (pour ne pas trop apparaitre et favoriser une lecture en second plan).
    En fonction des tuiles, certains blocs « DataX » seront masqués, ou remplacé par un pictogramme : beaucoup de possibilités à ce niveau !
    Ce qui donne par exemple pour la trame de la « tuile type »:
    Capture d’écran, le 2023-01-04 à 23.07.16

  2. J’ai meublé la trame le principe répercuté sur toutes les tuiles. Parfois, à l’inspiration, j’ai commencé à remplacer les « DataX » par d’autres infos (toujours statiques pour le moment), pour essayer d’obtenir à la fin une sorte d’instantané de ce que devra être le dashboard.
    Parfois un peu de liberté avec quelques couleurs :slight_smile:
    Ne pas se fier aux valeurs car si vous avez bien suivi tout est « bidon » pour l’instant :stuck_out_tongue:
    Ce qui donne:

  3. J’ai reçu ma tablette qui me servira de IHM : c’est une TECLAST T40 Pro, trouvé en promo sur AMZ pour 160€ (!): 10.4", Octo-core 2Ghz, Android 12, 8Go Ram + 128GoDD, Wifi, BT, etc.
    Je suis bluffé pour le prix, hyper bien finie et design alu monobloc.
    Résolution 2000 x 1200px, j’ai adapté mon design sur cette nouvelle base.
    Je joue un peu aussi avec Fully Kiosk que j’ai acheté et découvert en même temps (hyper complet aussi… Appli géniale !)
    Résultat :

2 « J'aime »

Je me pose des questions pour la suite :

  1. Est-ce mieux de laisser la page de dashboard hébergée sur le RPI ? (rubrique Design dans Jeedom)
    Cela peut-il simplifier les appels API d’une façon ou d’une autre qu’il faudra coder ?
    Avec ce principe, le compte l’utilisateur de la tablette est déjà logué…
    Mais quid de la surcharge RPI ?

  2. Peut-on envisager d’héberger la page html du dashboard sur un serveur en dehors du réseau local domotique ? (Mon réseau domotique est déjà accessible de l’extérieur avec IP fixe + domaine).
    J’imagine que cela alourdira les chemins d’accès à renseigner dans le code + quid gestion utilisateur avec API ?

  3. Imaginons x3 tablettes dans un même bâtiment.
    Ces 3 tablettes peuvent-elles pointer vers la même page html hébergée au même endroit ?
    S’agissant d’une page « interactive » ou « dynamique » à terme (avec les valeurs qui se mettent à jour, des boutons d’action, etc) que se passe-il si 2 ou 3 personnes interviennent en même temps sur le même bouton d’action ?
    Je sais que Jeedom (et l’informatique en général) est capable de trier les actions « par ordre d’arrivé » grâce à la finesse de notion de temps en millisecondes, etc, et donc de hérarchiser les actions sur la base du premier arrivé premier servi.
    Est-il préférable d’assigner à chaque tablette un fichier « dashboard.html » différent dédié ?

Merci !

1 « J'aime »

Evolution du jour:

Il me reste :

  • Intégrer un flux RSS dans le carré central « actualité » = pas évident, je m’arrache les cheveux avec les générateurs de widgets html en ligne + ou - fiables, ils font toujours appels à des références externes sur leurs serveurs et j’aimerai tout mettre en local. J’ai essayé parfois en récupérant les scripts java et en les stockant sur le RPI, mais ça n’a pas marché, je retenterai plus tard quand j’aurai la motivation…
    L’ideal serait de pouvoir décoder directement un flux RSS en .xml sans être dépendant de quelconque service web…

  • Détailler la tuile « Musique » juste en dessous = je ferai une version light pour le moment. Je dois intégrer des boutons d’allumage et pilotage de l’ampli. Avec choix de radio, gestion volume, pause, etc. Ce sera aussi un mini-projet dans le projet :sweat_smile:

On y est presque :crossed_fingers: :smile:

1 « J'aime »

Tes questions sont assez complexe pour moi, donc fait des test pour en tiré la solution.

mais pour la 3eme tel, tab, pc sur une même page et tous s’actualise sauf avec une page trop lourde au bout d’un certain moment. Il y a très longtemps et de mémoire via un cron js pour recharge de page : soucis de vidage mémoire pour moi. Le HTML n’est pas prévu pour. Mais avec les machines d’aujourd’hui je doutes (on ne voit plus se genre de problème)

Yes merci @ajja17orange, elles s’adressent aussi globalement à la communauté, si quelqu’un de calé dans ces domaines passe par là :wink:

J’y suis pas encore, mais j’aime bien anticiper du mieux que je peux et je pense que d’ici quelques temps j’en mettrai une autre à l’étage (quand la rénovation sera avancée…). Du coup j’imaginais que 2 personnes puisse régler du chauffage en simultané par exemple, au RDC et R+1 sans se parler.

Mais peut-etre que je vais trop loin, un bon moyen de ne pas se prendre la tête serait de n’avoir qu’une tablette et basta :sweat_smile:

Hello @tou(te)s,

:exploding_head: :blush: :grey_question:

Je suis un peu coincé dans mon avancement, car j’ai des questions de base de noob auxquelles je n’arrive pas à répondre. J’ai besoin d’aide et de conseils, d’avis éclairés, bref d’un (ou plusieurs!) oeil extérieur :face_with_peeking_eye: , pour m’aider à prendre une décision sur les questions / remarques ci-dessous. Désolé en avance si c’est un peu long, j’essaye d’être le plus possible clair dans mon raisonnement :blush:

Maintenant que mon design est à peu près calé « esthétiquement » (ça tourne en statique et ressemble à ce que je veux pour une v1, affichage OK FullyKiosk sans scrollbar, etc…), j’ai des questions existentielles sur la façon de relier cette interface à Jeedom pour lui donner vie.

Il y a plusieurs façons de faire, de l’envisager, j’en vois 2 principales. Je vous les expose en détail ci-dessous, en gardant en tête qu’il va falloir trancher pour ensuite dérouler les modifs sur tout le dashboard :wink:

Mon point d’entrée est la valeur de température de la pièce / zone, dans la première tuile tout en haut à gauche (plus tard celle de consigne sera visible juste à côté, j’ai voulu pour l’instant garder une valeur simple de température de sonde pour l’exemple…):

Je veux lier les 25 deg. C à Jeedom, pour avoir la valeur évoluer en Live.
Et donc 2 façons d’y parvenir (après avoir supprimé la valeur statique de mon code, conservé la <div></div> et conservé le style CSS à appliquer pour garder le rendu esthétique) :

1. La méthode "interface graphique" :

Je fait « clique droit » sur ma page de design, « Ajouter une commmande » (ou ce qu’on veut d’autre pour la suite) :

De là, je choisis celle qui m’intéresse (= température de la cuisine) :

Pour info je l’ai piquée depuis mon équipement thermostat, j’aurai pu aussi depuis l’équipement de ma sonde, je n’ai pas de préférence. Comme l’un (thermostat) affiche aussi l’autre (sonde), c’est la même dans Jeedom si je ne me trompe pas (même ID de commande = ici #554).

Elle apparait « non formatée » évidemment, en tout petit en haut à gauche de l’image suivante.
Donc « clique droit » sur l’élément, et « paramètres d’affichage » :

Puis j’applique une surcouche CSS qui va bien pour modifier le rendu (en prenant soin de cocher fond transparent, texte blanc, et masquer le nom…) :

J’obtiens bien ce que je souhaite (avec en prime l’accès à l’historique des valeurs au survol (et popup du core avec diagramme en cliquant dessus…) :

2. La méthode "code avec requêtes API" :

Cette fois, je n’utilise pas les outils graphique standard Jeedom, et je reprends mon code html en remplaçant la valeur statique de la <div> prévue dans ma trame par un appel API :

Donc, dans le code html de la page du dashboard, cela nous donne par exemple :

Traduction en quelques mots :

  • Je fais un requête API toute simple d’une valeur via la commande fetch(Url)
    (pas trouvé mieux pour l’instant pour un code compact…).
  • Conversion en code json
    (peut-être étape inutile ?)
  • Insertion dans le html à l’intérieur de la balise <t id="tempajax"></t>

Le résultat est identique visuellement à la méthode 1, oui, mais je perds pas mal au change (pour l’instant et sans code supplémentaire) :

  • je n’ai pas accès à l’historique (etc, normal puisque je fais juste un appel « brut » de la data seule). Pas forcément rédhibitoire pour un usage tablette familiale… J’ai suffisamment de moyens autres pour aller chercher les infos dans Jeedom si nécessaire, sur ordinateur par exemple.

  • la valeur ne change pas « en live » et nécessite un rechargement de la page (il faut une nouvelle requête pour récupérer l’info à chaque fois…). Cela doit pouvoir se modifier avec d’autres éléments de code. Ou pas, alternative possible en forçant dans FullyKiosk un rechargement de la page systematique après la sortie de veille (déjà testé), juste pas l’idéal, le mieux serait de fairre comme un cron avec une mise à jour régulière des valeurs (d’ailleurs faudrait-il : a / aller chercher la valeur, ou b / pusher la valeur ? Beaucoup de possibilités en code…)

Synthèse de ma réflexion :

Ces x2 façons de faire sont deux approches assez différentes, avec chacune ses avantages et ses inconvénients, de mon point de vue. D’autant que j’essaye de raisonner « à grande échelle » lorsque toutes les tuiles du dashboard seront peuplées, avec chacune ses multiples data…

- Méthode 1 : interface graphique

    Avantages : plutôt facile et rapide à mettre en place, liée au core de Jeedom,

    Inconvénients : moins précis pour le calage des éléments pour les maniacs comme moi (on les positionne à la mano), lourdeur des surcouches graphiques non nécessaires (ajout + multiplication des équipements, etc) qui multiplient les portions de code à interpréter par le navigateur, surdose d’infos pas forcement nécessaire (accès graphique historique, etc), obligation d’héberger dashboard sur le RPI en production, code source éclaté dans autant de popup à renseigner pour les personnaliser qu’il y a de data sur les tuiles, quid compatibilité du design si passage à Jeedom v5 ou v6 ?

- Méthode 2 : code avec requêtes API

    Avantages : plus flexible, code allégé, indépendant du core pour la partie graphique, possible de délocaliser l'hébergement des html + CSS du design en dehors du RPI (en réseau local, ou même externe d'ailleurs avec le principe des requêtes API), code source regroupé au même endroit,

    Inconvénients : besoin de compétences supplémentaires en code pour le refresh des valeurs (de mon côté en tout cas), possible lourdeur des multiples requêtes API à chaque chargement de page ? (à me confirmer ?),

Évidemment, j’aurai tendance à privilégier la méthode la moins gourmande en ressources in fine.
Pour l’instant, j’envisage d’héberger mon design sur le Jeedom, en laissant les pages de code dans les répertoires prévus.

Si de bonnes ames veulent bien se pencher sur mon sujet, je vous en remercie grandement d’avance !
Au plaisir d’échanger ensemble

:pray: :wink:

Bonsoir,

Beau projet :+1:t2:

L’idée qui me vient en tête pour répondre en partie a tes questions serai de passer par la création d’un plugin !
avec dans celui-ci des cmd que l’user importerai …
Ainsi grâce au plugin, tu aurais la possibilité d’accéder a la fonction toHtml() et d’y intégrer toute les personnalisations que tu souhaites (css…) !

2 « J'aime »

Merci beaucoup @Phpvarious :wink:

Tu veux dire un plugin qui permettrai de glisser une commande au choix dans une tuile ? (Excuse moi c’est un peu flou pour moi ce qu’un plugin pourrait faire dans mon projet…)

Toi qui maîtrise le code comme sa langue maternelle (!), aurais-tu une préférence entre la
méthode graphique ou la méthode par requête API pour l’implémentation des commandes sur le Dashboard ? (cf. mon dernier post).

Je sais que ma méthode API est trop succincte et qu’il manque des choses pour la rendre dynamique. Mais ces choses qu’il faut ajouter ne la rendraient-elle pas aussi lourde que la méthode graphique au final ?!

Avec un plugin tu aurait la possibilité de créer un équipement avec les éléments directement intégré dedans (css, js…) et de pouvoir gérer l’affichage (tuile) grâce a la fonction toHtml(), en gros tu aurait la possibilité d’agir directement sur la tuile, contrairement au widget … qui est accessible a tous les users mais qui agit que sur une commande.

Comme tu l’a précisé dans tes Post précèdent, le choix de la méthode est déterminante en fonction de l’utilisation. Par exemple si tu exporte cette page a l’extérieur, la méthode ne serait forcement pas la même, et l’utilisation de l’API serait indispensable et qui dit exportation du code dit aussi que certaine clef API seront potentiellement exposées (code source…), il faudra donc bien sécurisé cette partie. En restant en Local (design) tu n’a pas a te préoccuper de cette partie, perso je choisirai cette méthode sans hésitation.

C’est aussi mon avis, pour la rendre plus dynamique il faudrait plutôt utiliser les fonctions js du core, mais effectivement sa reviendrai a utiliser la méthode graphique.
dans l’idéale je choisirai la méthode graphique, plus simple a mettre en place pour un simple user, permet aussi la personnalisation de l’affichage de la commande dans la tuile (grid), mais le gros soucis c’est que sa oblige l’user d’afficher la commande avec un widget « line » par exemple, hors sur le dashboard il préfèrera peut être le widget « defaut »

1 « J'aime »

Merci pour ta contrib @Phpvarious :wink:

je vais m’orienter dans cette direction, car elle a l’avantage d’être aussi bcp plus rapide pour moi à ce stade à mettre en place, et ça compte :sweat_smile:

Je laisse le fil ouvert pour vous montrer mon avancement.
Si d’autres on des remarques / avis d’ici là, je reste preneur :wink:
A très vite

Hello,

Alors il est fini ce beau dashbord :wink:

Pour l’instant je m’étais concentré sur le meuble d’entrée qui va accueillir la tablette :wink:

Avec double cloison placo + porte à galandage cachée derrière, arrivee élec dans le meuble de gauche blanc, tout ça tout ça :sweat_smile:

Il me reste l’intégration de la tablette dans la niche vide visible du meuble bois au centre, avec prise commandée et scénario pour recharge batterie.

Ensuite, je me remets au design et je vous partage, c’est promis ! :slight_smile:

2 « J'aime »

Salut @alexcrp, Alors cette intégration :slight_smile: ?

J’ai hâte de voir ça! Je galère autant sur le design que sur la façon d’intégrer la tablette à la maison

Merci, moi aussi j’ai hâte !

Mais je suis un peu sur tous les fronts en ce moment dans cette entrée/couloir (voir ici mon sujet de carillon sonnette en POE…)
Plus l’espace est petit, plus c’est long et compliqué j’ai l’impression :sweat_smile:

Promis je vous posterai des avancées bientôt :+1: