feat(ui): add NextPM firmware version button on sensors page

Add a "Firmware Version" button next to "Get Data" in the NextPM card
that calls firmware_version.py and displays the result as a badge.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
PaulVua
2026-02-10 17:05:10 +01:00
parent 6bdaef8c24
commit 544eebd715
3 changed files with 50 additions and 13 deletions

View File

@@ -608,6 +608,13 @@ if ($type == "npm") {
echo $output; echo $output;
} }
if ($type == "npm_firmware") {
$port=$_GET['port'];
$command = 'sudo /usr/bin/python3 /var/www/nebuleair_pro_4g/NPM/firmware_version.py ' . $port;
$output = shell_exec($command);
echo $output;
}
if ($type == "envea") { if ($type == "envea") {
$port=$_GET['port']; $port=$_GET['port'];
$name=$_GET['name']; $name=$_GET['name'];

View File

@@ -375,6 +375,14 @@
</div> </div>
<div class="list-group" id="selftest_results"> <div class="list-group" id="selftest_results">
<!-- Dynamic sensor test entries will be added here -->
<div id="sensor_tests_container"></div>
<!-- Separator for communication tests -->
<div id="comm_tests_separator" class="list-group-item bg-light text-center py-1" style="display:none;">
<small class="text-muted fw-bold">COMMUNICATION</small>
</div>
<!-- Info: WiFi Status --> <!-- Info: WiFi Status -->
<div class="list-group-item d-flex justify-content-between align-items-center" id="test_wifi"> <div class="list-group-item d-flex justify-content-between align-items-center" id="test_wifi">
<div> <div>
@@ -384,7 +392,7 @@
<span id="test_wifi_status" class="badge bg-secondary">Pending</span> <span id="test_wifi_status" class="badge bg-secondary">Pending</span>
</div> </div>
<!-- Test 1: Modem Connection --> <!-- Test: Modem Connection -->
<div class="list-group-item d-flex justify-content-between align-items-center" id="test_modem"> <div class="list-group-item d-flex justify-content-between align-items-center" id="test_modem">
<div> <div>
<strong>Modem Connection</strong> <strong>Modem Connection</strong>
@@ -393,7 +401,7 @@
<span id="test_modem_status" class="badge bg-secondary">Pending</span> <span id="test_modem_status" class="badge bg-secondary">Pending</span>
</div> </div>
<!-- Test 2: SIM Card --> <!-- Test: SIM Card -->
<div class="list-group-item d-flex justify-content-between align-items-center" id="test_sim"> <div class="list-group-item d-flex justify-content-between align-items-center" id="test_sim">
<div> <div>
<strong>SIM Card</strong> <strong>SIM Card</strong>
@@ -402,7 +410,7 @@
<span id="test_sim_status" class="badge bg-secondary">Pending</span> <span id="test_sim_status" class="badge bg-secondary">Pending</span>
</div> </div>
<!-- Test 3: Signal Strength --> <!-- Test: Signal Strength -->
<div class="list-group-item d-flex justify-content-between align-items-center" id="test_signal"> <div class="list-group-item d-flex justify-content-between align-items-center" id="test_signal">
<div> <div>
<strong>Signal Strength</strong> <strong>Signal Strength</strong>
@@ -411,7 +419,7 @@
<span id="test_signal_status" class="badge bg-secondary">Pending</span> <span id="test_signal_status" class="badge bg-secondary">Pending</span>
</div> </div>
<!-- Test 4: Network Connection --> <!-- Test: Network Connection -->
<div class="list-group-item d-flex justify-content-between align-items-center" id="test_network"> <div class="list-group-item d-flex justify-content-between align-items-center" id="test_network">
<div> <div>
<strong>Network Connection</strong> <strong>Network Connection</strong>
@@ -419,14 +427,6 @@
</div> </div>
<span id="test_network_status" class="badge bg-secondary">Pending</span> <span id="test_network_status" class="badge bg-secondary">Pending</span>
</div> </div>
<!-- Separator for sensor tests -->
<div id="sensor_tests_separator" class="list-group-item bg-light text-center py-1" style="display:none;">
<small class="text-muted fw-bold">SENSOR TESTS</small>
</div>
<!-- Dynamic sensor test entries will be added here -->
<div id="sensor_tests_container"></div>
</div> </div>
<!-- Logs section --> <!-- Logs section -->
@@ -1612,8 +1612,8 @@ function resetSelfTestUI() {
document.getElementById('test_network_detail').textContent = 'Waiting...'; document.getElementById('test_network_detail').textContent = 'Waiting...';
// Reset sensor tests // Reset sensor tests
document.getElementById('sensor_tests_separator').style.display = 'none';
document.getElementById('sensor_tests_container').innerHTML = ''; document.getElementById('sensor_tests_container').innerHTML = '';
document.getElementById('comm_tests_separator').style.display = 'none';
// Reset logs // Reset logs
document.getElementById('selftest_logs').innerHTML = ''; document.getElementById('selftest_logs').innerHTML = '';

View File

@@ -145,6 +145,33 @@ function getNPM_values(port){
}); });
} }
function getNPM_firmware(port){
console.log("Firmware version from NPM (port "+port+"):");
$("#loading_fw_"+port).show();
$.ajax({
url: 'launcher.php?type=npm_firmware&port='+port,
dataType: 'json',
method: 'GET',
success: function(response) {
console.log(response);
$("#loading_fw_"+port).hide();
const fwSpan = document.getElementById("fw_version_"+port);
if (response.firmware_version !== undefined) {
fwSpan.innerHTML = '<span class="badge bg-success">Firmware: ' + response.firmware_version + '</span>';
} else {
fwSpan.innerHTML = '<span class="badge bg-danger">Error reading firmware</span>';
}
},
error: function(xhr, status, error) {
console.error('AJAX request failed:', status, error);
$("#loading_fw_"+port).hide();
const fwSpan = document.getElementById("fw_version_"+port);
fwSpan.innerHTML = '<span class="badge bg-danger">Error</span>';
}
});
}
function getENVEA_values(port, name){ function getENVEA_values(port, name){
console.log("Data from Envea " + name + " (port " + port + "):"); console.log("Data from Envea " + name + " (port " + port + "):");
$("#loading_envea" + name).show(); $("#loading_envea" + name).show();
@@ -369,8 +396,11 @@ error: function(xhr, status, error) {
<h5 class="card-title" data-i18n="sensors.npm.title">NextPM</h5> <h5 class="card-title" data-i18n="sensors.npm.title">NextPM</h5>
<p class="card-text" data-i18n="sensors.npm.description">Capteur particules fines.</p> <p class="card-text" data-i18n="sensors.npm.description">Capteur particules fines.</p>
<button class="btn btn-primary" onclick="getNPM_values('ttyAMA5')" data-i18n="common.getData">Get Data</button> <button class="btn btn-primary" onclick="getNPM_values('ttyAMA5')" data-i18n="common.getData">Get Data</button>
<button class="btn btn-secondary" onclick="getNPM_firmware('ttyAMA5')">Firmware Version</button>
<br> <br>
<div id="loading_ttyAMA5" class="spinner-border spinner-border-sm" style="display: none;" role="status"></div> <div id="loading_ttyAMA5" class="spinner-border spinner-border-sm" style="display: none;" role="status"></div>
<div id="loading_fw_ttyAMA5" class="spinner-border spinner-border-sm" style="display: none;" role="status"></div>
<div id="fw_version_ttyAMA5" class="mt-1"></div>
<table class="table table-striped-columns"> <table class="table table-striped-columns">
<tbody id="data-table-body_ttyAMA5"></tbody> <tbody id="data-table-body_ttyAMA5"></tbody>
</table> </table>