''' ____ ___ _ _ _ _ ____ / ___| / _ \| | | | \ | | _ \ \___ \| | | | | | | \| | | | | ___) | |_| | |_| | |\ | |_| | |____/ \___/ \___/|_| \_|____/ python3 /var/www/nebuleair_pro_4g/sound_meter/NSRT_mk4_get_data.py Script to get data from the NSRT_MK4 Sound Level Meter triggered by a systemd service sudo systemctl status nebuleair-noise-data.service Need to install "nsrt_mk3_dev" 1.Intervalle d'enregistrement L'intervalle d'enregistrement définit le temps entre deux points successifs enregistrés. Cela définit également la période d'intégration pour le LEQ, et la période d'observation pour L-min et L-max et Lpeak. L'intervalle d'enregistrement peut être réglé de 125 ms (1/8ème) à 2 H par incréments de 125 ms. some parameters can be changed: write_tau(tau: float) -> time constant write_fs(frequency: int) -> sampling freq ''' import nsrt_mk3_dev import sqlite3 import time DEVICE = '/dev/ttyACM0' MAX_RETRIES = 3 RETRY_DELAY = 1.0 # secondes entre deux tentatives # noise_status: 0x00 = OK, 0xFF = disconnected noise_status = 0xFF leq_level_rounded = 0 weighted_level_rounded = 0 # Le NSRT MK4 (USB CDC-ACM) se ré-énumère parfois ~1s sur le bus : /dev/ttyACM0 # disparaît brièvement et un seul échec marquait un point "Déconnecté" à tort. # On retente : si l'OUVERTURE échoue, nsrt reste None et on ré-ouvre au tour # suivant ; si c'est une LECTURE qui échoue, on garde le handle ouvert et on # retente juste les lectures (pas de double-open du port). nsrt = None for attempt in range(1, MAX_RETRIES + 1): try: if nsrt is None: nsrt = nsrt_mk3_dev.NsrtMk3Dev(DEVICE) leq_level = nsrt.read_leq() # LEQ courant weighted_level = nsrt.read_level() # niveau courant en dB leq_level_rounded = round(leq_level, 2) weighted_level_rounded = round(weighted_level, 2) noise_status = 0x00 if attempt > 1: print(f"NSRT MK4 OK après {attempt} tentatives") break except Exception as e: print(f"NSRT MK4 échec lecture (tentative {attempt}/{MAX_RETRIES}): {e}") if attempt < MAX_RETRIES: time.sleep(RETRY_DELAY) # Connect to the SQLite database conn = sqlite3.connect("/var/www/nebuleair_pro_4g/sqlite/sensors.db") cursor = conn.cursor() #GET RTC TIME from SQlite cursor.execute("SELECT * FROM timestamp_table LIMIT 1") row = cursor.fetchone() # Get the first (and only) row rtc_time_str = row[1] # '2025-02-07 12:30:45' #save to sqlite database try: cursor.execute(''' INSERT INTO data_NOISE (timestamp, current_LEQ, DB_A_value, noise_status) VALUES (?,?,?,?)''' , (rtc_time_str, leq_level_rounded, weighted_level_rounded, noise_status)) conn.commit() except Exception as e: print(f"Database error: {e}") conn.close()