From 6ae623ab2220520a8b055a75d8148e5de7151410 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:20:15 +0100 Subject: [PATCH 01/24] bugfix on templates --- .vscode/cspell.json | 2 + core/template/dashboard/AsusWRT.html | 364 ++++++++++------- core/template/dashboard/Monitoring.html | 509 ++++++++++++++---------- 3 files changed, 524 insertions(+), 351 deletions(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 00eadc69..4e41ac8a 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -36,6 +36,8 @@ "Equipement", "esata", "Etat", + "Eteindre", + "Etes", "firmver", "Formated", "freebsd", diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html index 42cd756a..7e6931f4 100644 --- a/core/template/dashboard/AsusWRT.html +++ b/core/template/dashboard/AsusWRT.html @@ -197,6 +197,26 @@ (() => { 'use strict' + // Get reference to this specific widget container + const widgetRoot = document.querySelector('.eqLogic-widget[data-eqLogic_uid="#uid#"]') + if (!widgetRoot) return + + /** + * Safely parse JSON from data attribute + * @param {string} jsonString - JSON string to parse + * @param {object} fallback - Fallback value if parsing fails + * @returns {object} Parsed object or fallback + */ + const safeJSONParse = (jsonString, fallback = {min: '-', avg: '-', max: '-'}) => { + if (!jsonString || jsonString === 'undefined' || jsonString === '') return fallback + try { + return JSON.parse(jsonString) + } catch (e) { + console.warn('[Monitoring AsusWRT] JSON parse error:', e, 'Input:', jsonString) + return fallback + } + } + // ======================================== // === UTILITY FUNCTIONS === // ======================================== @@ -285,7 +305,8 @@ * Initialize SSH connection status icon */ const initIconSSH = () => { - const iconSSH = document.getElementById('iconSSH#id#') + try { + const iconSSH = widgetRoot.querySelector('#iconSSH#id#') if (!iconSSH) return if ('#cnx_ssh#' === 'OK') { @@ -293,13 +314,17 @@ } else if ('#cnx_ssh#' === 'KO') { iconSSH.innerHTML = '' } - } - - /** - * Initialize Cron status icon - */ - const initIconCron = () => { - const iconCron = document.getElementById('iconCron#id#') + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initIconSSH:', e) + } + } + + /** + * Initialize Cron status icon + */ + const initIconCron = () => { + try { + const iconCron = widgetRoot.querySelector('#iconCron#id#') if (!iconCron) return const isOn = '#cron_status#' === '1' @@ -312,13 +337,17 @@ const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') iconCron.innerHTML = `` - } - - /** - * Initialize Check Firmware icon - */ - const initIconCheckFirmware = () => { - const el = document.getElementById('iconCheckFirmware#id#') + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initIconCron:', e) + } + } + + /** + * Initialize firmware check icon + */ + const initIconCheckFirmware = () => { + try { + const el = widgetRoot.querySelector('#iconCheckFirmware#id#') if (!el) return if ('#asus_fw_check#' === '1') { @@ -326,17 +355,21 @@ } else if ('#asus_fw_check#' === '0') { el.innerHTML = '' } - } - - // ======================================== - // === BUTTON HANDLERS === - // ======================================== - - /** - * Initialize Reboot button with confirmation dialog - */ + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initIconCheckFirmware:', e) + } + } + + // ======================================== + // === BUTTON HANDLERS === + // ======================================== + + /** + * Initialize Reboot button with confirmation dialog + */ const initRebootButton = () => { - const rebootBtn = document.querySelector('.reboot[data-cmd_id="#cmd_reboot_id#"]') + try { + const rebootBtn = widgetRoot.querySelector('.reboot[data-cmd_id="#cmd_reboot_id#"]') rebootBtn?.addEventListener('click', () => { jeeDialog.confirm({ title: ' Redémarrer l\'équipement', @@ -348,13 +381,17 @@ callback: result => result && jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) }) }) - } - - /** - * Initialize Refresh button - */ - const initRefreshButton = () => { - const refreshBtn = document.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh') + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initRebootButton:', e) + } + } + + /** + * Initialize Refresh button + */ + const initRefreshButton = () => { + try { + const refreshBtn = widgetRoot.querySelector('.refresh') if (!refreshBtn) return if ('#refresh_id#' !== '') { @@ -362,84 +399,112 @@ } else { refreshBtn.remove() } - } - - // ======================================== - // === VALUE DISPLAYS - Simple === - // ======================================== - - /** - * Initialize Uptime display - */ - const initUptime = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initRefreshButton:', e) + } + } + + // ======================================== + // === VALUE DISPLAYS - Simple === + // ======================================== + + /** + * Initialize Uptime display + */ + const initUptime = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const uptimeEl = document.getElementById('uptime#id#') + const uptimeEl = widgetRoot.querySelector('#uptime#id#') if (uptimeEl) uptimeEl.innerHTML = '#uptime#' - } - - /** - * Initialize Network Infos display - */ - const initNetworkInfos = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initUptime:', e) + } + } + + /** + * Initialize Network Infos display + */ + const initNetworkInfos = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const networkInfosEl = document.getElementById('network_infos#id#') + const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' - } - - /** - * Initialize Network Traffic display - */ - const initNetwork = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initNetworkInfos:', e) + } + } + + /** + * Initialize Network display + */ + const initNetwork = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const networkEl = document.getElementById('network#id#') + const networkEl = widgetRoot.querySelector('#network#id#') if (networkEl) networkEl.innerHTML = '#network#' - } - - /** - * Initialize Asus Clients display - */ - const initAsusClients = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initNetwork:', e) + } + } + + /** + * Initialize Asus Clients display + */ + const initAsusClients = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = document.getElementById('asus_clients#id#') + const el = widgetRoot.querySelector('#asus_clients#id#') if (el) el.innerHTML = '#asus_clients#' - } - - /** - * Initialize Asus WAN IP display - */ - const initAsusWan0IP = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initAsusClients:', e) + } + } + + /** + * Initialize Asus WAN0 IP display + */ + const initAsusWan0IP = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = document.getElementById('asus_wan0_ip#id#') + const el = widgetRoot.querySelector('#asus_wan0_ip#id#') if (el) el.innerHTML = 'IP (WAN) : #asus_wan0_ip#' - } - - /** - * Initialize Asus WiFi Temperature display - */ - const initAsusWifiTemp = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initAsusWan0IP:', e) + } + } + + /** + * Initialize Asus WiFi Temperature display + */ + const initAsusWifiTemp = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = document.getElementById('asus_wifi_temp#id#') + const el = widgetRoot.querySelector('#asus_wifi_temp#id#') if (el) el.innerHTML = '#asus_wifi_temp#' - } - - // ======================================== - // === VALUE DISPLAYS - With Thresholds === - // ======================================== - - /** - * Initialize Load Average displays (1mn, 5mn, 15mn) - */ - const initLoadAverage = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initAsusWifiTemp:', e) + } + } + + // ======================================== + // === VALUE DISPLAYS - With Thresholds === + // ======================================== + + /** + * Initialize Load Average displays (1mn, 5mn, 15mn) + */ + const initLoadAverage = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return // Load avg 1mn - const loadAvg1mn = document.getElementById('load_avg_1mn#id#') + const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { const html = buildThresholdHTML( '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', @@ -451,7 +516,7 @@ } // Load avg 5mn - const loadAvg5mn = document.getElementById('load_avg_5mn#id#') + const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') if (loadAvg5mn) { const html = buildThresholdHTML( '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', @@ -463,7 +528,7 @@ } // Load avg 15mn - const loadAvg15mn = document.getElementById('load_avg_15mn#id#') + const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') if (loadAvg15mn) { const html = buildThresholdHTML( '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', @@ -473,15 +538,19 @@ ) loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` } - } - - /** - * Initialize Memory display with percentage - */ - const initMemory = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initLoadAverage:', e) + } + } + + /** + * Initialize Memory display with percentage + */ + const initMemory = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const memoryEl = document.getElementById('memory_available_percent#id#') + const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#') if (!memoryEl) return const value = '#memory_available_percent#' @@ -496,15 +565,19 @@ { min: '#memory_available_percent_minHistory#', avg: '#memory_available_percent_averageHistory#', max: '#memory_available_percent_maxHistory#' }, '#memory_available_percent_tendance#', '#memory# (', '%', true ) - } - - /** - * Initialize Swap display with percentage - */ - const initSwap = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initMemory:', e) + } + } + + /** + * Initialize Swap display with percentage + */ + const initSwap = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const swapEl = document.getElementById('swap_free_percent#id#') + const swapEl = widgetRoot.querySelector('#swap_free_percent#id#') if (!swapEl) return const value = '#swap_free_percent#' @@ -519,15 +592,19 @@ { min: '#swap_free_percent_minHistory#', avg: '#swap_free_percent_averageHistory#', max: '#swap_free_percent_maxHistory#' }, '#swap_free_percent_tendance#', '#swap# (', '%', true ) - } - - /** - * Initialize HDD display with percentage - */ - const initHDD = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initSwap:', e) + } + } + + /** + * Initialize HDD display with percentage + */ + const initHDD = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const hddEl = document.getElementById('hdd#id#') + const hddEl = widgetRoot.querySelector('#hdd#id#') if (!hddEl) return const value = '#hdd_free_percent#' @@ -542,21 +619,25 @@ { min: '#hdd_free_percent_minHistory#', avg: '#hdd_free_percent_averageHistory#', max: '#hdd_free_percent_maxHistory#' }, '#hdd_free_percent_tendance#', '#hdd# (', '%', true ) - } - - /** - * Initialize CPU display with optional temperature - */ - const initCPU = () => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initHDD:', e) + } + } + + /** + * Initialize CPU display with optional temperature + */ + const initCPU = () => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const cpuEl = document.getElementById('cpu#id#') + const cpuEl = widgetRoot.querySelector('#cpu#id#') if (!cpuEl) return if ('#cpu_temp#' !== '' && '#cpu_temp_display#' === 'block') { cpuEl.innerHTML = '#cpu# ' - const tempEl = document.getElementById('cpu_temp#id#') + const tempEl = widgetRoot.querySelector('#cpu_temp#id#') if (!tempEl) return const temp = parseFloat('#cpu_temp#') @@ -569,18 +650,22 @@ } else { cpuEl.innerHTML = '#cpu#' } - } - - /** - * Initialize custom command display (perso1-4) using data attributes - * @param {HTMLElement} container - The container div with data-perso-* attributes - */ - const initPerso = (container) => { + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initCPU:', e) + } + } + + /** + * Initialize custom command display (perso1-4) using data attributes + * @param {HTMLElement} container - The container div with data-perso-* attributes + */ + const initPerso = (container) => { + try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const dataset = container.dataset const persoId = dataset.persoId - const el = document.getElementById(`${persoId}_unite#id#`) + const el = widgetRoot.querySelector(`#${persoId}_unite#id#`) if (!el) return const value = dataset.persoValue @@ -588,15 +673,18 @@ el.innerHTML = '' return } - - const val = parseFloat(value) - const low = parseFloat(dataset.persoLow) - const high = parseFloat(dataset.persoHigh) - const history = JSON.parse(dataset.persoHistory) - const title = `Stats : ${dataset.persoName}
Min: ${history.min} | Moy : ${history.avg} | Max : ${history.max}` - const color = getColorStyle(val, low, high, false) - - el.innerHTML = `${value}${dataset.persoUnite}${dataset.persoTendance}` + + const val = parseFloat(value) + const low = parseFloat(dataset.persoLow) + const high = parseFloat(dataset.persoHigh) + const history = safeJSONParse(dataset.persoHistory) + const title = `Stats : ${dataset.persoName}
Min: ${history.min} | Moy : ${history.avg} | Max : ${history.max}` + const color = getColorStyle(val, low, high, false) + + el.innerHTML = `${value}${dataset.persoUnite}${dataset.persoTendance}` + } catch (e) { + console.error('[Monitoring AsusWRT] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e) + } } // ======================================== @@ -632,7 +720,7 @@ initCPU() // Custom commands - generic initialization using data attributes - document.querySelectorAll('[data-perso-id]').forEach(initPerso) + widgetRoot.querySelectorAll('[data-perso-id]').forEach(initPerso) } })() diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index 2e715e2a..6519d202 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -259,10 +259,30 @@ (() => { 'use strict' + // Get reference to this specific widget container + const widgetRoot = document.querySelector('.eqLogic-widget[data-eqLogic_uid="#uid#"]') + if (!widgetRoot) return + // ======================================== // === UTILITY FUNCTIONS === // ======================================== + /** + * Safely parse JSON from data attribute + * @param {string} jsonString - JSON string to parse + * @param {object} fallback - Fallback value if parsing fails + * @returns {object} Parsed object or fallback + */ + const safeJSONParse = (jsonString, fallback = {min: '-', avg: '-', max: '-'}) => { + if (!jsonString || jsonString === 'undefined' || jsonString === '') return fallback + try { + return JSON.parse(jsonString) + } catch (e) { + console.warn('[Monitoring] JSON parse error:', e, 'Input:', jsonString) + return fallback + } + } + /** * Calculate color style based on thresholds * @param {number} val - Current value @@ -347,13 +367,17 @@ * Initialize SSH connection status icon */ const initIconSSH = () => { - const iconSSH = document.getElementById('iconSSH#id#') - if (!iconSSH) return - - if ('#cnx_ssh#' === 'OK') { - iconSSH.innerHTML = '' - } else if ('#cnx_ssh#' === 'KO') { - iconSSH.innerHTML = '' + try { + const iconSSH = widgetRoot.querySelector('#iconSSH#id#') + if (!iconSSH) return + + if ('#cnx_ssh#' === 'OK') { + iconSSH.innerHTML = '' + } else if ('#cnx_ssh#' === 'KO') { + iconSSH.innerHTML = '' + } + } catch (e) { + console.error('[Monitoring] Error in initIconSSH:', e) } } @@ -361,19 +385,23 @@ * Initialize Cron status icon */ const initIconCron = () => { - const iconCron = document.getElementById('iconCron#id#') - if (!iconCron) return - - const isOn = '#cron_status#' === '1' - const isCustom = '#cron_status_custom#' === '1' - const display = '#cron_status_display#' - - const icon = isOn ? 'play-circle' : 'pause-circle' - const label = isOn ? 'ON' : 'OFF' - const customLabel = isCustom ? 'Custom' : 'Default' - const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') - - iconCron.innerHTML = `` + try { + const iconCron = widgetRoot.querySelector('#iconCron#id#') + if (!iconCron) return + + const isOn = '#cron_status#' === '1' + const isCustom = '#cron_status_custom#' === '1' + const display = '#cron_status_display#' + + const icon = isOn ? 'play-circle' : 'pause-circle' + const label = isOn ? 'ON' : 'OFF' + const customLabel = isCustom ? 'Custom' : 'Default' + const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') + + iconCron.innerHTML = `` + } catch (e) { + console.error('[Monitoring] Error in initIconCron:', e) + } } // ======================================== @@ -384,53 +412,65 @@ * Initialize Reboot button with confirmation dialog */ const initRebootButton = () => { - const rebootBtn = document.querySelector('.reboot[data-cmd_id="#cmd_reboot_id#"]') - rebootBtn?.addEventListener('click', () => { - jeeDialog.confirm({ + try { + const rebootBtn = widgetRoot.querySelector('.reboot[data-cmd_id="#cmd_reboot_id#"]') + rebootBtn?.addEventListener('click', () => { + jeeDialog.confirm({ title: ' Redémarrer l\'équipement', message: 'Etes-vous sûr de vouloir redémarrer l\'équipement #name# ?', - buttons: { - confirm: { label: 'Redémarrer', className: 'warning' }, - cancel: { label: 'Annuler', className: 'info' } - }, - callback: (result) => { - if (result) jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) - } + buttons: { + confirm: { label: 'Redémarrer', className: 'warning' }, + cancel: { label: 'Annuler', className: 'info' } + }, + callback: (result) => { + if (result) jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) + } + }) }) - }) + } catch (e) { + console.error('[Monitoring] Error in initRebootButton:', e) + } } /** * Initialize Poweroff button with confirmation dialog */ const initPoweroffButton = () => { - const poweroffBtn = document.querySelector('.poweroff[data-cmd_id="#cmd_poweroff_id#"]') - poweroffBtn?.addEventListener('click', () => { - jeeDialog.confirm({ + try { + const poweroffBtn = widgetRoot.querySelector('.poweroff[data-cmd_id="#cmd_poweroff_id#"]') + poweroffBtn?.addEventListener('click', () => { + jeeDialog.confirm({ title: ' Eteindre l\'équipement', message: 'Etes-vous sûr de vouloir éteindre l\'équipement #name# ?', - buttons: { - confirm: { label: 'Eteindre', className: 'danger' }, - cancel: { label: 'Annuler', className: 'info' } - }, - callback: (result) => { - if (result) jeedom.cmd.execute({ id: '#cmd_poweroff_id#' }) - } + buttons: { + confirm: { label: 'Eteindre', className: 'danger' }, + cancel: { label: 'Annuler', className: 'info' } + }, + callback: (result) => { + if (result) jeedom.cmd.execute({ id: '#cmd_poweroff_id#' }) + } + }) }) - }) + } catch (e) { + console.error('[Monitoring] Error in initPoweroffButton:', e) + } } /** * Initialize Refresh button */ const initRefreshButton = () => { - const refreshBtn = document.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh') - if (!refreshBtn) return - - if ('#refresh_id#' !== '') { - refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) - } else { - refreshBtn.remove() + try { + const refreshBtn = widgetRoot.querySelector('.refresh') + if (!refreshBtn) return + + if ('#refresh_id#' !== '') { + refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) + } else { + refreshBtn.remove() + } + } catch (e) { + console.error('[Monitoring] Error in initRefreshButton:', e) } } @@ -442,30 +482,45 @@ * Initialize Uptime display */ const initUptime = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const uptimeEl = document.getElementById('uptime#id#') - if (uptimeEl) uptimeEl.innerHTML = '#uptime#' + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const uptimeEl = widgetRoot.querySelector('#uptime#id#') + if (uptimeEl) uptimeEl.innerHTML = '#uptime#' + } catch (e) { + console.error('[Monitoring] Error in initUptime:', e) + } } /** * Initialize Network Infos display */ const initNetworkInfos = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const networkInfosEl = document.getElementById('network_infos#id#') - if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') + if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' + } catch (e) { + console.error('[Monitoring] Error in initNetworkInfos:', e) + } } /** * Initialize Network Traffic display */ const initNetwork = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const networkEl = document.getElementById('network#id#') - if (networkEl) networkEl.innerHTML = '#network#' + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const networkEl = widgetRoot.querySelector('#network#id#') + if (networkEl) { + const history = {min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#'} + networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) + } + } catch (e) { + console.error('[Monitoring] Error in initNetwork:', e) + } } // ======================================== @@ -476,42 +531,46 @@ * Initialize Load Average displays (1mn, 5mn, 15mn) */ const initLoadAverage = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - // Load avg 1mn - const loadAvg1mn = document.getElementById('load_avg_1mn#id#') - if (loadAvg1mn) { - const html = buildThresholdHTML( - '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', - 'Charge Système (1min)', '#load_avg_1mn_id#', - { min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' }, - '#load_avg_1mn_tendance#' - ) - loadAvg1mn.innerHTML = html === '' ? html : `1 min : ${html}` - } - - // Load avg 5mn - const loadAvg5mn = document.getElementById('load_avg_5mn#id#') - if (loadAvg5mn) { - const html = buildThresholdHTML( - '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', - 'Charge Système (5min)', '#load_avg_5mn_id#', - { min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' }, - '#load_avg_5mn_tendance#' - ) - loadAvg5mn.innerHTML = html === '' ? html : ` - 5 min : ${html}` - } - - // Load avg 15mn - const loadAvg15mn = document.getElementById('load_avg_15mn#id#') - if (loadAvg15mn) { - const html = buildThresholdHTML( - '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', - 'Charge Système (15min)', '#load_avg_15mn_id#', - { min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' }, - '#load_avg_15mn_tendance#' - ) - loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + // Load avg 1mn + const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') + if (loadAvg1mn) { + const html = buildThresholdHTML( + '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', + 'Charge Système (1min)', '#load_avg_1mn_id#', + { min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' }, + '#load_avg_1mn_tendance#' + ) + loadAvg1mn.innerHTML = html === '' ? html : `1 min : ${html}` + } + + // Load avg 5mn + const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') + if (loadAvg5mn) { + const html = buildThresholdHTML( + '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', + 'Charge Système (5min)', '#load_avg_5mn_id#', + { min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' }, + '#load_avg_5mn_tendance#' + ) + loadAvg5mn.innerHTML = html === '' ? html : ` - 5 min : ${html}` + } + + // Load avg 15mn + const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') + if (loadAvg15mn) { + const html = buildThresholdHTML( + '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', + 'Charge Système (15min)', '#load_avg_15mn_id#', + { min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' }, + '#load_avg_15mn_tendance#' + ) + loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` + } + } catch (e) { + console.error('[Monitoring] Error in initLoadAverage:', e) } } @@ -519,69 +578,81 @@ * Initialize Memory display with percentage */ const initMemory = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const memoryEl = document.getElementById('memory_available_percent#id#') - if (!memoryEl) return - - const value = '#memory_available_percent#' - if (value === '') { - memoryEl.innerHTML = '#memory#' - return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#') + if (!memoryEl) return + + const value = '#memory_available_percent#' + if (value === '') { + memoryEl.innerHTML = '#memory#' + return + } + + memoryEl.innerHTML = buildPercentageHTML( + value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', + 'Mémoire Vive (% Disponible)', '#memory_available_percent_id#', + { min: '#memory_available_percent_minHistory#', avg: '#memory_available_percent_averageHistory#', max: '#memory_available_percent_maxHistory#' }, + '#memory_available_percent_tendance#', '#memory# (', '%', true + ) + } catch (e) { + console.error('[Monitoring] Error in initMemory:', e) } - - memoryEl.innerHTML = buildPercentageHTML( - value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', - 'Mémoire Vive (% Disponible)', '#memory_available_percent_id#', - { min: '#memory_available_percent_minHistory#', avg: '#memory_available_percent_averageHistory#', max: '#memory_available_percent_maxHistory#' }, - '#memory_available_percent_tendance#', '#memory# (', '%', true - ) } /** * Initialize Swap display with percentage */ const initSwap = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const swapEl = document.getElementById('swap_free_percent#id#') - if (!swapEl) return - - const value = '#swap_free_percent#' - if (value === '') { - swapEl.innerHTML = '' - return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const swapEl = widgetRoot.querySelector('#swap_free_percent#id#') + if (!swapEl) return + + const value = '#swap_free_percent#' + if (value === '') { + swapEl.innerHTML = '' + return + } + + swapEl.innerHTML = buildPercentageHTML( + value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', + 'Mémoire Swap (% Libre)', '#swap_free_percent_id#', + { min: '#swap_free_percent_minHistory#', avg: '#swap_free_percent_averageHistory#', max: '#swap_free_percent_maxHistory#' }, + '#swap_free_percent_tendance#', '#swap# (', '%', true + ) + } catch (e) { + console.error('[Monitoring] Error in initSwap:', e) } - - swapEl.innerHTML = buildPercentageHTML( - value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', - 'Mémoire Swap (% Libre)', '#swap_free_percent_id#', - { min: '#swap_free_percent_minHistory#', avg: '#swap_free_percent_averageHistory#', max: '#swap_free_percent_maxHistory#' }, - '#swap_free_percent_tendance#', '#swap# (', '%', true - ) } /** * Initialize HDD display with percentage */ const initHDD = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const hddEl = document.getElementById('hdd#id#') - if (!hddEl) return - - const value = '#hdd_free_percent#' - if (value === '') { - hddEl.innerHTML = '' - return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const hddEl = widgetRoot.querySelector('#hdd#id#') + if (!hddEl) return + + const value = '#hdd_free_percent#' + if (value === '') { + hddEl.innerHTML = '' + return + } + + hddEl.innerHTML = buildPercentageHTML( + value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', + 'Espace Disque (% Libre)', '#hdd_free_percent_id#', + { min: '#hdd_free_percent_minHistory#', avg: '#hdd_free_percent_averageHistory#', max: '#hdd_free_percent_maxHistory#' }, + '#hdd_free_percent_tendance#', '#hdd# (', '%', true + ) + } catch (e) { + console.error('[Monitoring] Error in initHDD:', e) } - - hddEl.innerHTML = buildPercentageHTML( - value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', - 'Espace Disque (% Libre)', '#hdd_free_percent_id#', - { min: '#hdd_free_percent_minHistory#', avg: '#hdd_free_percent_averageHistory#', max: '#hdd_free_percent_maxHistory#' }, - '#hdd_free_percent_tendance#', '#hdd# (', '%', true - ) } /** @@ -589,61 +660,69 @@ * @param {HTMLElement} synoContainer - The container div with data-syno-* attributes */ const initSynoVolume = (synoContainer) => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const dataset = synoContainer.dataset - if (dataset.synoDisplay !== 'block') return - - const synoId = dataset.synoId - const container = document.getElementById(`${synoId}#id#`) - if (!container) return - - container.className = 'tooltips' - container.style.display = dataset.synoDisplay - container.innerHTML = `${dataset.synoIcon} ` - - const percentEl = document.getElementById(`${synoId}_free_percent#id#`) - if (!percentEl) return - - const value = dataset.synoPercent - if (value === '') { - percentEl.innerHTML = '' - return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const dataset = synoContainer.dataset + if (dataset.synoDisplay !== 'block') return + + const synoId = dataset.synoId + const container = widgetRoot.querySelector(`#${synoId}#id#`) + if (!container) return + + container.className = 'tooltips' + container.style.display = dataset.synoDisplay + container.innerHTML = `${dataset.synoIcon} ` + + const percentEl = widgetRoot.querySelector(`#${synoId}_free_percent#id#`) + if (!percentEl) return + + const value = dataset.synoPercent + if (value === '') { + percentEl.innerHTML = '' + return + } + + const history = safeJSONParse(dataset.synoHistory) + percentEl.innerHTML = buildPercentageHTML( + value, dataset.synoLow, dataset.synoHigh, + `${dataset.synoName} (% Libre)`, dataset.synoCmdId, + history, + dataset.synoTendance, `${dataset.synoValue} (`, '%', true + ) + } catch (e) { + console.error('[Monitoring] Error in initSynoVolume for', synoContainer.dataset?.synoId || 'unknown', ':', e) } - - const history = JSON.parse(dataset.synoHistory) - percentEl.innerHTML = buildPercentageHTML( - value, dataset.synoLow, dataset.synoHigh, - `${dataset.synoName} (% Libre)`, dataset.synoCmdId, - history, - dataset.synoTendance, `${dataset.synoValue} (`, '%', true - ) } /** * Initialize CPU display with optional temperature */ const initCPU = () => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const cpuEl = document.getElementById('cpu#id#') - if (!cpuEl) return - - if ('#cpu_temp#' !== '' && '#cpu_temp_display#' === 'block') { - cpuEl.innerHTML = '#cpu# ' - - const tempEl = document.getElementById('cpu_temp#id#') - if (!tempEl) return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const temp = parseFloat('#cpu_temp#') - const low = parseFloat('#cpu_temp_colorlow#') - const high = parseFloat('#cpu_temp_colorhigh#') - const title = 'Stats : Température CPU
Min: #cpu_temp_minHistory# | Moy : #cpu_temp_averageHistory# | Max : #cpu_temp_maxHistory#' - const color = getColorStyle(temp, low, high, false) + const cpuEl = widgetRoot.querySelector('#cpu#id#') + if (!cpuEl) return - tempEl.innerHTML = `(#cpu_temp#°C#cpu_temp_tendance#)` - } else { - cpuEl.innerHTML = '#cpu#' + if ('#cpu_temp#' !== '' && '#cpu_temp_display#' === 'block') { + cpuEl.innerHTML = '#cpu# ' + + const tempEl = widgetRoot.querySelector('#cpu_temp#id#') + if (!tempEl) return + + const temp = parseFloat('#cpu_temp#') + const low = parseFloat('#cpu_temp_colorlow#') + const high = parseFloat('#cpu_temp_colorhigh#') + const title = 'Stats : Température CPU
Min: #cpu_temp_minHistory# | Moy : #cpu_temp_averageHistory# | Max : #cpu_temp_maxHistory#' + const color = getColorStyle(temp, low, high, false) + + tempEl.innerHTML = `(#cpu_temp#°C#cpu_temp_tendance#)` + } else { + cpuEl.innerHTML = '#cpu#' + } + } catch (e) { + console.error('[Monitoring] Error in initCPU:', e) } } @@ -652,27 +731,31 @@ * @param {HTMLElement} container - The container div with data-perso-* attributes */ const initPerso = (container) => { - if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - - const dataset = container.dataset - const persoId = dataset.persoId - const el = document.getElementById(`${persoId}_unite#id#`) - if (!el) return - - const value = dataset.persoValue - if (value === '') { - el.innerHTML = '' - return + try { + if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return + + const dataset = container.dataset + const persoId = dataset.persoId + const el = widgetRoot.querySelector(`#${persoId}_unite#id#`) + if (!el) return + + const value = dataset.persoValue + if (value === '') { + el.innerHTML = '' + return + } + + const val = parseFloat(value) + const low = parseFloat(dataset.persoLow) + const high = parseFloat(dataset.persoHigh) + const history = safeJSONParse(dataset.persoHistory) + const title = `Stats : ${dataset.persoName}
Min: ${history.min} | Moy : ${history.avg} | Max : ${history.max}` + const color = getColorStyle(val, low, high, false) + + el.innerHTML = `${value}${dataset.persoUnite}${dataset.persoTendance}` + } catch (e) { + console.error('[Monitoring] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e) } - - const val = parseFloat(value) - const low = parseFloat(dataset.persoLow) - const high = parseFloat(dataset.persoHigh) - const history = JSON.parse(dataset.persoHistory) - const title = `Stats : ${dataset.persoName}
Min: ${history.min} | Moy : ${history.avg} | Max : ${history.max}` - const color = getColorStyle(val, low, high, false) - - el.innerHTML = `${value}${dataset.persoUnite}${dataset.persoTendance}` } // ======================================== @@ -702,13 +785,13 @@ initHDD() // Synology volumes - generic initialization using data attributes - document.querySelectorAll('[data-syno-id]').forEach(initSynoVolume) + widgetRoot.querySelectorAll('[data-syno-id]').forEach(initSynoVolume) // CPU with temperature initCPU() // Custom commands - generic initialization using data attributes - document.querySelectorAll('[data-perso-id]').forEach(initPerso) + widgetRoot.querySelectorAll('[data-perso-id]').forEach(initPerso) } })() From cca06594b8a351e1cd0d7df886f3cb40daff7e56 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:31:16 +0100 Subject: [PATCH 02/24] update templates --- core/template/dashboard/AsusWRT.html | 1142 ++++++++++----------- core/template/dashboard/Monitoring.html | 1244 +++++++++++------------ 2 files changed, 1179 insertions(+), 1207 deletions(-) diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html index 7e6931f4..331847a0 100644 --- a/core/template/dashboard/AsusWRT.html +++ b/core/template/dashboard/AsusWRT.html @@ -3,6 +3,7 @@ div.eqLogic-widget[data-eqLogic_uid="#uid#"] .cmd.monitor-btn { font-size: 12px !important; } + div.eqLogic-widget[data-eqLogic_uid="#uid#"].editingMode .cmd.monitor-btn { display: none !important; } @@ -21,6 +22,7 @@ align-items: center; box-sizing: border-box; } + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.monitor-name-left span:not(:empty) { padding-right: 3px; } @@ -38,7 +40,7 @@ padding-right: 5px; box-sizing: border-box; } - + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.widget-name.monitor-name-center a { overflow: hidden !important; text-overflow: ellipsis; @@ -59,7 +61,7 @@ padding-right: 5px; color: inherit !important; } - + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.monitor-cmds { display: block; text-align: left; @@ -92,636 +94,636 @@
- #distri_name_icon# + #distri_name_icon# #distri_name#
- #uptime_icon# + #uptime_icon#
- #load_avg_icon# + #load_avg_icon#
- #memory_icon# + #memory_icon#
- #swap_icon# + #swap_icon#
- #network_infos_icon# + #network_infos_icon#
- #network_icon# + #network_icon#
- #asus_clients_icon# + #asus_clients_icon#
- #asus_wan0_ip_icon# + #asus_wan0_ip_icon#
- #asus_wifi_temp_icon# + #asus_wifi_temp_icon#
- #hdd_icon# + #hdd_icon#
- #cpu_icon# + #cpu_icon#
-
+
#perso1_icon#
-
+
#perso2_icon#
-
+
#perso3_icon#
-
+
#perso4_icon#
#divGraphInfo# -
+
\ No newline at end of file diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index 6519d202..5f003c41 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -3,6 +3,7 @@ div.eqLogic-widget[data-eqLogic_uid="#uid#"] .cmd.monitor-btn { font-size: 12px !important; } + div.eqLogic-widget[data-eqLogic_uid="#uid#"].editingMode .cmd.monitor-btn { display: none !important; } @@ -21,6 +22,7 @@ align-items: center; box-sizing: border-box; } + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.monitor-name-left span:not(:empty) { padding-right: 3px; } @@ -38,7 +40,7 @@ padding-right: 5px; box-sizing: border-box; } - + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.widget-name.monitor-name-center a { overflow: hidden !important; text-overflow: ellipsis; @@ -59,7 +61,7 @@ padding-right: 5px; color: inherit !important; } - + div.eqLogic-widget[data-eqLogic_uid="#uid#"] div.monitor-cmds { display: block; text-align: left; @@ -75,10 +77,10 @@
- + - +
@@ -86,7 +88,7 @@ #name_display# #object_name# #name_display# #object_name#
-
+
@@ -94,705 +96,673 @@
- #distri_name_icon# + #distri_name_icon# #distri_name#
- #uptime_icon# + #uptime_icon#
- #load_avg_icon# + #load_avg_icon#
- #memory_icon# + #memory_icon#
- #swap_icon# + #swap_icon#
- #network_infos_icon# + #network_infos_icon#
- #network_icon# + #network_icon#
#multi_network_cards#
- #hdd_icon# + #hdd_icon#
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
- #cpu_icon# + #cpu_icon#
-
- #perso1_icon# +
+ #perso1_icon#
-
- #perso2_icon# +
+ #perso2_icon#
-
- #perso3_icon# +
+ #perso3_icon#
-
- #perso4_icon# +
+ #perso4_icon#
#divGraphInfo# -
+
\ No newline at end of file From 6cd67144f9c6cc805350e1c0c234f3eea678042e Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:34:06 +0100 Subject: [PATCH 03/24] Update info.json --- plugin_info/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin_info/info.json b/plugin_info/info.json index cea69b69..f68d7c2d 100644 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -1,7 +1,7 @@ { "id": "Monitoring", "name": "Monitoring", - "pluginVersion": "3.4.1", + "pluginVersion": "3.4.2", "description": { "fr_FR": "Plugin permettant le monitoring des équipements locaux et distants (via SSH). Le plugin affichera les informations systèmes d'équipements sous Linux ou Synology (Distribution, CPU, Mémoire, Disques, Swap).", "en_US": "Plugin to monitor local and remote equipments (through SSH). The plugin will display system informations from Linux or Synology (Distribution, CPU, Memory, Disks, Swap).", From 32de8bc2b3796509127ae1b042b3d2a5a8ba30f4 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:47:55 +0100 Subject: [PATCH 04/24] update templates --- core/template/dashboard/AsusWRT.html | 31 +++++++++------ core/template/dashboard/Monitoring.html | 51 +++++++++++++++---------- 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html index 331847a0..5c9d25a4 100644 --- a/core/template/dashboard/AsusWRT.html +++ b/core/template/dashboard/AsusWRT.html @@ -1,4 +1,7 @@ -
+
+
+
+ + + + + + + + +
+
+ #name_display# #object_name# + #name_display# #object_name# +
+
+ + + +
+
+
+
+ #distri_name_icon# + #distri_name# +
+
+ #uptime_icon# + +
+
+ #load_avg_icon# + +
+
+ #memory_icon# + +
+
+ #swap_icon# + +
+
+ #network_infos_icon# + +
+
+ #network_icon# + +
+ + #multi_network_cards# +
+ #hdd_icon# + +
+
+ #syno_hddv2_icon# + +
+
+ #syno_hddv3_icon# + +
+
+ #syno_hddv4_icon# + +
+
+ #syno_hddusb_icon# + +
+
+ #syno_hddesata_icon# + +
+
+ #cpu_icon# + +
+
+ #perso1_icon# + +
+
+ #perso2_icon# + +
+
+ #perso3_icon# + +
+
+ #perso4_icon# + +
+
+ #divGraphInfo# + +
From 4896dcbf326b339504f9fa7eb62d36febf0dd8c3 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:22:33 +0100 Subject: [PATCH 15/24] Update Monitoring.html --- core/template/dashboard/Monitoring.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index 23b3ee0f..de680525 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -685,12 +685,10 @@ initSwap() initHDD() - // Synology volumes - widgetRoot.querySelectorAll('[data-syno-id]').forEach(initSynoVolume) - // CPU with temperature - initCPU() + // CPU with temperature + initCPU() - // Custom commands - generic initialization using data attributes + // Custom commands - generic initialization using data attributes widgetRoot.querySelectorAll('[data-perso-id]').forEach(initPerso) } })() From 1b7d16dcf13f54da47f3ea29316b21620bc50369 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:42:25 +0100 Subject: [PATCH 16/24] update templates --- core/template/dashboard/Monitoring.html | 2 +- core/template/dashboard/Synology.html | 1632 +++++++++++------------ 2 files changed, 803 insertions(+), 831 deletions(-) diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index de680525..ecc06866 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -298,7 +298,7 @@ // Only add prefix if it exists and is not a placeholder if (prefix && !prefix.startsWith('#')) { - return `${prefix}${valueSpan}${unitSpan})` + return `${prefix}${valueSpan}${unitSpan})` } return `${valueSpan}${unitSpan}` } diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html index 4952fed7..43a3c70a 100644 --- a/core/template/dashboard/Synology.html +++ b/core/template/dashboard/Synology.html @@ -1,831 +1,803 @@
- -
-
- - - - - - - - -
-
- #name_display# #object_name# - #name_display# #object_name# -
-
- - - -
-
-
-
- #distri_name_icon# - #distri_name# -
-
- #uptime_icon# - -
-
- #load_avg_icon# - -
-
- #memory_icon# - -
-
- #swap_icon# - -
-
- #network_infos_icon# - -
-
- #network_icon# - -
- - #multi_network_cards# -
- #hdd_icon# - -
-
- #syno_hddv2_icon# - -
-
- #syno_hddv3_icon# - -
-
- #syno_hddv4_icon# - -
-
- #syno_hddusb_icon# - -
-
- #syno_hddesata_icon# - -
-
- #cpu_icon# - -
-
- #perso1_icon# - -
-
- #perso2_icon# - -
-
- #perso3_icon# - -
-
- #perso4_icon# - -
-
- #divGraphInfo# - -
+ data-eqType="#eqType#" data-eqLogic_id="#id#" data-eqLogic_uid="#uid#" data-version="#version#" + data-translate-category="#translate_category#" data-category="#category#" data-tags="#tags#" + style="width: #width#;height: #height#;#style#;"> + +
+
+ + + + + + + + +
+
+ #name_display# #object_name# + #name_display# #object_name# +
+
+ + + +
+
+
+
+ #distri_name_icon# + #distri_name# +
+
+ #uptime_icon# + +
+
+ #load_avg_icon# + +
+
+ #memory_icon# + +
+
+ #swap_icon# + +
+
+ #network_infos_icon# + +
+
+ #network_icon# + +
+ + #multi_network_cards# +
+ #hdd_icon# + +
+
+ #syno_hddv2_icon# + +
+
+ #syno_hddv3_icon# + +
+
+ #syno_hddv4_icon# + +
+
+ #syno_hddusb_icon# + +
+
+ #syno_hddesata_icon# + +
+
+ #cpu_icon# + +
+
+ #perso1_icon# + +
+
+ #perso2_icon# + +
+
+ #perso3_icon# + +
+
+ #perso4_icon# + +
+
+ #divGraphInfo# + +
\ No newline at end of file From 7f443beb7f7c7270d0c8fc9d1fcba7f8228e62cb Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 09:38:14 +0100 Subject: [PATCH 17/24] Update mobile templates --- core/template/mobile/AsusWRT.html | 953 ++++++++++++++------------ core/template/mobile/Monitoring.html | 954 +++++++++++++-------------- core/template/mobile/Synology.html | 687 +++++++++++++++++++ 3 files changed, 1664 insertions(+), 930 deletions(-) create mode 100644 core/template/mobile/Synology.html diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html index 1a89e011..7c87de37 100644 --- a/core/template/mobile/AsusWRT.html +++ b/core/template/mobile/AsusWRT.html @@ -1,4 +1,6 @@ -
+
+ + + + + + + + + + + + + + #name_display# + + + + + + + + +
+
+ #distri_name_icon# + #distri_name# +
+
+ #uptime_icon# + +
+
+ #load_avg_icon# + +
+
+ #memory_icon# + +
+
+ #swap_icon# + +
+
+ #network_infos_icon# + +
+
+ #network_icon# + +
+ + #multi_network_cards# +
+ #hdd_icon# + +
+
+ #syno_v2_icon# + +
+
+ #syno_v3_icon# + +
+
+ #syno_v4_icon# + +
+
+ #syno_usb_icon# + +
+
+ #syno_esata_icon# + +
+
+ #cpu_icon# + +
+
+ #perso1_icon# + +
+
+ #perso2_icon# + +
+
+ #perso3_icon# + +
+
+ #perso4_icon# + +
+
+ +
\ No newline at end of file From 21318566c1b40483d72d4c41b8324f1a9d23db79 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:01:10 +0100 Subject: [PATCH 18/24] update templates --- core/template/dashboard/AsusWRT.html | 30 ++++++++++++++---------- core/template/dashboard/Monitoring.html | 26 +++++++++++---------- core/template/dashboard/Synology.html | 31 +++++++++++++------------ core/template/mobile/AsusWRT.html | 28 +++++++++++----------- core/template/mobile/Monitoring.html | 28 +++++++++++----------- core/template/mobile/Synology.html | 12 +++++----- 6 files changed, 82 insertions(+), 73 deletions(-) diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html index da435c5c..39ad65ab 100644 --- a/core/template/dashboard/AsusWRT.html +++ b/core/template/dashboard/AsusWRT.html @@ -433,7 +433,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const uptimeEl = widgetRoot.querySelector('#uptime#id#') - if (uptimeEl) uptimeEl.innerHTML = '#uptime#' + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initUptime:', e) } @@ -447,7 +448,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') - if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initNetworkInfos:', e) } @@ -461,7 +463,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkEl = widgetRoot.querySelector('#network#id#') - if (networkEl) networkEl.innerHTML = '#network#' + if (!networkEl) return + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initNetwork:', e) } @@ -475,7 +478,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const el = widgetRoot.querySelector('#asus_clients#id#') - if (el) el.innerHTML = '#asus_clients#' + if (!el) return + el.innerHTML = '#asus_clients#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusClients:', e) } @@ -489,7 +493,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const el = widgetRoot.querySelector('#asus_wan0_ip#id#') - if (el) el.innerHTML = 'IP (WAN) : #asus_wan0_ip#' + if (!el) return + el.innerHTML = 'IP (WAN) : #asus_wan0_ip#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusWan0IP:', e) } @@ -503,7 +508,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const el = widgetRoot.querySelector('#asus_wifi_temp#id#') - if (el) el.innerHTML = '#asus_wifi_temp#' + if (!el) return + el.innerHTML = '#asus_wifi_temp#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusWifiTemp:', e) } @@ -523,37 +529,37 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML( + const html1mn = buildThresholdHTML( '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', 'Charge Système (1min)', '#load_avg_1mn_id#', { min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' }, '#load_avg_1mn_tendance#' ) - loadAvg1mn.innerHTML = html === '' ? html : `1 min : ${html}` + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` } // Load avg 5mn const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') if (loadAvg5mn) { - const html = buildThresholdHTML( + const html5mn = buildThresholdHTML( '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', 'Charge Système (5min)', '#load_avg_5mn_id#', { min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' }, '#load_avg_5mn_tendance#' ) - loadAvg5mn.innerHTML = html === '' ? html : ` - 5 min : ${html}` + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` } // Load avg 15mn const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') if (loadAvg15mn) { - const html = buildThresholdHTML( + const html15mn = buildThresholdHTML( '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', 'Charge Système (15min)', '#load_avg_15mn_id#', { min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' }, '#load_avg_15mn_tendance#' ) - loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring AsusWRT] Error in initLoadAverage:', e) diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index ecc06866..94ccc2d7 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -430,7 +430,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const uptimeEl = widgetRoot.querySelector('#uptime#id#') - if (uptimeEl) uptimeEl.innerHTML = '#uptime#' + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring] Error in initUptime:', e) } @@ -444,7 +445,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') - if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring] Error in initNetworkInfos:', e) } @@ -458,10 +460,10 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkEl = widgetRoot.querySelector('#network#id#') - if (networkEl) { - const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } - networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) - } + if (!networkEl) return + + const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } + networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } @@ -481,37 +483,37 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML( + const html1mn = buildThresholdHTML( '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', 'Charge Système (1min)', '#load_avg_1mn_id#', { min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' }, '#load_avg_1mn_tendance#' ) - loadAvg1mn.innerHTML = html === '' ? html : `1 min : ${html}` + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` } // Load avg 5mn const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') if (loadAvg5mn) { - const html = buildThresholdHTML( + const html5mn = buildThresholdHTML( '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', 'Charge Système (5min)', '#load_avg_5mn_id#', { min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' }, '#load_avg_5mn_tendance#' ) - loadAvg5mn.innerHTML = html === '' ? html : ` - 5 min : ${html}` + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` } // Load avg 15mn const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') if (loadAvg15mn) { - const html = buildThresholdHTML( + const html15mn = buildThresholdHTML( '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', 'Charge Système (15min)', '#load_avg_15mn_id#', { min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' }, '#load_avg_15mn_tendance#' ) - loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring] Error in initLoadAverage:', e) diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html index 43a3c70a..739936f6 100644 --- a/core/template/dashboard/Synology.html +++ b/core/template/dashboard/Synology.html @@ -491,7 +491,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const uptimeEl = widgetRoot.querySelector('#uptime#id#') - if (uptimeEl) uptimeEl.innerHTML = '#uptime#' + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring] Error in initUptime:', e) } @@ -505,7 +506,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') - if (networkInfosEl) networkInfosEl.innerHTML = '#network_infos#' + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring] Error in initNetworkInfos:', e) } @@ -519,10 +521,10 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkEl = widgetRoot.querySelector('#network#id#') - if (networkEl) { - const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } - networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) - } + if (!networkEl) return + + const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } + networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } @@ -542,37 +544,37 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML( + const html1mn = buildThresholdHTML( '#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', 'Charge Système (1min)', '#load_avg_1mn_id#', { min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' }, '#load_avg_1mn_tendance#' ) - loadAvg1mn.innerHTML = html === '' ? html : `1 min : ${html}` + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` } // Load avg 5mn const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') if (loadAvg5mn) { - const html = buildThresholdHTML( + const html5mn = buildThresholdHTML( '#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', 'Charge Système (5min)', '#load_avg_5mn_id#', { min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' }, '#load_avg_5mn_tendance#' ) - loadAvg5mn.innerHTML = html === '' ? html : ` - 5 min : ${html}` + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` } // Load avg 15mn const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') if (loadAvg15mn) { - const html = buildThresholdHTML( + const html15mn = buildThresholdHTML( '#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', 'Charge Système (15min)', '#load_avg_15mn_id#', { min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' }, '#load_avg_15mn_tendance#' ) - loadAvg15mn.innerHTML = html === '' ? html : ` - 15 min : ${html}` + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring] Error in initLoadAverage:', e) @@ -697,9 +699,8 @@ // Ajouter le pourcentage dans le deuxième span const percentSpan = volumeEl.querySelector('.syno-percent') - if (percentSpan) { - percentSpan.innerHTML = percentageHTML - } + if (!percentSpan) return + percentSpan.innerHTML = percentageHTML } catch (e) { console.error('[Monitoring] Error in initSynoVolume for', volumeEl.dataset?.synoId || 'unknown', ':', e) } diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html index 7c87de37..ce4b47a0 100644 --- a/core/template/mobile/AsusWRT.html +++ b/core/template/mobile/AsusWRT.html @@ -473,22 +473,22 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') - loadAvg1mn.innerHTML = html - } + const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` + } - // Load avg 5mn - const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') - if (loadAvg5mn) { - const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') - loadAvg5mn.innerHTML = html - } + // Load avg 5mn + const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') + if (loadAvg5mn) { + const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` + } - // Load avg 15mn - const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') - if (loadAvg15mn) { - const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') - loadAvg15mn.innerHTML = html + // Load avg 15mn + const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') + if (loadAvg15mn) { + const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring AsusWRT] Error in initLoadAverage:', e) diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html index 0787ed63..2fd2b786 100644 --- a/core/template/mobile/Monitoring.html +++ b/core/template/mobile/Monitoring.html @@ -416,22 +416,22 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') - loadAvg1mn.innerHTML = html - } + const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` + } - // Load avg 5mn - const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') - if (loadAvg5mn) { - const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') - loadAvg5mn.innerHTML = html - } + // Load avg 5mn + const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') + if (loadAvg5mn) { + const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` + } - // Load avg 15mn - const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') - if (loadAvg15mn) { - const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') - loadAvg15mn.innerHTML = html + // Load avg 15mn + const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') + if (loadAvg15mn) { + const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring] Error in initLoadAverage:', e) diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html index d655db08..32cbc321 100644 --- a/core/template/mobile/Synology.html +++ b/core/template/mobile/Synology.html @@ -458,22 +458,22 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') - loadAvg1mn.innerHTML = html + const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` } // Load avg 5mn const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') if (loadAvg5mn) { - const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') - loadAvg5mn.innerHTML = html + const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` } // Load avg 15mn const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') if (loadAvg15mn) { - const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') - loadAvg15mn.innerHTML = html + const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring Syno] Error in initLoadAverage:', e) From d2ddcfa2e43ec21ea267498e69da29936a72b01f Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:08:44 +0100 Subject: [PATCH 19/24] update templates --- core/template/dashboard/Monitoring.html | 5 ++--- core/template/dashboard/Synology.html | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index 94ccc2d7..e25a0c04 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -460,10 +460,9 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkEl = widgetRoot.querySelector('#network#id#') - if (!networkEl) return + if (!networkEl) return - const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } - networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html index 739936f6..a38cf0f7 100644 --- a/core/template/dashboard/Synology.html +++ b/core/template/dashboard/Synology.html @@ -523,8 +523,7 @@ const networkEl = widgetRoot.querySelector('#network#id#') if (!networkEl) return - const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' } - networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false) + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } From 9df2979d04edbd546388063223de839f8af3f521 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:16:52 +0100 Subject: [PATCH 20/24] Update Monitoring.class.php --- core/class/Monitoring.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php index ddd10f75..8d86f89b 100644 --- a/core/class/Monitoring.class.php +++ b/core/class/Monitoring.class.php @@ -241,12 +241,14 @@ public static function pullCustom($_options) { $mem_stats = config::byKey('configStatsMemCustom', 'Monitoring', '0') == '1' ? true : false; if ($mem_stats) { $mem_start_usage = memory_get_usage(); - log::add('Monitoring', 'info', '[PULLCUSTOM] Memory Usage Start :: ' . round($mem_start_usage / 1024, 2) . ' Ko'); } /** @var Monitoring $Monitoring */ $Monitoring = Monitoring::byId($_options['Monitoring_Id']); if (is_object($Monitoring)) { + if ($mem_stats) { + log::add('Monitoring', 'info', '[' . $Monitoring->getName() .'][PULLCUSTOM] Memory Usage Start :: ' . round($mem_start_usage / 1024, 2) . ' Ko'); + } $cronState = $Monitoring->getCmd(null, 'cron_status'); if (is_object($cronState) && $cronState->execCmd() === 0) { log::add('Monitoring', 'debug', '[' . $Monitoring->getName() .'][PULLCUSTOM] Pull (Custom) :: En Pause'); @@ -270,10 +272,10 @@ public static function pullCustom($_options) { } $Monitoring->refreshWidget(); } - } - if ($mem_stats) { - $mem_end_usage = memory_get_usage(); - log::add('Monitoring', 'info', '[PULLCUSTOM] Memory Usage End :: ' . round($mem_end_usage / 1024, 2) . ' Ko | Conso :: ' . round(($mem_end_usage - $mem_start_usage) / 1024, 2) . ' Ko'); + if ($mem_stats) { + $mem_end_usage = memory_get_usage(); + log::add('Monitoring', 'info', '[' . $Monitoring->getName() .'][PULLCUSTOM] Memory Usage End :: ' . round($mem_end_usage / 1024, 2) . ' Ko | Conso :: ' . round(($mem_end_usage - $mem_start_usage) / 1024, 2) . ' Ko'); + } } } From fa63fecd6a9676bbe19ebe3a81a3bf78cae3ab27 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:37:26 +0100 Subject: [PATCH 21/24] Update Monitoring class --- core/class/Monitoring.class.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php index 8d86f89b..9909f35e 100644 --- a/core/class/Monitoring.class.php +++ b/core/class/Monitoring.class.php @@ -279,13 +279,13 @@ public static function pullCustom($_options) { } } - public static function postConfig_configPullLocal($value) { - log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration PullLocal :: '. $value); - } - + public static function postConfig_configPullLocal($value) { + log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration PullLocal :: ' . $value); + } + public static function postConfig_configPull($value) { - log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration Pull :: '. $value); - } + log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration Pull :: ' . $value); + } // Fonction exécutée automatiquement avant la suppression de l'équipement public function preRemove() { @@ -2118,10 +2118,10 @@ public function postSave() { $cron->save(); } else { $cron = cron::byClassAndFunction('Monitoring', 'pullCustom', array('Monitoring_Id' => intval($this->getId()))); - if (is_object($cron)) { - log::add('Monitoring', 'debug', '['. $this->getName() .'][POSTSAVE] Remove CustomPull'); - $cron->remove(); - } + if (is_object($cron)) { + log::add('Monitoring', 'debug', '[' . $this->getName() . '][POSTSAVE] Remove CustomPull'); + $cron->remove(); + } } $this->getInformations(); From 8e4b044e1eb0324540ccf08ce190766b98fda6c6 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:37:36 +0100 Subject: [PATCH 22/24] Update templates --- core/template/dashboard/Monitoring.html | 10 +++--- core/template/mobile/Monitoring.html | 42 ++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html index e25a0c04..0a974be4 100644 --- a/core/template/dashboard/Monitoring.html +++ b/core/template/dashboard/Monitoring.html @@ -430,8 +430,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const uptimeEl = widgetRoot.querySelector('#uptime#id#') - if (!uptimeEl) return - uptimeEl.innerHTML = '#uptime#' + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring] Error in initUptime:', e) } @@ -445,8 +445,8 @@ if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') - if (!networkInfosEl) return - networkInfosEl.innerHTML = '#network_infos#' + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring] Error in initNetworkInfos:', e) } @@ -462,7 +462,7 @@ const networkEl = widgetRoot.querySelector('#network#id#') if (!networkEl) return - networkEl.innerHTML = '#network#' + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html index 2fd2b786..ef70d3b4 100644 --- a/core/template/mobile/Monitoring.html +++ b/core/template/mobile/Monitoring.html @@ -259,13 +259,13 @@ */ const initIconSSH = () => { try { - const el = widgetRoot.querySelector('#iconSSH#id#') - if (!el) return + const iconSSH = widgetRoot.querySelector('#iconSSH#id#') + if (!iconSSH) return if ('#cnx_ssh#' === 'OK') { - el.innerHTML = '' + iconSSH.innerHTML = '' } else if ('#cnx_ssh#' === 'KO') { - el.innerHTML = '' + iconSSH.innerHTML = '' } } catch (e) { console.error('[Monitoring] Error in initIconSSH:', e) @@ -277,8 +277,8 @@ */ const initIconCron = () => { try { - const el = widgetRoot.querySelector('#iconCron#id#') - if (!el) return + const iconCron = widgetRoot.querySelector('#iconCron#id#') + if (!iconCron) return const isOn = '#cron_status#' === '1' const isCustom = '#cron_status_custom#' === '1' @@ -289,7 +289,7 @@ const customLabel = isCustom ? ' (Custom)' : ' (Default)' const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') - el.innerHTML = '' + iconCron.innerHTML = '' } catch (e) { console.error('[Monitoring] Error in initIconCron:', e) } @@ -416,22 +416,22 @@ // Load avg 1mn const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#') if (loadAvg1mn) { - const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') - loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` - } + const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ') + loadAvg1mn.innerHTML = html1mn === '' ? html1mn : `1 min : ${html1mn}` + } - // Load avg 5mn - const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') - if (loadAvg5mn) { - const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') - loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` - } + // Load avg 5mn + const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#') + if (loadAvg5mn) { + const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ') + loadAvg5mn.innerHTML = html5mn === '' ? html5mn : ` - 5 min : ${html5mn}` + } - // Load avg 15mn - const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') - if (loadAvg15mn) { - const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') - loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` + // Load avg 15mn + const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#') + if (loadAvg15mn) { + const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ') + loadAvg15mn.innerHTML = html15mn === '' ? html15mn : ` - 15 min : ${html15mn}` } } catch (e) { console.error('[Monitoring] Error in initLoadAverage:', e) From afb4366442600ba65c095d26d31341d96e335fe6 Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:54:45 +0100 Subject: [PATCH 23/24] Update templates --- core/template/mobile/AsusWRT.html | 106 +++++++++++++-------------- core/template/mobile/Monitoring.html | 72 +++++++++--------- core/template/mobile/Synology.html | 92 +++++++++++------------ 3 files changed, 135 insertions(+), 135 deletions(-) diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html index ce4b47a0..4c3b425c 100644 --- a/core/template/mobile/AsusWRT.html +++ b/core/template/mobile/AsusWRT.html @@ -271,13 +271,13 @@ */ const initIconSSH = () => { try { - const el = widgetRoot.querySelector('#iconSSH#id#') - if (!el) return + const iconSSH = widgetRoot.querySelector('#iconSSH#id#') + if (!iconSSH) return if ('#cnx_ssh#' === 'OK') { - el.innerHTML = '' + iconSSH.innerHTML = '' } else if ('#cnx_ssh#' === 'KO') { - el.innerHTML = '' + iconSSH.innerHTML = '' } } catch (e) { console.error('[Monitoring AsusWRT] Error in initIconSSH:', e) @@ -289,8 +289,8 @@ */ const initIconCron = () => { try { - const el = widgetRoot.querySelector('#iconCron#id#') - if (!el) return + const iconCron = widgetRoot.querySelector('#iconCron#id#') + if (!iconCron) return const isOn = '#cron_status#' === '1' const isCustom = '#cron_status_custom#' === '1' @@ -301,7 +301,7 @@ const customLabel = isCustom ? ' (Custom)' : ' (Default)' const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') - el.innerHTML = '' + iconCron.innerHTML = '' } catch (e) { console.error('[Monitoring AsusWRT] Error in initIconCron:', e) } @@ -312,13 +312,13 @@ */ const initIconCheckFirmware = () => { try { - const el = widgetRoot.querySelector('#iconCheckFirmware#id#') - if (!el) return + const iconCheckFirmware = widgetRoot.querySelector('#iconCheckFirmware#id#') + if (!iconCheckFirmware) return if ('#asus_fw_check#' === '1') { - el.innerHTML = '' + iconCheckFirmware.innerHTML = '' } else if ('#asus_fw_check#' === '0') { - el.innerHTML = '' + iconCheckFirmware.innerHTML = '' } } catch (e) { console.error('[Monitoring AsusWRT] Error in initIconCheckFirmware:', e) @@ -334,10 +334,10 @@ */ const initRebootButton = () => { try { - const btn = widgetRoot.querySelector('.reboot') - if (!btn) return + const rebootBtn = widgetRoot.querySelector('.reboot') + if (!rebootBtn) return - btn.addEventListener('click', () => { + rebootBtn.addEventListener('click', () => { if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) { jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) } @@ -352,13 +352,13 @@ */ const initRefreshButton = () => { try { - const btn = widgetRoot.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh') - if (!btn) return + const refreshBtn = widgetRoot.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh') + if (!refreshBtn) return if ('#refresh_id#' !== '') { - btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) + refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) } else { - btn.remove() + refreshBtn.remove() } } catch (e) { console.error('[Monitoring AsusWRT] Error in initRefreshButton:', e) @@ -376,9 +376,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#uptime#id#') - if (!el) return - el.innerHTML = '#uptime#' + const uptimeEl = widgetRoot.querySelector('#uptime#id#') + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initUptime:', e) } @@ -391,9 +391,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network_infos#id#') - if (!el) return - el.innerHTML = '#network_infos#' + const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initNetworkInfos:', e) } @@ -406,9 +406,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network#id#') - if (!el) return - el.innerHTML = '#network#' + const networkEl = widgetRoot.querySelector('#network#id#') + if (!networkEl) return + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initNetwork:', e) } @@ -421,9 +421,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#asus_clients#id#') - if (!el) return - el.innerHTML = '#asus_clients#' + const asusClientsEl = widgetRoot.querySelector('#asus_clients#id#') + if (!asusClientsEl) return + asusClientsEl.innerHTML = '#asus_clients#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusClients:', e) } @@ -436,9 +436,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#asus_wan0_ip#id#') - if (!el) return - el.innerHTML = '#asus_wan0_ip#' + const asusWanIpEl = widgetRoot.querySelector('#asus_wan0_ip#id#') + if (!asusWanIpEl) return + asusWanIpEl.innerHTML = '#asus_wan0_ip#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusWanIP:', e) } @@ -451,9 +451,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#asus_wifi_temp#id#') - if (!el) return - el.innerHTML = '#asus_wifi_temp#' + const asusWiFiTempEl = widgetRoot.querySelector('#asus_wifi_temp#id#') + if (!asusWiFiTempEl) return + asusWiFiTempEl.innerHTML = '#asus_wifi_temp#' } catch (e) { console.error('[Monitoring AsusWRT] Error in initAsusWiFiTemp:', e) } @@ -502,16 +502,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#memory_available_percent#id#') - if (!el) return + const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#') + if (!memoryEl) return const value = '#memory_available_percent#' if (value === '') { - el.innerHTML = '#memory#' + memoryEl.innerHTML = '#memory#' return } - el.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true) + memoryEl.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true) } catch (e) { console.error('[Monitoring AsusWRT] Error in initMemory:', e) } @@ -524,16 +524,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#swap_free_percent#id#') - if (!el) return + const swapEl = widgetRoot.querySelector('#swap_free_percent#id#') + if (!swapEl) return const value = '#swap_free_percent#' if (value === '') { - el.innerHTML = '#swap#' + swapEl.innerHTML = '#swap#' return } - el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) + swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) } catch (e) { console.error('[Monitoring AsusWRT] Error in initSwap:', e) } @@ -546,16 +546,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#hdd#id#') - if (!el) return + const hddEl = widgetRoot.querySelector('#hdd#id#') + if (!hddEl) return const value = '#hdd_free_percent#' if (value === '') { - el.innerHTML = '' + hddEl.innerHTML = '' return } - el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) + hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) } catch (e) { console.error('[Monitoring AsusWRT] Error in initHDD:', e) } @@ -600,12 +600,12 @@ const dataset = container.dataset const persoId = dataset.persoId - const el = widgetRoot.querySelector('#' + persoId + '_unite#id#') - if (!el) return + const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#') + if (!persoEl) return const value = dataset.persoValue if (value === '') { - el.innerHTML = '' + persoEl.innerHTML = '' return } @@ -615,9 +615,9 @@ const color = getColorStyle(val, low, high, false) if (color) { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } else { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } } catch (e) { console.error('[Monitoring AsusWRT] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e) diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html index ef70d3b4..9880a585 100644 --- a/core/template/mobile/Monitoring.html +++ b/core/template/mobile/Monitoring.html @@ -304,10 +304,10 @@ */ const initRebootButton = () => { try { - const btn = widgetRoot.querySelector('.reboot') - if (!btn) return + const rebootBtn = widgetRoot.querySelector('.reboot') + if (!rebootBtn) return - btn.addEventListener('click', () => { + rebootBtn.addEventListener('click', () => { if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) { jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) } @@ -322,10 +322,10 @@ */ const initPoweroffButton = () => { try { - const btn = widgetRoot.querySelector('.poweroff') - if (!btn) return + const poweroffBtn = widgetRoot.querySelector('.poweroff') + if (!poweroffBtn) return - btn.addEventListener('click', () => { + poweroffBtn.addEventListener('click', () => { if (confirm("Etes-vous sûr de vouloir éteindre l'équipement #name# ?")) { jeedom.cmd.execute({ id: '#cmd_poweroff_id#' }) } @@ -340,13 +340,13 @@ */ const initRefreshButton = () => { try { - const btn = widgetRoot.querySelector('.refresh') - if (!btn) return + const refreshBtn = widgetRoot.querySelector('.refresh') + if (!refreshBtn) return if ('#refresh_id#' !== '') { - btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) + refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) } else { - btn.remove() + refreshBtn.remove() } } catch (e) { console.error('[Monitoring] Error in initRefreshButton:', e) @@ -364,9 +364,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#uptime#id#') - if (!el) return - el.innerHTML = '#uptime#' + const uptimeEl = widgetRoot.querySelector('#uptime#id#') + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring] Error in initUptime:', e) } @@ -379,9 +379,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network_infos#id#') - if (!el) return - el.innerHTML = '#network_infos#' + const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring] Error in initNetworkInfos:', e) } @@ -394,9 +394,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network#id#') - if (!el) return - el.innerHTML = '#network#' + const networkEl = widgetRoot.querySelector('#network#id#') + if (!networkEl) return + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring] Error in initNetwork:', e) } @@ -445,16 +445,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#memory_available_percent#id#') - if (!el) return + const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#') + if (!memoryEl) return const value = '#memory_available_percent#' if (value === '') { - el.innerHTML = '#memory#' + memoryEl.innerHTML = '#memory#' return } - el.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true) + memoryEl.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true) } catch (e) { console.error('[Monitoring] Error in initMemory:', e) } @@ -467,16 +467,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#swap_free_percent#id#') - if (!el) return + const swapEl = widgetRoot.querySelector('#swap_free_percent#id#') + if (!swapEl) return const value = '#swap_free_percent#' if (value === '') { - el.innerHTML = '#swap#' + swapEl.innerHTML = '#swap#' return } - el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) + swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) } catch (e) { console.error('[Monitoring] Error in initSwap:', e) } @@ -489,16 +489,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#hdd#id#') - if (!el) return + const hddEl = widgetRoot.querySelector('#hdd#id#') + if (!hddEl) return const value = '#hdd_free_percent#' if (value === '') { - el.innerHTML = '' + hddEl.innerHTML = '' return } - el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) + hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) } catch (e) { console.error('[Monitoring] Error in initHDD:', e) } @@ -543,12 +543,12 @@ const dataset = container.dataset const persoId = dataset.persoId - const el = widgetRoot.querySelector('#' + persoId + '_unite#id#') - if (!el) return + const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#') + if (!persoEl) return const value = dataset.persoValue if (value === '') { - el.innerHTML = '' + persoEl.innerHTML = '' return } @@ -558,9 +558,9 @@ const color = getColorStyle(val, low, high, false) if (color) { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } else { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } } catch (e) { console.error('[Monitoring] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e) diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html index 32cbc321..53f76b98 100644 --- a/core/template/mobile/Synology.html +++ b/core/template/mobile/Synology.html @@ -301,13 +301,13 @@ */ const initIconSSH = () => { try { - const el = widgetRoot.querySelector('#iconSSH#id#') - if (!el) return + const iconSSH = widgetRoot.querySelector('#iconSSH#id#') + if (!iconSSH) return if ('#cnx_ssh#' === 'OK') { - el.innerHTML = '' + iconSSH.innerHTML = '' } else if ('#cnx_ssh#' === 'KO') { - el.innerHTML = '' + iconSSH.innerHTML = '' } } catch (e) { console.error('[Monitoring Syno] Error in initIconSSH:', e) @@ -319,8 +319,8 @@ */ const initIconCron = () => { try { - const el = widgetRoot.querySelector('#iconCron#id#') - if (!el) return + const iconCron = widgetRoot.querySelector('#iconCron#id#') + if (!iconCron) return const isOn = '#cron_status#' === '1' const isCustom = '#cron_status_custom#' === '1' @@ -331,7 +331,7 @@ const customLabel = isCustom ? ' (Custom)' : ' (Default)' const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color') - el.innerHTML = '' + iconCron.innerHTML = '' } catch (e) { console.error('[Monitoring Syno] Error in initIconCron:', e) } @@ -346,10 +346,10 @@ */ const initRebootButton = () => { try { - const btn = widgetRoot.querySelector('.reboot') - if (!btn) return + const rebootBtn = widgetRoot.querySelector('.reboot') + if (!rebootBtn) return - btn.addEventListener('click', () => { + rebootBtn.addEventListener('click', () => { if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) { jeedom.cmd.execute({ id: '#cmd_reboot_id#' }) } @@ -364,10 +364,10 @@ */ const initPoweroffButton = () => { try { - const btn = widgetRoot.querySelector('.poweroff') - if (!btn) return + const poweroffBtn = widgetRoot.querySelector('.poweroff') + if (!poweroffBtn) return - btn.addEventListener('click', () => { + poweroffBtn.addEventListener('click', () => { if (confirm("Etes-vous sûr de vouloir éteindre l'équipement #name# ?")) { jeedom.cmd.execute({ id: '#cmd_poweroff_id#' }) } @@ -382,13 +382,13 @@ */ const initRefreshButton = () => { try { - const btn = widgetRoot.querySelector('.refresh') - if (!btn) return + const refreshBtn = widgetRoot.querySelector('.refresh') + if (!refreshBtn) return if ('#refresh_id#' !== '') { - btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) + refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' })) } else { - btn.remove() + refreshBtn.remove() } } catch (e) { console.error('[Monitoring Syno] Error in initRefreshButton:', e) @@ -406,9 +406,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#uptime#id#') - if (!el) return - el.innerHTML = '#uptime#' + const uptimeEl = widgetRoot.querySelector('#uptime#id#') + if (!uptimeEl) return + uptimeEl.innerHTML = '#uptime#' } catch (e) { console.error('[Monitoring Syno] Error in initUptime:', e) } @@ -421,9 +421,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network_infos#id#') - if (!el) return - el.innerHTML = '#network_infos#' + const networkInfosEl = widgetRoot.querySelector('#network_infos#id#') + if (!networkInfosEl) return + networkInfosEl.innerHTML = '#network_infos#' } catch (e) { console.error('[Monitoring Syno] Error in initNetworkInfos:', e) } @@ -436,9 +436,9 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#network#id#') - if (!el) return - el.innerHTML = '#network#' + const networkEl = widgetRoot.querySelector('#network#id#') + if (!networkEl) return + networkEl.innerHTML = '#network#' } catch (e) { console.error('[Monitoring Syno] Error in initNetwork:', e) } @@ -487,12 +487,12 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#memory_available_percent#id#') - if (!el) return + const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#') + if (!memoryEl) return const value = '#memory_available_percent#' if (value === '') { - el.innerHTML = '#memory#' + memoryEl.innerHTML = '#memory#' return } @@ -509,16 +509,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#swap_free_percent#id#') - if (!el) return + const swapEl = widgetRoot.querySelector('#swap_free_percent#id#') + if (!swapEl) return const value = '#swap_free_percent#' if (value === '') { - el.innerHTML = '#swap#' + swapEl.innerHTML = '#swap#' return } - el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) + swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true) } catch (e) { console.error('[Monitoring Syno] Error in initSwap:', e) } @@ -531,16 +531,16 @@ try { if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return - const el = widgetRoot.querySelector('#hdd#id#') - if (!el) return + const hddEl = widgetRoot.querySelector('#hdd#id#') + if (!hddEl) return const value = '#hdd_free_percent#' if (value === '') { - el.innerHTML = '' + hddEl.innerHTML = '' return } - el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) + hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true) } catch (e) { console.error('[Monitoring Syno] Error in initHDD:', e) } @@ -585,8 +585,8 @@ const dataset = container.dataset const synoId = dataset.synoId - const el = widgetRoot.querySelector('#' + synoId + '_unit#id#') - if (!el) return + const synoVolumeEl = widgetRoot.querySelector('#' + synoId + '_unit#id#') + if (!synoVolumeEl) return const value = dataset.synoValue const valuePercent = dataset.synoValuePercent @@ -598,7 +598,7 @@ } if (!valuePercent || valuePercent === '' || valuePercent.startsWith('#')) { - el.innerHTML = '' + value + '' + synoVolumeEl.innerHTML = '' + value + '' return } @@ -607,7 +607,7 @@ const high = parseFloat(dataset.synoHigh) const color = getColorStyle(val, low, high, true) - el.innerHTML = value + ' (' + valuePercent + '%)' + synoVolumeEl.innerHTML = value + ' (' + valuePercent + '%)' } catch (e) { console.error('[Monitoring Syno] Error in initSynoVolume for', container.dataset?.synoId || 'unknown', ':', e) } @@ -623,12 +623,12 @@ const dataset = container.dataset const persoId = dataset.persoId - const el = widgetRoot.querySelector('#' + persoId + '_unite#id#') - if (!el) return + const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#') + if (!persoEl) return const value = dataset.persoValue if (value === '') { - el.innerHTML = '' + persoEl.innerHTML = '' return } @@ -638,9 +638,9 @@ const color = getColorStyle(val, low, high, false) if (color) { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } else { - el.innerHTML = '' + value + '' + dataset.persoUnite + '' + persoEl.innerHTML = '' + value + '' + dataset.persoUnite + '' } } catch (e) { console.error('[Monitoring Syno] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e) From a6ce8e58fbb908a1bc29a17eb7f3b6f6c79a487e Mon Sep 17 00:00:00 2001 From: Olivier <16240457+TiTidom-RC@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:57:23 +0100 Subject: [PATCH 24/24] update Syno templates --- core/template/dashboard/Synology.html | 1602 ++++++++++++------------- core/template/mobile/Synology.html | 1370 ++++++++++----------- 2 files changed, 1486 insertions(+), 1486 deletions(-) diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html index a38cf0f7..d2b6bfb9 100644 --- a/core/template/dashboard/Synology.html +++ b/core/template/dashboard/Synology.html @@ -1,803 +1,803 @@
- -
-
- - - - - - - - -
-
- #name_display# #object_name# - #name_display# #object_name# -
-
- - - -
-
-
-
- #distri_name_icon# - #distri_name# -
-
- #uptime_icon# - -
-
- #load_avg_icon# - -
-
- #memory_icon# - -
-
- #swap_icon# - -
-
- #network_infos_icon# - -
-
- #network_icon# - -
- - #multi_network_cards# -
- #hdd_icon# - -
-
- #syno_hddv2_icon# - -
-
- #syno_hddv3_icon# - -
-
- #syno_hddv4_icon# - -
-
- #syno_hddusb_icon# - -
-
- #syno_hddesata_icon# - -
-
- #cpu_icon# - -
-
- #perso1_icon# - -
-
- #perso2_icon# - -
-
- #perso3_icon# - -
-
- #perso4_icon# - -
-
- #divGraphInfo# - + data-eqType="#eqType#" data-eqLogic_id="#id#" data-eqLogic_uid="#uid#" data-version="#version#" + data-translate-category="#translate_category#" data-category="#category#" data-tags="#tags#" + style="width: #width#;height: #height#;#style#;"> + +
+
+ + + + + + + + +
+
+ #name_display# #object_name# + #name_display# #object_name# +
+
+ + + +
+
+
+
+ #distri_name_icon# + #distri_name# +
+
+ #uptime_icon# + +
+
+ #load_avg_icon# + +
+
+ #memory_icon# + +
+
+ #swap_icon# + +
+
+ #network_infos_icon# + +
+
+ #network_icon# + +
+ + #multi_network_cards# +
+ #hdd_icon# + +
+
+ #syno_hddv2_icon# + +
+
+ #syno_hddv3_icon# + +
+
+ #syno_hddv4_icon# + +
+
+ #syno_hddusb_icon# + +
+
+ #syno_hddesata_icon# + +
+
+ #cpu_icon# + +
+
+ #perso1_icon# + +
+
+ #perso2_icon# + +
+
+ #perso3_icon# + +
+
+ #perso4_icon# + +
+
+ #divGraphInfo# +
\ No newline at end of file diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html index 53f76b98..8e9cc980 100644 --- a/core/template/mobile/Synology.html +++ b/core/template/mobile/Synology.html @@ -1,687 +1,687 @@
- - - - - - - - - - - - - - - #name_display# - - - - - - - - -
-
- #distri_name_icon# - #distri_name# -
-
- #uptime_icon# - -
-
- #load_avg_icon# - -
-
- #memory_icon# - -
-
- #swap_icon# - -
-
- #network_infos_icon# - -
-
- #network_icon# - -
- - #multi_network_cards# -
- #hdd_icon# - -
-
- #syno_v2_icon# - -
-
- #syno_v3_icon# - -
-
- #syno_v4_icon# - -
-
- #syno_usb_icon# - -
-
- #syno_esata_icon# - -
-
- #cpu_icon# - -
-
- #perso1_icon# - -
-
- #perso2_icon# - -
-
- #perso3_icon# - -
-
- #perso4_icon# - -
-
- + data-eqLogic_uid="#uid#" data-translate-category="#translate_category#" data-category="#category#" + data-tags="#tags#" style="#style#"> + + + + + + + + + + + + + + + #name_display# + + + + + + + + +
+
+ #distri_name_icon# + #distri_name# +
+
+ #uptime_icon# + +
+
+ #load_avg_icon# + +
+
+ #memory_icon# + +
+
+ #swap_icon# + +
+
+ #network_infos_icon# + +
+
+ #network_icon# + +
+ + #multi_network_cards# +
+ #hdd_icon# + +
+
+ #syno_v2_icon# + +
+
+ #syno_v3_icon# + +
+
+ #syno_v4_icon# + +
+
+ #syno_usb_icon# + +
+
+ #syno_esata_icon# + +
+
+ #cpu_icon# + +
+
+ #perso1_icon# + +
+
+ #perso2_icon# + +
+
+ #perso3_icon# + +
+
+ #perso4_icon# + +
+
+
\ No newline at end of file