v1.10.0: intégration capteur CCS811 (TVOC/eCO2, I2C)
Nouveau capteur de qualité d'air CCS811 sur le bus I2C, calqué sur le pattern S88 (local-only, pas encore dans le payload de transmission). - CCS811/get_data.py (lecture live) + write_data.py (timer 10s, self-heal table) - table data_CCS811 (timestamp, eCO2, TVOC) dans create_db.py - config CCS811 (bool) + CCS811_address (0x5A/0x5B, défaut 0x5A) dans set_config.py - service+timer systemd nebuleair-ccs811-data (10s) + ajout boucle d'activation - admin.html: case d'activation + dropdown adresse I2C - sensors.html: carte Get Data (TVOC + eCO2) - database.html + launcher.php: consultation/export/stats data_CCS811 - lib adafruit-circuitpython-ccs811 dans installation_part1.sh - CCS811/README.md: câblage, adresses, warning clock-stretching I2C sur Pi - CLAUDE.md + changelog mis à jour Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,7 @@
|
||||
<button class="btn btn-primary mb-2" onclick="openTableModal('data_MPPT','Batterie')" data-i18n="database.battery">Batterie</button>
|
||||
<button class="btn btn-primary mb-2" onclick="openTableModal('data_MHZ19','Mesures CO2 (MH-Z19)')">Mesures CO2 (MH-Z19)</button>
|
||||
<button class="btn btn-primary mb-2" onclick="openTableModal('data_S88','Mesures CO2 (Senseair S88)')">Mesures CO2 (Senseair S88)</button>
|
||||
<button class="btn btn-primary mb-2" onclick="openTableModal('data_CCS811','Mesures TVOC/eCO2 (CCS811)')">Mesures TVOC/eCO2 (CCS811)</button>
|
||||
<button class="btn btn-warning mb-2" onclick="openTableModal('timestamp_table','Timestamp Table')" data-i18n="database.timestampTable">Timestamp Table</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -100,6 +101,7 @@
|
||||
<button class="btn btn-primary mb-2" onclick="downloadByDate('data_mppt')" data-i18n="database.battery">Batterie</button>
|
||||
<button class="btn btn-primary mb-2" onclick="downloadByDate('data_MHZ19')">Mesures CO2 (MH-Z19)</button>
|
||||
<button class="btn btn-primary mb-2" onclick="downloadByDate('data_S88')">Mesures CO2 (Senseair S88)</button>
|
||||
<button class="btn btn-primary mb-2" onclick="downloadByDate('data_CCS811')">Mesures TVOC/eCO2 (CCS811)</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -117,6 +119,7 @@
|
||||
<button class="btn btn-success mb-2" onclick="downloadFullTable('data_MPPT')" data-i18n="database.battery">Batterie</button>
|
||||
<button class="btn btn-success mb-2" onclick="downloadFullTable('data_MHZ19')">Mesures CO2 (MH-Z19)</button>
|
||||
<button class="btn btn-success mb-2" onclick="downloadFullTable('data_S88')">Mesures CO2 (Senseair S88)</button>
|
||||
<button class="btn btn-success mb-2" onclick="downloadFullTable('data_CCS811')">Mesures TVOC/eCO2 (CCS811)</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -320,7 +323,8 @@ function buildTableHeader(table) {
|
||||
data_MPPT: ['Timestamp','Battery Voltage','Battery Current','solar_voltage','solar_power','charger_status'],
|
||||
data_NOISE: ['Timestamp','Curent LEQ','DB_A_value','Status'],
|
||||
data_MHZ19: ['Timestamp','CO2 (ppm)'],
|
||||
data_S88: ['Timestamp','CO2 (ppm)']
|
||||
data_S88: ['Timestamp','CO2 (ppm)'],
|
||||
data_CCS811: ['Timestamp','eCO2 (ppm)','TVOC (ppb)']
|
||||
};
|
||||
return (headers[table] || ['Data']).map(h => `<th>${h}</th>`).join('');
|
||||
}
|
||||
@@ -343,7 +347,7 @@ function buildTableRow(table, columns) {
|
||||
return `<td>${columns[1]}</td>`;
|
||||
}
|
||||
// Default: render all available columns
|
||||
const colCount = { data_BME280: 4, data_NPM_5channels: 6, data_envea: 6, data_WIND: 3, data_MPPT: 6, data_MHZ19: 2, data_S88: 2 };
|
||||
const colCount = { data_BME280: 4, data_NPM_5channels: 6, data_envea: 6, data_WIND: 3, data_MPPT: 6, data_MHZ19: 2, data_S88: 2, data_CCS811: 3 };
|
||||
const n = colCount[table] || columns.length;
|
||||
return columns.slice(0, n).map(c => `<td>${c}</td>`).join('');
|
||||
}
|
||||
@@ -485,6 +489,9 @@ function downloadCSV(response, table) {
|
||||
else if (table === "data_S88") {
|
||||
csvContent += "TimestampUTC,CO2_ppm\n";
|
||||
}
|
||||
else if (table === "data_CCS811") {
|
||||
csvContent += "TimestampUTC,eCO2_ppm,TVOC_ppb\n";
|
||||
}
|
||||
|
||||
// Format rows as CSV
|
||||
rows.forEach(row => {
|
||||
@@ -513,7 +520,8 @@ const tableDisplayNames = {
|
||||
'data_MPPT': 'Batterie (MPPT)',
|
||||
'data_NOISE': 'Bruit',
|
||||
'data_MHZ19': 'CO2 (MH-Z19)',
|
||||
'data_S88': 'CO2 (Senseair S88)'
|
||||
'data_S88': 'CO2 (Senseair S88)',
|
||||
'data_CCS811': 'TVOC/eCO2 (CCS811)'
|
||||
};
|
||||
|
||||
function loadDbStats() {
|
||||
|
||||
Reference in New Issue
Block a user