first add of webui

This commit is contained in:
Chuck
2025-05-31 11:38:40 -05:00
parent b319b2de30
commit 4066d30195
3 changed files with 77 additions and 2 deletions

View File

@@ -14,5 +14,4 @@ icalevents
python-socketio python-socketio
python-engineio python-engineio
websockets websockets
websocket-client websocket-client
requests

View File

@@ -38,6 +38,20 @@ class ConfigManager:
print(f"Error loading configuration: {str(e)}") print(f"Error loading configuration: {str(e)}")
raise raise
def save_config(self, config_data: Dict[str, Any]) -> None:
"""Save configuration to the main JSON file."""
try:
with open(self.config_path, 'w') as f:
json.dump(config_data, f, indent=4)
self.config = config_data # Update the in-memory config
print(f"Configuration successfully saved to {os.path.abspath(self.config_path)}")
except IOError as e:
print(f"Error writing configuration to file {os.path.abspath(self.config_path)}: {e}")
raise
except Exception as e:
print(f"An unexpected error occurred while saving configuration: {str(e)}")
raise
def _deep_merge(self, target: Dict, source: Dict) -> None: def _deep_merge(self, target: Dict, source: Dict) -> None:
"""Deep merge source dict into target dict.""" """Deep merge source dict into target dict."""
for key, value in source.items(): for key, value in source.items():

62
web_interface.py Normal file
View File

@@ -0,0 +1,62 @@
from flask import Flask, render_template_string, request, redirect, url_for
import json # Added import for json
from src.config_manager import ConfigManager
app = Flask(__name__)
config_manager = ConfigManager()
CONFIG_TEMPLATE = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>LED Matrix Config</title>
<style>
body { font-family: sans-serif; margin: 20px; }
label { display: block; margin-top: 10px; }
input[type="text"], textarea { width: 100%; padding: 8px; margin-top: 5px; border-radius: 4px; border: 1px solid #ccc; box-sizing: border-box; }
input[type="submit"] { background-color: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; margin-top: 20px;}
input[type="submit"]:hover { background-color: #45a049; }
.container { max-width: 600px; margin: auto; background: #f9f9f9; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
h1 { text-align: center; }
</style>
</head>
<body>
<div class="container">
<h1>LED Matrix Configuration</h1>
<form method="post" action="{{ url_for('save_config_route') }}">
<label for="config_data">Configuration (JSON):</label>
<textarea name="config_data" rows="20" cols="80">{{ config_json }}</textarea><br>
<input type="submit" value="Save Configuration">
</form>
</div>
</body>
</html>
"""
@app.route('/')
def display_config_route():
try:
current_config = config_manager.load_config()
# Pretty print JSON for the textarea
config_json = json.dumps(current_config, indent=4)
return render_template_string(CONFIG_TEMPLATE, config_json=config_json)
except Exception as e:
return f"Error loading configuration: {str(e)}", 500
@app.route('/save', methods=['POST'])
def save_config_route():
try:
new_config_str = request.form['config_data']
new_config = json.loads(new_config_str) # Parse the JSON string from textarea
config_manager.save_config(new_config)
return redirect(url_for('display_config_route'))
except json.JSONDecodeError:
return "Error: Invalid JSON format submitted.", 400
except Exception as e:
return f"Error saving configuration: {str(e)}", 500
if __name__ == '__main__':
# Make sure to run with debug=True only for development
# In a production environment, use a proper WSGI server like Gunicorn
app.run(debug=True, host='0.0.0.0', port=5000)