From af4355a83f491a97ed96cf71a5f93978605c6e12 Mon Sep 17 00:00:00 2001 From: oberon Date: Wed, 11 Feb 2026 21:13:10 +0100 Subject: [PATCH] updated control functions --- .DS_Store | Bin 8196 -> 8196 bytes app.py | 54 +++++++++++- static/.DS_Store | Bin 0 -> 6148 bytes static/js/app.js | 193 +++++++++++++++++++++++++++++++++-------- templates/control.html | 38 +++++--- 5 files changed, 232 insertions(+), 53 deletions(-) create mode 100644 static/.DS_Store diff --git a/.DS_Store b/.DS_Store index aceeb6873612ae99eab8e94b6bbdf7f7db9286ad..e9122880ea4f6406803999a0e6b91bb4da4c8c99 100644 GIT binary patch delta 140 zcmZp1XmOa}&&akhU^hP_+h!htU2LXo48;s342eLT$&j3uQk6iQ{t cWhh|C0ZXSc6vL%A7V=*&8UJ5P% diff --git a/app.py b/app.py index 88abb90..f2d46e9 100644 --- a/app.py +++ b/app.py @@ -267,13 +267,61 @@ def api_stop_all(): return jsonify({"success": False, "message": "Nicht verbunden"}), 400 try: - current_device.Stop() # ← Stoppt alle Kanäle des Devices - logger.info("Alle Kanäle gestoppt") - return jsonify({"success": True}) + # Nur stoppen – KEIN Disconnect! + current_device.Stop() + logger.info("Alle Kanäle gestoppt (Verbindung bleibt bestehen)") + return jsonify({"success": True, "message": "Alle Kanäle gestoppt"}) except Exception as e: logger.exception("Stop-Fehler") return jsonify({"success": False, "message": str(e)}), 500 +@app.route('/api/reconnect', methods=['POST']) +def api_reconnect(): + global current_device, current_module, current_hub + if current_config is None: + return jsonify({"success": False, "message": "Keine Konfiguration geladen"}), 400 + + try: + # Alte Verbindung sauber beenden, falls nötig + if current_device is not None: + try: + current_device.Disconnect() + except: + pass + + # Neu verbinden (kopierter Code aus api_connect) + hub_id = int(current_config.get('hub_id', 0)) + hub_type = current_config.get('hub_type', '6channel') + + mk = MouldKing() + mk.SetAdvertiser(advertiser) + try: + mk.SetTracer(tracer) + except: + pass + + if hub_type.lower() in ['6channel', '6']: + current_module = mk.Module6_0() + else: + current_module = mk.Module4_0() + + device_attr = f'Device{hub_id}' + if not hasattr(current_module, device_attr): + raise ValueError(f"Hub-ID {hub_id} nicht unterstützt") + + current_device = getattr(current_module, device_attr) + current_device.Connect() + + current_hub = mk + + logger.info(f"Re-Connect erfolgreich: Hub {hub_id}") + return jsonify({"success": True, "message": "Verbindung wiederhergestellt"}) + + except Exception as e: + logger.exception("Re-Connect-Fehler") + return jsonify({"success": False, "message": str(e)}), 500 + + if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file diff --git a/static/.DS_Store b/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0d962943b4217fdb3546088f0d4a02528777b2a1 GIT binary patch literal 6148 zcmeH~Jr2S!425lAKw|00n1usyg9yP1xB!BR0Utb*@FJ*K=2U&oT2Q7wa*e@u>x3=Er<$CqZN!+^)bZi z-VT=BSCcIm?V>q+Xx>?Eih*ggixwm>tquk%Km`U0Oe62?{NKU9&HsZIrc{6m{Fwqe z+wQj;yi}g8AFpTiLso6w;Gl0uc>4)JVn^{3?uP5d7GO=bASy8a2)GOkRN$uyJOTM; B5HtV) literal 0 HcmV?d00001 diff --git a/static/js/app.js b/static/js/app.js index c69c93b..ec6653a 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1,17 +1,26 @@ -// app.js – gemeinsames JavaScript -console.log("MK Control JS geladen"); +// static/js/app.js – MK Control Frontend document.addEventListener('DOMContentLoaded', () => { console.log('MK Control Frontend geladen'); - const connectBtn = document.getElementById('connect-btn'); - const connectSection = document.getElementById('connect-section'); - const controlSection = document.getElementById('control-section'); + // ── Elemente ─────────────────────────────────────────────────────────────── + const connectBtn = document.getElementById('connect-btn'); + const connectSection = document.getElementById('connect-section'); + const controlSection = document.getElementById('control-section'); const channelsContainer = document.getElementById('channels-container'); - const stopAllBtn = document.getElementById('stop-all-btn'); + const stopAllBtn = document.getElementById('stop-all-btn'); + const reconnectSection = document.getElementById('reconnect-section'); + const reconnectBtn = document.getElementById('reconnect-btn'); - if (!connectBtn) return; // Sicherstellen, dass wir auf der richtigen Seite sind + if (!connectBtn) { + console.warn('Nicht auf der Steuerseite – Connect-Button nicht gefunden'); + return; + } + // ── Config aus Template (von Flask eingebettet) ─────────────────────────── + const config = window.config || {}; // Sicherstellen, dass config existiert + + // ── Connect-Button ──────────────────────────────────────────────────────── connectBtn.addEventListener('click', async () => { connectBtn.disabled = true; connectBtn.innerHTML = ' Verbinde...'; @@ -27,39 +36,89 @@ document.addEventListener('DOMContentLoaded', () => { if (result.success) { connectSection.style.display = 'none'; controlSection.style.display = 'block'; + reconnectSection.style.display = 'none'; renderChannels(); - alert('Verbunden! (Simulation)'); + console.log('Verbindung erfolgreich'); } else { - alert('Verbindung fehlgeschlagen: ' + (result.message || 'Unbekannter Fehler')); + alert('Verbindung fehlgeschlagen:\n' + (result.message || 'Unbekannter Fehler')); } } catch (err) { - console.error(err); - alert('Fehler bei der Verbindung: ' + err.message); + console.error('Connect-Fehler:', err); + alert('Netzwerk- oder Verbindungsfehler: ' + err.message); } finally { connectBtn.disabled = false; connectBtn.innerHTML = ' Mit Hub verbinden'; } }); - stopAllBtn.addEventListener('click', async () => { - if (!confirm('Wirklich alle Kanäle stoppen?')) return; + // ── Alle stoppen ────────────────────────────────────────────────────────── + if (stopAllBtn) { + stopAllBtn.addEventListener('click', async () => { + if (!confirm('Wirklich ALLE Kanäle stoppen?')) return; - try { - const res = await fetch('/api/stop_all', { method: 'POST' }); - const data = await res.json(); - if (data.success) { - alert('Alle Kanäle gestoppt'); + try { + const res = await fetch('/api/stop_all', { method: 'POST' }); + const data = await res.json(); + + if (data.success) { + // Alle Motor-Slider zurücksetzen + document.querySelectorAll('.motor-slider').forEach(slider => { + slider.value = 0; + const display = slider.parentElement.querySelector('.value-display'); + if (display) display.textContent = '0 %'; + }); + + console.log('Alle Kanäle gestoppt'); + alert('Alle Kanäle gestoppt'); + } else { + alert('Fehler beim Stoppen:\n' + (data.message || 'Unbekannt')); + } + } catch (err) { + console.error('Stop-all Fehler:', err); + alert('Netzwerkfehler beim Stoppen aller Kanäle'); } - } catch (err) { - alert('Fehler beim Stoppen'); - } - }); + }); + } + // ── Erneut verbinden ────────────────────────────────────────────────────── + if (reconnectBtn) { + reconnectBtn.addEventListener('click', async () => { + reconnectBtn.disabled = true; + reconnectBtn.innerHTML = ' Verbinde...'; + + try { + const response = await fetch('/api/reconnect', { + method: 'POST', + headers: { 'Content-Type': 'application/json' } + }); + + const result = await response.json(); + + if (result.success) { + reconnectSection.style.display = 'none'; + controlSection.style.display = 'block'; + alert('Verbindung wiederhergestellt!'); + // Optional: Kanäle neu rendern oder Status aktualisieren + } else { + alert('Erneute Verbindung fehlgeschlagen:\n' + (result.message || 'Unbekannt')); + } + } catch (err) { + console.error('Reconnect-Fehler:', err); + alert('Netzwerkfehler beim erneuten Verbinden'); + } finally { + reconnectBtn.disabled = false; + reconnectBtn.innerHTML = ' Erneut verbinden'; + } + }); + } + + // ── Kanäle dynamisch rendern ────────────────────────────────────────────── function renderChannels() { + if (!channelsContainer) return; channelsContainer.innerHTML = ''; if (!config.channels || config.channels.length === 0) { - channelsContainer.innerHTML = '

Keine Kanäle in der Konfiguration definiert.

'; + channelsContainer.innerHTML = '

Keine Kanäle in der Konfiguration definiert.

'; return; } @@ -71,18 +130,26 @@ document.addEventListener('DOMContentLoaded', () => { if (channel.type === 'motor') { controlHTML = ` - + -
- 0 % +
+ -100 % + 0 % + +100 % +
+
+
`; } else { - // Licht, Sound, Fogger → Toggle-Button + // Licht, Sound, Fogger etc. → Toggle controlHTML = ` - + -
+ + + -