diff --git a/config.yaml b/config.yaml index 5a2cb4e..ce73f01 100644 --- a/config.yaml +++ b/config.yaml @@ -1,9 +1,12 @@ # Configuration file for scanner service # it is automatically re-loaded between scans -start_freq: 1000 -stop_freq: 0.2 +start_freq: 4000 +stop_freq: 0.4 freq_step_multiply: 0.95 -allowed_noise_level: 9 -skip_scans_for_noisy_freqs: 5 +allowed_noise_level: 15 +skip_scans_for_noisy_freqs: 3 ampl: 1600 noise_scan: False +hw_version: "2026-04-02" # dit was met 3.33 Ohm weerstand voor stromen boven 1000A +scan_comment: "Paasweekend scan met varierende stoom levels" + diff --git a/scanner.py b/scanner.py index 0e952c9..2cff08c 100644 --- a/scanner.py +++ b/scanner.py @@ -12,23 +12,22 @@ from datetime import datetime import yaml import os +VersionScripSoftware = "2026-03-17" +VersionDspSoftware = "Unknown" + data_rows = [] # global 2-D list state = {} blacklist = [] Inoise_baseline = 0.1 PATTERN = re.compile( - r"Va=(?P-?\d+\.?\d*)\s+" - r"Vp=(?P-?\d+\.?\d*)\s+\|\s+" - r"Ia=(?P-?\d+\.?\d*)\s+" - r"Ip=(?P-?\d+\.?\d*)\s+\|\s+" - r"ZR=(?P-?\d+\.?\d*)\s+" - r"ZX=(?P-?\d+\.?\d*)" - r".*?irq=\d+\s+" # Skip to 'irq=', match the first digits and space - r"(?P[0-9a-fA-F]+)-" # First hex - r"(?P[0-9a-fA-F]+)\s+" # Second hex - r"(?P[0-9a-fA-F]+)-" # Third hex - r"(?P[0-9a-fA-F]+)" # Fourth hex + r"Va=(?P[\d.-]+)\s+Vp=(?P[\d.-]+)\s*\|\s*" + r"Ia=(?P[\d.-]+)\s+Ip=(?P[\d.-]+)\s*\|\s*" + r"ZR=(?P[\d.-]+)\s+ZX=(?P[\d.-]+).*?\|\s*" + r".*?irq=\w+\s+" + r"(?P[0-9a-fA-F]+)-(?P[0-9a-fA-F]+)\s+" + r"(?P[0-9a-fA-F]+)-(?P[0-9a-fA-F]+).*?\|\s*" + r"nv=(?P[\d.-]+)\s+ni=(?P[\d.-]+)\s*\|\s*" ) config_path = '/home/bart/python-scanner/config.yaml' @@ -56,11 +55,26 @@ conn_str = ( ) def dump_into_database(): + print("dump into database\n") try: with pyodbc.connect(conn_str) as conn: cursor = conn.cursor() sweep_insert_time = datetime.now() - print("dump into database\n") + # Add scan details + cursor.execute(""" + IF NOT EXISTS ( + SELECT 1 FROM ScanDetails WHERE StartTimeOfSweep = ? + ) + INSERT INTO ScanDetails + (StartTimeOfSweep, VersionScanScript, VersionDspSoftware, VersionHardware, Comment) + VALUES (?, ?, ?, ?, ?) + """, sweep_insert_time, + sweep_insert_time, VersionScripSoftware, VersionDspSoftware, state["hw_version"], state["scan_comment"]) + print("commit1\n") + conn.commit() + + with pyodbc.connect(conn_str) as conn: + cursor = conn.cursor() # Prepare the data: SQL Server expects the columns in order. if state["noise_scan"]==False: # regular scan data @@ -89,7 +103,7 @@ def dump_into_database(): cursor.fast_executemany = False # needs less RAM cursor.executemany(sql, formatted_rows) - print("commit\n") + print("commit2\n") conn.commit() print(f"Successfully inserted {len(formatted_rows)} rows.") @@ -136,17 +150,19 @@ def extract_to_dataframe(line): if not match: return # silently ignore malformed lines row = [ - float(state["freq"]), - float(match.group("Va")), - float(match.group("Vp")), - float(match.group("Ia")), - float(match.group("Ip")), - float(match.group("ZR")), - float(match.group("ZX")), - int(match.group("adc_vmin"), 16), - int(match.group("adc_vmax"), 16), - int(match.group("adc_imin"), 16), - int(match.group("adc_imax"), 16), + float(state["freq"]), # row 0 + float(match.group("Va")), # row 1 + float(match.group("Vp")), # row 2 + float(match.group("Ia")), # row 3 + float(match.group("Ip")), # row 4 + float(match.group("ZR")), # row 5 + float(match.group("ZX")), # row 6 + int(match.group("adc_vmin"), 16), # row 7 + int(match.group("adc_vmax"), 16), # row 8 + int(match.group("adc_imin"), 16), # row 9 + int(match.group("adc_imax"), 16), # row 10 + float(match.group("nv")), # row 11 + float(match.group("ni")), # row 12 ] row[1] = row[1]/(2*3.14159*row[0]*0.00005 + 1) # compensate Va for pole at 20kHz row[5] = row[1]/row[3] * math.cos(0.01745*(row[2]-row[4])) @@ -219,7 +235,10 @@ class TelnetReader: def process_line(self, line): global state global Inoise_baseline -# print(f"RAW: {line}") + global VersionDspSoftware + if line.startswith("SW-Version"): + VersionDspSoftware = line.split(":", 1)[1].strip() # remember the DSP software version from its reporting + print(f"DSP SW Version={VersionDspSoftware}\r\n") if not line.startswith("Va="): # skip lines that are not to be analyzed return if state["remaining_receive_lines"] > 0 : @@ -228,7 +247,7 @@ class TelnetReader: # prepare new frequency measurement if state["initializing"] == 1: # since we just start a frequency scan, let's set the R, Max and Amplitude - response = f"\rr516\r" # set Resistance value for scaling HAL sensor + response = f"\rr344\r" # set Resistance value for scaling HAL sensor self.tn.write(response.encode("utf-8")) response = f"m1600\r" # set max amplitude value self.tn.write(response.encode("utf-8")) @@ -263,8 +282,8 @@ class TelnetReader: state["freq"] *= freq_multiplier if (state["freq"]>40) and (state["freq"]<660) and ((state["freq"]%50<2.5) or (-state["freq"]%50<2.5)): state["freq"] *= freq_multiplier # if near a 50Hz harmonic, skip to the next frequency - while (state["freq"]<0.6) and ((state["freq"]%state["interference_freq"]