mirror of
https://github.com/vvzvlad/vestasync.git
synced 2024-12-26 20:21:00 +03:00
add modbus_err_stats.py util
This commit is contained in:
parent
a714118f63
commit
a37fbc17ef
57
modbus_err_stats.py
Executable file
57
modbus_err_stats.py
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
def restart_service():
|
||||||
|
subprocess.Popen(["systemctl", "restart", "wb-mqtt-serial"], stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def parse_config_file(filename):
|
||||||
|
with open(filename, "r") as file:
|
||||||
|
config_data = json.load(file)
|
||||||
|
|
||||||
|
device_to_port = {}
|
||||||
|
device_errors = {}
|
||||||
|
for port in config_data["ports"]:
|
||||||
|
for device in port["devices"]:
|
||||||
|
device_to_port[device["slave_id"]] = port["path"]
|
||||||
|
device_errors[device["slave_id"]] = 0 # Initialize error count as zero
|
||||||
|
|
||||||
|
return device_to_port, device_errors
|
||||||
|
|
||||||
|
def parse_journal(device_to_port, device_errors):
|
||||||
|
p = subprocess.Popen(["journalctl", "-f", "-u", "wb-mqtt-serial"], stdout=subprocess.PIPE)
|
||||||
|
last_log_line = None
|
||||||
|
|
||||||
|
for line in iter(p.stdout.readline, b''):
|
||||||
|
line = line.decode('utf-8') # convert bytes to string
|
||||||
|
match = re.search(r'modbus:(\d+): Serial protocol error: request timed out', line)
|
||||||
|
if match:
|
||||||
|
device_number = match.group(1)
|
||||||
|
device_errors[device_number] += 1
|
||||||
|
last_log_line = line
|
||||||
|
|
||||||
|
# clear the console
|
||||||
|
os.system('cls' if os.name == 'nt' else 'clear')
|
||||||
|
|
||||||
|
# print the last log line
|
||||||
|
print(f"Last log line: {last_log_line}")
|
||||||
|
|
||||||
|
# print error statistics
|
||||||
|
print_error_statistics(device_errors, device_to_port)
|
||||||
|
|
||||||
|
def print_error_statistics(device_errors, device_to_port):
|
||||||
|
print("\n--- Error Statistics ---")
|
||||||
|
|
||||||
|
# sort by error count
|
||||||
|
sorted_device_errors = sorted(device_errors.items(), key=lambda x: x[1], reverse=True)
|
||||||
|
|
||||||
|
for device, error_count in sorted_device_errors:
|
||||||
|
device_port = device_to_port.get(device, "Unknown port")
|
||||||
|
print(f"Device number {device}\t(port: {device_port})\t had {error_count} errors")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
restart_service()
|
||||||
|
device_to_port, device_errors = parse_config_file("/mnt/data/etc/wb-mqtt-serial.conf")
|
||||||
|
parse_journal(device_to_port, device_errors)
|
Loading…
Reference in New Issue
Block a user