'''
  ____   ___  _   _ _   _ ____  
 / ___| / _ \| | | | \ | |  _ \ 
 \___ \| | | | | | |  \| | | | |
  ___) | |_| | |_| | |\  | |_| |
 |____/ \___/ \___/|_| \_|____/ 
                                
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

# noise_status: 0x00 = OK, 0xFF = disconnected
noise_status = 0x00
leq_level_rounded = 0
weighted_level_rounded = 0

try:
    nsrt = nsrt_mk3_dev.NsrtMk3Dev('/dev/ttyACM0')

    freq_level = nsrt.read_fs()             #current sampling frequency
    time_constant = nsrt.read_tau()         #reads the current time constant
    leq_level = nsrt.read_leq()             #current running LEQ and starts the integration of a new LEQ.
    weighting = nsrt.read_weighting()       #weighting curve that is currently selected ( A ou C)
    weighted_level = nsrt.read_level()      #current running level in dB.

    leq_level_rounded = round(leq_level, 2)
    weighted_level_rounded = round(weighted_level, 2)

except Exception as e:
    err_msg = str(e)
    if "No such file or directory" in err_msg or "could not open port" in err_msg:
        print(f"NSRT MK4 disconnected: {err_msg}")
        noise_status = 0xFF
    else:
        print(f"NSRT MK4 error: {err_msg}")
        noise_status = 0xFF

# 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()