This commit is contained in:
Your Name
2025-03-10 13:38:02 +01:00
parent 072f98ef95
commit 10c4348e54
3 changed files with 123 additions and 21 deletions

View File

@@ -1,6 +1,12 @@
#!/usr/bin/python3 #!/usr/bin/python3
""" """
Script to set the RTC using an NTP server. ____ _____ ____
| _ \_ _/ ___|
| |_) || || |
| _ < | || |___
|_| \_\|_| \____|
Script to set the RTC using an NTP server (script used by web UI)
RPI needs to be connected to the internet (WIFI). RPI needs to be connected to the internet (WIFI).
Requires ntplib and pytz: Requires ntplib and pytz:
sudo pip3 install ntplib pytz --break-system-packages sudo pip3 install ntplib pytz --break-system-packages

View File

@@ -1,5 +1,11 @@
""" """
Script to set the RTC using the browser time. ____ _____ ____
| _ \_ _/ ___|
| |_) || || |
| _ < | || |___
|_| \_\|_| \____|
Script to set the RTC using the browser time (script used by the web UI).
/usr/bin/python3 /var/www/nebuleair_pro_4g/RTC/set_with_browserTime.py '2024-01-30 12:48:39' /usr/bin/python3 /var/www/nebuleair_pro_4g/RTC/set_with_browserTime.py '2024-01-30 12:48:39'

View File

@@ -290,23 +290,45 @@ try:
print('<h3>START LOOP</h3>') print('<h3>START LOOP</h3>')
#Local timestamp #Local timestamp
#ATTENTION:
# -> RTC module can be deconnected ""
# -> RTC module can be out of time like "2000-01-01T00:55:21Z"
print("Getting local timestamp") print("Getting local timestamp")
cursor.execute("SELECT * FROM timestamp_table LIMIT 1") cursor.execute("SELECT * FROM timestamp_table LIMIT 1")
row = cursor.fetchone() # Get the first (and only) row row = cursor.fetchone() # Get the first (and only) row
rtc_time_str = row[1] # '2025-02-07 12:30:45' rtc_time_str = row[1] # '2025-02-07 12:30:45' ou '2000-01-01 00:55:21' ou 'not connected'
# Convert to a datetime object print(rtc_time_str)
dt_object = datetime.strptime(rtc_time_str, '%Y-%m-%d %H:%M:%S') if rtc_time_str == 'not connected':
# Convert to InfluxDB RFC3339 format with UTC 'Z' suffix print("⛔ Atttention RTC module not connected⛔")
influx_timestamp = dt_object.strftime('%Y-%m-%dT%H:%M:%SZ') rtc_status = "disconnected"
print(influx_timestamp) influx_timestamp="rtc_disconnected"
else :
# Convert to a datetime object
dt_object = datetime.strptime(rtc_time_str, '%Y-%m-%d %H:%M:%S')
# Check if timestamp is reset (year 2000)
if dt_object.year == 2000:
print("⛔ Attention: RTC has been reset to default date ⛔")
rtc_status = "reset"
else:
print("✅ RTC timestamp is valid")
rtc_status = "valid"
# Always convert to InfluxDB format
# Convert to InfluxDB RFC3339 format with UTC 'Z' suffix
influx_timestamp = dt_object.strftime('%Y-%m-%dT%H:%M:%SZ')
rtc_status = "valid"
print(influx_timestamp)
#NEXTPM #NEXTPM
# We take the last measures (order by rowid and not by timestamp)
print("Getting NPM values (last 6 measures)") print("Getting NPM values (last 6 measures)")
#cursor.execute("SELECT * FROM data_NPM ORDER BY timestamp DESC LIMIT 1") #cursor.execute("SELECT * FROM data_NPM ORDER BY timestamp DESC LIMIT 1")
cursor.execute("SELECT * FROM data_NPM ORDER BY timestamp DESC LIMIT 6") #cursor.execute("SELECT * FROM data_NPM ORDER BY timestamp DESC LIMIT 6")
cursor.execute("SELECT rowid, * FROM data_NPM ORDER BY rowid DESC LIMIT 6")
rows = cursor.fetchall() rows = cursor.fetchall()
# Exclude the timestamp column (assuming first column is timestamp) # Exclude the timestamp column (assuming first column is timestamp)
data_values = [row[1:] for row in rows] # Exclude timestamp data_values = [row[2:] for row in rows] # Exclude timestamp
# Compute column-wise average # Compute column-wise average
num_columns = len(data_values[0]) num_columns = len(data_values[0])
averages = [round(sum(col) / len(col),1) for col in zip(*data_values)] averages = [round(sum(col) / len(col),1) for col in zip(*data_values)]
@@ -407,7 +429,7 @@ try:
response2 = read_complete_response(ser_sara, wait_for_lines=["OK"]) response2 = read_complete_response(ser_sara, wait_for_lines=["OK"])
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(response2) print(response2)
print("</p>") print("</p>", end="")
match = re.search(r'\+CSQ:\s*(\d+),', response2) match = re.search(r'\+CSQ:\s*(\d+),', response2)
if match: if match:
signal_quality = int(match.group(1)) signal_quality = int(match.group(1))
@@ -425,7 +447,7 @@ try:
responseReconnect = read_complete_response(ser_sara, timeout=20, end_of_response_timeout=20) responseReconnect = read_complete_response(ser_sara, timeout=20, end_of_response_timeout=20)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(responseReconnect) print(responseReconnect)
print("</p>") print("</p>", end="")
print('🛑STOP LOOP🛑') print('🛑STOP LOOP🛑')
print("<hr>") print("<hr>")
@@ -467,7 +489,7 @@ try:
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(response_SARA_3) print(response_SARA_3)
print("</p>") print("</p>", end="")
# si on recoit la réponse UHTTPCR # si on recoit la réponse UHTTPCR
if "+UUHTTPCR" in response_SARA_3: if "+UUHTTPCR" in response_SARA_3:
@@ -547,7 +569,7 @@ try:
response_SARA_9 = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False) response_SARA_9 = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(response_SARA_9) print(response_SARA_9)
print("</p>") print("</p>", end="")
''' '''
+UHTTPER: profile_id,error_class,error_code +UHTTPER: profile_id,error_class,error_code
@@ -580,7 +602,7 @@ try:
responseResetHTTP2_profile = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=5, wait_for_lines=["OK", "+CME ERROR"], debug=True) responseResetHTTP2_profile = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=5, wait_for_lines=["OK", "+CME ERROR"], debug=True)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(responseResetHTTP2_profile) print(responseResetHTTP2_profile)
print("</p>") print("</p>", end="")
# 2.2 code 1 (HHTP succeded) # 2.2 code 1 (HHTP succeded)
@@ -597,7 +619,75 @@ try:
response_SARA_4 = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False) response_SARA_4 = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False)
print('<p class="text-success">') print('<p class="text-success">')
print(response_SARA_4) print(response_SARA_4)
print('</p>') print("</p>", end="")
#Parse the server datetime
# Extract just the date from the response
date_string = None
date_start = response_SARA_4.find("Date: ")
if date_start != -1:
date_end = response_SARA_4.find("\n", date_start)
date_string = response_SARA_4[date_start + 6:date_end].strip()
print(f'<div class="text-primary">Server date: {date_string}</div>', end="")
# Optionally convert to datetime object
try:
from datetime import datetime
server_datetime = datetime.strptime(
date_string,
"%a, %d %b %Y %H:%M:%S %Z"
)
#print(f'<p class="text-primary">Parsed datetime: {server_datetime}</p>')
except Exception as e:
print(f'<p class="text-warning">Error parsing date: {e}</p>')
# Get RTC time from SQLite
cursor.execute("SELECT * FROM timestamp_table LIMIT 1")
row = cursor.fetchone()
rtc_time_str = row[1] # '2025-02-07 12:30:45' or '2000-01-01 00:55:21' or 'not connected'
print(f'<div class="text-primary">RTC time: {rtc_time_str}</div>', end="")
# Compare times if both are available
if server_datetime and rtc_time_str != 'not connected':
try:
# Convert RTC time string to datetime
rtc_datetime = datetime.strptime(rtc_time_str, '%Y-%m-%d %H:%M:%S')
# Calculate time difference in seconds
time_diff = abs((server_datetime - rtc_datetime).total_seconds())
print(f'<div class="text-primary">Time difference: {time_diff:.2f} seconds</div>', end="")
# Check if difference is more than 10 seconds
# and update the RTC clock
if time_diff > 10:
print(f'<div class="text-warning"><strong>⚠️ RTC time differs from server time by {time_diff:.2f} seconds!</strong></div>', end="")
# Format server time for RTC update
server_time_formatted = server_datetime.strftime('%Y-%m-%d %H:%M:%S')
#update RTC module do not wait for answer, non blocking
#/usr/bin/python3 /var/www/nebuleair_pro_4g/RTC/set_with_browserTime.py '2024-01-30 12:48:39'
# Launch RTC update script as non-blocking subprocess
import subprocess
update_command = [
"/usr/bin/python3",
"/var/www/nebuleair_pro_4g/RTC/set_with_browserTime.py",
server_time_formatted
]
# Execute the command without waiting for result
subprocess.Popen(update_command,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
print(f'<div class="text-warning">➡️ Updating RTC with server time: {server_time_formatted}</div>', end="")
else:
print(f'<div class="text-success">✅ RTC time is synchronized with server time (within 10 seconds)</div>')
except Exception as e:
print(f'<p class="text-warning">Error comparing times: {e}</p>')
#Si non ne recoit pas de réponse UHTTPCR #Si non ne recoit pas de réponse UHTTPCR
#on a peut etre une ERROR de type "+CME ERROR: No connection to phone" ou "Operation not allowed" #on a peut etre une ERROR de type "+CME ERROR: No connection to phone" ou "Operation not allowed"
@@ -629,7 +719,7 @@ try:
responseReconnect = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=120, wait_for_lines=["OK", "+CME ERROR"], debug=True) responseReconnect = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=120, wait_for_lines=["OK", "+CME ERROR"], debug=True)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(responseReconnect) print(responseReconnect)
print("</p>") print("</p>", end="")
# Handle "Operation not allowed" error # Handle "Operation not allowed" error
if error_message == "Operation not allowed": if error_message == "Operation not allowed":
print('<span style="color: orange;font-weight: bold;">❓Try Resetting the HTTP Profile❓</span>') print('<span style="color: orange;font-weight: bold;">❓Try Resetting the HTTP Profile❓</span>')
@@ -638,7 +728,7 @@ try:
responseResetHTTP_profile = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=5, wait_for_lines=["OK", "+CME ERROR"], debug=True) responseResetHTTP_profile = read_complete_response(ser_sara, timeout=5, end_of_response_timeout=5, wait_for_lines=["OK", "+CME ERROR"], debug=True)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(responseResetHTTP_profile) print(responseResetHTTP_profile)
print("</p>") print("</p>", end="")
check_lines = responseResetHTTP_profile.strip().splitlines() check_lines = responseResetHTTP_profile.strip().splitlines()
for line in check_lines: for line in check_lines:
if "+CME ERROR: Operation not allowed" in line: if "+CME ERROR: Operation not allowed" in line:
@@ -687,7 +777,7 @@ try:
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(response_SARA_8) print(response_SARA_8)
print("</p>") print("</p>", end="")
# si on recoit la réponse UHTTPCR # si on recoit la réponse UHTTPCR
if "+UUHTTPCR" in response_SARA_8: if "+UUHTTPCR" in response_SARA_8:
@@ -740,7 +830,7 @@ try:
response_SARA_9b = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False) response_SARA_9b = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False)
print('<p class="text-danger-emphasis">') print('<p class="text-danger-emphasis">')
print(response_SARA_9b) print(response_SARA_9b)
print("</p>") print("</p>", end="")
''' '''
+UHTTPER: profile_id,error_class,error_code +UHTTPER: profile_id,error_class,error_code
@@ -773,7 +863,7 @@ try:
response_SARA_4b = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False) response_SARA_4b = read_complete_response(ser_sara, wait_for_lines=["OK"], debug=False)
print('<p class="text-success">') print('<p class="text-success">')
print(response_SARA_4b) print(response_SARA_4b)
print('</p>') print("</p>", end="")