v1.10.1: OTA installe les deps pip + filtre lectures parasites CCS811

Découvert en vérif SSH sur nebuleair-pro100 : le timer CCS811 échouait en
ModuleNotFoundError car l'OTA fait git pull mais ne réinstallait jamais les
dépendances pip (installation_part1.sh ne tourne qu'à l'install neuve).

- requirements.txt: source unique de vérité des deps Python
- installation_part1.sh: install via requirements.txt (chemin relatif au script,
  le repo n'est pas encore cloné dans /var/www à cette étape)
- update_firmware.sh: nouvelle étape 2a, pip install -r requirements.txt
  (idempotent) -> les capteurs déjà déployés récupèrent les libs manquantes à l'OTA
- CCS811/write_data.py + get_data.py: skip des lectures eCO2 < 400 ppm
  (échantillon 0/0 parasite juste après init du driver, plancher physique = 400)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
PaulVua
2026-06-02 15:51:58 +02:00
parent 4f3d273981
commit 46c73acb7e
7 changed files with 65 additions and 5 deletions

View File

@@ -76,9 +76,13 @@ def main():
print(json.dumps({"error": "CCS811 data not ready (warming up?)"}))
return
eco2 = ccs811.eco2
tvoc = ccs811.tvoc
print(json.dumps({"eCO2": int(eco2), "TVOC": int(tvoc)}))
eco2 = int(ccs811.eco2)
tvoc = int(ccs811.tvoc)
# eCO2 floor is 400 ppm; a sub-400 value is a not-yet-settled sample.
if eco2 < 400:
print(json.dumps({"error": "CCS811 reading not settled (warming up?)"}))
return
print(json.dumps({"eCO2": eco2, "TVOC": tvoc}))
except Exception as e:
print(json.dumps({"error": f"CCS811 read error: {e}"}))

View File

@@ -78,6 +78,13 @@ def main():
eco2 = int(ccs811.eco2)
tvoc = int(ccs811.tvoc)
# eCO2 has a physical floor of 400 ppm. Just after the driver (re)inits,
# the CCS811 can return a 0/0 sample before its first valid measurement is
# ready — those are spurious, drop them (next 10 s tick will retry).
if eco2 < 400:
print(f"CCS811: reading not settled (eCO2={eco2}), skipping.")
return
cursor.execute("SELECT last_updated FROM timestamp_table LIMIT 1")
row = cursor.fetchone()
rtc_time_str = row[0]