polymech - fw latest | web ui
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
# Default device identifier (mDNS or IP)
|
||||
DEFAULT_DEVICE_ID = "modbus-esp32.local"
|
||||
|
||||
# API endpoint
|
||||
API_ENDPOINT = "/api/v1/system/boot-metrics"
|
||||
|
||||
# Output directory
|
||||
OUTPUT_DIR = "./tmp"
|
||||
OUTPUT_FILE = "boot_metrics.json"
|
||||
|
||||
def get_device_url(device_id):
|
||||
"""Constructs the full URL for the API endpoint."""
|
||||
if not device_id.startswith(("http://", "https://")):
|
||||
device_id = f"http://{device_id}"
|
||||
return f"{device_id}{API_ENDPOINT}"
|
||||
|
||||
def fetch_and_save_metrics(device_url):
|
||||
"""Fetches boot and current metrics from the device and saves them to a JSON file."""
|
||||
try:
|
||||
print(f"Attempting to fetch metrics from: {device_url}")
|
||||
response = requests.get(device_url, timeout=10) # 10 second timeout
|
||||
response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
|
||||
|
||||
metrics_data = response.json()
|
||||
print("Successfully fetched metrics:")
|
||||
# Print initial and current metrics
|
||||
print(json.dumps(metrics_data, indent=2))
|
||||
|
||||
# Ensure the output directory exists
|
||||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||||
|
||||
output_path = os.path.join(OUTPUT_DIR, OUTPUT_FILE)
|
||||
|
||||
# Save the data to a JSON file
|
||||
with open(output_path, 'w') as f:
|
||||
json.dump(metrics_data, f, indent=4)
|
||||
|
||||
print(f"Metrics saved to: {output_path}")
|
||||
|
||||
except requests.exceptions.ConnectionError as e:
|
||||
print(f"Error: Could not connect to the device at {device_url}.", file=sys.stderr)
|
||||
print(f"Details: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except requests.exceptions.Timeout:
|
||||
print(f"Error: Request timed out while connecting to {device_url}.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: An error occurred during the request to {device_url}.", file=sys.stderr)
|
||||
print(f"Details: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except json.JSONDecodeError:
|
||||
print(f"Error: Failed to decode JSON response from {device_url}.", file=sys.stderr)
|
||||
print(f"Received content: {response.text}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except OSError as e:
|
||||
print(f"Error: Could not create directory or write file.", file=sys.stderr)
|
||||
print(f"Details: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Fetch boot and current metrics from ESP32 device via REST API.")
|
||||
parser.add_argument(
|
||||
"--ip",
|
||||
type=str,
|
||||
default=DEFAULT_DEVICE_ID,
|
||||
help=f"IP address or mDNS name of the device (default: {DEFAULT_DEVICE_ID})"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
url = get_device_url(args.ip)
|
||||
fetch_and_save_metrics(url)
|
||||
Reference in New Issue
Block a user