v1.9.8: Self Test - vrai check Envea + firmware version + renommage
- Fix Envea Gas Sensors: scan physique via detect_envea_device (read_ref.py) sur ttyAMA3/4/5 au lieu de juste vérifier envea_sondes_table.connected=1. L'ancien check disait Passed même sans sonde branchée car read_value_v2.py -d imprime un en-tête de debug non vide et utilise "Failed" pas "error". - Ajout Firmware Version dans les logs et le rapport (via firmware_version déjà retourné par get_config_sqlite, pas d'AJAX supplémentaire). - Renommage titre modal "Modem Self Test" -> "Self Test" (couvre aussi capteurs et RTC, pas uniquement le modem). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,45 @@
|
|||||||
{
|
{
|
||||||
"versions": [
|
"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",
|
"version": "1.9.5",
|
||||||
"date": "2026-05-20",
|
"date": "2026-05-20",
|
||||||
|
|||||||
@@ -219,6 +219,7 @@ async function selfTestSequence() {
|
|||||||
selfTestReport.deviceId = configResponse.deviceID || 'Unknown';
|
selfTestReport.deviceId = configResponse.deviceID || 'Unknown';
|
||||||
selfTestReport.deviceName = configResponse.deviceName || 'Unknown';
|
selfTestReport.deviceName = configResponse.deviceName || 'Unknown';
|
||||||
selfTestReport.modemVersion = configResponse.modem_version || 'Unknown';
|
selfTestReport.modemVersion = configResponse.modem_version || 'Unknown';
|
||||||
|
selfTestReport.firmwareVersion = configResponse.firmware_version || 'Unknown';
|
||||||
selfTestReport.latitude = configResponse.latitude_raw || 'N/A';
|
selfTestReport.latitude = configResponse.latitude_raw || 'N/A';
|
||||||
selfTestReport.longitude = configResponse.longitude_raw || 'N/A';
|
selfTestReport.longitude = configResponse.longitude_raw || 'N/A';
|
||||||
selfTestReport.config = configResponse;
|
selfTestReport.config = configResponse;
|
||||||
@@ -245,6 +246,7 @@ async function selfTestSequence() {
|
|||||||
addSelfTestLog('════════════════════════════════════════════════════════');
|
addSelfTestLog('════════════════════════════════════════════════════════');
|
||||||
addSelfTestLog(`Device ID: ${selfTestReport.deviceId}`);
|
addSelfTestLog(`Device ID: ${selfTestReport.deviceId}`);
|
||||||
addSelfTestLog(`Device Name: ${selfTestReport.deviceName}`);
|
addSelfTestLog(`Device Name: ${selfTestReport.deviceName}`);
|
||||||
|
addSelfTestLog(`Firmware Version: ${selfTestReport.firmwareVersion}`);
|
||||||
addSelfTestLog(`Modem Version: ${selfTestReport.modemVersion}`);
|
addSelfTestLog(`Modem Version: ${selfTestReport.modemVersion}`);
|
||||||
addSelfTestLog(`RTC Time: ${selfTestReport.systemTime}`);
|
addSelfTestLog(`RTC Time: ${selfTestReport.systemTime}`);
|
||||||
addSelfTestLog(`Browser Time: ${new Date().toLocaleString()}`);
|
addSelfTestLog(`Browser Time: ${new Date().toLocaleString()}`);
|
||||||
@@ -426,29 +428,42 @@ async function selfTestSequence() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (sensor.type === 'envea') {
|
} else if (sensor.type === 'envea') {
|
||||||
// Envea sensor test - use the debug endpoint for all sensors
|
// Envea sensor test - scan ports physically (same logic as Envea Sondes Detection)
|
||||||
const enveaResult = await new Promise((resolve, reject) => {
|
// The envea_debug endpoint only confirms config (connected=1 in envea_sondes_table),
|
||||||
$.ajax({
|
// not actual device presence. detect_envea_device runs read_ref.py per port and
|
||||||
url: 'launcher.php?type=envea_debug',
|
// checks for a real Envea CAIRSENS response.
|
||||||
dataType: 'text',
|
const enveaPorts = ['ttyAMA3', 'ttyAMA4', 'ttyAMA5'];
|
||||||
method: 'GET',
|
const enveaScan = await Promise.all(enveaPorts.map(port =>
|
||||||
timeout: 30000,
|
new Promise(resolve => {
|
||||||
success: function(data) { resolve(data); },
|
$.ajax({
|
||||||
error: function(xhr, status, error) { reject(new Error(error || status)); }
|
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;
|
const detected = enveaScan.filter(r => r.detected);
|
||||||
addSelfTestLog(`Envea response: ${enveaResult.trim().substring(0, 200)}`);
|
const errored = enveaScan.filter(r => !r.success);
|
||||||
|
|
||||||
if (enveaResult.trim() !== '' && !enveaResult.toLowerCase().includes('error')) {
|
if (detected.length > 0) {
|
||||||
updateTestStatus(sensor.id, 'Passed', 'Sensors responding', 'bg-success');
|
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++;
|
testsPassed++;
|
||||||
} else if (enveaResult.toLowerCase().includes('error')) {
|
} else if (errored.length === enveaPorts.length) {
|
||||||
updateTestStatus(sensor.id, 'Failed', 'Sensor error detected', 'bg-danger');
|
updateTestStatus(sensor.id, 'Failed', 'Aucun port accessible (erreur série)', 'bg-danger');
|
||||||
testsFailed++;
|
testsFailed++;
|
||||||
} else {
|
} 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++;
|
testsFailed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -825,12 +840,13 @@ function generateReport() {
|
|||||||
|
|
||||||
DEVICE INFORMATION
|
DEVICE INFORMATION
|
||||||
------------------
|
------------------
|
||||||
Device ID: ${selfTestReport.deviceId || 'Unknown'}
|
Device ID: ${selfTestReport.deviceId || 'Unknown'}
|
||||||
Device Name: ${selfTestReport.deviceName || 'Unknown'}
|
Device Name: ${selfTestReport.deviceName || 'Unknown'}
|
||||||
Modem Version: ${selfTestReport.modemVersion || 'Unknown'}
|
Firmware Version: ${selfTestReport.firmwareVersion || 'Unknown'}
|
||||||
System Time: ${selfTestReport.systemTime || 'Unknown'}
|
Modem Version: ${selfTestReport.modemVersion || 'Unknown'}
|
||||||
Report Date: ${selfTestReport.timestamp}
|
System Time: ${selfTestReport.systemTime || 'Unknown'}
|
||||||
GPS Location: ${selfTestReport.latitude || 'N/A'}, ${selfTestReport.longitude || 'N/A'}
|
Report Date: ${selfTestReport.timestamp}
|
||||||
|
GPS Location: ${selfTestReport.latitude || 'N/A'}, ${selfTestReport.longitude || 'N/A'}
|
||||||
|
|
||||||
===============================================================
|
===============================================================
|
||||||
TEST RESULTS
|
TEST RESULTS
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="modal-dialog modal-dialog-centered">
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h5 class="modal-title" id="selfTestModalLabel">Modem Self Test</h5>
|
<h5 class="modal-title" id="selfTestModalLabel">Self Test</h5>
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" id="selfTestCloseBtn" disabled></button>
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" id="selfTestCloseBtn" disabled></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
|||||||
Reference in New Issue
Block a user