diff --git a/VERSION b/VERSION index 158c747..66beabb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.9.5 +1.9.8 diff --git a/changelog.json b/changelog.json index c31b2a4..087e7cf 100644 --- a/changelog.json +++ b/changelog.json @@ -1,5 +1,45 @@ { "versions": [ + { + "version": "1.9.8", + "date": "2026-05-21", + "changes": { + "features": [], + "improvements": [ + "Self Test: titre du modal renommé 'Modem Self Test' → 'Self Test' (plus juste, le test couvre aussi les capteurs et le RTC)", + "Self Test: ajout de la ligne 'Firmware Version' dans les logs et dans le rapport copiable (récupérée depuis le fichier VERSION via get_config_sqlite, pas d'AJAX supplémentaire)" + ], + "fixes": [], + "compatibility": [] + }, + "notes": "Si le test Envea passe encore en 'Passed' alors qu'aucune sonde n'est branchée: forcer le rafraîchissement du navigateur (Ctrl+F5) — le fichier selftest.js v1.9.7 est probablement en cache. La nouvelle version doit afficher 'Envea ttyAMA3/4/5: detected=...' au lieu de '=== ENVEA Sensor Reader Started ==='." + }, + { + "version": "1.9.7", + "date": "2026-05-21", + "changes": { + "features": [], + "improvements": [ + "Modem Self Test: le test 'Envea (Gas Sensors)' vérifie maintenant la présence physique du device sur ttyAMA3/4/5 via detect_envea_device (read_ref.py), au lieu de se fier à la config envea_sondes_table.connected=1. Affiche les ports où un device Envea CAIRSENS est réellement détecté" + ], + "fixes": [], + "compatibility": [] + }, + "notes": "Suite de la v1.9.6: le précédent fix parsait read_value_v2.py mais cette sortie reflète la config UI (sonde activée), pas la réponse physique du device. Le self-test utilise désormais la même logique que la page 'Envea Sondes Detection'." + }, + { + "version": "1.9.6", + "date": "2026-05-21", + "changes": { + "features": [], + "improvements": [], + "fixes": [ + "Modem Self Test: le test 'Envea (Gas Sensors)' passait à tort en 'Passed' même sans sonde physiquement branchée. L'ancien check vérifiait juste que la sortie debug de read_value_v2.py était non vide et ne contenait pas le mot 'error', ce qui était toujours vrai (le script imprime un en-tête '=== ENVEA Sensor Reader Started ===' et utilise 'Failed' pas 'error' pour les échecs). Le test parse maintenant les marqueurs explicites '✓ NAME = ' (trame valide reçue) et '✗ Failed to read NAME' pour décider Passed/Warning/Failed, et liste les sondes qui répondent vs celles qui ne répondent pas" + ], + "compatibility": [] + }, + "notes": "Fix d'un faux positif du self-test Envea. Détecte aussi le cas 'aucune sonde marquée connected=1' dans envea_sondes_table (sortie '! No connected ENVEA sensors found')." + }, { "version": "1.9.5", "date": "2026-05-20", diff --git a/html/assets/js/selftest.js b/html/assets/js/selftest.js index aef89e1..e2709c7 100644 --- a/html/assets/js/selftest.js +++ b/html/assets/js/selftest.js @@ -219,6 +219,7 @@ async function selfTestSequence() { selfTestReport.deviceId = configResponse.deviceID || 'Unknown'; selfTestReport.deviceName = configResponse.deviceName || 'Unknown'; selfTestReport.modemVersion = configResponse.modem_version || 'Unknown'; + selfTestReport.firmwareVersion = configResponse.firmware_version || 'Unknown'; selfTestReport.latitude = configResponse.latitude_raw || 'N/A'; selfTestReport.longitude = configResponse.longitude_raw || 'N/A'; selfTestReport.config = configResponse; @@ -245,6 +246,7 @@ async function selfTestSequence() { addSelfTestLog('════════════════════════════════════════════════════════'); addSelfTestLog(`Device ID: ${selfTestReport.deviceId}`); addSelfTestLog(`Device Name: ${selfTestReport.deviceName}`); + addSelfTestLog(`Firmware Version: ${selfTestReport.firmwareVersion}`); addSelfTestLog(`Modem Version: ${selfTestReport.modemVersion}`); addSelfTestLog(`RTC Time: ${selfTestReport.systemTime}`); addSelfTestLog(`Browser Time: ${new Date().toLocaleString()}`); @@ -426,29 +428,42 @@ async function selfTestSequence() { } } else if (sensor.type === 'envea') { - // Envea sensor test - use the debug endpoint for all sensors - const enveaResult = await new Promise((resolve, reject) => { - $.ajax({ - url: 'launcher.php?type=envea_debug', - dataType: 'text', - method: 'GET', - timeout: 30000, - success: function(data) { resolve(data); }, - error: function(xhr, status, error) { reject(new Error(error || status)); } - }); + // Envea sensor test - scan ports physically (same logic as Envea Sondes Detection) + // The envea_debug endpoint only confirms config (connected=1 in envea_sondes_table), + // not actual device presence. detect_envea_device runs read_ref.py per port and + // checks for a real Envea CAIRSENS response. + const enveaPorts = ['ttyAMA3', 'ttyAMA4', 'ttyAMA5']; + const enveaScan = await Promise.all(enveaPorts.map(port => + new Promise(resolve => { + $.ajax({ + url: `launcher.php?type=detect_envea_device&port=${port}`, + dataType: 'json', + method: 'GET', + cache: false, + timeout: 15000, + success: function(data) { resolve({ port, ...data }); }, + error: function(xhr, status, error) { resolve({ port, success: false, detected: false, error: error || status }); } + }); + }) + )); + + selfTestReport.rawResponses['Envea Sensors'] = JSON.stringify(enveaScan, null, 2); + enveaScan.forEach(r => { + addSelfTestLog(`Envea ${r.port}: detected=${r.detected} — ${r.device_info || r.error || ''}`); }); - selfTestReport.rawResponses['Envea Sensors'] = enveaResult; - addSelfTestLog(`Envea response: ${enveaResult.trim().substring(0, 200)}`); + const detected = enveaScan.filter(r => r.detected); + const errored = enveaScan.filter(r => !r.success); - if (enveaResult.trim() !== '' && !enveaResult.toLowerCase().includes('error')) { - updateTestStatus(sensor.id, 'Passed', 'Sensors responding', 'bg-success'); + if (detected.length > 0) { + const list = detected.map(r => `${r.port} (${r.device_info || 'Envea'})`).join(', '); + updateTestStatus(sensor.id, 'Passed', `Device(s) détecté(s): ${list}`, 'bg-success'); testsPassed++; - } else if (enveaResult.toLowerCase().includes('error')) { - updateTestStatus(sensor.id, 'Failed', 'Sensor error detected', 'bg-danger'); + } else if (errored.length === enveaPorts.length) { + updateTestStatus(sensor.id, 'Failed', 'Aucun port accessible (erreur série)', 'bg-danger'); testsFailed++; } else { - updateTestStatus(sensor.id, 'Failed', 'No data received', 'bg-danger'); + updateTestStatus(sensor.id, 'Failed', 'Aucun device Envea détecté sur ttyAMA3/4/5', 'bg-danger'); testsFailed++; } @@ -825,12 +840,13 @@ function generateReport() { DEVICE INFORMATION ------------------ -Device ID: ${selfTestReport.deviceId || 'Unknown'} -Device Name: ${selfTestReport.deviceName || 'Unknown'} -Modem Version: ${selfTestReport.modemVersion || 'Unknown'} -System Time: ${selfTestReport.systemTime || 'Unknown'} -Report Date: ${selfTestReport.timestamp} -GPS Location: ${selfTestReport.latitude || 'N/A'}, ${selfTestReport.longitude || 'N/A'} +Device ID: ${selfTestReport.deviceId || 'Unknown'} +Device Name: ${selfTestReport.deviceName || 'Unknown'} +Firmware Version: ${selfTestReport.firmwareVersion || 'Unknown'} +Modem Version: ${selfTestReport.modemVersion || 'Unknown'} +System Time: ${selfTestReport.systemTime || 'Unknown'} +Report Date: ${selfTestReport.timestamp} +GPS Location: ${selfTestReport.latitude || 'N/A'}, ${selfTestReport.longitude || 'N/A'} =============================================================== TEST RESULTS diff --git a/html/selftest-modal.html b/html/selftest-modal.html index e70929b..a96ea17 100644 --- a/html/selftest-modal.html +++ b/html/selftest-modal.html @@ -3,7 +3,7 @@