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>
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>
- installation_part1.sh: install paquet Tailscale + sudoers /usr/bin/tailscale
- services/tailscale_bootstrap.sh (nouveau): script idempotent d'enrolement au boot
- services/setup_services.sh: service systemd nebuleair-tailscale-bootstrap (one-shot)
- update_firmware.sh: nouvelle etape 3d 'Bootstrap Tailscale' (self-heal install + fetch
authkey depuis data.nebuleair.fr/pro_4G/get_tailscale_key.php + enrolement). Fallback
HTTPS->HTTP en attendant le cert TLS cote serveur.
Permet l'acces SSH distant aux 200 capteurs deployes via le tailnet une fois que leur
client a clique sur 'Update' dans l'admin web. Necessite l'endpoint serveur
get_tailscale_key.php en place sur data.nebuleair.fr (a deployer en parallele cote
AirCarto, auth par deviceID + rate limit + audit log).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Configure Apache pour accepter les .htaccess (AllowOverride All)
et augmente les limites PHP (upload_max_filesize=50M, post_max_size=55M)
directement dans php.ini comme fallback. Necessaire pour l'upload
de firmware .zip via la page admin.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements power saving optimizations to extend battery life on solar-powered remote air quality sensors:
- WiFi Power Saving: Disable WiFi 10 minutes after boot to save ~100-200mA
- Configurable via web UI checkbox in admin panel
- WiFi automatically re-enables after reboot for 10-minute configuration window
- Systemd timer (nebuleair-wifi-powersave.timer) manages automatic disable
- New wifi/power_save.py script checks database config and disables WiFi via nmcli
- HDMI Disable: Added hdmi_blanking=2 to boot config to save ~20-30mA
- Automatically configured during installation
- Database: Added wifi_power_saving boolean config (default: disabled)
- Uses INSERT OR IGNORE for safe updates to existing installations
- UI: Added checkbox control in admin.html for WiFi power saving
- Includes helpful description of power savings and behavior
- Services: Updated setup_services.sh and update_firmware.sh to manage new timer
Total power savings: ~120-230mA when WiFi power saving enabled
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>