Bonsoir, merci pour les expplications fgtoul ça fonctionne.
Super travail et merci pour tous les tutos !!!
Cordialement
Bonsoir fgtoul,
Ne peut on pas insĂ©rer dans le code javascript que vous avez rĂ©aliser, la possibilitĂ©, en fonction des diffĂ©rents cas/plage de tempĂ©rature, directement lâactivation dâune sortie de lâIPX ?
Merci dâavance,
Bonne soirée
bonjour @nicocau,
câest faisable par scenario avec des comparateurs. De cette maniĂšre, vous conservez le caractĂšre autonome alors quâun widget doit ĂȘtre affichĂ© pour piloter les E/S.
bonne journée
Bonjour,
Je viens de remplacer ma V4 par une V5, je nâarrive plus Ă faire fonctionner les jauges analogiques personnalisĂ©es , aprĂšs plusieurs jours de lecture des blogs je dois passer Ă cotĂ© de quelque chose.
Pouvez-vous mâaider svp?
Voici ce que jâai fait:
jâai crĂ©er un API key
jâai crĂ©er un objet XTHL
et un Widget
<center>
<canvas id=fgtoul1 style="margin-top:15px;" data-type="radial-gauge"
data-width="200"
data-height="200"
data-units="°C"
data-title="Temperature"
data-min-value="-10"
data-max-value="50"
data-major-ticks="[-10,0,10,20,30,40,50]"
data-minor-ticks="5"
data-stroke-ticks="true"
data-highlights='[
{"from": -10, "to": 0, "color": "rgba(0,0, 255, .3)"},
{"from": 0, "to": 50, "color": "rgba(255, 0, 0, .3)"}
]'
data-ticks-angle="225"
data-start-angle="67.5"
data-color-major-ticks="#ddd"
data-color-minor-ticks="#ddd"
data-color-title="#eee"
data-color-units="#ccc"
data-color-numbers="#eee"
data-color-plate="#222"
data-border-shadow-width="0"
data-borders="true"
data-needle-type="arrow"
data-needle-width="4"
data-needle-circle-size="7"
data-needle-circle-outer="true"
data-needle-circle-inner="false"
data-animation-duration="1500"
data-animation-rule="linear"
data-color-border-outer="#333"
data-color-border-outer-end="#111"
data-color-border-middle="#222"
data-color-border-middle-end="#111"
data-color-border-inner="#111"
data-color-border-inner-end="#333"
data-color-needle-shadow-down="#333"
data-color-needle-circle-outer="#333"
data-color-needle-circle-outer-end="#111"
data-color-needle-circle-inner="#111"
data-color-needle-circle-inner-end="#222"
data-value-box-border-radius="0"
data-color-value-box-rect="#222"
data-color-value-box-rect-end="#333"
data-font-value="Led"
></canvas>
</center>
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js" > </script>
<script type="text/javascript">
let IPX_apiKey="3DDuTtHzipidtXJ"; //renseignez votre apikey IPX
let idxths1="30010f1d"; //xths1 sur canal 0
var gauge1;
function initb() {
getStateb((ipxb) => {
gauge1 = document.gauges.get("fgtoul1");
gauge1.value=parseFloat(ipxb.anaPhVal)/100; // pH sur X200 canal 0 sur X-Bridge
});
}
function getStateb(cb) {
fetch("/api/ebx/xths1/" + idxths1 + "?ApiKey=" + IPX_apiKey, {method: "GET"}).then((ret) => { // Get IPX object
ret.json().then((ipxb) => {
cb(ipxb);
});
});
}
/* Auto refresh (optional) */
function autoRefreshb() {
setInterval(() => {
initb();
}, 60000); // 60 sec
}
initb();
autoRefreshb();
</script>
Mais rien ne fonctionne
Bonjour,
les widgets Html V4 et V5 ne fonctionnent pas de la mĂȘme maniĂšre.
Un réadaptation est nécessaire.
Vous trouverez un exemple de widget retravaillĂ© pour lâipx800 V5 dans ce post:
Bonne journée
Merci beaucoup, jâĂ©tais passĂ© Ă cotĂ© de ce tuto
ce tuto est antĂ©rieur Ă lâarrivĂ©e de lâAPI HTML Widget. Vous pouvez adapter le javascript pour utiliser cette API (recommandĂ©).
Bonjour Ă tous,
V5 : Affichage de la direction des vents - Cartes Ethernet IPX800 / Tutoriels - GCE Electronics - Forum domotique - IPX800 - EcoDevices etcâŠ
Dans le tuto en lien ci-dessus, vous trouverez un code Ă jour pour lâIPX800 V5, utilisant lâAPI Widget HTML comme prĂ©conisĂ©.

Le tutoriel prĂ©sente un widget spĂ©cifique Ă lâaffichage de la direction du vent mais sâadapte Ă tous les types de jauges Canvas-Gauge.
Bonne journée
Pensez à mettre vos Canvas-Gauges à jour en modifiant la référence à la librairie sur vos dashboards V4 ou V5.
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.7/all/gauge.min.js""/>
Vous pourrez surveiller les mises Ă jour sur cette page :
canvas-gauges/download at gh-pages · Mikhus/canvas-gauges · GitHub
Nâutilisez pas le lien vers « Latest ». Certes la derniĂšre version serait automatiquement tĂ©lĂ©chargĂ©e Ă lâouverture du dashboard, mais en cas de modification profonde de lâAPI, vos widgets risqueraient de ne plus fonctionner. Il faut toujours vĂ©rifier le bon fonctionnement dâune version avant de lâappliquer.
Bonjour Ă tous,
Je suis parti de cette excellente idĂ©e de pour essayer de lâadapter Ă ma configuration basĂ©e sur une IPX800v5 et une pompe Ă vitesse variable. La plage de la vitesse V1 dont les limites horaires basse (Hmin) et haute (Hmax) sont calculĂ©es par des fonctions et stockĂ©es dans des variables analogiques Hmin et Hmax, sâaffiche en jaune, et lâheure courante stockĂ©e dans la variable H est indiquĂ©e par lâaiguille verte.
Malheureusement le widget ne se met pas Ă jour, sauf si je rentre manuellement ces valeurs, ce qui nâest pas lâesprit. Il doit donc y avoir quelque chose Ă corriger dans le script.
<canvas id="filtration" data-type="radial-gauge"
data-width="190"
data-height="190"
data-min-value="0"
data-max-value="24"
data-major-ticks="0,2,4,6,8,10,12,14,16,18,20,22,0"
data-minor-ticks="2"
data-stroke-ticks="true"
data-highlights="[]"
data-color-plate="transparent"
data-color-major-ticks="#ccc"
data-color-minor-ticks="#ccc"
data-color-numbers="#ccc"
data-color-needle="#1f8f1f"
data-color-needle-end="#1f8f1f"
data-needle-circle-size="7"
data-needle-circle-outer="true"
data-needle-circle-inner="false"
data-animation-rule="linear"
data-animate-on-init="false"
data-animated-value="true"
data-value="0"
data-value-box="false"
data-borders="0"
data-border-shadow-width="0"
data-start-angle="0"
data-ticks-angle="360"> <!-- cercle complet -->
</canvas>
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js"></script>
<script>
var H = 327746;
var Hmin = 327698;
var Hmax = 327727;
var gaugeId = "filtration";
window.GCE_Refresh.push(function(data) {
switch (data['_id']) {
case H:
updateGauge(gaugeId, data.value);
break;
case Hmin:
Hmin = data.value;
updateHighlight();
break;
case Hmax:
Hmax = data.value;
updateHighlight();
break;
}
});
function init() {
GCE_API.getANA(H).then((ret) => {
updateGauge(gaugeId, ret.value);
});
GCE_API.getANA(Hmin).then((ret) => {
Hmin = ret.value;
updateHighlight();
});
GCE_API.getANA(Hmax).then((ret) => {
Hmax = ret.value;
updateHighlight();
});
}
function updateGauge(id, d) {
document.gauges.get(id).value = d;
}
function updateHighlight() {
let g = document.gauges.get(gaugeId);
if (Hmin < Hmax) {
g.update({ highlights: [{ from: Hmin, to: Hmax, color: "rgba(241,210,8,1)"}],
highlightsWidth: 8 // épaisseur réduite
});
} else {
g.update({ highlights: [] }); // si incohérent
}
}
init();
</script>
Cordialement,
DA
Je prĂ©cise que jâai fait ça avec lâaide de Chat GPT
@Argi-78
Y a pas de honte !
âŠ
LâIA en 2025 câest le google de 2000âŠmais en plus Ă©voluĂ© ! ĂĂ fait pas tout faut aussi un cerveau derriĂšre pour analyser, trier, orchestrer mais ça dĂ©broussaille bien, voire trĂšs bien mais des fois ça part grave en sucette donc faut y aller petit bout par petit bout ! ![]()
Mais je nâai pas honte
.
Effectivement je mis Chat GPT sur la voie Chat GPT et il nâa finalement pas plus que moi rĂ©ussi Ă faire fonctionner le widget complĂštement.
Bonne soirée
Bonjour,
comme souvent dit, il y a toujours un gros travail de dĂ©bogage derriĂšre lâIA.
Jâai souvent remarquĂ© que le endpoint getAna de lâapi ne fonctionnait pas @gce @Jeremy_GCE
A la place jâai pris lâhabitude dâutiliser GCE_API.get("/api/core/ana/id")
Jâai Ă©galement pris lâhabitude de mettre un setTimeout pour mâassurer que le DOM est complĂštement chargĂ© avant de faire appel Ă getElementById() par exemple.
Dans votre code, lâIA fait un mauvais usage des variables Hmax et Hmin. Elle contiennent initialement lâid des analogiques, puis le code remplace lâid par la valeur lue avec lâAPI. Il faut donc utiliser des variables supplĂ©mentaires.
Pour finir, il manquait un update derriĂšre le changement de valeur de la jauge.
Voici un code corrigé (sans IA) mais non testé :
<canvas id="filtration" data-type="radial-gauge"
data-width="190"
data-height="190"
data-min-value="0"
data-max-value="24"
data-major-ticks="0,2,4,6,8,10,12,14,16,18,20,22,0"
data-minor-ticks="2"
data-stroke-ticks="true"
data-highlights="[]"
data-color-plate="transparent"
data-color-major-ticks="#ccc"
data-color-minor-ticks="#ccc"
data-color-numbers="#ccc"
data-color-needle="#1f8f1f"
data-color-needle-end="#1f8f1f"
data-needle-circle-size="7"
data-needle-circle-outer="true"
data-needle-circle-inner="false"
data-animation-rule="linear"
data-animate-on-init="false"
data-animated-value="true"
data-value="0"
data-value-box="false"
data-borders="0"
data-border-shadow-width="0"
data-start-angle="0"
data-ticks-angle="360"> <!-- cercle complet -->
</canvas>
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js"></script>
<script>
var H = 327746;
var Hmin = 327698,hmin=0.0;
var Hmax = 32772,hmax=0.0;
var gaugeId = "filtration";
window.GCE_Refresh.push(function(data) {
switch (data['_id']) {
case H:
updateGauge(data.value);
break;
case Hmin:
hmin = data.value;
updateHighlight();
break;
case Hmax:
hmax = data.value;
updateHighlight();
break;
}
});
function init() {
GCE_API.get(`/api/core/ana/${H}`).then((ret) => {
updateGauge(ret.value);
});
GCE_API.get(`/api/core/ana/${Hmin}`).then((ret) => {
hmin = ret.value;
updateHighlight();
});
GCE_API.get(`/api/core/ana/${Hmax}`).then((ret) => {
hmax = ret.value;
updateHighlight();
});
}
function updateGauge(d) {
let g=document.gauges.get(gaugeId);
g.value = d;
g.update({ value: d });
}
function updateHighlight() {
let g = document.gauges.get(gaugeId);
if (hmin < hmax) {
g.update({ highlights: [{ from: hmin, to: hmax, color: "rgba(241,210,8,1)"}],
highlightsWidth: 8 // épaisseur réduite
});
} else {
g.update({ highlights: [] }); // si incohérent
}
}
setTimeout(init,500);
</script>
Bonne journée
Merci,
Ca fonctionne parfaitement sur lâinterface web.
Par contre la jauge ne sâaffiche pas sur lâappli IOS.
Bonne soirée,
Bonjour,
je pense que câest lâAPI Widget HTML qui ne fonctionne pas dans lâapplication que ce soit Android ou iOS
@GCE
Je viens de vérifier le code, voici un visuel pour ceux qui sont intéressés.
Ajustement dynamique des Highlights et variation de la valeur de la jauge.

Pour reprendre mon widget V4 présenté plus haut mais en jauge linéaire
Voici lâadaptation en V5
Code
<canvas style="margin-top:1px;" id=filtration data-type="linear-gauge"
data-width="290"
data-height="90"
data-min-value="0"
data-max-value="24"
data-border-radius="0"
data-borders="0"
data-bar-begin-circle="false"
data-title=""
data-units=""
data-bar-stroke="false"
data-bar-width="7"
data-highlights : '[]'
data-tick-side="left"
data-major-ticks="0,,2,,4,,6,,8,,10,,12,,14,,16,,18,,20,,22,,24"
data-minor-ticks="0.5"
data-color-plate="transparent"
data-color-numbers="#ccc"
data-color-major-ticks="#ccc"
data-color-bar-stroke="#444"
data-number-side="left"
data-needle-side="right"
data-animate-on-init="false"
data-animated-value="true"
data-value="0"
></canvas>
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js"></script>
<script>
var H = 327746;
var Hmin = 327698,hmin=0.0;
var Hmax = 32772,hmax=0.0;
var gaugeId = "filtration";
window.GCE_Refresh.push(function(data) {
switch (data['_id']) {
case H:
updateGauge(data.value);
break;
case Hmin:
hmin = data.value;
updateHighlight();
break;
case Hmax:
hmax = data.value;
updateHighlight();
break;
}
});
function init() {
GCE_API.get(`/api/core/ana/${H}`).then((ret) => {
updateGauge(ret.value);
});
GCE_API.get(`/api/core/ana/${Hmin}`).then((ret) => {
hmin = ret.value;
updateHighlight();
});
GCE_API.get(`/api/core/ana/${Hmax}`).then((ret) => {
hmax = ret.value;
updateHighlight();
});
}
function updateGauge(d) {
let g=document.gauges.get(gaugeId);
g.value = d;
g.update({ value: d });
}
function updateHighlight() {
let g = document.gauges.get(gaugeId);
if (hmin < hmax) {
g.update({ highlights: [{ from: hmin, to: hmax, color: "rgba(241,210,8,1)"}],
highlightsWidth: 8 // épaisseur réduite
});
} else {
g.update({ highlights: [] }); // si incohérent
}
}
setTimeout(init,500);
</script>
Et voici le code pour un widget qui se met automatiquement Ă lâheure en fonction de lâheure locale (pas besoin de crĂ©er de fonctions sur IPX). Seuls les Highlights sont gĂ©rĂ©s par lâIPX.
Code
<canvas style="margin-top:1px;" id=filtration data-type="linear-gauge"
data-width="290"
data-height="90"
data-min-value="0"
data-max-value="24"
data-border-radius="0"
data-borders="0"
data-bar-begin-circle="false"
data-title=""
data-units=""
data-bar-stroke="false"
data-bar-width="7"
data-highlights : '[]'
data-tick-side="left"
data-major-ticks="0,,2,,4,,6,,8,,10,,12,,14,,16,,18,,20,,22,,24"
data-minor-ticks="0.5"
data-color-plate="transparent"
data-color-numbers="#222"
data-color-major-ticks="#222"
data-color-bar-stroke="#444"
data-number-side="left"
data-needle-side="right"
data-animate-on-init="false"
data-animated-value="true"
data-value:"0"
></canvas>
<script async src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js"></script>
<script>
var Hmin = 262300,hmin=0;
var Hmax = 262301,hmax=0;
var gaugeId = "filtration";
window.GCE_Refresh.push(function(data) {
switch (data['_id']) {
case Hmin:
hmin = data.value;
updateHighlight();
break;
case Hmax:
hmax = data.value;
updateHighlight();
break;
}
});
function init() {
GCE_API.get(`/api/core/ana/${Hmin}`).then((ret) => {
hmin = ret.value;
updateHighlight();
});
GCE_API.get(`/api/core/ana/${Hmax}`).then((ret) => {
hmax = ret.value;
updateHighlight();
});
updateGauge();
}
function updateGauge() {
let g=document.gauges.get(gaugeId);
let d= heureDecimaleNow();
//g.value=d;
g.update({ value: d });
}
function updateHighlight() {
let g = document.gauges.get(gaugeId);
if (hmin < hmax) {
g.update({ highlights: [{ from: hmin, to: hmax, color: "rgba(241,210,8,1)"}],
highlightsWidth: 8 // épaisseur réduite
});
} else {
g.update({ highlights: [] }); // si incohérent
}
}
function heureDecimaleNow() {
const date = new Date(); // Heure locale actuelle
const heures = date.getHours();
const minutes = date.getMinutes();
const secondes = date.getSeconds();
return heures + minutes / 60 + secondes / 3600;
}
setTimeout(() => {
init(); // Appel initial aprĂšs 500 ms
setInterval(updateGauge, 60000); // Ensuite, appel toutes les minutes
}, 500);
//init();
</script>
Bonne journée
Bonjour,
Merci.
Peut-ĂȘtre sur une mise Ă jour prochaine pour lâappli.
En attendant jâai mis un lien vers lâinterface web sur lâĂ©cran dâaccueil de mon smartphone.
Bonne journée






